Submitted URL: https://www.baycrews.jp/
Effective URL: https://baycrews.jp/
Submission: On February 27 via api from US

Summary

This website contacted 73 IPs in 8 countries across 52 domains to perform 166 HTTP transactions. The main IP is 104.109.78.166, located in Frankfurt am Main, Germany and belongs to AKAMAI-ASN1, NL. The main domain is baycrews.jp.
TLS certificate: Issued by DigiCert SHA2 Secure Server CA on March 12th 2020. Valid for: a year.
This is the only time baycrews.jp was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 1 54.150.1.233 16509 (AMAZON-02)
28 104.109.78.166 20940 (AKAMAI-ASN1)
2 65.9.58.75 16509 (AMAZON-02)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
20 23.37.57.111 16625 (AKAMAI-AS)
2 2a00:1450:400... 15169 (GOOGLE)
1 2600:9000:215... 16509 (AMAZON-02)
3 13.114.70.18 16509 (AMAZON-02)
2 183.79.113.122 24572 (YAHOO-JP-...)
4 13.32.24.51 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
4 143.204.97.88 16509 (AMAZON-02)
1 65.9.61.33 16509 (AMAZON-02)
1 52.204.47.1 14618 (AMAZON-AES)
2 2.18.232.182 16625 (AKAMAI-AS)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
4 203.104.153.77 38631 (LINE LINE...)
1 54.250.85.92 16509 (AMAZON-02)
1 2600:9000:20d... 16509 (AMAZON-02)
5 130.211.31.19 15169 (GOOGLE)
2 183.79.248.252 24572 (YAHOO-JP-...)
8 16 2600:9000:206... 16509 (AMAZON-02)
1 2600:9000:20e... 16509 (AMAZON-02)
4 182.22.24.252 23816 (YAHOO Yah...)
3 182.22.30.220 23816 (YAHOO Yah...)
1 34.102.147.248 15169 (GOOGLE)
3 2a03:2880:f01... 32934 (FACEBOOK)
1 2.18.232.62 16625 (AKAMAI-AS)
1 142.250.186.130 15169 (GOOGLE)
1 54.65.185.147 16509 (AMAZON-02)
1 35.241.23.116 15169 (GOOGLE)
1 2a02:2638:1::3 44788 (ASN-CRITE...)
5 2a03:2880:f11... 32934 (FACEBOOK)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 4 178.250.0.163 44788 (ASN-CRITE...)
1 182.161.73.211 55569 (CRITEO-AS...)
1 2a02:2638:1::13 44788 (ASN-CRITE...)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 35.227.248.159 15169 (GOOGLE)
1 202.241.208.4 4694 (IDCF IDC ...)
1 124.146.215.49 2514 (INFOSPHER...)
1 104.75.88.112 16625 (AKAMAI-AS)
1 1 142.250.185.66 15169 (GOOGLE)
1 54.65.94.198 16509 (AMAZON-02)
1 2 70.42.32.159 22075 (AS-OUTBRAIN)
1 185.64.189.110 62713 (AS-PUBMATIC)
1 18.177.106.11 16509 (AMAZON-02)
1 61.213.187.248 2914 (NTT-COMMU...)
1 65.9.187.60 16509 (AMAZON-02)
1 1 103.142.125.192 131957 (MICROAD M...)
1 143.204.97.111 16509 (AMAZON-02)
1 2.18.232.7 16625 (AKAMAI-AS)
1 3.114.17.118 16509 (AMAZON-02)
1 2 35.244.159.8 15169 (GOOGLE)
1 13.231.67.24 16509 (AMAZON-02)
3 4 37.252.172.36 29990 (ASN-APPNEX)
1 2620:1ec:c11:... 8068 (MICROSOFT...)
1 2 2.18.234.21 16625 (AKAMAI-AS)
3 3 52.28.254.214 16509 (AMAZON-02)
1 3 18.156.0.31 16509 (AMAZON-02)
1 141.226.228.48 200478 (TABOOLA-AS)
1 2 52.57.162.23 16509 (AMAZON-02)
1 162.210.196.208 30633 (LEASEWEB-...)
1 2.18.235.93 16625 (AKAMAI-AS)
1 3.227.99.154 14618 (AMAZON-AES)
1 46.249.52.249 50673 (SERVERIUS-AS)
1 185.86.137.133 201081 (SMARTADSE...)
166 73
Apex Domain
Subdomains
Transfer
49 baycrews.jp
www.baycrews.jp
baycrews.jp
images.baycrews.jp
317 KB
16 staff-start.com
feature-tool.bcg.staff-start.com
1 MB
11 karte.io
static.karte.io
sync-tag.karte.io
t.karte.io
img-cf.karte.io
351 KB
9 yahoo.co.jp
yjtag.yahoo.co.jp
b92.yahoo.co.jp
b97.yahoo.co.jp
21 KB
6 criteo.com
sslwidget.criteo.com
widget.as.criteo.com
gum.criteo.com
dis.criteo.com
5 KB
5 facebook.com
www.facebook.com
456 B
5 doubleclick.net
stats.g.doubleclick.net
googleads.g.doubleclick.net
cm.g.doubleclick.net
4 KB
5 worldshopping.jp
checkout-api.worldshopping.jp
checkout-js.worldshopping.jp
594 KB
4 adnxs.com
secure.adnxs.com
ib.adnxs.com
4 KB
4 line.me
tr.line.me
2 KB
4 google.de
www.google.de
833 B
4 google.com
analytics.google.com
www.google.com
1 KB
3 yahoo.com
ups.analytics.yahoo.com
3 KB
3 advertising.com
pixel.advertising.com
1 KB
3 facebook.net
connect.facebook.net
162 KB
3 google-analytics.com
www.google-analytics.com
20 KB
3 silveregg.net
baycrews.silveregg.net
43 KB
3 googletagmanager.com
www.googletagmanager.com
148 KB
2 3lift.com
eb2.3lift.com
733 B
2 casalemedia.com
r.casalemedia.com
2 KB
2 openx.net
us-u.openx.net
491 B
2 adtdp.com
ad.as.amanad.adtdp.com
ad.caprofitx.adtdp.com
1 KB
2 outbrain.com
sync.outbrain.com
828 B
2 socdm.com
adgen.socdm.com
tg.socdm.com
1 KB
2 tapad.com
pixel.tapad.com
915 B
2 smartnews-ads.com
cdn.smartnews-ads.com
i.smartnews-ads.com
2 KB
2 yimg.jp
s.yimg.jp
14 KB
2 line-scdn.net
d.line-scdn.net
20 KB
2 smartica.jp
js.smartica.jp
api.smartica.jp
4 KB
2 go-mpulse.net
s.go-mpulse.net
c.go-mpulse.net
51 KB
2 treasuredata.com
cdn.treasuredata.com
in.treasuredata.com
14 KB
1 smartadserver.com
rtb-csync.smartadserver.com
688 B
1 e-planning.net
sync.e-planning.net
104 B
1 yieldmo.com
sync-criteo.ads.yieldmo.com
220 B
1 media.net
contextual.media.net
714 B
1 aralego.com
sync.aralego.com
266 B
1 taboola.com
sync-t1.taboola.com
229 B
1 bing.com
c.bing.com
415 B
1 i-mobile.co.jp
ssp-sync.i-mobile.co.jp
566 B
1 teads.tv
criteo-sync.teads.tv
172 B
1 smaato.net
s.ad.smaato.net
236 B
1 microad.jp
s-cs.send.microad.jp
394 B
1 gssprt.jp
cs.gssprt.jp
595 B
1 ad-stir.com
sync.ad-stir.com
101 B
1 pubmatic.com
simage2.pubmatic.com
875 B
1 adingo.jp
cs.adingo.jp
412 B
1 addthis.com
cw.addthis.com
426 B
1 criteo.net
static.criteo.net
12 KB
1 linksynergy.com
consent.linksynergy.com
258 B
1 googleadservices.com
www.googleadservices.com
13 KB
1 rmtag.com
intljs.rmtag.com
21 KB
1 yjtag.jp
s.yjtag.jp
13 KB
166 52
Domain Requested by
28 baycrews.jp baycrews.jp
20 images.baycrews.jp baycrews.jp
16 feature-tool.bcg.staff-start.com 8 redirects baycrews.jp
5 www.facebook.com connect.facebook.net
5 t.karte.io static.karte.io
4 b92.yahoo.co.jp s.yimg.jp
4 tr.line.me baycrews.jp
4 www.google.de baycrews.jp
4 static.karte.io baycrews.jp
static.karte.io
4 checkout-api.worldshopping.jp www.googletagmanager.com
checkout-api.worldshopping.jp
checkout-js.worldshopping.jp
3 ups.analytics.yahoo.com 1 redirects
3 pixel.advertising.com 3 redirects
3 secure.adnxs.com 2 redirects
3 dis.criteo.com
3 connect.facebook.net baycrews.jp
connect.facebook.net
3 b97.yahoo.co.jp s.yimg.jp
3 www.google.com baycrews.jp
3 www.google-analytics.com www.googletagmanager.com
www.google-analytics.com
baycrews.jp
3 baycrews.silveregg.net baycrews.jp
3 www.googletagmanager.com baycrews.jp
www.googletagmanager.com
s.yjtag.jp
2 eb2.3lift.com 1 redirects
2 r.casalemedia.com 1 redirects
2 us-u.openx.net 1 redirects
2 sync.outbrain.com 1 redirects
2 pixel.tapad.com 1 redirects
2 googleads.g.doubleclick.net www.googleadservices.com
2 s.yimg.jp s.yjtag.jp
2 stats.g.doubleclick.net www.google-analytics.com
www.googletagmanager.com
2 d.line-scdn.net baycrews.jp
2 yjtag.yahoo.co.jp s.yjtag.jp
1 rtb-csync.smartadserver.com
1 sync.e-planning.net
1 sync-criteo.ads.yieldmo.com
1 contextual.media.net
1 sync.aralego.com
1 sync-t1.taboola.com
1 c.bing.com
1 ib.adnxs.com 1 redirects
1 ssp-sync.i-mobile.co.jp
1 ad.caprofitx.adtdp.com
1 criteo-sync.teads.tv
1 s.ad.smaato.net
1 s-cs.send.microad.jp 1 redirects
1 ad.as.amanad.adtdp.com
1 cs.gssprt.jp
1 sync.ad-stir.com
1 simage2.pubmatic.com
1 cs.adingo.jp
1 cm.g.doubleclick.net 1 redirects
1 cw.addthis.com
1 tg.socdm.com
1 adgen.socdm.com
1 gum.criteo.com static.criteo.net
1 widget.as.criteo.com
1 sslwidget.criteo.com 1 redirects
1 checkout-js.worldshopping.jp checkout-api.worldshopping.jp
1 static.criteo.net s.yjtag.jp
1 consent.linksynergy.com
1 i.smartnews-ads.com
1 www.googleadservices.com www.googletagmanager.com
1 cdn.smartnews-ads.com baycrews.jp
1 intljs.rmtag.com baycrews.jp
1 img-cf.karte.io baycrews.jp
1 sync-tag.karte.io static.karte.io
1 api.smartica.jp baycrews.jp
1 analytics.google.com www.googletagmanager.com
1 in.treasuredata.com cdn.treasuredata.com
1 js.smartica.jp baycrews.jp
1 s.yjtag.jp baycrews.jp
1 c.go-mpulse.net s.go-mpulse.net
1 s.go-mpulse.net baycrews.jp
1 cdn.treasuredata.com baycrews.jp
1 www.baycrews.jp 1 redirects
166 73

This site contains links to these domains. Also see Links.

Domain
www.facebook.com
twitter.com
www.instagram.com
line.me
www.baycrews.co.jp
baycrews.onelink.me
Subject Issuer Validity Valid
baycrews.jp
DigiCert SHA2 Secure Server CA
2020-03-12 -
2021-06-11
a year crt.sh
*.treasuredata.com
Amazon
2020-10-16 -
2021-11-15
a year crt.sh
akstat.io
DigiCert Secure Site ECC CA-1
2020-05-06 -
2021-08-05
a year crt.sh
*.google-analytics.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
*.tgm.yahoo-net.jp
Cybertrust Japan SureServer CA G4
2020-03-12 -
2021-04-12
a year crt.sh
*.silveregg.net
DigiCert TLS RSA SHA256 2020 CA1
2020-12-24 -
2022-01-24
a year crt.sh
yjtag.yahoo.co.jp
Cybertrust Japan SureServer CA G4
2020-10-04 -
2021-11-04
a year crt.sh
*.worldshopping.jp
Amazon
2020-07-03 -
2021-08-03
a year crt.sh
static.karte.io
Amazon
2020-08-25 -
2021-09-24
a year crt.sh
*.smartica.jp
RapidSSL RSA CA 2018
2020-01-06 -
2022-02-04
2 years crt.sh
line-apps.com
DigiCert SHA2 Secure Server CA
2021-01-14 -
2022-01-18
a year crt.sh
*.g.doubleclick.net
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
*.google.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
www.google.de
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
www.google.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
*.google.de
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
*.line.me
GlobalSign RSA OV SSL CA 2018
2020-06-17 -
2022-09-05
2 years crt.sh
sync-tag.karte.io
Amazon
2020-05-01 -
2021-06-01
a year crt.sh
*.karte.io
GlobalSign GCC R3 DV TLS CA 2020
2020-12-17 -
2021-12-22
a year crt.sh
edge01.yahoo.co.jp
Cybertrust Japan SureServer CA G4
2021-02-10 -
2022-03-09
a year crt.sh
feature-tool.bcg.staff-start.com
Amazon
2020-06-12 -
2021-07-12
a year crt.sh
img-cf.karte.io
Amazon
2020-09-25 -
2021-10-27
a year crt.sh
mscedge01.yahoo.co.jp
Cybertrust Japan SureServer CA G4
2020-08-04 -
2021-09-03
a year crt.sh
*.rmtag.com
Thawte RSA CA 2018
2020-01-23 -
2022-02-26
2 years crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2021-02-10 -
2021-05-10
3 months crt.sh
*.smartnews-ads.com
DigiCert SHA2 Secure Server CA
2020-05-15 -
2021-08-14
a year crt.sh
www.googleadservices.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
*.linksynergy.com
Thawte RSA CA 2018
2019-06-11 -
2021-07-18
2 years crt.sh
*.criteo.net
DigiCert TLS Hybrid ECC SHA384 2020 CA1
2021-01-30 -
2021-04-28
3 months crt.sh
*.as.criteo.com
DigiCert TLS Hybrid ECC SHA384 2020 CA1
2021-01-11 -
2021-04-10
3 months crt.sh
*.criteo.com
DigiCert TLS Hybrid ECC SHA384 2020 CA1
2021-01-30 -
2021-04-28
3 months crt.sh
*.tapad.com
DigiCert SHA2 Secure Server CA
2020-10-05 -
2021-11-06
a year crt.sh
*.socdm.com
GlobalSign RSA OV SSL CA 2018
2020-04-24 -
2022-06-02
2 years crt.sh
odc-prod-01.oracle.com
DigiCert SHA2 Secure Server CA
2021-01-10 -
2021-04-07
3 months crt.sh
*.adingo.jp
DigiCert SHA2 Secure Server CA
2020-03-26 -
2021-04-15
a year crt.sh
*.outbrain.com
Thawte RSA CA 2018
2019-10-29 -
2021-11-23
2 years crt.sh
*.pubmatic.com
DigiCert Baltimore TLS RSA SHA256 2020 CA1
2020-12-07 -
2021-12-14
a year crt.sh
*.ad-stir.com
Amazon
2020-06-09 -
2021-07-09
a year crt.sh
cs.gssprt.jp
GeoTrust RSA CA 2018
2020-12-02 -
2022-01-01
a year crt.sh
*.as.amanad.adtdp.com
Cybertrust Japan SureServer CA G4
2020-04-01 -
2021-04-30
a year crt.sh
s.ad.smaato.net
Amazon
2020-04-15 -
2021-05-15
a year crt.sh
teads.tv
R3
2021-02-18 -
2021-05-19
3 months crt.sh
*.caprofitx.adtdp.com
Amazon
2020-12-28 -
2022-01-26
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2020-06-18 -
2021-08-17
a year crt.sh
*.i-mobile.co.jp
JPRS Domain Validation Authority - G4
2020-08-18 -
2022-03-31
2 years crt.sh
www.bing.com
Microsoft RSA TLS CA 02
2021-01-19 -
2021-07-19
6 months crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2020-03-02 -
2021-04-01
a year crt.sh
ups.analytics.yahoo.com
DigiCert SHA2 High Assurance Server CA
2020-10-24 -
2021-04-20
6 months crt.sh
*.taboola.com
DigiCert TLS Hybrid ECC SHA384 2020 CA1
2020-11-25 -
2021-12-26
a year crt.sh
*.3lift.com
Amazon
2020-07-04 -
2021-08-05
a year crt.sh
*.aralego.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-23 -
2021-11-21
2 years crt.sh
*.media.net
DigiCert SHA2 Secure Server CA
2020-02-25 -
2021-05-26
a year crt.sh
*.ads.yieldmo.com
Amazon
2020-06-23 -
2021-07-23
a year crt.sh
*.e-planning.net
R3
2021-01-15 -
2021-04-15
3 months crt.sh
*.smartadserver.com
DigiCert ECC Secure Server CA
2020-01-30 -
2022-02-03
2 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh

This page contains 4 frames:

Primary Page: https://baycrews.jp/
Frame ID: F9E6692FF56DB26AE89ADF7900466AB1
Requests: 133 HTTP requests in this frame

Frame: https://s.go-mpulse.net/boomerang/4DKGK-AGGJB-V2ZJX-CKH5A-6Q35D
Frame ID: FB74A59BAF71D302483CD790D447E916
Requests: 2 HTTP requests in this frame

Frame: https://gum.criteo.com/syncframe?topUrl=baycrews.jp
Frame ID: E0E0BF9DA39E3921DC23521C9D117C77
Requests: 1 HTTP requests in this frame

Frame: https://pixel.tapad.com/idsync/ex/receive/check?partner_id=2926&partner_device_id=k-2zuD4g8mczyi7CAmAG-Mlps6bFCDqKyijZcJxw
Frame ID: 4C2F175F4C64FC2A790DD69639330F2D
Requests: 30 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. https://www.baycrews.jp/ HTTP 301
    https://baycrews.jp/ Page URL

Detected technologies

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

Page Statistics

166
Requests

98 %
HTTPS

32 %
IPv6

52
Domains

73
Subdomains

73
IPs

8
Countries

2872 kB
Transfer

6659 kB
Size

3
Cookies

Page URL History

This captures the URL locations of the websites, including HTTP redirects and client-side redirects via JavaScript or Meta fields.

  1. https://www.baycrews.jp/ HTTP 301
    https://baycrews.jp/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 66
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBdEhFIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--834f4552935770a7db993fd543eff1e1d35fea9e/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNT1RneWVEUXdNQVk2QmtWRyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--f5e9e6a12048596d33ea58e1bfafe4a02286c529/main_pc.jpg HTTP 302
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPR0V6TTNoemRtZG9kMll4ZFd4NWREY3daSGg2YTJOa1lYZDRNeTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWJXRnBibDl3WXk1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KMjFoYVc1ZmNHTXVhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToxMS4xMjBaIiwicHVyIjoiYmxvYl9rZXkifX0=--b8a9a8af9aec30626ec749b07c3a4c354f8dd393/main_pc.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22main_pc.jpg%22%3B+filename%2A%3DUTF-8%27%27main_pc.jpg
Request Chain 103
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBc2JHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--41c21edc8e3b951bb10efa2b7f683de3247ffc78/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNT1RneWVEUXdNQVk2QmtWRyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--f5e9e6a12048596d33ea58e1bfafe4a02286c529/pc_20210226_edi.jpg HTTP 302
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZhR1ZyTkhwbGNHOTFOVFl4Y25wcVpqVnlPREowY0RRM1l6aDVZaTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKUmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakF5TVRBeU1qWmZaV1JwTG1wd1p5STdJR1pwYkdWdVlXMWxLajFWVkVZdE9DY25jR05mTWpBeU1UQXlNalpmWldScExtcHdad1k3QmxRNkVXTnZiblJsYm5SZmRIbHdaVWtpRDJsdFlXZGxMMnB3WldjR093WlUiLCJleHAiOiIyMDIxLTAyLTI3VDEyOjU5OjEyLjc2NVoiLCJwdXIiOiJibG9iX2tleSJ9fQ==--cd0ddf815215357810563e2f9633015f701f4b5a/pc_20210226_edi.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_20210226_edi.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_20210226_edi.jpg
Request Chain 113
  • https://sslwidget.criteo.com/event?a=4265&v=5.6.2&p0=e%3Dexd%26site_type%3Dd&p1=e%3Dvh&p2=e%3Ddis&adce=1&tld=baycrews.jp&dtycbr=24826 HTTP 302
  • https://widget.as.criteo.com/event?a=4265&v=5.6.2&p0=e%3Dexd%26site_type%3Dd&p1=e%3Dvh&p2=e%3Ddis&adce=1&tld=baycrews.jp&dtycbr=24826
Request Chain 127
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaS9IIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0e3be656eaebc2b8a576bd499b82dc34ea91d1fd/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNT1RneWVEUXdNQVk2QmtWRyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--f5e9e6a12048596d33ea58e1bfafe4a02286c529/main.jpg HTTP 302
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlalkzZERGcGFUSXpkamRyWm5od016UjBPVGN6TW5SamNqaDBiUzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NJN2FXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWJXRnBiaTVxY0djaU95Qm1hV3hsYm1GdFpTbzlWVlJHTFRnbkoyMWhhVzR1YW5CbkJqc0dWRG9SWTI5dWRHVnVkRjkwZVhCbFNTSVBhVzFoWjJVdmFuQmxad1k3QmxRPSIsImV4cCI6IjIwMjEtMDItMjdUMTI6NTk6MTQuODAyWiIsInB1ciI6ImJsb2Jfa2V5In19--42d38a9e8029f59367b6abaa1fc893e022b7c0ad/main.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22main.jpg%22%3B+filename%2A%3DUTF-8%27%27main.jpg
Request Chain 128
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBcGpFIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--c7dc666f6d3feb340a904e44c6f89769023e0577/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNT1RneWVEUXdNQVk2QmtWRyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--f5e9e6a12048596d33ea58e1bfafe4a02286c529/pc_210223_crews.jpg HTTP 302
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZOMlF5WmpZNWNtMW9jRGt5YkhWMFptNHdNR3d5WVdJM2RYa3lZUzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKUmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakV3TWpJelgyTnlaWGR6TG1wd1p5STdJR1pwYkdWdVlXMWxLajFWVkVZdE9DY25jR05mTWpFd01qSXpYMk55WlhkekxtcHdad1k3QmxRNkVXTnZiblJsYm5SZmRIbHdaVWtpRDJsdFlXZGxMMnB3WldjR093WlUiLCJleHAiOiIyMDIxLTAyLTI3VDEyOjU5OjE1LjI5MloiLCJwdXIiOiJibG9iX2tleSJ9fQ==--08a5f926adb0405ada892dc82f45ae8ba9d5fd4a/pc_210223_crews.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_210223_crews.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_210223_crews.jpg
Request Chain 129
  • https://pixel.tapad.com/idsync/ex/receive?partner_id=2926&partner_device_id=k-2zuD4g8mczyi7CAmAG-Mlps6bFCDqKyijZcJxw HTTP 302
  • https://pixel.tapad.com/idsync/ex/receive/check?partner_id=2926&partner_device_id=k-2zuD4g8mczyi7CAmAG-Mlps6bFCDqKyijZcJxw
Request Chain 133
  • https://cm.g.doubleclick.net/pixel?google_nid=cjp&google_sc&google_ula=913071&google_hm=ay0yenVENGc4bWN6eWk3Q0FtQUctTWxwczZiRkNEcUt5aWpaY0p4dw HTTP 302
  • https://dis.criteo.com/dis/rtb/google/cookiematch.aspx?id=&google_ula=913071,0
Request Chain 135
  • https://sync.outbrain.com/cookie-sync?p=criteo&uid=k-k2tqDg8mczyi7CAmAG-Mlps6bFBgSNp60XK5rQ HTTP 302
  • https://sync.outbrain.com/cookie-sync?p=criteo&uid=k-k2tqDg8mczyi7CAmAG-Mlps6bFBgSNp60XK5rQ&rdrctExp=true
Request Chain 140
  • https://s-cs.send.microad.jp/cs?key=criteo_1 HTTP 302
  • https://dis.criteo.com/dis/rtb/microad/cookiematch.aspx?maid=&cmps_error=3
Request Chain 144
  • https://us-u.openx.net/w/1.0/sd?id=537072953&val=k-cQAtgw8mczyi7CAmAG-Mlps6bFAu-wVbxiPqqw&c=us HTTP 302
  • https://us-u.openx.net/w/1.0/sd?cc=1&id=537072953&val=k-cQAtgw8mczyi7CAmAG-Mlps6bFAu-wVbxiPqqw&c=us
Request Chain 146
  • https://secure.adnxs.com/seg?add=1005440&redir=https%3A%2F%2Fib.adnxs.com%2Fgetuid%3Fhttps%3A%2F%2Fdis.criteo.com%2Fdis%2Frtb%2Fappnexus%2Fcookiematch.aspx%3Fappnxsid%3D%24UID HTTP 307
  • https://secure.adnxs.com/bounce?%2Fseg%3Fadd%3D1005440%26redir%3Dhttps%253A%252F%252Fib.adnxs.com%252Fgetuid%253Fhttps%253A%252F%252Fdis.criteo.com%252Fdis%252Frtb%252Fappnexus%252Fcookiematch.aspx%253Fappnxsid%253D%2524UID HTTP 302
  • https://ib.adnxs.com/getuid?https://dis.criteo.com/dis/rtb/appnexus/cookiematch.aspx?appnxsid=$UID HTTP 302
  • https://dis.criteo.com/dis/rtb/appnexus/cookiematch.aspx?appnxsid=7935217643157946466
Request Chain 148
  • https://r.casalemedia.com/rum?cm_dsp_id=20&external_user_id=k-LVghcQ8mczyi7CAmAG-Mlps6bFAOX9j43FOwIw HTTP 302
  • https://r.casalemedia.com/rum?cm_dsp_id=20&external_user_id=k-LVghcQ8mczyi7CAmAG-Mlps6bFAOX9j43FOwIw&C=1
Request Chain 149
  • https://pixel.advertising.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1 HTTP 302
  • https://pixel.advertising.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1&verify=true HTTP 302
  • https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46 HTTP 302
  • https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46&verify=true
Request Chain 151
  • https://eb2.3lift.com/xuid?mid=2711&xuid=k-5m_9KA8mczyi7CAmAG-Mlps6bFCgJmCrb4s3vg&dongle=013b HTTP 302
  • https://eb2.3lift.com/xuid?ld=1&mid=2711&xuid=k-5m_9KA8mczyi7CAmAG-Mlps6bFCgJmCrb4s3vg&dongle=013b&gdpr=1&cmp_cs=&us_privacy=
Request Chain 159
  • https://pixel.advertising.com/ups/55945/sync?uid=k-jE31Sw8mczyi7CAmAG-Mlps6bFD2QfmWnngoeg&_origin=1 HTTP 302
  • https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-jE31Sw8mczyi7CAmAG-Mlps6bFD2QfmWnngoeg&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46
Request Chain 160
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBbi9CIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--43ff45b0cd16832437187c8687069da1b4ee9e67/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNT1RneWVEUXdNQVk2QmtWRyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--f5e9e6a12048596d33ea58e1bfafe4a02286c529/pc_210120_jsm.jpg HTTP 302
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlR2N6TVROc01YTXliMk4xYTNONU9IQjVkREJ0TmpOd1p6SjJNQzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKTmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakV3TVRJd1gycHpiUzVxY0djaU95Qm1hV3hsYm1GdFpTbzlWVlJHTFRnbkozQmpYekl4TURFeU1GOXFjMjB1YW5CbkJqc0dWRG9SWTI5dWRHVnVkRjkwZVhCbFNTSVBhVzFoWjJVdmFuQmxad1k3QmxRPSIsImV4cCI6IjIwMjEtMDItMjdUMTI6NTk6MTkuMDcwWiIsInB1ciI6ImJsb2Jfa2V5In19--a9e732b7cb1b8aa119430a272b3ef96d0d084757/pc_210120_jsm.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_210120_jsm.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_210120_jsm.jpg
Request Chain 161
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBdFRFIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--c2a9b1762fe2340afbb93968ce1aeac8f796642a/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNT1RneWVEUXdNQVk2QmtWRyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--f5e9e6a12048596d33ea58e1bfafe4a02286c529/pc.jpg HTTP 302
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaRGhtYlhBM2FXb3lZVGxqY0hjd2VETjZiV0pyWkc1a2NHMDVjQzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NJM2FXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTXVhbkJuSWpzZ1ptbHNaVzVoYldVcVBWVlVSaTA0Snlkd1l5NXFjR2NHT3daVU9oRmpiMjUwWlc1MFgzUjVjR1ZKSWc5cGJXRm5aUzlxY0dWbkJqc0dWQT09IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToxOC43MDFaIiwicHVyIjoiYmxvYl9rZXkifX0=--b4261fed1951f0f50f110862ad10fea58c90227a/pc.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc.jpg%22%3B+filename%2A%3DUTF-8%27%27pc.jpg
Request Chain 163
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaisvIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--1bf91392c3517141c866adcc5c6b4cf7eb33ff37/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNT1RneWVEUXdNQVk2QmtWRyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--f5e9e6a12048596d33ea58e1bfafe4a02286c529/pc@2x.jpg HTTP 302
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaWEF6ZDNKMFptaDNaM0YzYlRoemREWmlNM2cwTm1VNGVuWnphaTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTWxOREF5ZUM1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KM0JqSlRRd01uZ3VhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToyMi41NjVaIiwicHVyIjoiYmxvYl9rZXkifX0=--5de98644be596e39ec94f6fd1a8fafebe23bfcde/pc@2x.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc%25402x.jpg%22%3B+filename%2A%3DUTF-8%27%27pc%25402x.jpg
Request Chain 164
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBbkhGIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--9e579afa546e55cf06ac166d1815e5891cc38f8b/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9MY21WemFYcGxTU0lNT1RneWVEUXdNQVk2QmtWRyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--f5e9e6a12048596d33ea58e1bfafe4a02286c529/pc@2x.jpg HTTP 302
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPSFl6ZWpZd2RIcDZjSFIwYzJrd01tNTJPRFZsWkRVeGEzQmtaeTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTWxOREF5ZUM1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KM0JqSlRRd01uZ3VhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToyMi43MTRaIiwicHVyIjoiYmxvYl9rZXkifX0=--e3ad3771ffb7ea077969b2bc6a19d49bff4802ff/pc@2x.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc%25402x.jpg%22%3B+filename%2A%3DUTF-8%27%27pc%25402x.jpg

166 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
baycrews.jp/
Redirect Chain
  • https://www.baycrews.jp/
  • https://baycrews.jp/
84 KB
14 KB
Document
General
Full URL
https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
6564cbcc60bd5367e93280916b21fce8085ac8ee0cb692c08745c373e24ea7e7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
baycrews.jp
:scheme
https
:path
/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
none
sec-fetch-mode
navigate
sec-fetch-user
?1
sec-fetch-dest
document
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

content-type
text/html; charset=utf-8
server
nginx
x-frame-options
SAMEORIGIN
x-xss-protection
1; mode=block
x-content-type-options
nosniff
vary
User-Agent Accept-Encoding
x-akamai-transformed
9 - 0 pmb=mRUM,1
content-encoding
gzip
date
Sat, 27 Feb 2021 12:54:05 GMT
content-length
14068
set-cookie
cid=wKjkpmA6QO0MmAAVA8/8Ag==; expires=Sun, 27-Feb-22 12:54:05 GMT; path=/
server-timing
cdn-cache; desc=MISS edge; dur=271 origin; dur=34

Redirect headers

server
awselb/2.0
date
Sat, 27 Feb 2021 12:54:04 GMT
content-type
text/html
content-length
134
location
https://baycrews.jp:443/
common.css
baycrews.jp/assets/css/
111 KB
21 KB
Stylesheet
General
Full URL
https://baycrews.jp/assets/css/common.css?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
c2e0b749ba98f3158f0bc25cf0ab517e36627bbb4eb791dbd04ecbe15e0e0539
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
nginx
x-frame-options
SAMEORIGIN
content-type
text/css
cache-control
max-age=600
server-timing
edge; dur=270, origin; dur=787, cdn-cache; desc=MISS
vary
User-Agent, Accept-Encoding
content-length
20751
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:06 GMT
jquery-2.2.0.min.js
baycrews.jp/assets/js/lib/
84 KB
30 KB
Script
General
Full URL
https://baycrews.jp/assets/js/lib/jquery-2.2.0.min.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
8a102873a33f24f7eb22221e6b23c4f718e29f85168ecc769a35bfaed9b12cce
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-14e55"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=4, origin; dur=1811, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
29918
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:07 GMT
jquery.cookie.js
baycrews.jp/assets/js/
3 KB
2 KB
Script
General
Full URL
https://baycrews.jp/assets/js/jquery.cookie.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
8c0301b3dba5061632d7321cd8bb7bd527f48288d5cb15ff614ea0c1dcc1ad69
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-c44"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=5, origin; dur=821, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
1395
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:06 GMT
common.js
baycrews.jp/assets/js/
69 KB
26 KB
Script
General
Full URL
https://baycrews.jp/assets/js/common.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
4edbece3e1a487ad5341880a4a6d8ca66e6091088a0a6e5e12725bae14394323
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-11586"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=3, origin; dur=811, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
26246
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:06 GMT
bc_front_common.js
baycrews.jp/assets/js/
10 KB
4 KB
Script
General
Full URL
https://baycrews.jp/assets/js/bc_front_common.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
032009ee7a62418a5f969658f59c6888737e4f4779104a00ab57a922836d64de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-283f"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=4, origin; dur=786, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
3861
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:06 GMT
load_personalized.js
baycrews.jp/assets/js/
12 KB
3 KB
Script
General
Full URL
https://baycrews.jp/assets/js/load_personalized.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
057df4e0b56157e244331027c6572ab3abb5d26b8e1adec9c41c6364814d37a9
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-2f2f"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=3, origin; dur=1553, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
2781
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:06 GMT
favorite.js
baycrews.jp/assets/js/
12 KB
4 KB
Script
General
Full URL
https://baycrews.jp/assets/js/favorite.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
c94593d4a67696ade36cf632c0ab6abfc55ddc7271a61e872cb8a641a1e7d17a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-2f18"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=2, origin; dur=785, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
3702
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:06 GMT
header_search.js
baycrews.jp/assets/js/
5 KB
2 KB
Script
General
Full URL
https://baycrews.jp/assets/js/header_search.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
879d5010159b99723bb423be6ec7a122c6e5893fa40d01d45a5e7243420ade20
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-152a"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=3, origin; dur=269, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
1507
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
index.css
baycrews.jp/assets/css/
847 B
652 B
Stylesheet
General
Full URL
https://baycrews.jp/assets/css/index.css?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
4cf9ee11774bed05ba076db70a18d27325eed3bced558a82a801c6847e254454
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
nginx
x-frame-options
SAMEORIGIN
content-type
text/css
cache-control
max-age=600
server-timing
edge; dur=2, origin; dur=802, cdn-cache; desc=MISS
vary
User-Agent, Accept-Encoding
content-length
361
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:06 GMT
saletop.js
baycrews.jp/assets/js/
9 KB
3 KB
Script
General
Full URL
https://baycrews.jp/assets/js/saletop.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
ae78949c343a51623421be03013bca62c8fccadefb9c88c8dead260b75b120bd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-25b4"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=1, origin; dur=829, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
2379
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:06 GMT
loading.png
baycrews.jp/assets/img/common/
108 B
425 B
Image
General
Full URL
https://baycrews.jp/assets/img/common/loading.png
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b2de832c0c7bddff993b5fa453ecb26314dc4767346bebb2270cfd429b7bf249
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-6c"
x-frame-options
SAMEORIGIN
content-type
image/png
cache-control
max-age=600
server-timing
edge; dur=2, origin; dur=266, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent
content-length
108
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
app_icon.png
baycrews.jp/sp/assets/img/common/
912 B
1 KB
Image
General
Full URL
https://baycrews.jp/sp/assets/img/common/app_icon.png
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
81cbfaf57a918386ad3b1445b3fc958079457a07a1f26f4668f1e222d4496bf3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-390"
x-frame-options
SAMEORIGIN
content-type
image/png
cache-control
max-age=600
server-timing
edge; dur=1, origin; dur=268, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent
content-length
912
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
chat.js
baycrews.jp/src/chat/
4 KB
2 KB
Script
General
Full URL
https://baycrews.jp/src/chat/chat.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
476a2659ea0bbc84be8b7339cb36830920e6e922d7c90a4a65ce084006e0197b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 27 Nov 2019 03:44:16 GMT
server
nginx
etag
"6d7e5b736ca1de8934371e8ca11dbe3f"
x-frame-options
SAMEORIGIN
content-type
text/javascript
cache-control
max-age=600
server-timing
edge; dur=6, origin; dur=265, cdn-cache; desc=MISS
vary
User-Agent, Accept-Encoding
content-length
1528
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:07 GMT
get_browsing_history.js
baycrews.jp/assets/js/
7 KB
3 KB
Script
General
Full URL
https://baycrews.jp/assets/js/get_browsing_history.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
4df5a9a506463b0fa0ec80f59d02383f22608323c54f9e8d18f2e2024da896dc
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-1ba4"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=1, origin; dur=263, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
2261
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:07 GMT
top_banner.js
baycrews.jp/assets/js/
4 KB
2 KB
Script
General
Full URL
https://baycrews.jp/assets/js/top_banner.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
11f7c767ee892f2576e46aedbc22c9d8a2b6540b5666ee34d4fb820716d5055a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-10cd"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=1, origin; dur=832, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
1229
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
jquery.inview.min.js
baycrews.jp/assets/js/
1 KB
1 KB
Script
General
Full URL
https://baycrews.jp/assets/js/jquery.inview.min.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
ba732a6d0b4db5e763fcba62ac2f0931e440fc10d1645597de4e3ec9890bcea9
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:09 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-59e"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=1, origin; dur=1544, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
767
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:09 GMT
snap_list.js
baycrews.jp/assets/js/
6 KB
2 KB
Script
General
Full URL
https://baycrews.jp/assets/js/snap_list.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
675b227628ddf15bd4180a794ebceadacc3bb622bf4f45aa1539bd18ce166586
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-187a"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=1, origin; dur=266, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
1889
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
news_list.js
baycrews.jp/assets/js/
6 KB
2 KB
Script
General
Full URL
https://baycrews.jp/assets/js/news_list.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
c570f8ff21634cbcc068126a80a2a40e15323495b9a6fbd78ad67fe75df4cf18
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-166c"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=4, origin; dur=274, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
1836
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
blog_list.js
baycrews.jp/assets/js/
6 KB
2 KB
Script
General
Full URL
https://baycrews.jp/assets/js/blog_list.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e86c874d3c0982593342852a1e8513d2e7445688714c3a79cc5520abc71c5a60
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-16fc"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=5, origin; dur=277, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
1875
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
feature_list.js
baycrews.jp/assets/js/
7 KB
2 KB
Script
General
Full URL
https://baycrews.jp/assets/js/feature_list.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
34416f24af9edc04d6fe32bf8b1d6d4c9b70332109a25b4f5cee13bb7fea7225
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-1ad4"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=2, origin; dur=275, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
2095
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
recommend_request.js
baycrews.jp/assets/js/
24 KB
7 KB
Script
General
Full URL
https://baycrews.jp/assets/js/recommend_request.js?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
5894fceb165e6c06db0c9b198165581fade79422a7c4784bc5606027207fcdf3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-5f01"
x-frame-options
SAMEORIGIN
content-type
application/javascript; charset=utf-8
cache-control
max-age=600
server-timing
edge; dur=4, origin; dur=555, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent, Accept-Encoding
content-length
6756
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
header-info
baycrews.jp/web-api/v1/
37 KB
5 KB
XHR
General
Full URL
https://baycrews.jp/web-api/v1/header-info?_=1614430447992
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/js/lib/jquery-2.2.0.min.js?v=20210224013704
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
1050a06619ed9db5673831b49dbdaf6cd8c060f1da0ef8875f9c01f36e74c382
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Accept
application/json, text/javascript, */*; q=0.01
Referer
https://baycrews.jp/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
nginx
x-amzn-trace-id
Root=1-603a40f0-35b068bd2b7188336ccd7cac
x-frame-options
SAMEORIGIN
content-type
application/json
cache-control
no-cache, private
server-timing
cdn-cache; desc=MISS, edge; dur=225, origin; dur=42
vary
User-Agent, Accept-Encoding
content-length
3410
x-xss-protection
1; mode=block
x-request-id
520cee6105e9b838096ce185b475d580
td.min.js
cdn.treasuredata.com/sdk/1.9.2/
34 KB
13 KB
Script
General
Full URL
https://cdn.treasuredata.com/sdk/1.9.2/td.min.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.75 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ac195780e6b3c57034d94552b0f55c450879151bee089547f4de05b0db8b5a37

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Mon, 08 Feb 2021 01:13:30 GMT
Content-Encoding
gzip
Connection
keep-alive
Last-Modified
Thu, 21 Dec 2017 00:23:31 GMT
Server
AmazonS3
Age
1683639
ETag
W/"502f07067956c3fc1e64f138e8e4322b"
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 df7c0ba7857d5300ae11e7566c926f17.cloudfront.net (CloudFront)
Cache-Control
public, max-age=315360000
Transfer-Encoding
chunked
X-Amz-Cf-Pop
FRA56-C1
X-Amz-Cf-Id
Vx-8vIHpRMev3kt5FzDTzGCKb-RFJDaXwFTtMO6OcpIBcnI5hfs8ig==
4DKGK-AGGJB-V2ZJX-CKH5A-6Q35D
s.go-mpulse.net/boomerang/ Frame FB74
202 KB
51 KB
Script
General
Full URL
https://s.go-mpulse.net/boomerang/4DKGK-AGGJB-V2ZJX-CKH5A-6Q35D
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:291::11a6 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
Software
/
Resource Hash
95a439c4e11ace2484e8d42c30ff56cf7db5ea7c6463df9ce2fdafa7f6ccbf54

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
content-encoding
br
last-modified
Mon, 08 Feb 2021 08:34:22 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
cache-control
max-age=604800
timing-allow-origin
*
content-length
51580
logo.png
baycrews.jp/assets/img/common/
1 KB
2 KB
Image
General
Full URL
https://baycrews.jp/assets/img/common/logo.png
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/css/common.css?v=20210224013704
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
46987c9cfaa8d9a900fffcc3cc414506347fb3b65eb98b4b73d98275652e5a16
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/assets/css/common.css?v=20210224013704
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-4c4"
x-frame-options
SAMEORIGIN
content-type
image/png
cache-control
max-age=600
server-timing
edge; dur=1, origin; dur=800, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent
content-length
1220
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
icon.png
baycrews.jp/assets/img/common/
9 KB
9 KB
Image
General
Full URL
https://baycrews.jp/assets/img/common/icon.png?v=20210224013704
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/css/common.css?v=20210224013704
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
6a0b3c4bc43c63864f113f9f8a5ff37c033a0f3a5ad912647df712a7b0b9909b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/assets/css/common.css?v=20210224013704
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-237e"
x-frame-options
SAMEORIGIN
content-type
image/png
cache-control
max-age=600
server-timing
edge; dur=2, origin; dur=809, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent
content-length
9086
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:08 GMT
config.json
c.go-mpulse.net/api/ Frame FB74
51 B
323 B
XHR
General
Full URL
https://c.go-mpulse.net/api/config.json?key=4DKGK-AGGJB-V2ZJX-CKH5A-6Q35D&d=baycrews.jp&t=5381435&v=1.632.0&if=&sl=0&si=fev5f1z7t1-qp6ui8&plugins=AK,ConfigOverride,Continuity,PageParams,IFrameDelay,AutoXHR,SPA,Angular,Backbone,Ember,History,RT,CrossDomain,BW,PaintTiming,NavigationTiming,ResourceTiming,Memory,CACHE_RELOAD,Errors,TPAnalytics,UserTiming,Akamai,LOGN&acao=&ak.ai=328455
Requested by
Host: s.go-mpulse.net
URL: https://s.go-mpulse.net/boomerang/4DKGK-AGGJB-V2ZJX-CKH5A-6Q35D
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:19a::11a6 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
Software
/
Resource Hash
09b99cd31de32440268984f9e53d616e2772dc8af49bdab1d0a7ff7d3fd4ae9e

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Sat, 27 Feb 2021 12:54:08 GMT
Cache-Control
private, max-age=120, stale-while-revalidate=60, stale-if-error=120
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
51
Content-Type
application/json
21030200106010_ma_002_N_org.jpg
images.baycrews.jp/itemimages/i/21/030/200/
9 KB
9 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/030/200/21030200106010_ma_002_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
32878d6b1ce14a906b475c0dd28e1d59f97ab6ca77981449182823758f600283

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Fri, 12 Feb 2021 01:12:04 GMT
server
Akamai Image Server
etag
"34a96fabd222fc9e5402da5b163045da"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
9489
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:08 GMT
21070560103310_ma_002_N_org.jpg
images.baycrews.jp/itemimages/i/21/070/560/
7 KB
8 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/070/560/21070560103310_ma_002_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
8f7329b940fb2b3640f385531cbb078d12756854a50e247023e79df8eabb5b12

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Wed, 24 Feb 2021 09:54:07 GMT
server
Akamai Image Server
etag
"fb0a6f917dafff2a399b3f66b3b3c0c5"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
7448
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:08 GMT
21030510002010_ma_010_N_org.jpg
images.baycrews.jp/itemimages/i/21/030/510/
6 KB
6 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/030/510/21030510002010_ma_010_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
029ed6daff2ac61d9d98ebf3b0c2b678099cb8c0db6580f16bcf5ca50611c5da

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Wed, 24 Feb 2021 04:12:22 GMT
server
Akamai Image Server
etag
"db8d63a355898f7b1cc0c8b83dddbf6b"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
5702
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:08 GMT
21080200462110_ma_040_N_org.jpg
images.baycrews.jp/itemimages/i/21/080/200/
6 KB
7 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/080/200/21080200462110_ma_040_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
30983593c3b77d120a15d7333846e3e8764eb890adba33df63b3e4bcbd1bdf1d

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Fri, 26 Feb 2021 02:22:09 GMT
server
Akamai Image Server
etag
"8b50da9d95d09a3e43b7cd6ae196240c"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
6644
expires
Sat, 27 Feb 2021 13:54:08 GMT
20060900601140_ma_040_N_org.jpg
images.baycrews.jp/itemimages/i/20/060/900/
10 KB
10 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/20/060/900/20060900601140_ma_040_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
865d7d9466bcce8a31293867e16138344c5042592d6262801e5bfb50c68d92c8

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Fri, 22 Jan 2021 04:40:39 GMT
server
Akamai Image Server
etag
"1a7c5d30d1f9cc108ebb7ebf9017de2d"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
9748
expires
Sat, 27 Feb 2021 13:54:08 GMT
21010560201710_ma_001_N_org.jpg
images.baycrews.jp/itemimages/i/21/010/560/
8 KB
8 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/010/560/21010560201710_ma_001_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
94591a01594ad86b0d3cb165439e854ff5cacc52f6271ba2946c5cc55c032121

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Tue, 19 Jan 2021 14:02:46 GMT
server
Akamai Image Server
etag
"a5008486cae3742c4c8ed844a082aae0"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
8446
expires
Sat, 27 Feb 2021 13:54:08 GMT
21090560000910_ma_007_N_org.jpg
images.baycrews.jp/itemimages/i/21/090/560/
9 KB
10 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/090/560/21090560000910_ma_007_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
d81609c3625fcd1905e46062eef49194b3d529ae56e44854334d8ee9354ac1fa

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Wed, 24 Feb 2021 03:40:23 GMT
server
Akamai Image Server
etag
"6aa3d11dc768e270850e1f678c41face"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
9689
expires
Sat, 27 Feb 2021 13:54:08 GMT
21040462103110_ma_044_N_org.jpg
images.baycrews.jp/itemimages/i/21/040/462/
6 KB
6 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/040/462/21040462103110_ma_044_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
93bd5a0e65a1897c0fd2a31ae368b65fe2d9aad13a2a5a186578d98f84eea6cc

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Thu, 25 Feb 2021 03:56:27 GMT
server
Akamai Image Server
etag
"8f4f848f67d8badabd042c048140150d"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
6298
expires
Sat, 27 Feb 2021 13:54:08 GMT
21093230005210_ma_016_N_org.jpg
images.baycrews.jp/itemimages/i/21/093/230/
7 KB
7 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/093/230/21093230005210_ma_016_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
e25beb2604f643113077c9c23574520e47407aa747c1bda940b064d6307c615a

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Thu, 25 Feb 2021 09:12:06 GMT
server
Akamai Image Server
etag
"06fec370ff4c252210385f9e3eda31f4"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
7316
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:08 GMT
21070560202010_ma_001_N_org.jpg
images.baycrews.jp/itemimages/i/21/070/560/
7 KB
8 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/070/560/21070560202010_ma_001_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
2f3b2d76269edaa148afb9989efa6cb4f2baf6941225da46f4fa6d092132ae9e

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:08 GMT
last-modified
Wed, 24 Feb 2021 05:32:12 GMT
server
Akamai Image Server
etag
"9fb0dbc09d20bc4e9e4f9e908d265db9"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
7608
expires
Sat, 27 Feb 2021 13:54:08 GMT
top
baycrews.jp/web-api/v1/banner/
15 KB
2 KB
XHR
General
Full URL
https://baycrews.jp/web-api/v1/banner/top?_=1614430447993
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/js/lib/jquery-2.2.0.min.js?v=20210224013704
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
063d466430cc9d86a54c9ef90bbd4b918322cf5ac8cf557833dc9b4ae3b6b6c7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Accept
application/json, text/javascript, */*; q=0.01
Referer
https://baycrews.jp/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:10 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
nginx
x-amzn-trace-id
Root=1-603a40f1-30a44ac61d7abc75559e3712
x-frame-options
SAMEORIGIN
content-type
application/json
cache-control
no-cache, private
server-timing
cdn-cache; desc=MISS, edge; dur=1048, origin; dur=83
vary
User-Agent, Accept-Encoding
content-length
1794
x-xss-protection
1; mode=block
x-request-id
7b7302b015a09cbd0b01f9973ced86dd
gtm.js
www.googletagmanager.com/
249 KB
56 KB
Script
General
Full URL
https://www.googletagmanager.com/gtm.js?id=GTM-KC52B6
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:827::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
2e019bd226878c6bde4ebe330e11af03ce15ba1b221a9ce31e2d4fa6d8888d22
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:09 GMT
content-encoding
br
server
Google Tag Manager
access-control-allow-headers
Cache-Control
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, max-age=900
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
strict-transport-security
max-age=31536000; includeSubDomains
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
57546
x-xss-protection
0
expires
Sat, 27 Feb 2021 12:54:09 GMT
tag.js
s.yjtag.jp/
37 KB
13 KB
Script
General
Full URL
https://s.yjtag.jp/tag.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:2156:6000:8:dcbf:c740:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3ea1d47e294e438851d775f2eca7352b4d03cf662e3ad9410f18bae663a380e5

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

x-amz-version-id
pwVJ8CZ5CzxJk0oranYXZm0CJzsUHSFZ
content-encoding
gzip
last-modified
Mon, 09 Nov 2020 01:50:12 GMT
server
AmazonS3
age
8427
etag
W/"830cee037cbd2937feb368104dc9a35f"
vary
Accept-Encoding
x-cache
Hit from cloudfront
p3p
CP=NOI DSP COR NID
via
1.1 9ab847fabb8c9edbd39cff57c2a2f4c0.cloudfront.net (CloudFront)
cache-control
public, max-age=14400
date
Sat, 27 Feb 2021 10:33:42 GMT
x-amz-cf-pop
FRA50-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
x_fVdIQTI0FPsxfhhoOs4b820huJpXvhJ0DJOzx6cxwQ-uFlKxDrfQ==
browsinghistory
baycrews.jp/web-api/v1/
42 B
2 KB
XHR
General
Full URL
https://baycrews.jp/web-api/v1/browsinghistory
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/js/lib/jquery-2.2.0.min.js?v=20210224013704
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
87843ae8d6564b6103261f9d77ed90a3bfba705c8b2fccd7a725a4f8cfd5205f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Accept
application/json, text/javascript, */*; q=0.01
Referer
https://baycrews.jp/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:09 GMT
x-content-type-options
nosniff
server
nginx
x-amzn-trace-id
Root=1-603a40f1-093ea1ea2cd7440b77895be6
x-frame-options
SAMEORIGIN
content-type
application/json
cache-control
no-cache, private
server-timing
cdn-cache; desc=MISS, edge; dur=235, origin; dur=24
vary
User-Agent
content-length
42
x-xss-protection
1; mode=block
x-request-id
f0c154b28f1e623331336d4422144439
recommend
baycrews.silveregg.net/pycre5/jsonp/
10 KB
10 KB
Script
General
Full URL
https://baycrews.silveregg.net/pycre5/jsonp/recommend?merch=baycrews&cat=item_women&cat=item_unisex&callback=silverEggRecommendDefault&num=10&spec=pc1111&cookie=blank&true=silverEggRecommendDefault&_=1614430447994
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/js/lib/jquery-2.2.0.min.js?v=20210224013704
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.114.70.18 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-13-114-70-18.ap-northeast-1.compute.amazonaws.com
Software
Silveregg/Suite /
Resource Hash
68a20e9893e64e59c6689cb8491903d19b733082f9a592cd27af694ef6ea03ec

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-store
date
Sat, 27 Feb 2021 12:54:10 GMT
cache-control
private, no-cache, must-revalidate, max-age=0
server
Silveregg/Suite
p3p
CP="ALL DSP COR CURa OUR BUS"
content-type
application/json
recommend
baycrews.silveregg.net/pycre5/jsonp/
10 KB
10 KB
Script
General
Full URL
https://baycrews.silveregg.net/pycre5/jsonp/recommend?merch=baycrews&spec=pc1112&num=10&cat=item_men&cat=item_unisex&cookie=blank&callback=silverEggRecommendDefaultSecondary&true=silverEggRecommendDefaultSecondary&_=1614430447995
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/js/lib/jquery-2.2.0.min.js?v=20210224013704
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.114.70.18 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-13-114-70-18.ap-northeast-1.compute.amazonaws.com
Software
Silveregg/Suite /
Resource Hash
55114b2aff6696106fc192789f23627bc6edc647d0c50e6e43087785b3b3619b

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-store
date
Sat, 27 Feb 2021 12:54:10 GMT
cache-control
private, no-cache, must-revalidate, max-age=0
server
Silveregg/Suite
p3p
CP="ALL DSP COR CURa OUR BUS"
content-type
application/json
tag
yjtag.yahoo.co.jp/
14 KB
4 KB
Script
General
Full URL
https://yjtag.yahoo.co.jp/tag?site=8CRQDRF%2CjhbVWaa&referrer=https%3A%2F%2Fbaycrews.jp%2F&H=-l73jh5
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
183.79.113.122 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
/
Resource Hash
50002963bcf0d6cc08272bc01eea9bb29ededca5353c70f1aa06b3bb0ec62829
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 27 Feb 2021 12:54:10 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Age
0
ETag
603cbcc53221d678bddb8811f4da9645
vary
accept-encoding
P3P
policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control
private, must-revalidate
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
text/javascript
X-BT-RequestId
e26418e0-78fa-11eb-acd3-0000ac1c496c
script
checkout-api.worldshopping.jp/v1/
437 KB
131 KB
Script
General
Full URL
https://checkout-api.worldshopping.jp/v1/script?token=baycrews_jp
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-KC52B6
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.32.24.51 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-32-24-51.fra56.r.cloudfront.net
Software
/
Resource Hash
33cb1c6d9c3059872e8c6e5016cb752517d0997ae314f263dfeec8e2b85fe097

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:10 GMT
via
1.1 df792ea3bbbe656e2f5c7b61aa85cc47.cloudfront.net (CloudFront), 1.1 6c63b8e5a6627b953ced3e530ce1b09d.cloudfront.net (CloudFront)
x-amz-cf-pop
TXL52-C1, FRA56-C2
x-amzn-requestid
1a94978e-249a-41f9-a7cd-89a312bd90ff
vary
Accept-Encoding
x-cache
Miss from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
private, no-store, no-cache, must-revalidate
x-amzn-trace-id
Root=1-603a40f2-0c2a18bc0ee0bfe913c61deb
content-encoding
gzip
x-amz-apigw-id
bZ8V2HofNjMFdFQ=
x-amz-cf-id
WSZ315hLhJQI0fKlxeew8XJAPwbAgc9HhacfCeyL1EAMqh0Ug8ZvwQ==
js
www.googletagmanager.com/gtag/
137 KB
53 KB
Script
General
Full URL
https://www.googletagmanager.com/gtag/js?id=G-LK092ZYXP1&l=dataLayer&cx=c
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-KC52B6
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:80f::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
465f78e8e233e11e3f5aa7c94f9d3c47916d72cc9888c15261bf8a255abd604e
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:09 GMT
content-encoding
br
server
Google Tag Manager
access-control-allow-headers
Cache-Control
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, max-age=900
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
strict-transport-security
max-age=31536000; includeSubDomains
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
53737
x-xss-protection
0
expires
Sat, 27 Feb 2021 12:54:09 GMT
analytics.js
www.google-analytics.com/
46 KB
19 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-KC52B6
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80f::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
0f3be44690ae9914ae3e47b7752e1bdea316f09938e9094f99e0de19ccd8987a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 05 Feb 2021 21:33:27 GMT
server
Golfe2
age
3093
date
Sat, 27 Feb 2021 12:02:36 GMT
vary
Accept-Encoding
content-type
text/javascript
cache-control
public, max-age=7200
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
18980
expires
Sat, 27 Feb 2021 14:02:36 GMT
tracker.js
static.karte.io/libs/
267 KB
80 KB
Script
General
Full URL
https://static.karte.io/libs/tracker.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
143.204.97.88 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-97-88.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
17ec06cb0e9751f1cca2eb8515b75d00123b6f23e442a0dec8b4df3c124d39da

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:49:32 GMT
Content-Encoding
gzip
Connection
keep-alive
Last-Modified
Thu, 25 Feb 2021 01:19:08 GMT
Server
AmazonS3
Age
277
ETag
W/"d176f503bad1c9e283d13ebb06419120"
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 a148356b14492df0e216c234ac2c2308.cloudfront.net (CloudFront)
Cache-Control
max-age=300
Transfer-Encoding
chunked
X-Amz-Cf-Pop
FRA50-C1
X-Amz-Cf-Id
6ukD57kzsNpgjQxtPwik5mnZf5YpJMBncMoa-Snxje2akFNE1pKeKA==
smartica_dmp.js
js.smartica.jp/baycrews_new/
3 KB
3 KB
Script
General
Full URL
https://js.smartica.jp/baycrews_new/smartica_dmp.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.61.33 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
c02c210804f06662c5a864a0d8c62d27757a051183b74b1bbd50eedbb9759f66

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 04:01:57 GMT
Via
1.1 3dd91613764eafe7ad199013ce202443.cloudfront.net (CloudFront)
Last-Modified
Fri, 09 Sep 2016 03:54:35 GMT
Server
AmazonS3
Age
31932
ETag
"0feb64cba312cfa98bd0e0f318eb7788"
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Connection
keep-alive
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Content-Length
3052
X-Amz-Cf-Id
cNg7dJ7T5szL3seu-LqLibE6EQTaoFE5CNz1Jy7bQUNpXP-5Cgna1g==
pageviews
in.treasuredata.com/js/v3/event/weblog_db/
89 B
515 B
Script
General
Full URL
https://in.treasuredata.com/js/v3/event/weblog_db/pageviews?api_key=9537%2F17111f959c238421516f9592b48eb3f0d5d6ad51&modified=1614430449369&data=eyJ0ZF9nbG9iYWxfaWQiOiJ0ZF9nbG9iYWxfaWQiLCJ1SWQiOiJ1bmRlZmluZWQiLCJrYXJ0ZUlkIjoidW5kZWZpbmVkIiwicHJvZHVjdElkIjoibnVsbCIsIml0ZW1OYW1lIjoibnVsbCIsImJyYW5kTmFtZSI6Im51bGwiLCJjb250ZW50VXJsIjoiIiwidGRfdmVyc2lvbiI6IjEuOS4yIiwidGRfY2xpZW50X2lkIjoiNjcwZjYxZDYtNDhiOS00MDJjLWFmODktNzVkZjBkNmQxNGRlIiwidGRfY2hhcnNldCI6InV0Zi04IiwidGRfbGFuZ3VhZ2UiOiJlbi11cyIsInRkX2NvbG9yIjoiMjQtYml0IiwidGRfc2NyZWVuIjoiMTYwMHgxMjAwIiwidGRfdmlld3BvcnQiOiIxNjAweDEyMDAiLCJ0ZF90aXRsZSI6IuODmeOCpOOCr%2BODq%2BODvOOCuuOBruODleOCoeODg%2BOCt%2BODp%2BODs%2BmAmuiyqSAtIEJBWUNSRVfigJlTIFNUT1JFIiwidGRfZGVzY3JpcHRpb24iOiLjg5njgqTjgq%2Fjg6vjg7zjgrrjga7lhazlvI%2FpgJrosqnjgrXjgqTjg4jjgIJKT1VSTkFMIFNUQU5EQVJE44CBSUVOQeOAgUVESUZJQ0XjgIFTcGljayBhbmQgU3BhbuOAgURldXhpZW1lIENsYXNzZeOBquOBqeOBruaWsOedgOOCouOCpOODhuODoOOChOOCueODiuODg%2BODl%2BOCkuavjuaXpeabtOaWsOOBp%2BOBlOe0ueS7i%2BOAguWFqOWTgemAgeaWmeeEoeaWmeOAgeacgOefree%2FjOaXpeOBiuWxiuOBkeOAgumAmuW4uOODneOCpOODs%2BODiDMl6YKE5YWD44CC44Od44Kk44Oz44OI44Gq44Gp44Gu5Lya5ZOh44K144O844OT44K544Gv5bqX6IiX5YWx6YCa44Gn44GU5Yip55So44GE44Gf44Gg44GR44G%2B44GZ44CCIiwidGRfdXJsIjoiaHR0cHM6Ly9iYXljcmV3cy5qcC8iLCJ0ZF91c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTRfNSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzgzLjAuNDEwMy42MSBTYWZhcmkvNTM3LjM2IiwidGRfcGxhdGZvcm0iOiJMaW51eCB4ODZfNjQiLCJ0ZF9ob3N0IjoiYmF5Y3Jld3MuanAiLCJ0ZF9wYXRoIjoiLyIsInRkX3JlZmVycmVyIjoiIiwidGRfaXAiOiJ0ZF9pcCIsInRkX2Jyb3dzZXIiOiJ0ZF9icm93c2VyIiwidGRfYnJvd3Nlcl92ZXJzaW9uIjoidGRfYnJvd3Nlcl92ZXJzaW9uIiwidGRfb3MiOiJ0ZF9vcyIsInRkX29zX3ZlcnNpb24iOiJ0ZF9vc192ZXJzaW9uIn0%3D&callback=TreasureJSONPCallback0
Requested by
Host: cdn.treasuredata.com
URL: https://cdn.treasuredata.com/sdk/1.9.2/td.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.204.47.1 , United States, ASN14618 (AMAZON-AES, US),
Reverse DNS
ec2-52-204-47-1.compute-1.amazonaws.com
Software
/
Resource Hash
3aa9f235c06f8205b4b91091c02bbb8c8a23b12fafa257f68aecc4be22e8b7c0
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Strict-Transport-Security
max-age=31536000
Connection
keep-alive
P3P
CP="This is not a P3P policy! See https://docs.treasuredata.com/articles/p3p"
Date
Sat, 27 Feb 2021 12:54:09 GMT
Content-Length
89
Content-Type
application/javascript
lt.js
d.line-scdn.net/n/line_tag/public/release/v1/
32 KB
10 KB
Script
General
Full URL
https://d.line-scdn.net/n/line_tag/public/release/v1/lt.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.232.182 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-232-182.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
261595338fd9066332abdbde9ab8f2cf826985e226e2d03904777799e54c9665

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:09 GMT
content-encoding
gzip
last-modified
Tue, 10 Nov 2020 06:15:35 GMT
server
nginx
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=629
accept-ranges
bytes
content-length
9865
expires
Sat, 27 Feb 2021 13:04:38 GMT
ec.js
www.google-analytics.com/plugins/ua/
3 KB
1 KB
Script
General
Full URL
https://www.google-analytics.com/plugins/ua/ec.js
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:827::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
058ed961bfe422af7bfc65865f4c08531ec8ace995f8a1ec560a46581cb7712c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:43:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 22 Oct 2019 18:15:00 GMT
server
sffe
age
653
vary
Accept-Encoding
content-type
text/javascript
cache-control
public, max-age=3600
cross-origin-resource-policy
cross-origin
accept-ranges
bytes
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1306
x-xss-protection
0
expires
Sat, 27 Feb 2021 13:43:16 GMT
collect
stats.g.doubleclick.net/j/
4 B
85 B
XHR
General
Full URL
https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j88&tid=UA-53738514-61&cid=158121857.1614430449&jid=907642594&gjid=655623210&_gid=1206226139.1614430449&_u=aHBAgEALAAAAAE~&z=2032852175
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c1b::9d Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
84e01419bd81f32ac6df0f75f49c604fda9172000a3ae432b3c47b2a6a712d80
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
date
Sat, 27 Feb 2021 12:54:09 GMT
content-type
text/plain
access-control-allow-origin
https://baycrews.jp
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
4
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
122 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j88&a=71325334&t=pageview&_s=1&dl=https%3A%2F%2Fbaycrews.jp%2F&ul=en-us&de=UTF-8&dt=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=aHBAgEAL~&jid=907642594&gjid=655623210&cid=158121857.1614430449&tid=UA-53738514-61&_gid=1206226139.1614430449&gtm=2wg2h0KC52B6&cd29=&cd31=WOMEN&cd28=158121857.1614430449&z=1006418281
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:827::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 26 Feb 2021 20:08:00 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
60369
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
analytics.google.com/g/
0
348 B
Other
General
Full URL
https://analytics.google.com/g/collect?v=2&tid=G-LK092ZYXP1&gtm=2oe2h0&_p=71325334&sr=1600x1200&_gaz=1&ul=en-us&cid=158121857.1614430449&_s=1&dl=https%3A%2F%2Fbaycrews.jp%2F&dt=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&sid=1614430449&sct=1&seg=0&en=page_view&_fv=1&_ss=1
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtag/js?id=G-LK092ZYXP1&l=dataLayer&cx=c
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:811::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:09 GMT
server
Golfe2
content-type
text/plain
access-control-allow-origin
https://baycrews.jp
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
stats.g.doubleclick.net/g/
0
335 B
Other
General
Full URL
https://stats.g.doubleclick.net/g/collect?v=2&tid=G-LK092ZYXP1&cid=158121857.1614430449&gtm=2oe2h0&aip=1
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtag/js?id=G-LK092ZYXP1&l=dataLayer&cx=c
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:400c:c1b::9a Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:09 GMT
server
Golfe2
content-type
text/plain
access-control-allow-origin
https://baycrews.jp
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
ga-audiences
www.google.de/ads/
42 B
107 B
Image
General
Full URL
https://www.google.de/ads/ga-audiences?v=1&t=sr&slf_rd=1&_r=4&tid=G-LK092ZYXP1&cid=158121857.1614430449&gtm=2oe2h0&aip=1&z=533438586
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80f::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:09 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
ga-audiences
www.google.com/ads/
42 B
107 B
Image
General
Full URL
https://www.google.com/ads/ga-audiences?t=sr&aip=1&_r=4&slf_rd=1&v=1&_v=j88&tid=UA-53738514-61&cid=158121857.1614430449&jid=907642594&_u=aHBAgEALAAAAAE~&z=1738074482
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80e::2004 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:09 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
ga-audiences
www.google.de/ads/
42 B
483 B
Image
General
Full URL
https://www.google.de/ads/ga-audiences?t=sr&aip=1&_r=4&slf_rd=1&v=1&_v=j88&tid=UA-53738514-61&cid=158121857.1614430449&jid=907642594&_u=aHBAgEALAAAAAE~&z=1738074482
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:82a::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:09 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
tag.gif
tr.line.me/
43 B
425 B
Image
General
Full URL
https://tr.line.me/tag.gif?b_id=acb24eca-c247-4047-9edf-a730b24115df&b_u=https%3A%2F%2Fbaycrews.jp%2F&b_d=baycrews.jp&b_p=%2F&b_t=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&c_t=lap&t_id=9cb40e73-ed4e-4595-85f2-b6a00a3d497b&s_id=6d86e933-5a5453d3&x4=1&e=pv&v=3.0.0&_t=1614430449540
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
203.104.153.77 , Japan, ASN38631 (LINE LINE Corporation, JP),
Reverse DNS
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:10 GMT
Cache-Control
private, no-store, no-cache, must-revalidate
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Connection
keep-alive
Content-Length
43
Content-Type
image/gif
access
api.smartica.jp/2/baycrews/log/
0
224 B
Script
General
Full URL
https://api.smartica.jp/2/baycrews/log/access?callback=jQuery220018542587490897344_1614430447996&session_id=Tva3iYAzCz1aCruMeklmBpPi34Uv5y2L2HoXKHlq&jsver=20160909&_=1614430447997
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/js/lib/jquery-2.2.0.min.js?v=20210224013704
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.250.85.92 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-250-85-92.ap-northeast-1.compute.amazonaws.com
Software
nginx/1.2.6 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Sat, 27 Feb 2021 12:54:10 GMT
Server
nginx/1.2.6
Connection
keep-alive
Access-Control-Allow-Headers
*
Access-Control-Allow-Methods
POST, GET, OPTIONS
custom_f6092410db90d76ab16e93cb345f05df.js
sync-tag.karte.io/
6 KB
6 KB
Script
General
Full URL
https://sync-tag.karte.io/custom_f6092410db90d76ab16e93cb345f05df.js
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:20d7:1a00:d:5c6f:d380:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
62432f03bfba535949c6b29a4cd2e1cad21d98ff35a4b9c93a8950e37e77b353

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
via
1.1 c3ee0b759208fdcbade39e3e283300c7.cloudfront.net (CloudFront)
last-modified
Mon, 22 Feb 2021 09:20:03 GMT
server
AmazonS3
x-amz-cf-pop
ZAG50-C1
etag
"c0ea76494a74b03ee153cb0cc0b53f9a"
x-cache
Miss from cloudfront
x-amz-version-id
5Y0ik7m9ZjBrPHln87v2fUcyyaXkfFe.
cache-control
max-age=300
accept-ranges
bytes
content-type
text/javascript
content-length
6258
x-amz-cf-id
bs63ytjzrGmRAWMlvMNp1zt4rMiG75ZwjcGjC504Ue0tHjmMSwmu5A==
recommend
baycrews.silveregg.net/pycre5/jsonp/
22 KB
23 KB
Script
General
Full URL
https://baycrews.silveregg.net/pycre5/jsonp/recommend?merch=baycrews&spec=pc1001&xcat=snap&xcat=blog&xcat=feature&xcat=news&num=24&cookie=blank&callback=jQuery220018542587490897344_1614430447998&_=1614430447999
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/js/lib/jquery-2.2.0.min.js?v=20210224013704
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.114.70.18 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-13-114-70-18.ap-northeast-1.compute.amazonaws.com
Software
Silveregg/Suite /
Resource Hash
70d894770ceb1435685ac21716605fe3751e4c54b462317c202ab53d2f38db27

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-store
date
Sat, 27 Feb 2021 12:54:10 GMT
cache-control
private, no-cache, must-revalidate, max-age=0
server
Silveregg/Suite
p3p
CP="ALL DSP COR CURa OUR BUS"
content-type
application/json
track
t.karte.io/
48 KB
8 KB
XHR
General
Full URL
https://t.karte.io/track
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
130.211.31.19 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
19.31.211.130.bc.googleusercontent.com
Software
/ Express
Resource Hash
d37ef9a3466f44f368086ece3aef8b9da14b2bed9e3d4a810100770491f1b709

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

date
Sat, 27 Feb 2021 12:54:10 GMT
content-encoding
gzip
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept
x-powered-by
Express
vary
Accept-Encoding
content-type
application/json; charset=utf-8
access-control-allow-origin
*
alt-svc
clear
via
1.1 google
hero_loading.gif
baycrews.jp/assets/img/common/
3 KB
4 KB
Image
General
Full URL
https://baycrews.jp/assets/img/common/hero_loading.gif
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/assets/css/common.css?v=20210224013704
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.109.78.166 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a104-109-78-166.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
0c4e944f147c56b68ec2f689668ea25e31b2d883db18b0f84ca5f703aacda6d0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/assets/css/common.css?v=20210224013704
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:10 GMT
x-content-type-options
nosniff
last-modified
Wed, 24 Feb 2021 01:35:08 GMT
server
nginx
etag
"6035ad4c-d51"
x-frame-options
SAMEORIGIN
content-type
image/gif
cache-control
max-age=600
server-timing
edge; dur=3, origin; dur=269, cdn-cache; desc=MISS
accept-ranges
bytes
vary
User-Agent
content-length
3409
x-xss-protection
1; mode=block
expires
Sat, 27 Feb 2021 13:04:10 GMT
ytag.js
s.yimg.jp/images/listing/tool/cv/
23 KB
7 KB
Script
General
Full URL
https://s.yimg.jp/images/listing/tool/cv/ytag.js
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
183.79.248.252 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
ATS /
Resource Hash
fcb5ee7a8fcec48a11b7adf420332a9ff2cf49f99558795d6b7b810618573e35

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

ats-carp-promotion
1
date
Sat, 27 Feb 2021 12:53:28 GMT
content-encoding
gzip
last-modified
Wed, 30 Sep 2020 06:06:44 GMT
server
ATS
age
42
vary
Accept-Encoding
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge2108.img.djm.yahoo.co.jp (ApacheTrafficServer [cRs f ]), http/1.1 edge2167.img.djm.yahoo.co.jp (ApacheTrafficServer [cRs f ])
cache-control
public, max-age=600
accept-ranges
bytes
content-type
application/javascript
content-length
6746
expires
Sat, 27 Feb 2021 13:03:28 GMT
main_pc.jpg
feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPR0V6TTNoemRtZG9kMll4ZFd4NWREY3daSGg2YTJOa1lYZDRNeTgzTWpNMFkyVTRZek0zTW...
Redirect Chain
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBdEhFIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--834f4552935770a7db993fd543eff1e1d35fe...
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPR0V6TTNoemRtZG9kMll4ZFd4NWREY3daSGg2YTJOa1lYZDRNeTgzTWpNMFkyVT...
39 KB
39 KB
Image
General
Full URL
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPR0V6TTNoemRtZG9kMll4ZFd4NWREY3daSGg2YTJOa1lYZDRNeTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWJXRnBibDl3WXk1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KMjFoYVc1ZmNHTXVhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToxMS4xMjBaIiwicHVyIjoiYmxvYl9rZXkifX0=--b8a9a8af9aec30626ec749b07c3a4c354f8dd393/main_pc.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22main_pc.jpg%22%3B+filename%2A%3DUTF-8%27%27main_pc.jpg
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:2800:c:6dc1:1600:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx + Phusion Passenger 6.0.2 / Phusion Passenger 6.0.2
Resource Hash
f73f6196f7af66ce888d6eeb5431242b1320baf1baeba6691ec7054c988da752
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
200 OK
content-disposition
inline; filename="main_pc.jpg"; filename*=UTF-8''main_pc.jpg
content-length
39503
x-xss-protection
1; mode=block
x-request-id
d1c2871f-6666-4136-9809-9aa3d4e4f5ac
x-runtime
0.001028
referrer-policy
strict-origin-when-cross-origin
last-modified
Fri, 19 Feb 2021 12:56:14 GMT
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=0, private, must-revalidate
x-amz-cf-id
VVgN2ijWcbYY8A_ejK-ajpFj1xiW5bozfSs4IrLC5izpAlg8i8Ptyg==

Redirect headers

date
Sat, 27 Feb 2021 12:54:11 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
302 Found
x-xss-protection
1; mode=block
x-request-id
20d32e50-a83d-4b17-ba3a-b137f1b26d1f
x-runtime
0.005347
referrer-policy
strict-origin-when-cross-origin
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/html; charset=utf-8
location
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPR0V6TTNoemRtZG9kMll4ZFd4NWREY3daSGg2YTJOa1lYZDRNeTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWJXRnBibDl3WXk1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KMjFoYVc1ZmNHTXVhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToxMS4xMjBaIiwicHVyIjoiYmxvYl9rZXkifX0=--b8a9a8af9aec30626ec749b07c3a4c354f8dd393/main_pc.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22main_pc.jpg%22%3B+filename%2A%3DUTF-8%27%27main_pc.jpg
cache-control
max-age=300, private
x-amz-cf-id
0Z69ERhrsghvkSKgTwAbg-qh2xMzsL-J8A1BI7_gHX6EBPcs35nSFg==
21030510002110_ma_045_N_org.jpg
images.baycrews.jp/itemimages/i/21/030/510/
7 KB
7 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/030/510/21030510002110_ma_045_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
6f8945a31e0bb0eedeacadcc293d235df840e24368541ef48ab138fcfc2a14d8

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
last-modified
Fri, 19 Feb 2021 02:58:19 GMT
server
Akamai Image Server
etag
"f218e0360cf814f77439f4851c27c341"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
6945
expires
Sat, 27 Feb 2021 13:54:11 GMT
21070711219010_ma_010_N_org.jpg
images.baycrews.jp/itemimages/i/21/070/711/
7 KB
8 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/070/711/21070711219010_ma_010_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
80e476c2f6fd2e8b30044ddf41ba2b41aad4cb1c512f54ce56f3fc27399769f0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
last-modified
Fri, 26 Feb 2021 11:44:11 GMT
server
Akamai Image Server
etag
"953cfefaa659c6df7b6ad085602f9b6a"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
7463
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:12 GMT
21050091300310_ma_044_N_org.jpg
images.baycrews.jp/itemimages/i/21/050/091/
6 KB
6 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/050/091/21050091300310_ma_044_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
70ae2b0eae4fc5838491c10f487e137e9377670ae1d61f67d27dc0c38e122a84

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
last-modified
Fri, 22 Jan 2021 05:18:22 GMT
server
Akamai Image Server
etag
"d84473e0b6afbea3d1ef198e554b0b50"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
5675
expires
Sat, 27 Feb 2021 13:54:11 GMT
20050092600410_ma_010_N_org.jpg
images.baycrews.jp/itemimages/i/20/050/092/
7 KB
7 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/20/050/092/20050092600410_ma_010_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
0401d604913b926155dd9d7930f303c5fa0c32a231cb4060cec81fb0862fa019

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
last-modified
Mon, 30 Mar 2020 08:04:50 GMT
server
Akamai Image Server
etag
"ff674193e640e689b68d3e3070142bf0"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
6987
expires
Sat, 27 Feb 2021 13:54:12 GMT
20051400700040_ma_034_N_org.jpg
images.baycrews.jp/itemimages/i/20/051/400/
8 KB
8 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/20/051/400/20051400700040_ma_034_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
51ac6c42931897c845964ce3df4507453ee0e90675bb7bcc4fb5086ab371a7ce

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
last-modified
Fri, 29 Jan 2021 04:02:20 GMT
server
Akamai Image Server
etag
"9071e246f5cbe7d2fde77f6ee593371a"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
7996
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:12 GMT
21051912313010_ma_010_N_org.jpg
images.baycrews.jp/itemimages/i/21/051/912/
6 KB
6 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/051/912/21051912313010_ma_010_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
bebde36b7892da3491457af3c3f1987429fa81e07089052e4fa28d901130f20e

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
last-modified
Fri, 08 Jan 2021 00:56:07 GMT
server
Akamai Image Server
etag
"5c7ddf8914da0873e8e25f54b9360b9f"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
6444
expires
Sat, 27 Feb 2021 13:54:11 GMT
21051400709010_ma_016_N_org.jpg
images.baycrews.jp/itemimages/i/21/051/400/
13 KB
13 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/051/400/21051400709010_ma_016_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
a36bdcd117dcfd22799e7757199ca27c12f56e21438123c99b3a4e6221e791c8

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
last-modified
Thu, 24 Dec 2020 09:10:10 GMT
server
Akamai Image Server
etag
"87f83cde9eb1b0171e27d95d8bb1a22d"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
12929
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:11 GMT
21093463002710_ma_040_N_org.jpg
images.baycrews.jp/itemimages/i/21/093/463/
9 KB
9 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/093/463/21093463002710_ma_040_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
5f4514e4f4f8a20bf05dbd11e55aa5862331f9a5a6e8e1b3ca779795f954ee09

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
last-modified
Wed, 17 Feb 2021 08:04:21 GMT
server
Akamai Image Server
etag
"ce93977460bec3a4b72228fe977acca4"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
9075
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:11 GMT
21070910001310_ma_007_N_org.jpg
images.baycrews.jp/itemimages/i/21/070/910/
12 KB
12 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/070/910/21070910001310_ma_007_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
07debd9529f10df71890cd03639e00a930ac5225b7617601ba359776ed1319bb

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:10 GMT
last-modified
Mon, 22 Feb 2021 08:56:10 GMT
server
Akamai Image Server
etag
"1ae1cc3d14a88c52453eda2b17863053"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
12518
expires
Sat, 27 Feb 2021 13:54:10 GMT
track
t.karte.io/
699 B
798 B
XHR
General
Full URL
https://t.karte.io/track
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
130.211.31.19 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
19.31.211.130.bc.googleusercontent.com
Software
/ Express
Resource Hash
af10e93a231cfec5c9a51e15ab93cedd5f12f049109a7696f4d73da7d56efe37

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
via
1.1 google
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept
x-powered-by
Express
vary
Accept-Encoding
content-type
application/json; charset=utf-8
access-control-allow-origin
*
alt-svc
clear
content-length
699
tracker.widget.js
static.karte.io/libs/
221 KB
64 KB
XHR
General
Full URL
https://static.karte.io/libs/tracker.widget.js
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
143.204.97.88 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-97-88.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
252ed9643f62ed6f6737b18933cbcdc547def634b5fa93bb31b19429ea0af653

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:12 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
Transfer-Encoding
chunked
X-Cache
RefreshHit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 25 Feb 2021 01:19:08 GMT
Server
AmazonS3
ETag
W/"477ceea2d5139d8f3495382181c7229e"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET
Content-Type
application/javascript
Via
1.1 32e4d419823b7f8df8417a8b18c9602d.cloudfront.net (CloudFront)
Cache-Control
max-age=300
X-Amz-Cf-Id
ndQd8r-gFKvmtWSNCS9iyIK0Kd3zp6k6O5doh9HVGoFKy8w7l9eJFQ==
tracker.jquery.js
static.karte.io/libs/
83 KB
30 KB
XHR
General
Full URL
https://static.karte.io/libs/tracker.jquery.js
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
143.204.97.88 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-97-88.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
8cadf3c3a9253b0d06232619dc20082d865a3824667154df1429cd9bca7388ab

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:12 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
Transfer-Encoding
chunked
X-Cache
RefreshHit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 25 Feb 2021 01:19:08 GMT
Server
AmazonS3
ETag
W/"fd493063335f8b0d8aaa8754ad1cc2a9"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET
Content-Type
application/javascript
Via
1.1 5ad96647558bd4911f05189f8afefd98.cloudfront.net (CloudFront)
Cache-Control
max-age=300
X-Amz-Cf-Id
B2tWJ_Gl1Zhgqdtzl91gna-ThdkuM-bCXDf1D4iaxOUo6aLJe7BsTQ==
tracker.legacy.js
static.karte.io/libs/
366 KB
122 KB
XHR
General
Full URL
https://static.karte.io/libs/tracker.legacy.js
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
143.204.97.88 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-97-88.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
d1bbb32474281d29c10fe7d4bf4d8992937d209bad41108f1b62982fd5ea9d95

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:11 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 25 Feb 2021 01:19:08 GMT
Server
AmazonS3
ETag
W/"ae4f0227116d216d8b0a50821451a82c"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET
Content-Type
application/javascript
Via
1.1 d55780b776b171387055eca956ae29a9.cloudfront.net (CloudFront)
Cache-Control
max-age=300
X-Amz-Cf-Id
ZNOcAIo10-rnvg8S1ZRGzkLqOqyPV2hS-hRr94sPbLERsCjSuw8DWA==
track
t.karte.io/
67 B
165 B
XHR
General
Full URL
https://t.karte.io/track
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
130.211.31.19 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
19.31.211.130.bc.googleusercontent.com
Software
/ Express
Resource Hash
8211a66d98acea9b0cbdf87be9bef64a09f78a54c2b771669085fb9a84413cf8

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
via
1.1 google
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept
x-powered-by
Express
vary
Accept-Encoding
content-type
application/json; charset=utf-8
access-control-allow-origin
*
alt-svc
clear
content-length
67
truncated
/
240 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e47a4ae11cd9f9107548f55c7ea9a79d00dd659728dfd1d66804175e986f0ca9

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
text/javascript
geolocation
checkout-api.worldshopping.jp/v1/
44 B
486 B
XHR
General
Full URL
https://checkout-api.worldshopping.jp/v1/geolocation
Requested by
Host: checkout-api.worldshopping.jp
URL: https://checkout-api.worldshopping.jp/v1/script?token=baycrews_jp
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.32.24.51 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-32-24-51.fra56.r.cloudfront.net
Software
/
Resource Hash
4e9e987e00635d9c1c3b883806da3e8a1c225663d98d94ec5653107c9b637e6f

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
via
1.1 4f114016fe4d6c05531b0486ec2868be.cloudfront.net (CloudFront), 1.1 3d58896f901dbeed449603f5d2b4d9f1.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1, FRA56-C2
x-amzn-requestid
cc16db41-c803-426b-aca2-a5f3f069aa01
x-cache
Miss from cloudfront
content-type
application/json; charset=utf-8
access-control-allow-origin
*
x-amzn-trace-id
Root=1-603a40f4-2d429a1a1b8ef8921aae3a3e;Sampled=0
x-amz-apigw-id
bZ8WMEc6tjMFmwg=
content-length
44
x-amz-cf-id
c_IEgjkLhVbfb50dWTtcMQV4y8D-zZGlQYD44C0wBmHdAhEsVbzJ6A==
21030912102010_ma_007_N_org.jpg
images.baycrews.jp/itemimages/i/21/030/912/
5 KB
6 KB
Image
General
Full URL
https://images.baycrews.jp/itemimages/i/21/030/912/21030912102010_ma_007_N_org.jpg?resize=237%3A284
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.37.57.111 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-57-111.deploy.static.akamaitechnologies.com
Software
Akamai Image Server /
Resource Hash
584562c217f2f84d27a9a1c7f27e59b207d7d23f61e7341cb1eacf1d018af76b

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:11 GMT
last-modified
Fri, 22 Jan 2021 03:28:18 GMT
server
Akamai Image Server
etag
"c5c3f09b3f43826ca8d69407f563f448"
content-type
image/jpeg
cache-control
private, no-transform, max-age=3600
content-length
5455
x-akamai-im-skip-dlr
1
expires
Sat, 27 Feb 2021 13:54:11 GMT
602e3519a2df8b00118fa925::03_%E6%A8%AA%E5%B8%AF_982x66.jpg
img-cf.karte.io/image/
38 KB
39 KB
Image
General
Full URL
https://img-cf.karte.io/image/602e3519a2df8b00118fa925::03_%E6%A8%AA%E5%B8%AF_982x66.jpg
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:20eb:d800:d:1369:bf40:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
2fa3f8de3305324646d537eb888eec94a7390343562a87c7fa0e150f6ad5ed55

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 08:19:20 GMT
via
1.1 c3b74c81fdcb7942211a6c721efa13fd.cloudfront.net (CloudFront)
last-modified
Thu, 18 Feb 2021 09:36:26 GMT
server
AmazonS3
age
16492
etag
"91a6557c1c5aeca51f8f215d0f54b9ea"
x-cache
Hit from cloudfront
content-type
image/jpeg
x-amz-cf-pop
FRA2-C1
accept-ranges
bytes
content-length
39105
x-amz-cf-id
80j8pkW91PKZ-Hr0kWxj7YeMkckYwOexdFw7XFnhYM3jvMPrX5EWfw==
track
t.karte.io/
699 B
792 B
XHR
General
Full URL
https://t.karte.io/track
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
130.211.31.19 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
19.31.211.130.bc.googleusercontent.com
Software
/ Express
Resource Hash
af10e93a231cfec5c9a51e15ab93cedd5f12f049109a7696f4d73da7d56efe37

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

date
Sat, 27 Feb 2021 12:54:13 GMT
via
1.1 google
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept
x-powered-by
Express
vary
Accept-Encoding
content-type
application/json; charset=utf-8
access-control-allow-origin
*
alt-svc
clear
content-length
699
/
b92.yahoo.co.jp/search/
0
436 B
Script
General
Full URL
https://b92.yahoo.co.jp/search/?p=TU76EYC4RQ&label=&ref=https%3A%2F%2Fbaycrews.jp%2F&rref=&pt=&item=&cat=&price=&quantity=&r=1614430452.6973653&pvid=w9jx8c1mu1aklnq7hfr&tsyjad=0&_impl=ytag
Requested by
Host: s.yimg.jp
URL: https://s.yimg.jp/images/listing/tool/cv/ytag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
182.22.24.252 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1;mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
ATS
age
0
x-frame-options
SAMEORIGIN
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge1370.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
cache-control
private, no-cache, no-store, post-check=0, pre-check=0
content-type
text/javascript; charset=utf-8
vary
Accept-Encoding
x-xss-protection
1;mode=block
expires
-1
/
b92.yahoo.co.jp/search/
0
873 B
Script
General
Full URL
https://b92.yahoo.co.jp/search/?p=KNTM1GZW0G&label=&ref=https%3A%2F%2Fbaycrews.jp%2F&rref=&pt=&item=&cat=&price=&quantity=&r=1614430452.456795&pvid=w9jx8c1mu1aklnq7hfr&tsyjad=1614430452&_impl=ytag
Requested by
Host: s.yimg.jp
URL: https://s.yimg.jp/images/listing/tool/cv/ytag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
182.22.24.252 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1;mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
ATS
age
0
x-frame-options
SAMEORIGIN
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge1370.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
cache-control
private, no-cache, no-store, post-check=0, pre-check=0
content-type
text/javascript; charset=utf-8
vary
Accept-Encoding
x-xss-protection
1;mode=block
expires
-1
conversion_async.js
b97.yahoo.co.jp/pagead/
31 KB
13 KB
Script
General
Full URL
https://b97.yahoo.co.jp/pagead/conversion_async.js
Requested by
Host: s.yimg.jp
URL: https://s.yimg.jp/images/listing/tool/cv/ytag.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
182.22.30.220 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
419a8dcc6f3af9015af6256ec0711ef6a422fa222352df2372f33e0d8493c6e2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:13 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Age
0
P3P
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cross-Origin-Resource-Policy
cross-origin
Content-Disposition
attachment; filename="f.txt"
Connection
close
Content-Length
12348
X-XSS-Protection
0
Server
ATS
ETag
6918361082065719546
Content-Type
text/javascript; charset=UTF-8
Via
http/1.1 mscedge1004.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
Cache-Control
private, max-age=3600
Timing-Allow-Origin
*
Expires
Sat, 27 Feb 2021 12:54:13 GMT
/
b92.yahoo.co.jp/search/
0
437 B
Script
General
Full URL
https://b92.yahoo.co.jp/search/?p=UZZ9A0Q6F8&label=&ref=https%3A%2F%2Fbaycrews.jp%2F&rref=&pt=home&item=&cat=&price=&quantity=&r=1614430452.5143363&pvid=w9jx8c1mu1aklnq7hfr&tsyjad=1614430452&_impl=ytag
Requested by
Host: s.yimg.jp
URL: https://s.yimg.jp/images/listing/tool/cv/ytag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
182.22.24.252 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1;mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
ATS
age
0
x-frame-options
SAMEORIGIN
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge1370.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
cache-control
private, no-cache, no-store, post-check=0, pre-check=0
content-type
text/javascript; charset=utf-8
vary
Accept-Encoding
x-xss-protection
1;mode=block
expires
-1
lt.js
d.line-scdn.net/n/line_tag/public/release/v1/
32 KB
10 KB
Script
General
Full URL
https://d.line-scdn.net/n/line_tag/public/release/v1/lt.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.232.182 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-232-182.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
261595338fd9066332abdbde9ab8f2cf826985e226e2d03904777799e54c9665

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
content-encoding
gzip
last-modified
Tue, 10 Nov 2020 06:15:35 GMT
server
nginx
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=626
accept-ranges
bytes
content-length
9865
expires
Sat, 27 Feb 2021 13:04:38 GMT
/
b92.yahoo.co.jp/search/
0
437 B
Script
General
Full URL
https://b92.yahoo.co.jp/search/?p=K3AUP9Q3MP&label=&ref=https%3A%2F%2Fbaycrews.jp%2F&rref=&pt=&item=&cat=&price=&quantity=&r=1614430452.1880727&pvid=w9jx8c1mu1aklnq7hfr&tsyjad=1614430452&_impl=ytag
Requested by
Host: s.yimg.jp
URL: https://s.yimg.jp/images/listing/tool/cv/ytag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
182.22.24.252 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1;mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
ATS
age
0
x-frame-options
SAMEORIGIN
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge1370.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
cache-control
private, no-cache, no-store, post-check=0, pre-check=0
content-type
text/javascript; charset=utf-8
vary
Accept-Encoding
x-xss-protection
1;mode=block
expires
-1
js
www.googletagmanager.com/gtag/
98 KB
39 KB
Script
General
Full URL
https://www.googletagmanager.com/gtag/js?id=AW-996468360
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:827::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
0f7430df12c82ed5382b5302d8a736c6a495d7536a9029d0f22e05c06a08aa85
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
content-encoding
br
vary
Accept-Encoding
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
39434
x-xss-protection
0
last-modified
Sat, 27 Feb 2021 12:00:00 GMT
server
Google Tag Manager
strict-transport-security
max-age=31536000; includeSubDomains
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, max-age=900
access-control-allow-credentials
true
access-control-allow-headers
Cache-Control
expires
Sat, 27 Feb 2021 12:54:12 GMT
115184.ct.js
intljs.rmtag.com/
63 KB
21 KB
Script
General
Full URL
https://intljs.rmtag.com/115184.ct.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
34.102.147.248 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash
ca095159e8c36019251e797e4d225002779d43bd0ff515f7a0cdb7b6d6cdd3bb

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
content-encoding
gzip
last-modified
Sat, 27 Feb 2021 12:54:12 GMT
x-cache
hit
x-samesite
secure
via
1.1 google
cache-control
max-age=86400
accept-ranges
bytes
content-type
text/javascript
alt-svc
clear
fbevents.js
connect.facebook.net/en_US/
91 KB
23 KB
Script
General
Full URL
https://connect.facebook.net/en_US/fbevents.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
9e7ea2b4ba8e2bcc4a964d6192e4671dc5f6863a1c7e35b52b229a3c1e67a68d
Security Headers
Name Value
Content-Security-Policy default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self';block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

content-security-policy
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self';block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
content-encoding
gzip
x-content-type-options
nosniff
x-xss-protection
0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
23762
x-fb-rlafr
0
pragma
public
x-fb-debug
x70ndiBKWTcIl6FrVv9CpHcBqL9uOh7xbGxvZC/kSCJlOiyVB5nAGn+DT6Bq15VQcF9h7shYPpzsvvitsLRAcA==
x-fb-trip-id
686109401
x-frame-options
DENY
date
Sat, 27 Feb 2021 12:54:12 GMT
strict-transport-security
max-age=31536000; preload; includeSubDomains
content-type
application/x-javascript; charset=utf-8
vary
Accept-Encoding
cache-control
public, max-age=1200
expires
Sat, 01 Jan 2000 00:00:00 GMT
ytag.js
s.yimg.jp/images/listing/tool/cv/
23 KB
7 KB
Script
General
Full URL
https://s.yimg.jp/images/listing/tool/cv/ytag.js
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
183.79.248.252 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
ATS /
Resource Hash
fcb5ee7a8fcec48a11b7adf420332a9ff2cf49f99558795d6b7b810618573e35

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

ats-carp-promotion
1
date
Sat, 27 Feb 2021 12:53:28 GMT
content-encoding
gzip
last-modified
Wed, 30 Sep 2020 06:06:44 GMT
server
ATS
age
44
vary
Accept-Encoding
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge2108.img.djm.yahoo.co.jp (ApacheTrafficServer [cRs f ]), http/1.1 edge2167.img.djm.yahoo.co.jp (ApacheTrafficServer [cRs f ])
cache-control
public, max-age=600
accept-ranges
bytes
content-type
application/javascript
content-length
6746
expires
Sat, 27 Feb 2021 13:03:28 GMT
pixel.js
cdn.smartnews-ads.com/i/
4 KB
2 KB
Script
General
Full URL
https://cdn.smartnews-ads.com/i/pixel.js
Requested by
Host: baycrews.jp
URL: https://baycrews.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.232.62 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-232-62.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
b0f6ed6203c6b84794084f41991dbc9fc608853a2cf1d097651314af3696ac0f

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

x-amz-version-id
o6uFnmvCc1lP0uUXzfLmJEfML4lM1rmW
content-encoding
gzip
last-modified
Tue, 15 Dec 2020 01:24:51 GMT
etag
"5d6c0b3ff41e9d7ec5cdd6a3b9b5a227"
vary
Accept-Encoding
content-type
application/javascript;charset=utf-8
cache-control
max-age=94
date
Sat, 27 Feb 2021 12:54:12 GMT
accept-ranges
bytes
content-length
1574
expires
Sat, 27 Feb 2021 12:55:46 GMT
tag
yjtag.yahoo.co.jp/
1 KB
1 KB
Script
General
Full URL
https://yjtag.yahoo.co.jp/tag?site=8CRQDRF%2CjhbVWaa&H=-l73jh5&referrer=https%3A%2F%2Fbaycrews.jp%2F&mode=v2&cf=4887923&_cb_bt_data(%27hashedemail%27)=&_cb_bt_data(%27userid%27)=
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
183.79.113.122 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
/
Resource Hash
88b4aa3596cfa55bd6269acf9fdffd1356aa3d362aa3839dcdb33b95e42a60a5
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 27 Feb 2021 12:54:12 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Age
0
ETag
a17a160b453fad291dc3a7b28a58080e
vary
accept-encoding
P3P
policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control
private, must-revalidate
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
text/javascript
X-BT-RequestId
e3d4bfe0-78fa-11eb-a73b-0000ac1c4045
tag.gif
tr.line.me/
43 B
425 B
Image
General
Full URL
https://tr.line.me/tag.gif?b_id=7cad821a-10dd-4aec-9bb0-3c5cde5192cf&b_u=https%3A%2F%2Fbaycrews.jp%2F&b_d=baycrews.jp&b_p=%2F&b_t=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&c_t=lap&t_id=a59a1884-e771-4848-b8c8-8f2cd4a6e72c&s_id=1b4ef180-f193addd&x4=1&e=pv&v=3.0.0&_t=1614430452242
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
203.104.153.77 , Japan, ASN38631 (LINE LINE Corporation, JP),
Reverse DNS
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:12 GMT
Cache-Control
private, no-store, no-cache, must-revalidate
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Connection
keep-alive
Content-Length
43
Content-Type
image/gif
tag.gif
tr.line.me/
43 B
425 B
Image
General
Full URL
https://tr.line.me/tag.gif?b_id=7cad821a-10dd-4aec-9bb0-3c5cde5192cf&b_u=https%3A%2F%2Fbaycrews.jp%2F&b_d=baycrews.jp&b_p=%2F&b_t=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&c_t=lap&t_id=87424a4d-afa6-469e-885f-5fe08b91c101&s_id=1b4ef180-f193addd&x4=2&e=pv&v=3.0.0&_t=1614430452249
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
203.104.153.77 , Japan, ASN38631 (LINE LINE Corporation, JP),
Reverse DNS
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:12 GMT
Cache-Control
private, no-store, no-cache, must-revalidate
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Connection
keep-alive
Content-Length
43
Content-Type
image/gif
tag.gif
tr.line.me/
43 B
425 B
Image
General
Full URL
https://tr.line.me/tag.gif?b_id=7cad821a-10dd-4aec-9bb0-3c5cde5192cf&b_u=https%3A%2F%2Fbaycrews.jp%2F&b_d=baycrews.jp&b_p=%2F&b_t=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&c_t=lap&t_id=a55929fe-6501-410d-93d4-4e32b97eb8e4&s_id=1b4ef180-f193addd&x4=2&e=pv&v=3.0.0&_t=1614430452252
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
203.104.153.77 , Japan, ASN38631 (LINE LINE Corporation, JP),
Reverse DNS
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:13 GMT
Cache-Control
private, no-store, no-cache, must-revalidate
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Connection
keep-alive
Content-Length
43
Content-Type
image/gif
802885096445971
connect.facebook.net/signals/config/
241 KB
69 KB
Script
General
Full URL
https://connect.facebook.net/signals/config/802885096445971?v=2.9.33&r=stable
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
caf2895706e04aa34cee3ccc13bb8f1acc48fef312337caa189be94508f9564a
Security Headers
Name Value
Content-Security-Policy default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

content-security-policy
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
content-encoding
gzip
x-content-type-options
nosniff
x-xss-protection
0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
x-fb-rlafr
0
pragma
public
x-fb-debug
Topi/02/+fHvC3PAq3aJxeExWm//z/ubhlmG8fyrxon2v9qbjyoLY6ZOvKWevsFW1f5FWj+Vy9dnEIiZGp+OXQ==
x-fb-trip-id
686109401
x-frame-options
DENY
cross-origin-embedder-policy-report-only
require-corp;report-to="coep_report"
date
Sat, 27 Feb 2021 12:54:12 GMT
strict-transport-security
max-age=31536000; preload; includeSubDomains
report-to
{"group":"coep_report","max_age":86400,"endpoints":[{"url":"https:\/\/www.facebook.com\/browser_reporting\/"}]}
content-type
application/x-javascript; charset=utf-8
vary
Accept-Encoding
cache-control
public, max-age=1200
expires
Sat, 01 Jan 2000 00:00:00 GMT
conversion_async.js
www.googleadservices.com/pagead/
31 KB
13 KB
Script
General
Full URL
https://www.googleadservices.com/pagead/conversion_async.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtag/js?id=AW-996468360
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
142.250.186.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra24s07-in-f2.1e100.net
Software
cafe /
Resource Hash
b4ceacee581031a4014c658e33aa47874612b4c25c1aed8ef682cada98b99d6d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12348
x-xss-protection
0
server
cafe
etag
7672817363517198860
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sat, 27 Feb 2021 12:54:12 GMT
pc_20210226_edi.jpg
feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZhR1ZyTkhwbGNHOTFOVFl4Y25wcVpqVnlPREowY0RRM1l6aDVZaTgzTWpNMFkyVTRZek0zTW...
Redirect Chain
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBc2JHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--41c21edc8e3b951bb10efa2b7f683de3247ff...
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZhR1ZyTkhwbGNHOTFOVFl4Y25wcVpqVnlPREowY0RRM1l6aDVZaTgzTWpNMFkyVT...
102 KB
102 KB
Image
General
Full URL
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZhR1ZyTkhwbGNHOTFOVFl4Y25wcVpqVnlPREowY0RRM1l6aDVZaTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKUmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakF5TVRBeU1qWmZaV1JwTG1wd1p5STdJR1pwYkdWdVlXMWxLajFWVkVZdE9DY25jR05mTWpBeU1UQXlNalpmWldScExtcHdad1k3QmxRNkVXTnZiblJsYm5SZmRIbHdaVWtpRDJsdFlXZGxMMnB3WldjR093WlUiLCJleHAiOiIyMDIxLTAyLTI3VDEyOjU5OjEyLjc2NVoiLCJwdXIiOiJibG9iX2tleSJ9fQ==--cd0ddf815215357810563e2f9633015f701f4b5a/pc_20210226_edi.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_20210226_edi.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_20210226_edi.jpg
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:2800:c:6dc1:1600:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx + Phusion Passenger 6.0.2 / Phusion Passenger 6.0.2
Resource Hash
451835c389e2e9f22a48a9d518f14662304b3348b591414d89ae05a5e37beb1b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:13 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
200 OK
content-disposition
inline; filename="pc_20210226_edi.jpg"; filename*=UTF-8''pc_20210226_edi.jpg
content-length
104043
x-xss-protection
1; mode=block
x-request-id
7dabedeb-e506-4217-a8a6-edeae812c3f3
x-runtime
0.000876
referrer-policy
strict-origin-when-cross-origin
last-modified
Fri, 26 Feb 2021 03:03:08 GMT
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=0, private, must-revalidate
x-amz-cf-id
2OyvkQxr66sbF8bGkUqRou0HzMtwuIQe6tfDldAzHAmsnp1bDllGdQ==

Redirect headers

date
Sat, 27 Feb 2021 12:54:12 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
302 Found
x-xss-protection
1; mode=block
x-request-id
ebbdd7a3-8022-4774-a60a-fcf37e347e9d
x-runtime
0.007605
referrer-policy
strict-origin-when-cross-origin
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/html; charset=utf-8
location
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZhR1ZyTkhwbGNHOTFOVFl4Y25wcVpqVnlPREowY0RRM1l6aDVZaTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKUmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakF5TVRBeU1qWmZaV1JwTG1wd1p5STdJR1pwYkdWdVlXMWxLajFWVkVZdE9DY25jR05mTWpBeU1UQXlNalpmWldScExtcHdad1k3QmxRNkVXTnZiblJsYm5SZmRIbHdaVWtpRDJsdFlXZGxMMnB3WldjR093WlUiLCJleHAiOiIyMDIxLTAyLTI3VDEyOjU5OjEyLjc2NVoiLCJwdXIiOiJibG9iX2tleSJ9fQ==--cd0ddf815215357810563e2f9633015f701f4b5a/pc_20210226_edi.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_20210226_edi.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_20210226_edi.jpg
cache-control
max-age=300, private
x-amz-cf-id
N5tMxWFw83pbE6_JPYWzcw1u8PeFflF7b_yOgqNBYs0kymkBEf6r2Q==
p
i.smartnews-ads.com/
2 B
178 B
Image
General
Full URL
https://i.smartnews-ads.com/p?id=3ef1da232f39381623da96a2&t=1614430452&url=https%3A%2F%2Fbaycrews.jp%2F&referrer=&e=PageView&v=1.0.0&exid=f44ac47a-a7cc-4d3e-bb4f-dceb1f9a2395
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.65.185.147 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-65-185-147.ap-northeast-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:13 GMT
content-length
2
content-type
text/plain; charset=utf-8
p
consent.linksynergy.com/consent/v2/
37 B
258 B
Image
General
Full URL
https://consent.linksynergy.com/consent/v2/p?rmch=cs&tp=gdpr&domain=baycrews.jp&sought=false&attr_sid=115184&in_scope=true&purposes=&vendors=&ext_id=0d945bfd-2567-4bd1-9d51-8994a3d604f7
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
35.241.23.116 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash
bb229a48bee31f5d54ca12dc9bd960c63a671f0d4be86a054c1d324a44499d96

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:13 GMT
via
1.1 google
content-type
image/gif
alt-svc
clear
content-length
37
p3p
CP="NOI BUS NID DSP COR"
ld.js
static.criteo.net/js/ld/
36 KB
12 KB
Script
General
Full URL
https://static.criteo.net/js/ld/ld.js
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638:1::3 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
0f6204713c11eeb6d7648e3401617e22f8e88f96cd517a538dc018ac2ab7bdf2

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:12 GMT
content-encoding
gzip
last-modified
Mon, 14 Sep 2020 13:03:43 GMT
server
nginx
etag
W/"5f5f6a2f-90a2"
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=86400, public
timing-allow-origin
*
expires
Sun, 28 Feb 2021 12:54:12 GMT
454675804673059
connect.facebook.net/signals/config/
241 KB
69 KB
Script
General
Full URL
https://connect.facebook.net/signals/config/454675804673059?v=2.9.33&r=stable
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
1657a8aa348883078cfe638f036b5a77a879a81f49ab4b15774382c50d653c99
Security Headers
Name Value
Content-Security-Policy default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

content-security-policy
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
content-encoding
gzip
x-content-type-options
nosniff
x-xss-protection
0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
x-fb-rlafr
0
pragma
public
x-fb-debug
Nh4NVoyLhuRPdZtP6NK1mWnPeuT6DAfZmU3QfN4sDUQFnX5kLyPLSqKOrwsX08Zd4SPDdcOWsLbeude4ijr5dw==
x-fb-trip-id
686109401
x-frame-options
DENY
cross-origin-embedder-policy-report-only
require-corp;report-to="coep_report"
date
Sat, 27 Feb 2021 12:54:13 GMT
strict-transport-security
max-age=31536000; preload; includeSubDomains
report-to
{"group":"coep_report","max_age":86400,"endpoints":[{"url":"https:\/\/www.facebook.com\/browser_reporting\/"}]}
content-type
application/x-javascript; charset=utf-8
vary
Accept-Encoding
cache-control
public, max-age=1200
expires
Sat, 01 Jan 2000 00:00:00 GMT
/
www.facebook.com/tr/
44 B
153 B
Image
General
Full URL
https://www.facebook.com/tr/?id=802885096445971&ev=PageView&dl=https%3A%2F%2Fbaycrews.jp%2F&rl=&if=false&ts=1614430452660&sw=1600&sh=1200&v=2.9.33&r=stable&ec=0&o=30&fbp=fb.1.1614430452659.169859113&it=1614430452290&coo=false&tm=1&rqm=GET
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:13 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
cache-control
no-cache, must-revalidate, max-age=0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
44
expires
Sat, 27 Feb 2021 12:54:13 GMT
checkout.js
checkout-js.worldshopping.jp/
1 MB
462 KB
Script
General
Full URL
https://checkout-js.worldshopping.jp/checkout.js?v=3.2.24
Requested by
Host: checkout-api.worldshopping.jp
URL: https://checkout-api.worldshopping.jp/v1/script?token=baycrews_jp
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.75 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
fa0490f5c30934a816fc2081786b09810a2892301d5d1f374b8b10218024cb2a

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

x-amz-version-id
jz63D36oINDHq44yL8.eDnX7zJwH8bBN
content-encoding
gzip
last-modified
Mon, 22 Feb 2021 07:33:20 GMT
server
AmazonS3
x-amz-cf-pop
FRA56-C1
etag
W/"11cc32526dc1e66550c4c60eac29a865"
vary
Accept-Encoding
x-cache
RefreshHit from cloudfront
content-type
application/javascript
via
1.1 547a50460a0cda7ae3dafb1c0b6d0e1a.cloudfront.net (CloudFront)
date
Sat, 27 Feb 2021 12:54:15 GMT
x-amz-cf-id
hJ2tXq2LlITWxoLG4cbaBhxJX9SJRpWppc2izsyJ1y4ZbzrDNGv-7A==
track
t.karte.io/
699 B
794 B
XHR
General
Full URL
https://t.karte.io/track
Requested by
Host: static.karte.io
URL: https://static.karte.io/libs/tracker.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
130.211.31.19 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
19.31.211.130.bc.googleusercontent.com
Software
/ Express
Resource Hash
af10e93a231cfec5c9a51e15ab93cedd5f12f049109a7696f4d73da7d56efe37

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

date
Sat, 27 Feb 2021 12:54:13 GMT
via
1.1 google
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept
x-powered-by
Express
vary
Accept-Encoding
content-type
application/json; charset=utf-8
access-control-allow-origin
*
alt-svc
clear
content-length
699
/
googleads.g.doubleclick.net/pagead/viewthroughconversion/996468360/
2 KB
1 KB
Script
General
Full URL
https://googleads.g.doubleclick.net/pagead/viewthroughconversion/996468360/?random=1614430452923&cv=9&fst=1614430452923&num=1&bg=ffffff&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2oa2h0&sendb=1&ig=1&data=event%3Dgtag.config&frm=0&url=https%3A%2F%2Fbaycrews.jp%2F&tiba=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
Requested by
Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:802::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
69b837568c14e9b5dbde403030e1943097c859f8880c8dda285ff1f58a943e3d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
content-encoding
gzip
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"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
text/javascript; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1095
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
googleads.g.doubleclick.net/pagead/viewthroughconversion/996468360/
2 KB
2 KB
Script
General
Full URL
https://googleads.g.doubleclick.net/pagead/viewthroughconversion/996468360/?random=1614430452928&cv=9&fst=1614430452928&num=1&bg=ffffff&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2oa2h0&sendb=1&ig=1&data=event%3Dpage_view%3Becomm_pagetype%3Dhome&frm=0&url=https%3A%2F%2Fbaycrews.jp%2F&tiba=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
Requested by
Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
a7f4b7419c52c9adcc3d2dcc162e55ea64471e7924d0b8eecc33debd951a6f4f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
content-encoding
gzip
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"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
text/javascript; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1109
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
event
widget.as.criteo.com/
Redirect Chain
  • https://sslwidget.criteo.com/event?a=4265&v=5.6.2&p0=e%3Dexd%26site_type%3Dd&p1=e%3Dvh&p2=e%3Ddis&adce=1&tld=baycrews.jp&dtycbr=24826
  • https://widget.as.criteo.com/event?a=4265&v=5.6.2&p0=e%3Dexd%26site_type%3Dd&p1=e%3Dvh&p2=e%3Ddis&adce=1&tld=baycrews.jp&dtycbr=24826
7 KB
4 KB
Script
General
Full URL
https://widget.as.criteo.com/event?a=4265&v=5.6.2&p0=e%3Dexd%26site_type%3Dd&p1=e%3Dvh&p2=e%3Ddis&adce=1&tld=baycrews.jp&dtycbr=24826
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
182.161.73.211 , Singapore, ASN55569 (CRITEO-AS-AP Criteo APAC, JP),
Reverse DNS
Software
Microsoft-IIS/10.0 / ASP.NET
Resource Hash
15716702afad352c018b7e0510adf21e0e0c6f556265ab4d77b23eb6d89da8c0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
content-encoding
gzip
content-type
application/x-javascript
server
Microsoft-IIS/10.0
x-powered-by
ASP.NET
vary
Accept-Encoding
p3p
NON DSP COR CURa PSA PSD OUR BUS NAV STA
cache-control
no-cache
server-processing-duration-in-ticks
25156
timing-allow-origin
*
content-length
3442
expires
0

Redirect headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:12 GMT
location
https://widget.as.criteo.com/event?a=4265&v=5.6.2&p0=e%3Dexd%26site_type%3Dd&p1=e%3Dvh&p2=e%3Ddis&adce=1&tld=baycrews.jp&dtycbr=24826
cache-control
no-cache
server-processing-duration-in-ticks
2934
timing-allow-origin
*
content-length
0
expires
0
syncframe
gum.criteo.com/ Frame E0E0
0
150 B
Document
General
Full URL
https://gum.criteo.com/syncframe?topUrl=baycrews.jp
Requested by
Host: static.criteo.net
URL: https://static.criteo.net/js/ld/ld.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638:1::13 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

:method
GET
:authority
gum.criteo.com
:scheme
https
:path
/syncframe?topUrl=baycrews.jp
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
sec-fetch-dest
iframe
referer
https://baycrews.jp/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
uid=49002314-7ac8-4723-b410-7d4867488d4b
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Referer
https://baycrews.jp/

Response headers

cache-control
private, max-age=0
content-type
text/html; charset=utf-8
strict-transport-security
max-age=31536000
server-processing-duration-in-ticks
3154
date
Sat, 27 Feb 2021 12:54:13 GMT
content-length
0
/
www.facebook.com/tr/
44 B
107 B
Image
General
Full URL
https://www.facebook.com/tr/?id=454675804673059&ev=PageView&dl=https%3A%2F%2Fbaycrews.jp%2F&rl=&if=false&ts=1614430453084&sw=1600&sh=1200&v=2.9.33&r=stable&ec=0&o=30&fbp=fb.1.1614430452659.169859113&it=1614430452290&coo=false&tm=1&rqm=GET
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:13 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
cache-control
no-cache, must-revalidate, max-age=0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
44
expires
Sat, 27 Feb 2021 12:54:13 GMT
/
www.facebook.com/tr/
44 B
107 B
Image
General
Full URL
https://www.facebook.com/tr/?id=454675804673059&ev=Contact&dl=https%3A%2F%2Fbaycrews.jp%2F&rl=&if=false&ts=1614430453086&sw=1600&sh=1200&v=2.9.33&r=stable&ec=1&o=30&fbp=fb.1.1614430452659.169859113&it=1614430452290&coo=false&tm=1&rqm=GET
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:13 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
cache-control
no-cache, must-revalidate, max-age=0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
44
expires
Sat, 27 Feb 2021 12:54:13 GMT
/
www.google.com/pagead/1p-user-list/996468360/
42 B
108 B
Image
General
Full URL
https://www.google.com/pagead/1p-user-list/996468360/?random=1614430452923&cv=9&fst=1614427200000&num=1&bg=ffffff&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2oa2h0&sendb=1&data=event%3Dgtag.config&frm=0&url=https%3A%2F%2Fbaycrews.jp%2F&tiba=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&async=1&fmt=3&is_vtc=1&random=677282497&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80e::2004 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.de/pagead/1p-user-list/996468360/
42 B
108 B
Image
General
Full URL
https://www.google.de/pagead/1p-user-list/996468360/?random=1614430452923&cv=9&fst=1614427200000&num=1&bg=ffffff&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2oa2h0&sendb=1&data=event%3Dgtag.config&frm=0&url=https%3A%2F%2Fbaycrews.jp%2F&tiba=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&async=1&fmt=3&is_vtc=1&random=677282497&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80f::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.facebook.com/tr/
0
52 B
Other
General
Full URL
https://www.facebook.com/tr/
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
multipart/form-data; boundary=----WebKitFormBoundarykiICnfoWDvPXdAQW

Response headers

strict-transport-security
max-age=31536000; includeSubDomains
server
proxygen-bolt
date
Sat, 27 Feb 2021 12:54:13 GMT
content-type
text/plain
access-control-allow-origin
https://baycrews.jp
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
0
/
www.google.com/pagead/1p-user-list/996468360/
42 B
530 B
Image
General
Full URL
https://www.google.com/pagead/1p-user-list/996468360/?random=1614430452928&cv=9&fst=1614427200000&num=1&bg=ffffff&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2oa2h0&sendb=1&data=event%3Dpage_view%3Becomm_pagetype%3Dhome&frm=0&url=https%3A%2F%2Fbaycrews.jp%2F&tiba=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&async=1&fmt=3&is_vtc=1&random=2249157079&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:812::2004 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.de/pagead/1p-user-list/996468360/
42 B
135 B
Image
General
Full URL
https://www.google.de/pagead/1p-user-list/996468360/?random=1614430452928&cv=9&fst=1614427200000&num=1&bg=ffffff&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2oa2h0&sendb=1&data=event%3Dpage_view%3Becomm_pagetype%3Dhome&frm=0&url=https%3A%2F%2Fbaycrews.jp%2F&tiba=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&async=1&fmt=3&is_vtc=1&random=2249157079&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:82a::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:13 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.facebook.com/tr/
0
37 B
Other
General
Full URL
https://www.facebook.com/tr/
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
multipart/form-data; boundary=----WebKitFormBoundary0bBsRZQZm3nzT6Tv

Response headers

strict-transport-security
max-age=31536000; includeSubDomains
server
proxygen-bolt
date
Sat, 27 Feb 2021 12:54:13 GMT
content-type
text/plain
access-control-allow-origin
https://baycrews.jp
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
0
/
b97.yahoo.co.jp/pagead/conversion/1000228401/
42 B
776 B
Image
General
Full URL
https://b97.yahoo.co.jp/pagead/conversion/1000228401/?random=1614430453968&cv=9&fst=1614430453968&num=1&fmt=3&guid=ON&disvt=false&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Fbaycrews.jp%2F&tiba=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&hn=www.googleadservices.com&async=1
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
182.22.30.220 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:14 GMT
Via
http/1.1 mscedge1002.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
X-Content-Type-Options
nosniff
Age
0
P3P
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cross-Origin-Resource-Policy
cross-origin
Connection
close
Content-Length
42
X-XSS-Protection
0
Pragma
no-cache
Server
ATS
Content-Type
image/gif
Cache-Control
no-cache, no-store, must-revalidate
Content-Security-Policy
script-src 'none'; object-src 'none'
Timing-Allow-Origin
*
Expires
Fri, 01 Jan 1990 00:00:00 GMT
/
b97.yahoo.co.jp/pagead/conversion/1000357015/
42 B
776 B
Image
General
Full URL
https://b97.yahoo.co.jp/pagead/conversion/1000357015/?random=1614430453973&cv=9&fst=1614430453973&num=1&fmt=3&guid=ON&disvt=false&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Fbaycrews.jp%2F&tiba=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&hn=www.googleadservices.com&async=1
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
182.22.30.220 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:14 GMT
Via
http/1.1 mscedge1001.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
X-Content-Type-Options
nosniff
Age
2
P3P
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cross-Origin-Resource-Policy
cross-origin
Connection
close
Content-Length
42
X-XSS-Protection
0
Pragma
no-cache
Server
ATS
Content-Type
image/gif
Cache-Control
no-cache, no-store, must-revalidate
Content-Security-Policy
script-src 'none'; object-src 'none'
Timing-Allow-Origin
*
Expires
Fri, 01 Jan 1990 00:00:00 GMT
report
checkout-api.worldshopping.jp/v1/ Frame
0
0
Other
General
Full URL
https://checkout-api.worldshopping.jp/v1/report
Protocol
H2
Server
13.32.24.51 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-32-24-51.fra56.r.cloudfront.net
Software
/
Resource Hash

Request headers

Accept
*/*
Access-Control-Request-Method
POST
Access-Control-Request-Headers
content-type
Origin
https://baycrews.jp
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

content-type
application/json
content-length
1
date
Sat, 27 Feb 2021 12:54:15 GMT
x-amzn-requestid
59f09786-61a0-4e13-8f4f-18b68b123f23
access-control-allow-origin
https://baycrews.jp
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
x-amz-apigw-id
bZ8WpFtRNjMFcFw=
access-control-allow-methods
OPTIONS,POST
access-control-allow-credentials
false
via
1.1 8e83c42d247a31c5b365c08a0352d8f9.cloudfront.net (CloudFront), 1.1 3d58896f901dbeed449603f5d2b4d9f1.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C2 FRA56-C2
x-cache
Miss from cloudfront
x-amz-cf-id
nQuU4W8B86YXBvryuLrjiZFbLIedDUl9HyUctF5eXcx0EEl6NWJ7HQ==
report
checkout-api.worldshopping.jp/v1/
2 B
447 B
XHR
General
Full URL
https://checkout-api.worldshopping.jp/v1/report
Requested by
Host: checkout-js.worldshopping.jp
URL: https://checkout-js.worldshopping.jp/checkout.js?v=3.2.24
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.32.24.51 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-32-24-51.fra56.r.cloudfront.net
Software
/
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
application/json

Response headers

date
Sat, 27 Feb 2021 12:54:16 GMT
via
1.1 7d3c59ee1b45f72158a8cbce053c8978.cloudfront.net (CloudFront), 1.1 3d58896f901dbeed449603f5d2b4d9f1.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C2, FRA56-C2
x-amzn-requestid
832784b3-20f0-4eea-9717-944a3ae70241
x-cache
Miss from cloudfront
content-type
application/json; charset=utf-8
access-control-allow-origin
*
x-amzn-trace-id
Root=1-603a40f8-6e30bb330a8cda7a7c3b9efd;Sampled=0
x-amz-apigw-id
bZ8WxF-GtjMFXxg=
content-length
2
x-amz-cf-id
T2s_WD5z1lw0noeKHHkYILn1ju84WMgfD7MYSNsfcH7UAJFxrSYZGg==
main.jpg
feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlalkzZERGcGFUSXpkamRyWm5od016UjBPVGN6TW5SamNqaDBiUzgzTWpNMFkyVTRZek0zTW...
Redirect Chain
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaS9IIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0e3be656eaebc2b8a576bd499b82dc34ea91d...
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlalkzZERGcGFUSXpkamRyWm5od016UjBPVGN6TW5SamNqaDBiUzgzTWpNMFkyVT...
159 KB
160 KB
Image
General
Full URL
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlalkzZERGcGFUSXpkamRyWm5od016UjBPVGN6TW5SamNqaDBiUzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NJN2FXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWJXRnBiaTVxY0djaU95Qm1hV3hsYm1GdFpTbzlWVlJHTFRnbkoyMWhhVzR1YW5CbkJqc0dWRG9SWTI5dWRHVnVkRjkwZVhCbFNTSVBhVzFoWjJVdmFuQmxad1k3QmxRPSIsImV4cCI6IjIwMjEtMDItMjdUMTI6NTk6MTQuODAyWiIsInB1ciI6ImJsb2Jfa2V5In19--42d38a9e8029f59367b6abaa1fc893e022b7c0ad/main.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22main.jpg%22%3B+filename%2A%3DUTF-8%27%27main.jpg
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:2800:c:6dc1:1600:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx + Phusion Passenger 6.0.2 / Phusion Passenger 6.0.2
Resource Hash
59f61a2e07011d01fd5ed0e7e3e9adee9f515626807eb338fe095a180f024eaa
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:15 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
200 OK
content-disposition
inline; filename="main.jpg"; filename*=UTF-8''main.jpg
content-length
163296
x-xss-protection
1; mode=block
x-request-id
6bcbb299-6fe8-4e2a-ad51-12c3be6dc2fc
x-runtime
0.001419
referrer-policy
strict-origin-when-cross-origin
last-modified
Fri, 26 Feb 2021 09:03:19 GMT
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=0, private, must-revalidate
x-amz-cf-id
AsoWsnqdN4WYQJJMBJh6W3DUAgKZxnzHBpJMB0KRD_fkbEeLIK22YA==

Redirect headers

date
Sat, 27 Feb 2021 12:54:14 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
302 Found
x-xss-protection
1; mode=block
x-request-id
ae73229a-ad9a-4323-9203-a1cc6145164c
x-runtime
0.005793
referrer-policy
strict-origin-when-cross-origin
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/html; charset=utf-8
location
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlalkzZERGcGFUSXpkamRyWm5od016UjBPVGN6TW5SamNqaDBiUzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NJN2FXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWJXRnBiaTVxY0djaU95Qm1hV3hsYm1GdFpTbzlWVlJHTFRnbkoyMWhhVzR1YW5CbkJqc0dWRG9SWTI5dWRHVnVkRjkwZVhCbFNTSVBhVzFoWjJVdmFuQmxad1k3QmxRPSIsImV4cCI6IjIwMjEtMDItMjdUMTI6NTk6MTQuODAyWiIsInB1ciI6ImJsb2Jfa2V5In19--42d38a9e8029f59367b6abaa1fc893e022b7c0ad/main.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22main.jpg%22%3B+filename%2A%3DUTF-8%27%27main.jpg
cache-control
max-age=300, private
x-amz-cf-id
LjSjN5f_u7vgNJFDsMNObQc3ahtoz6RfhhYdS457v15IdOhXgOquDg==
pc_210223_crews.jpg
feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZOMlF5WmpZNWNtMW9jRGt5YkhWMFptNHdNR3d5WVdJM2RYa3lZUzgzTWpNMFkyVTRZek0zTW...
Redirect Chain
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBcGpFIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--c7dc666f6d3feb340a904e44c6f89769023e0...
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZOMlF5WmpZNWNtMW9jRGt5YkhWMFptNHdNR3d5WVdJM2RYa3lZUzgzTWpNMFkyVT...
125 KB
125 KB
Image
General
Full URL
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZOMlF5WmpZNWNtMW9jRGt5YkhWMFptNHdNR3d5WVdJM2RYa3lZUzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKUmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakV3TWpJelgyTnlaWGR6TG1wd1p5STdJR1pwYkdWdVlXMWxLajFWVkVZdE9DY25jR05mTWpFd01qSXpYMk55WlhkekxtcHdad1k3QmxRNkVXTnZiblJsYm5SZmRIbHdaVWtpRDJsdFlXZGxMMnB3WldjR093WlUiLCJleHAiOiIyMDIxLTAyLTI3VDEyOjU5OjE1LjI5MloiLCJwdXIiOiJibG9iX2tleSJ9fQ==--08a5f926adb0405ada892dc82f45ae8ba9d5fd4a/pc_210223_crews.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_210223_crews.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_210223_crews.jpg
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:2800:c:6dc1:1600:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx + Phusion Passenger 6.0.2 / Phusion Passenger 6.0.2
Resource Hash
44b0bd0cf2b728e4b93e471e52db57a08a2ed84b7e47766879197316c566ae80
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:15 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
200 OK
content-disposition
inline; filename="pc_210223_crews.jpg"; filename*=UTF-8''pc_210223_crews.jpg
content-length
127531
x-xss-protection
1; mode=block
x-request-id
f52e16d7-a4a0-45a9-a4c8-f5e2c01ff1d0
x-runtime
0.002297
referrer-policy
strict-origin-when-cross-origin
last-modified
Tue, 23 Feb 2021 02:59:43 GMT
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=0, private, must-revalidate
x-amz-cf-id
Rb_xF3F97lY3VrnHZkQOhm2hXkXeeutQzsxPo67gYvMsnuU4hfIA5w==

Redirect headers

date
Sat, 27 Feb 2021 12:54:15 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
302 Found
x-xss-protection
1; mode=block
x-request-id
8152d5f5-6309-4e75-9078-8160fec1a181
x-runtime
0.002927
referrer-policy
strict-origin-when-cross-origin
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/html; charset=utf-8
location
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZOMlF5WmpZNWNtMW9jRGt5YkhWMFptNHdNR3d5WVdJM2RYa3lZUzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKUmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakV3TWpJelgyTnlaWGR6TG1wd1p5STdJR1pwYkdWdVlXMWxLajFWVkVZdE9DY25jR05mTWpFd01qSXpYMk55WlhkekxtcHdad1k3QmxRNkVXTnZiblJsYm5SZmRIbHdaVWtpRDJsdFlXZGxMMnB3WldjR093WlUiLCJleHAiOiIyMDIxLTAyLTI3VDEyOjU5OjE1LjI5MloiLCJwdXIiOiJibG9iX2tleSJ9fQ==--08a5f926adb0405ada892dc82f45ae8ba9d5fd4a/pc_210223_crews.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_210223_crews.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_210223_crews.jpg
cache-control
max-age=300, private
x-amz-cf-id
ebp32Xg22Bh3SFBypLvjLVM6NF-5mJaq5V-xADJiMK3CaMJrsOhywg==
check
pixel.tapad.com/idsync/ex/receive/ Frame 4C2F
Redirect Chain
  • https://pixel.tapad.com/idsync/ex/receive?partner_id=2926&partner_device_id=k-2zuD4g8mczyi7CAmAG-Mlps6bFCDqKyijZcJxw
  • https://pixel.tapad.com/idsync/ex/receive/check?partner_id=2926&partner_device_id=k-2zuD4g8mczyi7CAmAG-Mlps6bFCDqKyijZcJxw
95 B
426 B
Image
General
Full URL
https://pixel.tapad.com/idsync/ex/receive/check?partner_id=2926&partner_device_id=k-2zuD4g8mczyi7CAmAG-Mlps6bFCDqKyijZcJxw
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
35.227.248.159 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Jetty(9.4.28.v20200408) /
Resource Hash
3eb10792d1f0c7e07e7248273540f1952d9a5a2996f4b5df70ab026cd9f05517
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:15 GMT
via
1.1 google
server
Jetty(9.4.28.v20200408)
strict-transport-security
max-age=31536000
p3p
policyref="http://tapad-taptags.s3.amazonaws.com/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
content-type
image/png
alt-svc
clear
content-length
95

Redirect headers

date
Sat, 27 Feb 2021 12:54:15 GMT
via
1.1 google
server
Jetty(9.4.28.v20200408)
strict-transport-security
max-age=31536000
p3p
policyref="http://tapad-taptags.s3.amazonaws.com/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
location
https://pixel.tapad.com/idsync/ex/receive/check?partner_id=2926&partner_device_id=k-2zuD4g8mczyi7CAmAG-Mlps6bFCDqKyijZcJxw
alt-svc
clear
content-length
0
sync
adgen.socdm.com/rtb/ Frame 4C2F
43 B
692 B
Image
General
Full URL
https://adgen.socdm.com/rtb/sync?proto=adgen&dspid=23
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.241.208.4 , Japan, ASN4694 (IDCF IDC Frontier Inc., JP),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

X-SO-Cluster-ID
35
Date
Sat, 27 Feb 2021 12:54:15 GMT
X-SO-LB-Data
{"ban":false,"clean_query":"\/rtb\/sync?dspid=23&proto=adgen","cluster_id":35,"gdpr":true,"ipv4":"0.0.0.0","key":"YDpA98Co5rkAAEMD.CgAAAAA","privacy_sensitive":true,"uid":"","upstream_id":"a-ad40083"}
X-SO-Ads-Time
1
X-SO-Key
YDpA98Co5rkAAEMD.CgAAAAA
Server
nginx
X-SO-Upstream-ID
a-ad40083
P3P
CP="See also http://www.scaleout.jp/privacy/"
Cache-Control
private
X-SO-HostName
a-ad40083.dc2p.scaleout.jp
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-SO-LB-Hostname
a-ng40005.dc2p.scaleout.jp
X-SO-IP
194.99.105.99
idsync
tg.socdm.com/aux/ Frame 4C2F
43 B
728 B
Image
General
Full URL
https://tg.socdm.com/aux/idsync?proto=criteo&dsp_uid=k-gc7Rxw8mczyi7CAmAG-Mlps6bFDp4XHEjh9ANQ
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
124.146.215.49 Setagaya-ku, Japan, ASN2514 (INFOSPHERE NTT PC Communications, Inc., JP),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

X-SO-Cluster-ID
11
Date
Sat, 27 Feb 2021 12:54:15 GMT
X-SO-LB-Data
{"ban":false,"clean_query":"\/aux\/idsync?dsp_uid=k-gc7Rxw8mczyi7CAmAG-Mlps6bFDp4XHEjh9ANQ&proto=criteo","cluster_id":11,"gdpr":true,"ipv4":"0.0.0.0","key":"YDpA98Co8XgAADrib6gAAAAA","privacy_sensitive":true,"uid":"","upstream_id":"m-ad331"}
X-SO-Ads-Time
3
X-SO-Key
YDpA98Co8XgAADrib6gAAAAA
Server
nginx
X-SO-Upstream-ID
m-ad331
P3P
CP="See also http://www.scaleout.jp/privacy/"
Cache-Control
private
X-SO-HostName
m-ad331.dc4p.scaleout.jp
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-SO-LB-Hostname
m-tgng20.dc4p.scaleout.jp
X-SO-IP
194.99.105.99
t.gif
cw.addthis.com/ Frame 4C2F
0
426 B
Image
General
Full URL
https://cw.addthis.com/t.gif?pid=113&pdid=k-2zuD4g8mczyi7CAmAG-Mlps6bFCDqKyijZcJxw
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
104.75.88.112 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a104-75-88-112.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:15 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sat, 27 Feb 2021 12:54:15 GMT
cookiematch.aspx
dis.criteo.com/dis/rtb/google/ Frame 4C2F
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=cjp&google_sc&google_ula=913071&google_hm=ay0yenVENGc4bWN6eWk3Q0FtQUctTWxwczZiRkNEcUt5aWpaY0p4dw
  • https://dis.criteo.com/dis/rtb/google/cookiematch.aspx?id=&google_ula=913071,0
43 B
290 B
Image
General
Full URL
https://dis.criteo.com/dis/rtb/google/cookiematch.aspx?id=&google_ula=913071,0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.0.163 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
/
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:14 GMT
p3p
CP='NON DSP COR CURa PSA PSD OUR BUS NAV STA'
content-type
image/gif
cache-control
no-cache
server-processing-duration-in-ticks
494
timing-allow-origin
*
content-length
43
expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:15 GMT
server
HTTP server (unknown)
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
location
https://dis.criteo.com/dis/rtb/google/cookiematch.aspx?id=&google_ula=913071,0
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-type
text/html; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
279
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
cs.adingo.jp/sync/ Frame 4C2F
43 B
412 B
Image
General
Full URL
https://cs.adingo.jp/sync/?from=criteo&id=k-06s31g8mczyi7CAmAG-Mlps6bFBDd8uBaq7BTg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.65.94.198 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:15 GMT
cache-control
private, no-cache, no-cache=Set-Cookie, proxy-revalidate
content-type
image/gif
server
nginx
p3p
CP=NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa HISa OUR SAMa OTRa STP UNI STA
expires
Wed, 17 Sep 1975 21:32:10 GMT
cookie-sync
sync.outbrain.com/ Frame 4C2F
Redirect Chain
  • https://sync.outbrain.com/cookie-sync?p=criteo&uid=k-k2tqDg8mczyi7CAmAG-Mlps6bFBgSNp60XK5rQ
  • https://sync.outbrain.com/cookie-sync?p=criteo&uid=k-k2tqDg8mczyi7CAmAG-Mlps6bFBgSNp60XK5rQ&rdrctExp=true
0
476 B
Image
General
Full URL
https://sync.outbrain.com/cookie-sync?p=criteo&uid=k-k2tqDg8mczyi7CAmAG-Mlps6bFBgSNp60XK5rQ&rdrctExp=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
70.42.32.159 , United States, ASN22075 (AS-OUTBRAIN, US),
Reverse DNS
ny.outbrain.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:15 GMT
Cache-Control
no-cache
X-TraceId
c32f7cc7c8e1ea2ad26b99b31a914b3a
Content-Length
0

Redirect headers

Location
https://sync.outbrain.com/cookie-sync?p=criteo&uid=k-k2tqDg8mczyi7CAmAG-Mlps6bFBgSNp60XK5rQ&rdrctExp=true
Date
Sat, 27 Feb 2021 12:54:15 GMT
X-TraceId
e04f3f54ba2ab19c42ec5ac6bef05e53
Content-Length
0
Pug
simage2.pubmatic.com/AdServer/ Frame 4C2F
42 B
875 B
Image
General
Full URL
https://simage2.pubmatic.com/AdServer/Pug?vcode=bz0yJnR5cGU9MSZjb2RlPTMwMjMmdGw9MTI5NjAw&piggybackCookie=uid:k-fWttEg8mczyi7CAmAG-Mlps6bFCASgJDXw0M-g
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.110 , United Kingdom, ASN62713 (AS-PUBMATIC, US),
Reverse DNS
Software
Apache/2.2.24 (Unix) mod_ssl/2.2.24 OpenSSL/1.0.1e-fips mod_fastcgi/2.4.6 /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

X-Cnection
close
Pragma
no-cache
Date
Sat, 27 Feb 2021 12:54:15 GMT
X-lat
Pug22056:0:859
Server
Apache/2.2.24 (Unix) mod_ssl/2.2.24 OpenSSL/1.0.1e-fips mod_fastcgi/2.4.6
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Cache-Control
no-store, no-cache, private
Content-Type
image/gif; charset=utf-8
Content-Length
42
/
sync.ad-stir.com/ Frame 4C2F
35 B
101 B
Image
General
Full URL
https://sync.ad-stir.com/?symbol=CRITEO&uid=k-2zsI8g8mczyi7CAmAG-Mlps6bFAKzvWmS8fbwQ
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.177.106.11 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
/
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:16 GMT
content-length
35
content-type
image/gif
cs
cs.gssprt.jp/yie/ld/ Frame 4C2F
43 B
595 B
Image
General
Full URL
https://cs.gssprt.jp/yie/ld/cs?dspid=criteo&uid=k-f-Z9Vg8mczyi7CAmAG-Mlps6bFAGuRanQcP15g
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
61.213.187.248 , Japan, ASN2914 (NTT-COMMUNICATIONS-2914, US),
Reverse DNS
Software
/
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 27 Feb 2021 12:54:16 GMT
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
sync
ad.as.amanad.adtdp.com/v1/ Frame 4C2F
42 B
748 B
Image
General
Full URL
https://ad.as.amanad.adtdp.com/v1/sync?dsp_id=4,5&uid=k-_d-smA8mczyi7CAmAG-Mlps6bFAYBLpbreisaw
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.187.60 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:15 GMT
via
1.1 35262001a2ae8da534143b9a1e14d8fe.cloudfront.net (CloudFront)
x-amz-cf-pop
ZAG50-C1
x-cache
Miss from cloudfront
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
content-length
42
x-amz-cf-id
bytz3qxb_mSr4lhNeARmGXEpkBGeluucwqJ1MUfBWC6MVuwGcu8G4A==
expires
Thu, 01 Jan 1970 09:00:00 GMT
cookiematch.aspx
dis.criteo.com/dis/rtb/microad/ Frame 4C2F
Redirect Chain
  • https://s-cs.send.microad.jp/cs?key=criteo_1
  • https://dis.criteo.com/dis/rtb/microad/cookiematch.aspx?maid=&cmps_error=3
43 B
291 B
Image
General
Full URL
https://dis.criteo.com/dis/rtb/microad/cookiematch.aspx?maid=&cmps_error=3
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.0.163 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
/
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:15 GMT
p3p
CP='NON DSP COR CURa PSA PSD OUR BUS NAV STA'
content-type
image/gif
cache-control
no-cache
server-processing-duration-in-ticks
1719
timing-allow-origin
*
content-length
43
expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

date
Sat, 27 Feb 2021 12:54:16 GMT
x-content-type-options
nosniff
server
nginx
location
https://dis.criteo.com/dis/rtb/microad/cookiematch.aspx?maid=&cmps_error=3
strict-transport-security
max-age=31536000
p3p
policyref="http://www.microad.jp/w3c/p3p.xml",CP="NOI DSP COR NID DEVo PSAo OUR STP STA PRE
access-control-allow-origin
*
timing-allow-origin
*
access-control-allow-headers
origin, x-requested-with, If-Modified-Since, content-type, Pragma, Cache-Control
content-length
0
x-xss-protection
1; mode=block
/
s.ad.smaato.net/c/ Frame 4C2F
0
236 B
Image
General
Full URL
https://s.ad.smaato.net/c/?dspInit=1001851&dspCookie=k-TtQPOA8mczyi7CAmAG-Mlps6bFCQKNiTDatazQ
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
143.204.97.111 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-97-111.fra50.r.cloudfront.net
Software
CloudFront /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:15 GMT
via
1.1 b44e2902bb3501d47514e51618f1bda5.cloudfront.net (CloudFront)
server
CloudFront
cache-control
no-cache, must-revalidate
x-amz-cf-pop
FRA50-C1
x-amz-cf-id
C6IhqlIjfx_6Ku5fN8cvvT0Nd-Zygj4lhM2nK0iE0ZlnWKZJwtdLfg==
x-cache
Miss from cloudfront
um
criteo-sync.teads.tv/ Frame 4C2F
23 B
172 B
Image
General
Full URL
https://criteo-sync.teads.tv/um?eid=80&uid=k-dbXMYQ8mczyi7CAmAG-Mlps6bFBj2OaMBlJMrg
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.232.7 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
akka-http/10.1.9 /
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:16 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sat, 27 Feb 2021 12:54:16 GMT
server
akka-http/10.1.9
content-length
23
content-type
image/gif
cookiesync
ad.caprofitx.adtdp.com/v1/ Frame 4C2F
35 B
593 B
Image
General
Full URL
https://ad.caprofitx.adtdp.com/v1/cookiesync?criteo_uid=k-aFwglg8mczyi7CAmAG-Mlps6bFDvjN_HLA4fjg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.114.17.118 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx /
Resource Hash
6a842ea462daca2a0b5a0f5f25bcfc8e0059ac811ca6c6a1bc54e4d9119621c3

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:16 GMT
X-Trace-Token
9b0b406d1530-39895272
Server
nginx
Connection
keep-alive
Content-Length
35
Content-Type
image/gif
sd
us-u.openx.net/w/1.0/ Frame 4C2F
Redirect Chain
  • https://us-u.openx.net/w/1.0/sd?id=537072953&val=k-cQAtgw8mczyi7CAmAG-Mlps6bFAu-wVbxiPqqw&c=us
  • https://us-u.openx.net/w/1.0/sd?cc=1&id=537072953&val=k-cQAtgw8mczyi7CAmAG-Mlps6bFAu-wVbxiPqqw&c=us
43 B
180 B
Image
General
Full URL
https://us-u.openx.net/w/1.0/sd?cc=1&id=537072953&val=k-cQAtgw8mczyi7CAmAG-Mlps6bFAu-wVbxiPqqw&c=us
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
35.244.159.8 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
Software
OXGW/16.202.0 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:16 GMT
via
1.1 google
server
OXGW/16.202.0
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
cache-control
private, max-age=0, no-cache
content-type
image/gif
alt-svc
clear
content-length
43
expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

location
https://us-u.openx.net/w/1.0/sd?cc=1&id=537072953&val=k-cQAtgw8mczyi7CAmAG-Mlps6bFAu-wVbxiPqqw&c=us
date
Sat, 27 Feb 2021 12:54:16 GMT
via
1.1 google
server
OXGW/16.202.0
alt-svc
clear
content-length
0
p3p
CP="CUR ADM OUR NOR STA NID"
user_match.ashx
ssp-sync.i-mobile.co.jp/ Frame 4C2F
120 B
566 B
Image
General
Full URL
https://ssp-sync.i-mobile.co.jp/user_match.ashx?dspid=24&dspuid=k-vwSdtQ8mczyi7CAmAG-Mlps6bFC2OxA-6QvM3A
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.231.67.24 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Microsoft-IIS/10.0 / ASP.NET
Resource Hash
42b601bc0d93dfca6e350b46d113bf8e7ff9e40a87a0c57ab9b3c9c219062423

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 27 Feb 2021 12:55:00 GMT
Server
Microsoft-IIS/10.0
X-Powered-By
ASP.NET
P3P
CP = "NOI DEV PSA PSD IVA PVD OTP OUR OTR IND OTC"
Cache-Control
no-cache, no-store
Connection
keep-alive
Content-Type
image/png
Content-Length
120
Expires
-1
cookiematch.aspx
dis.criteo.com/dis/rtb/appnexus/ Frame 4C2F
Redirect Chain
  • https://secure.adnxs.com/seg?add=1005440&redir=https%3A%2F%2Fib.adnxs.com%2Fgetuid%3Fhttps%3A%2F%2Fdis.criteo.com%2Fdis%2Frtb%2Fappnexus%2Fcookiematch.aspx%3Fappnxsid%3D%24UID
  • https://secure.adnxs.com/bounce?%2Fseg%3Fadd%3D1005440%26redir%3Dhttps%253A%252F%252Fib.adnxs.com%252Fgetuid%253Fhttps%253A%252F%252Fdis.criteo.com%252Fdis%252Frtb%252Fappnexus%252Fcookiematch.aspx...
  • https://ib.adnxs.com/getuid?https://dis.criteo.com/dis/rtb/appnexus/cookiematch.aspx?appnxsid=$UID
  • https://dis.criteo.com/dis/rtb/appnexus/cookiematch.aspx?appnxsid=7935217643157946466
43 B
291 B
Image
General
Full URL
https://dis.criteo.com/dis/rtb/appnexus/cookiematch.aspx?appnxsid=7935217643157946466
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.0.163 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
/
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:15 GMT
p3p
CP='NON DSP COR CURa PSA PSD OUR BUS NAV STA'
content-type
image/gif
cache-control
no-cache
server-processing-duration-in-ticks
3993
timing-allow-origin
*
content-length
43
expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Pragma
no-cache
Date
Sat, 27 Feb 2021 12:54:16 GMT
X-Proxy-Origin
194.99.105.99; 194.99.105.99; 692.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.49:80
AN-X-Request-Uuid
2c9a9766-366f-410a-a945-7c2ff901fd16
Server
nginx/1.17.9
Access-Control-Allow-Origin
*
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Location
https://dis.criteo.com/dis/rtb/appnexus/cookiematch.aspx?appnxsid=7935217643157946466
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
c.gif
c.bing.com/ Frame 4C2F
42 B
415 B
Image
General
Full URL
https://c.bing.com/c.gif?Red3=CTOMS_pd&cbid=k-JJZvwg8mczyi7CAmAG-Mlps6bFBK6Rx1EWxzHg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2620:1ec:c11::200 , United States, ASN8068 (MICROSOFT-CORP-MSN-AS-BLOCK, US),
Reverse DNS
Software
/ ASP.NET
Resource Hash
99c2917ee5b2a01459a923bdd1c676f15ee73b62b87f696e6735312d26f51e12

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:15 GMT
etag
"506f5bd17ad71:0"
last-modified
Tue, 23 Feb 2021 19:11:50 GMT
x-msedge-ref
Ref A: 372F6357D062411CA385D1D8DD67ECF4 Ref B: FRAEDGE1518 Ref C: 2021-02-27T12:54:16Z
x-powered-by
ASP.NET
p3p
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
cache-control
private, no-cache, proxy-revalidate, no-store
accept-ranges
bytes
content-type
image/gif
content-length
42
rum
r.casalemedia.com/ Frame 4C2F
Redirect Chain
  • https://r.casalemedia.com/rum?cm_dsp_id=20&external_user_id=k-LVghcQ8mczyi7CAmAG-Mlps6bFAOX9j43FOwIw
  • https://r.casalemedia.com/rum?cm_dsp_id=20&external_user_id=k-LVghcQ8mczyi7CAmAG-Mlps6bFAOX9j43FOwIw&C=1
43 B
1 KB
Image
General
Full URL
https://r.casalemedia.com/rum?cm_dsp_id=20&external_user_id=k-LVghcQ8mczyi7CAmAG-Mlps6bFAOX9j43FOwIw&C=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.21 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-234-21.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 27 Feb 2021 12:54:16 GMT
Server
Apache
Vary
Is-Traffic-Usersync
P3p
policyref="/w3c/p3p.xml", CP="NOI DSP COR DEVa TAIa OUR BUS UNI"
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Sat, 27 Feb 2021 12:54:16 GMT

Redirect headers

Pragma
no-cache
Date
Sat, 27 Feb 2021 12:54:16 GMT
Server
Apache
P3p
policyref="/w3c/p3p.xml", CP="NOI DSP COR DEVa TAIa OUR BUS UNI"
Location
https://r.casalemedia.com/rum?cm_dsp_id=20&external_user_id=k-LVghcQ8mczyi7CAmAG-Mlps6bFAOX9j43FOwIw&C=1
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
text/html; charset=iso-8859-1
Content-Length
296
Expires
Sat, 27 Feb 2021 12:54:16 GMT
sync
ups.analytics.yahoo.com/ups/55945/ Frame 4C2F
Redirect Chain
  • https://pixel.advertising.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1
  • https://pixel.advertising.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1&verify=true
  • https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46
  • https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46&verify=true
0
964 B
Image
General
Full URL
https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46&verify=true
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
18.156.0.31 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
ATS/7.1.2.128 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:16 GMT
Server
ATS/7.1.2.128
Connection
keep-alive
Age
0
Strict-Transport-Security
max-age=31536000
P3P
CP=NOI DSP COR LAW CURa DEVa TAIa PSAa PSDa OUR BUS UNI COM NAV

Redirect headers

Date
Sat, 27 Feb 2021 12:54:16 GMT
Server
ATS/7.1.2.128
Age
0
Strict-Transport-Security
max-age=31536000
P3P
CP=NOI DSP COR LAW CURa DEVa TAIa PSAa PSDa OUR BUS UNI COM NAV
Location
https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-LmXTjg8mczyi7CAmAG-Mlps6bFCxqyqJ_yRU-g&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46&verify=true
Connection
keep-alive
Content-Length
0
/
sync-t1.taboola.com/sg/criteortb-network/1/rtb-h/ Frame 4C2F
0
229 B
Image
General
Full URL
https://sync-t1.taboola.com/sg/criteortb-network/1/rtb-h/?taboola_hm=k-ntaguQ8mczyi7CAmAG-Mlps6bFA7MS5LiomlHQ
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
141.226.228.48 , Netherlands, ASN200478 (TABOOLA-AS, IL),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

tbl-x-upstream
10.41.22.181:10213
date
Sat, 27 Feb 2021 12:54:16 GMT
server
nginx
x-fastly-to-nlb-rtt
22952
xuid
eb2.3lift.com/ Frame 4C2F
Redirect Chain
  • https://eb2.3lift.com/xuid?mid=2711&xuid=k-5m_9KA8mczyi7CAmAG-Mlps6bFCgJmCrb4s3vg&dongle=013b
  • https://eb2.3lift.com/xuid?ld=1&mid=2711&xuid=k-5m_9KA8mczyi7CAmAG-Mlps6bFCgJmCrb4s3vg&dongle=013b&gdpr=1&cmp_cs=&us_privacy=
37 B
352 B
Image
General
Full URL
https://eb2.3lift.com/xuid?ld=1&mid=2711&xuid=k-5m_9KA8mczyi7CAmAG-Mlps6bFCgJmCrb4s3vg&dongle=013b&gdpr=1&cmp_cs=&us_privacy=
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.57.162.23 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
/
Resource Hash
bb229a48bee31f5d54ca12dc9bd960c63a671f0d4be86a054c1d324a44499d96

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:16 GMT
cache-control
no-cache, no-store, must-revalidate
content-type
image/gif
content-length
37
p3p
policyref="http://cdn.3lift.com/w3c/p3p.xml", CP="NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC"

Redirect headers

location
/xuid?ld=1&mid=2711&xuid=k-5m_9KA8mczyi7CAmAG-Mlps6bFCgJmCrb4s3vg&dongle=013b&gdpr=1&cmp_cs=&us_privacy=
date
Sat, 27 Feb 2021 12:54:16 GMT
cache-control
no-cache, no-store, must-revalidate
content-length
0
p3p
policyref="http://cdn.3lift.com/w3c/p3p.xml", CP="NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC"
/
sync.aralego.com/idSync/ Frame 4C2F
35 B
266 B
Image
General
Full URL
https://sync.aralego.com/idSync/?ucf_nid=dsp-833DD22BEB97673FB4E8B8DBB882B99&ucf_user_id=k-Sc0FcA8mczyi7CAmAG-Mlps6bFAri4-pPUYG-A
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
162.210.196.208 Alexandria, United States, ASN30633 (LEASEWEB-USA-WDC, US),
Reverse DNS
Software
/
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:17 GMT
connection
close
content-length
35
content-type
image/gif
cksync.php
contextual.media.net/ Frame 4C2F
46 B
714 B
Image
General
Full URL
https://contextual.media.net/cksync.php?cs=3&type=crt&ovsid=k-SVtdHA8mczyi7CAmAG-Mlps6bFDNOs6Z3gaKMQ
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.235.93 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-235-93.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
579a172ca2c700734ebcfa06d105a134f31ec2357660e58e0874cfdee8472fd4
Security Headers
Name Value
Strict-Transport-Security max-age=604800

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
strict-transport-security
max-age=604800
server
Apache
date
Sat, 27 Feb 2021 12:54:16 GMT
p3p
CP="NON DSP COR NID CUR ADMa DEVo TAI PSA PSDo HIS OUR BUS COM NAV INT STA", CP: NON DSP COR NID CUR ADMa DEVo TAI PSA PSDo HIS OUR BUS COM NAV INT STA, CP: NON DSP COR NID CUR ADMa DEVo TAI PSA PSDo HIS OUR BUS COM NAV INT STA
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
46
x-mnet-hl2
E
expires
Sat, 27 Feb 2021 12:54:16 GMT
sync
sync-criteo.ads.yieldmo.com/ Frame 4C2F
43 B
220 B
Image
General
Full URL
https://sync-criteo.ads.yieldmo.com/sync?id=k-GPIobQ8mczyi7CAmAG-Mlps6bFBP2VH5P7zXHA&pn_id=criteo&ext=1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.227.99.154 Ashburn, United States, ASN14618 (AMAZON-AES, US),
Reverse DNS
Software
/
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

access-control-allow-origin
*
pragma
no-cache
date
Sat, 27 Feb 2021 12:54:16 GMT
content-type
image/gif
content-length
43
access-control-allow-methods
GET, OPTIONS
access-control-request-headers
Cache-Control, Pragma
um
sync.e-planning.net/ Frame 4C2F
42 B
104 B
Image
General
Full URL
https://sync.e-planning.net/um?uid=k-4mcX1A8mczyi7CAmAG-Mlps6bFBpyq8TfTiEeA&dc=6884a087b48abdb1&ibd=1&iss=1
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
46.249.52.249 , Netherlands, ASN50673 (SERVERIUS-AS, NL),
Reverse DNS
Software
openresty /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:16 GMT
server
openresty
content-type
image/gif
/
rtb-csync.smartadserver.com/redir/ Frame 4C2F
43 B
688 B
Image
General
Full URL
https://rtb-csync.smartadserver.com/redir/?partnerid=79&partneruserid=k-CNhBXA8mczyi7CAmAG-Mlps6bFChxsFSPco74g
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
185.86.137.133 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
89fe0ee6020314794fc2cfeacf3d10c31050cfe56f8ebddf1ed0a33fbe941fa7

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Sat, 27 Feb 2021 12:54:16 GMT
cache-control
no-cache,no-store
content-type
image/gif
transfer-encoding
chunked
p3p
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
collect
www.google-analytics.com/j/
0
0

setuid
secure.adnxs.com/ Frame 4C2F
43 B
1 KB
Image
General
Full URL
https://secure.adnxs.com/setuid?entity=52&code=k-JJZvwg8mczyi7CAmAG-Mlps6bFBK6Rx1EWxzHg&seg=1005440
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.36 Frankfurt am Main, Germany, ASN29990 (ASN-APPNEX, US),
Reverse DNS
692.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.17.9 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 27 Feb 2021 12:54:16 GMT
X-Proxy-Origin
194.99.105.99; 194.99.105.99; 692.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.105:80
AN-X-Request-Uuid
a1e5bca9-2fa9-41d6-9a9c-5eb5bd924f6c
Server
nginx/1.17.9
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
sync
ups.analytics.yahoo.com/ups/55945/ Frame 4C2F
Redirect Chain
  • https://pixel.advertising.com/ups/55945/sync?uid=k-jE31Sw8mczyi7CAmAG-Mlps6bFD2QfmWnngoeg&_origin=1
  • https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-jE31Sw8mczyi7CAmAG-Mlps6bFD2QfmWnngoeg&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46
0
964 B
Image
General
Full URL
https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-jE31Sw8mczyi7CAmAG-Mlps6bFD2QfmWnngoeg&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
18.156.0.31 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
ATS/7.1.2.128 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Sat, 27 Feb 2021 12:54:16 GMT
Server
ATS/7.1.2.128
Connection
keep-alive
Age
0
Strict-Transport-Security
max-age=31536000
P3P
CP=NOI DSP COR LAW CURa DEVa TAIa PSAa PSDa OUR BUS UNI COM NAV

Redirect headers

location
https://ups.analytics.yahoo.com/ups/55945/sync?uid=k-jE31Sw8mczyi7CAmAG-Mlps6bFD2QfmWnngoeg&_origin=1&apid=UPe61d9ea1-78fa-11eb-92c8-02014e65fe46
date
Sat, 27 Feb 2021 12:54:16 GMT
content-length
0
strict-transport-security
max-age=31536000
p3p
CP=NOI DSP COR LAW CURa DEVa TAIa PSAa PSDa OUR BUS UNI COM NAV
pc_210120_jsm.jpg
feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlR2N6TVROc01YTXliMk4xYTNONU9IQjVkREJ0TmpOd1p6SjJNQzgzTWpNMFkyVTRZek0zTW...
Redirect Chain
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBbi9CIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--43ff45b0cd16832437187c8687069da1b4ee9...
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlR2N6TVROc01YTXliMk4xYTNONU9IQjVkREJ0TmpOd1p6SjJNQzgzTWpNMFkyVT...
92 KB
93 KB
Image
General
Full URL
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlR2N6TVROc01YTXliMk4xYTNONU9IQjVkREJ0TmpOd1p6SjJNQzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKTmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakV3TVRJd1gycHpiUzVxY0djaU95Qm1hV3hsYm1GdFpTbzlWVlJHTFRnbkozQmpYekl4TURFeU1GOXFjMjB1YW5CbkJqc0dWRG9SWTI5dWRHVnVkRjkwZVhCbFNTSVBhVzFoWjJVdmFuQmxad1k3QmxRPSIsImV4cCI6IjIwMjEtMDItMjdUMTI6NTk6MTkuMDcwWiIsInB1ciI6ImJsb2Jfa2V5In19--a9e732b7cb1b8aa119430a272b3ef96d0d084757/pc_210120_jsm.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_210120_jsm.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_210120_jsm.jpg
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:2800:c:6dc1:1600:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx + Phusion Passenger 6.0.2 / Phusion Passenger 6.0.2
Resource Hash
2c6247557a9e3c1fd209079f0591aab85b6509299d7c478cca28edd43a37a0f4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:19 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
200 OK
content-disposition
inline; filename="pc_210120_jsm.jpg"; filename*=UTF-8''pc_210120_jsm.jpg
content-length
94707
x-xss-protection
1; mode=block
x-request-id
d3798b28-cd31-4714-a004-6018e8b7f65e
x-runtime
0.001838
referrer-policy
strict-origin-when-cross-origin
last-modified
Tue, 16 Feb 2021 04:23:18 GMT
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=0, private, must-revalidate
x-amz-cf-id
dWklavpyV1UrTiwM5m4Om3So5smejn2TNaC598QNG-iXMkqKe3uOQA==

Redirect headers

date
Sat, 27 Feb 2021 12:54:19 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
302 Found
x-xss-protection
1; mode=block
x-request-id
508576a9-b29e-47ba-bc07-285e67fbe0f2
x-runtime
0.002413
referrer-policy
strict-origin-when-cross-origin
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/html; charset=utf-8
location
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZlR2N6TVROc01YTXliMk4xYTNONU9IQjVkREJ0TmpOd1p6SjJNQzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKTmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTmZNakV3TVRJd1gycHpiUzVxY0djaU95Qm1hV3hsYm1GdFpTbzlWVlJHTFRnbkozQmpYekl4TURFeU1GOXFjMjB1YW5CbkJqc0dWRG9SWTI5dWRHVnVkRjkwZVhCbFNTSVBhVzFoWjJVdmFuQmxad1k3QmxRPSIsImV4cCI6IjIwMjEtMDItMjdUMTI6NTk6MTkuMDcwWiIsInB1ciI6ImJsb2Jfa2V5In19--a9e732b7cb1b8aa119430a272b3ef96d0d084757/pc_210120_jsm.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc_210120_jsm.jpg%22%3B+filename%2A%3DUTF-8%27%27pc_210120_jsm.jpg
cache-control
max-age=300, private
x-amz-cf-id
VqzC36Pw1V7C2vs-ltG9QycOq2ytYF_qgwpX6faElmN-tWocxqnBEQ==
pc.jpg
feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaRGhtYlhBM2FXb3lZVGxqY0hjd2VETjZiV0pyWkc1a2NHMDVjQzgzTWpNMFkyVTRZek0zTW...
Redirect Chain
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBdFRFIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--c2a9b1762fe2340afbb93968ce1aeac8f7966...
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaRGhtYlhBM2FXb3lZVGxqY0hjd2VETjZiV0pyWkc1a2NHMDVjQzgzTWpNMFkyVT...
161 KB
162 KB
Image
General
Full URL
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaRGhtYlhBM2FXb3lZVGxqY0hjd2VETjZiV0pyWkc1a2NHMDVjQzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NJM2FXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTXVhbkJuSWpzZ1ptbHNaVzVoYldVcVBWVlVSaTA0Snlkd1l5NXFjR2NHT3daVU9oRmpiMjUwWlc1MFgzUjVjR1ZKSWc5cGJXRm5aUzlxY0dWbkJqc0dWQT09IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToxOC43MDFaIiwicHVyIjoiYmxvYl9rZXkifX0=--b4261fed1951f0f50f110862ad10fea58c90227a/pc.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc.jpg%22%3B+filename%2A%3DUTF-8%27%27pc.jpg
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:2800:c:6dc1:1600:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx + Phusion Passenger 6.0.2 / Phusion Passenger 6.0.2
Resource Hash
13a35b3b2cb1403c7ba4669932c79bfb30ef8d4f77c531ede63ec5d5f809f600
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:19 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
200 OK
content-disposition
inline; filename="pc.jpg"; filename*=UTF-8''pc.jpg
content-length
165092
x-xss-protection
1; mode=block
x-request-id
7113d9ee-6d89-4f99-812d-cac3901817e2
x-runtime
0.000912
referrer-policy
strict-origin-when-cross-origin
last-modified
Thu, 25 Feb 2021 01:01:53 GMT
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=0, private, must-revalidate
x-amz-cf-id
cUY68bWGanLxWipVPac9MlbzfHlyUMmkcD9BYwVusXprUMVzXWl4Qg==

Redirect headers

date
Sat, 27 Feb 2021 12:54:18 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
302 Found
x-xss-protection
1; mode=block
x-request-id
c04155bd-6a42-4219-80b0-e97127051d7d
x-runtime
0.005944
referrer-policy
strict-origin-when-cross-origin
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/html; charset=utf-8
location
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaRGhtYlhBM2FXb3lZVGxqY0hjd2VETjZiV0pyWkc1a2NHMDVjQzgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NJM2FXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTXVhbkJuSWpzZ1ptbHNaVzVoYldVcVBWVlVSaTA0Snlkd1l5NXFjR2NHT3daVU9oRmpiMjUwWlc1MFgzUjVjR1ZKSWc5cGJXRm5aUzlxY0dWbkJqc0dWQT09IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToxOC43MDFaIiwicHVyIjoiYmxvYl9rZXkifX0=--b4261fed1951f0f50f110862ad10fea58c90227a/pc.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc.jpg%22%3B+filename%2A%3DUTF-8%27%27pc.jpg
cache-control
max-age=300, private
x-amz-cf-id
LqTEBUsixypO06JRmh35cAe734G8fpxcN_pZ9-_RtlhzZQoKTpPasg==
collect
www.google-analytics.com/j/
0
0

pc@2x.jpg
feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaWEF6ZDNKMFptaDNaM0YzYlRoemREWmlNM2cwTm1VNGVuWnphaTgzTWpNMFkyVTRZek0zTW...
Redirect Chain
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaisvIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--1bf91392c3517141c866adcc5c6b4cf7eb33f...
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaWEF6ZDNKMFptaDNaM0YzYlRoemREWmlNM2cwTm1VNGVuWnphaTgzTWpNMFkyVT...
154 KB
154 KB
Image
General
Full URL
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaWEF6ZDNKMFptaDNaM0YzYlRoemREWmlNM2cwTm1VNGVuWnphaTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTWxOREF5ZUM1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KM0JqSlRRd01uZ3VhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToyMi41NjVaIiwicHVyIjoiYmxvYl9rZXkifX0=--5de98644be596e39ec94f6fd1a8fafebe23bfcde/pc@2x.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc%25402x.jpg%22%3B+filename%2A%3DUTF-8%27%27pc%25402x.jpg
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:2800:c:6dc1:1600:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx + Phusion Passenger 6.0.2 / Phusion Passenger 6.0.2
Resource Hash
5059f7c263f88ed46ab73dbfc3402c95582342624f867a3bdd8af45d4890a431
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:22 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
200 OK
content-disposition
inline; filename="pc%402x.jpg"; filename*=UTF-8''pc%402x.jpg
content-length
157262
x-xss-protection
1; mode=block
x-request-id
04cbfdd5-884b-4d73-8057-c218c043b266
x-runtime
0.000733
referrer-policy
strict-origin-when-cross-origin
last-modified
Wed, 17 Feb 2021 09:24:14 GMT
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=0, private, must-revalidate
x-amz-cf-id
7PXH1MFFKVnxLZRM_uCLTDfK0Nt9BMV1d7GUz5N0AahhT-G2W-br-w==

Redirect headers

date
Sat, 27 Feb 2021 12:54:22 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
302 Found
x-xss-protection
1; mode=block
x-request-id
d53a685a-d414-41e8-8010-6ac7b654c7f6
x-runtime
0.003116
referrer-policy
strict-origin-when-cross-origin
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/html; charset=utf-8
location
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZaWEF6ZDNKMFptaDNaM0YzYlRoemREWmlNM2cwTm1VNGVuWnphaTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTWxOREF5ZUM1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KM0JqSlRRd01uZ3VhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToyMi41NjVaIiwicHVyIjoiYmxvYl9rZXkifX0=--5de98644be596e39ec94f6fd1a8fafebe23bfcde/pc@2x.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc%25402x.jpg%22%3B+filename%2A%3DUTF-8%27%27pc%25402x.jpg
cache-control
max-age=300, private
x-amz-cf-id
IF1hwSp8HymzOAeaG8ZcTMjTCMgGHhVPBcqLrKumP2w-jRAmvskuBg==
pc@2x.jpg
feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPSFl6ZWpZd2RIcDZjSFIwYzJrd01tNTJPRFZsWkRVeGEzQmtaeTgzTWpNMFkyVTRZek0zTW...
Redirect Chain
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBbkhGIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--9e579afa546e55cf06ac166d1815e5891cc38...
  • https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPSFl6ZWpZd2RIcDZjSFIwYzJrd01tNTJPRFZsWkRVeGEzQmtaeTgzTWpNMFkyVT...
190 KB
191 KB
Image
General
Full URL
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPSFl6ZWpZd2RIcDZjSFIwYzJrd01tNTJPRFZsWkRVeGEzQmtaeTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTWxOREF5ZUM1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KM0JqSlRRd01uZ3VhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToyMi43MTRaIiwicHVyIjoiYmxvYl9rZXkifX0=--e3ad3771ffb7ea077969b2bc6a19d49bff4802ff/pc@2x.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc%25402x.jpg%22%3B+filename%2A%3DUTF-8%27%27pc%25402x.jpg
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:206f:2800:c:6dc1:1600:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx + Phusion Passenger 6.0.2 / Phusion Passenger 6.0.2
Resource Hash
437570c34cbc68311166c45683a8dde9307db83c6aaeb6bba8277a50fbd41c97
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://baycrews.jp/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 12:54:22 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
200 OK
content-disposition
inline; filename="pc%402x.jpg"; filename*=UTF-8''pc%402x.jpg
content-length
194657
x-xss-protection
1; mode=block
x-request-id
382ba863-ee21-4596-99fc-c0fda4a2b60f
x-runtime
0.000741
referrer-policy
strict-origin-when-cross-origin
last-modified
Fri, 26 Feb 2021 09:03:19 GMT
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=0, private, must-revalidate
x-amz-cf-id
8dntcbX13a993nwMr7Kgu3p158xidQLnVqiJUbS5EeaVw-nh3W8nTw==

Redirect headers

date
Sat, 27 Feb 2021 12:54:22 GMT
via
1.1 2a3a093b493a82493f3431437cb166ad.cloudfront.net (CloudFront)
x-content-type-options
nosniff
x-permitted-cross-domain-policies
none
x-amz-cf-pop
FRA56-C1
x-powered-by
Phusion Passenger 6.0.2
x-cache
Miss from cloudfront
status
302 Found
x-xss-protection
1; mode=block
x-request-id
8598f4b4-cf8d-47c1-811f-c0bb6f1f048e
x-runtime
0.005118
referrer-policy
strict-origin-when-cross-origin
server
nginx + Phusion Passenger 6.0.2
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/html; charset=utf-8
location
https://feature-tool.bcg.staff-start.com/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSnJkbUZ5YVdGdWRITXZPSFl6ZWpZd2RIcDZjSFIwYzJrd01tNTJPRFZsWkRVeGEzQmtaeTgzTWpNMFkyVTRZek0zTW1RMFpHRTVNREEzWW1ObU1qYzFOVEZtTnpneE0yTmtPVEZrWW1NeE9UWmtOV0ppWVRrME9HVTBaVEExTldRME1HUTVPVEUxQmpvR1JWUTZFR1JwYzNCdmMybDBhVzl1U1NKQmFXNXNhVzVsT3lCbWFXeGxibUZ0WlQwaWNHTWxOREF5ZUM1cWNHY2lPeUJtYVd4bGJtRnRaU285VlZSR0xUZ25KM0JqSlRRd01uZ3VhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMS0wMi0yN1QxMjo1OToyMi43MTRaIiwicHVyIjoiYmxvYl9rZXkifX0=--e3ad3771ffb7ea077969b2bc6a19d49bff4802ff/pc@2x.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pc%25402x.jpg%22%3B+filename%2A%3DUTF-8%27%27pc%25402x.jpg
cache-control
max-age=300, private
x-amz-cf-id
oEZREuEgahL7UgofAR3Bx_0khJammZ6KTyJ0lZ0rodRX3DjxU7wGEA==
collect
www.google-analytics.com/j/
0
0

Failed requests

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

Domain
www.google-analytics.com
URL
https://www.google-analytics.com/j/collect?v=1&_v=j88&a=71325334&t=event&ni=0&_s=1&dl=https%3A%2F%2Fbaycrews.jp%2F&ul=en-us&de=UTF-8&dt=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=JS%20ERROR&ea=46%20%3A%20Uncaught%20TypeError%3A%20Cannot%20read%20property%20%27getItem%27%20of%20null&el=data%3Atext%2Fjavascript%3Bbase64%2CZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU%2FZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0yOTcpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQpLG89big0NSkuZixpPW4oODYpLGE9bigyKSxzPW4oMjkpLHU9bigxNSksYz1uKDEyKSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg%2FcyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oNTcpLGk9big2OCksYT1uKDk3KSxzPXIuU3ltYm9sLHU9bygid2tzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB1W3RdfHwodVt0XT1hJiZzW3RdfHwoYT9zOmkpKCJTeW1ib2wuIit0KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMiksbz1uKDEyKSxpPW4oNzcpLGE9bigyMCkuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ci5TeW1ib2x8fChyLlN5bWJvbD17fSk7byhlLHQpfHxhKGUsdCx7dmFsdWU6aS5mKHQpfSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09TWF0aCYmdH07dC5leHBvcnRzPXIodHlwZW9mIGdsb2JhbFRoaXM9PW4mJmdsb2JhbFRoaXMpfHxyKHR5cGVvZiB3aW5kb3c9PW4mJndpbmRvdyl8fHIodHlwZW9mIHNlbGY9PW4mJnNlbGYpfHxyKHR5cGVvZiBlPT1uJiZlKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0pLmNhbGwodGhpcyxuKDgyKSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ%2FbnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY0KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEzNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpKyIgaXMgbm90IGFuIG9iamVjdCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2OSk7ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCkscih0LG8ua2V5LG8pfX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlJiZvKHQucHJvdG90eXBlLGUpLG4mJm8odCxuKSx0fX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5jYWxsKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxODIpLG89bigxMTIpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8%2FcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjApLGk9bigyOCk7dC5leHBvcnRzPXI%2FZnVuY3Rpb24odCxlLG4pe3JldHVybiBvLmYodCxlLGkoMSxuKSl9OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1uLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHJbdCsiUHJvdG90eXBlIl19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTYxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODQpLG89big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByKG8odCkpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDg1KSxpPW4oOSksYT1uKDU0KSxzPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmY9cj9zOmZ1bmN0aW9uKHQsZSxuKXtpZihpKHQpLGU9YShlLCEwKSxpKG4pLG8pdHJ5e3JldHVybiBzKHQsZSxuKX1jYXRjaCh0KXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCIpO3JldHVybiJ2YWx1ZSJpbiBuJiYodFtlXT1uLnZhbHVlKSx0fX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMCkuZixvPW4oMTUpLGk9bigxMiksYT1uKDE0NSkscz1uKDEpKCJ0b1N0cmluZ1RhZyIpLHU9YSE9PXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXtpZih0KXt2YXIgbD1uP3Q6dC5wcm90b3R5cGU7aShsLHMpfHxyKGwscyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KSxjJiZ1JiZvKGwsInRvU3RyaW5nIixhKX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTg5KSxvPW4oMTkzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1Nyl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYocih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChuKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FsbChlKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5jYWxsKGUsbil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gdC5jYWxsKGUsbixyKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHIsbyl7cmV0dXJuIHQuY2FsbChlLG4scixvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpLG89big0KSxpPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2koclt0XSl8fGkob1t0XSk6clt0XSYmclt0XVtlXXx8b1t0XSYmb1t0XVtlXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY2KSxvPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP28ocih0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MikuY2hhckF0LG89big0OCksaT1uKDkzKSxhPW8uc2V0LHM9by5nZXR0ZXJGb3IoIlN0cmluZyBJdGVyYXRvciIpO2koU3RyaW5nLCJTdHJpbmciLGZ1bmN0aW9uKHQpe2EodGhpcyx7dHlwZToiU3RyaW5nIEl0ZXJhdG9yIixzdHJpbmc6U3RyaW5nKHQpLGluZGV4OjB9KX0sZnVuY3Rpb24oKXt2YXIgdCxlPXModGhpcyksbj1lLnN0cmluZyxvPWUuaW5kZXg7cmV0dXJuIG8%2BPW4ubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9cihuLG8pLGUuaW5kZXgrPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe28mJm8uZW51bWVyYWJsZT90W2VdPW46cih0LGUsbil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTQpLG89bigyMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PXIoZSkmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP28odCk6ZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMjkpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM2KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM5KX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPUpTT04ucGFyc2UoJ3sibG9jaXplIjp7InByb2R1Y3RJZCI6IjYwZmY4MjI0LWJiY2MtNDgwMi04ZDU5LWM4OTgzZGVhZThkMCIsImFwaUtleSI6IjczOTZlNzc4LTA5MDMtNGU3ZS04MjgyLWU2NzE1ODU4YmI4YyIsInZlcnNpb24iOiJwcm9kdWN0aW9uIn0sImludGVncmF0aW9ucyI6eyJjb2xvcm1lQXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9jb2xvcm1lLndvcmxkc2hvcHBpbmcuanAvdjEvcHJvZHVjdCJ9fSwic2hvcGlmeUFwcCI6eyJhcGkiOnsicHJvZHVjdCI6Imh0dHBzOi8vYXBwLXMud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19fSwibGFtYmRhIjp7ImNyZWF0ZSI6InNob3AtZGF0YS1wcm9kLWNyZWF0ZSIsImNsZWFyIjoic2hvcC1kYXRhLXByb2QtY2xlYXIifSwic2ZkYyI6eyJjb25uZWN0aW9uU2V0dGluZ3NQYXRoIjoiL3NmZGMvcHJvZC9hcGkifSwiZGVidWdIb3N0cyI6WyJzaG9wLWRhc2hib2FyZC53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWRldi53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWxvY2FsLndvcmxkc2hvcHBpbmcuYml6Il19Jyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDgzKSxpPW4oMjgpLGE9bigxOCkscz1uKDU0KSx1PW4oMTIpLGM9big4NSksbD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2UuZj1yP2w6ZnVuY3Rpb24odCxlKXtpZih0PWEodCksZT1zKGUsITApLGMpdHJ5e3JldHVybiBsKHQsZSl9Y2F0Y2godCl7fWlmKHUodCxlKSlyZXR1cm4gaSghby5mLmNhbGwodCxlKSx0W2VdKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSksbz1uKDEzNyksaT1uKDY3KSxhPW4oNTUpLHM9big4OSksdT1uKDYzKSxjPW4oNTYpKCJJRV9QUk9UTyIpLGw9ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24oKXt2YXIgdCxlPXUoImlmcmFtZSIpLG49aS5sZW5ndGg7Zm9yKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIscy5hcHBlbmRDaGlsZChlKSxlLnNyYz1TdHJpbmcoImphdmFzY3JpcHQ6IiksKHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksdC53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSx0LmNsb3NlKCksZj10LkY7bi0tOylkZWxldGUgZi5wcm90b3R5cGVbaVtuXV07cmV0dXJuIGYoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG51bGwhPT10PyhsLnByb3RvdHlwZT1yKHQpLG49bmV3IGwsbC5wcm90b3R5cGU9bnVsbCxuW2NdPXQpOm49ZigpLHZvaWQgMD09PWU%2FbjpvKG4sZSl9LGFbY109ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT1uKDE0Mykscz1uKDQpLHU9big2KSxjPW4oMTUpLGw9bigxMiksZj1uKDU2KSxwPW4oNTUpLGg9cy5XZWFrTWFwO2lmKGEpe3ZhciBkPW5ldyBoLGc9ZC5nZXQsdj1kLmhhcyx5PWQuc2V0O3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5jYWxsKGQsdCxlKSxlfSxvPWZ1bmN0aW9uKHQpe3JldHVybiBnLmNhbGwoZCx0KXx8e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHYuY2FsbChkLHQpfX1lbHNle3ZhciBtPWYoInN0YXRlIik7cFttXT0hMCxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGModCxtLGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKT90W21dOnt9fSxpPWZ1bmN0aW9uKHQpe3JldHVybiBsKHQsbSl9fXQuZXhwb3J0cz17c2V0OnIsZ2V0Om8saGFzOmksZW5mb3JjZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KT9vKHQpOnIodCx7fSl9LGdldHRlckZvcjpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG47aWYoIXUoZSl8fChuPW8oZSkpLnR5cGUhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3QrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMiksbz1uKDIzKSxpPW4oNTYpLGE9big5Nikscz1pKCJJRV9QUk9UTyIpLHU9T2JqZWN0LnByb3RvdHlwZTt0LmV4cG9ydHM9YT9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9byh0KSxyKHQscyk%2FdFtzXToiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3RvciYmdCBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3I%2FdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIE9iamVjdD91Om51bGx9fSxmdW5jdGlvbih0LGUsbil7big5OCk7dmFyIHI9bigxNDcpLG89big0KSxpPW4oMTUpLGE9bigyNSkscz1uKDEpKCJ0b1N0cmluZ1RhZyIpO2Zvcih2YXIgdSBpbiByKXt2YXIgYz1vW3VdLGw9YyYmYy5wcm90b3R5cGU7bCYmIWxbc10mJmkobCxzLHUpLGFbdV09YS5BcnJheX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY5KSxvPW4oMjUpLGk9bigxKSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtpXXx8dFsiQEBpdGVyYXRvciJdfHxvW3IodCldfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE5KSxvPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5wcm9taXNlPW5ldyB0KGZ1bmN0aW9uKHQscil7aWYodm9pZCAwIT09ZXx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7ZT10LG49cn0pLHRoaXMucmVzb2x2ZT1yKGUpLHRoaXMucmVqZWN0PXIobil9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFyKHQpKXJldHVybiB0O3ZhciBuLG87aWYoZSYmImZ1bmN0aW9uIj09dHlwZW9mKG49dC50b1N0cmluZykmJiFyKG89bi5jYWxsKHQpKSlyZXR1cm4gbztpZigiZnVuY3Rpb24iPT10eXBlb2Yobj10LnZhbHVlT2YpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoIWUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87dGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1Nyksbz1uKDY4KSxpPXIoImtleXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlbdF18fChpW3RdPW8odCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDEzOCksaT1uKDIyKSxhPXJbIl9fY29yZS1qc19zaGFyZWRfXyJdfHxvKCJfX2NvcmUtanNfc2hhcmVkX18iLHt9KTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFbdF18fChhW3RdPXZvaWQgMCE9PWU%2FZTp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjIuMCIsbW9kZTppPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89bigxMDIpLGk9bigzMSksYT1uKDI5KSxzPW4oNTEpLHU9bigxMDMpLGM9ZnVuY3Rpb24odCxlKXt0aGlzLnN0b3BwZWQ9dCx0aGlzLnJlc3VsdD1lfTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGwsZil7dmFyIHAsaCxkLGcsdix5LG09YShlLG4sbD8yOjEpO2lmKGYpcD10O2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mKGg9cyh0KSkpdGhyb3cgVHlwZUVycm9yKCJUYXJnZXQgaXMgbm90IGl0ZXJhYmxlIik7aWYobyhoKSl7Zm9yKGQ9MCxnPWkodC5sZW5ndGgpO2c%2BZDtkKyspaWYoKHY9bD9tKHIoeT10W2RdKVswXSx5WzFdKTptKHRbZF0pKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX1wPWguY2FsbCh0KX1mb3IoOyEoeT1wLm5leHQoKSkuZG9uZTspaWYoKHY9dShwLG0seS52YWx1ZSxsKSkmJnYgaW5zdGFuY2VvZiBjKXJldHVybiB2O3JldHVybiBuZXcgYyghMSl9KS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYyghMCx0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm57ZXJyb3I6ITEsdmFsdWU6dCgpfX1jYXRjaCh0KXtyZXR1cm57ZXJyb3I6ITAsdmFsdWU6dH19fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwKTtmdW5jdGlvbiBvKHQsZSxuLG8saSxhLHMpe3RyeXt2YXIgdT10W2FdKHMpLGM9dS52YWx1ZX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBuKHQpfXUuZG9uZT9lKGMpOnIucmVzb2x2ZShjKS50aGVuKG8saSl9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKHIsaSl7dmFyIGE9dC5hcHBseShlLG4pO2Z1bmN0aW9uIHModCl7byhhLHIsaSxzLHUsIm5leHQiLHQpfWZ1bmN0aW9uIHUodCl7byhhLHIsaSxzLHUsInRocm93Iix0KX1zKHZvaWQgMCl9KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ3KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI2Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89big2KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg3KSxvPW4oNjcpO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4KSxvPW4oMzEpLGk9big4OCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA%2FcjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjEpLG89bigxKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk%2FcihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSksbz1uKDE0Nik7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzApO3QuZXhwb3J0cz1yKCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiKXx8IiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI5KSxvPW4oODQpLGk9bigyMyksYT1uKDMxKSxzPW4oMTA5KSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsVD1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKVRbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoVCx5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY%2FLTE6Y3x8bD9sOlR9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTQpLG89bigyMCksaT1uKDI4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBhPXIoZSk7YSBpbiB0P28uZih0LGEsaSgwLG4pKTp0W2FdPW59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oMSkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIXIoZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4oZS5jb25zdHJ1Y3Rvcj17fSlbb109ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fSwxIT09ZVt0XShCb29sZWFuKS5mb299KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSJcdFxuXHZcZlxyIMKg4ZqA4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXHUyMDI4XHUyMDI5XHVmZWZmIn0sZnVuY3Rpb24odCxlLG4pe2UuZj1uKDEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjU0KSxvPW4oMjU3KSxpPW4oMjYyKSxhPW4oMjY1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCl8fG8odCl8fGkodCl8fGEoKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBQfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KTt2YXIgcj1uKDM2KSxvPW4ubihyKSxpPW4oMzcpLGE9bi5uKGkpLHM9bigzOCksdT1uLm4ocyksYz1uKDM5KSxsPW4ubihjKSxmPW4oNDApLHA9bi5uKGYpLGg9big0MSksZD1uLm4oaCksZz1uKDEzMCksdj1uLm4oZykseT1uKDYyKSxtPW4ubih5KSxiPW4oNykseD1uLm4oYiksdz1uKDEwKSxrPW4ubih3KSxTPW4oMTEpLEU9bi5uKFMpLFQ9bigxMzEpLEE9bi5uKFQpLE89bigzNSksQz1uKDQzKTtmdW5jdGlvbiBqKHQsZSl7dmFyIG47aWYodm9pZCAwPT09bC5hfHxudWxsPT11KCkodCkpe2lmKGEoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBMKHQsZSk7dmFyIHI9ZCgpKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7Ik9iamVjdCI9PT1yJiZ0LmNvbnN0cnVjdG9yJiYocj10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09cnx8IlNldCI9PT1yKXJldHVybiBwKCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gTCh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI%2BPXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBzLGM9ITAsZj0hMTtyZXR1cm57czpmdW5jdGlvbigpe249bygpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGM9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7Zj0hMCxzPXR9LGY6ZnVuY3Rpb24oKXt0cnl7Y3x8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihmKXRocm93IHN9fX19ZnVuY3Rpb24gTCh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfXZhciBQPXtjb2RlOiJOT05FIn0sUj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49dGhpcyxyPXQuc2NyYXBlclJlc3VsdCxvPXQubG9jYXRpb24saT10LmRhdGE7aygpKHRoaXMsZSksdGhpcy5leGNsdWRlQnlTY3JhcGVyRXJyb3I9ZnVuY3Rpb24oKXt2YXIgdD1uLnNjcmFwZXJSZXN1bHQ7cmV0dXJuIHQuZXJyb3I%2Fe2NvZGU6IkVSUk9SIixtZXNzYWdlOiJleGNsdWRlQnlTY3JhcGVyRXJyb3I6ICIuY29uY2F0KHQuZXJyb3IpfTp0Lml0ZW0%2FKHQuc2t1Um93c3x8KHQuc2t1Um93cz1bXSksUCk6e2NvZGU6IkVSUk9SIixtZXNzYWdlOiJleGNsdWRlQnlTY3JhcGVyRXJyb3I6IG5vIGl0ZW0ifX0sdGhpcy5leGNsdWRlQnlOb3RQdXJjaGFzYWJsZT1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQucHVyY2hhc2FibGU%2FUDp7Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlOb3RQdXJjaGFzYWJsZSJ9fSx0aGlzLmV4Y2x1ZGVCeVNrdVplcm89ZnVuY3Rpb24oKXtyZXR1cm4gbi5zY3JhcGVyUmVzdWx0LnNrdVJvd3MmJjA9PT1uLnNjcmFwZXJSZXN1bHQuc2t1Um93cy5sZW5ndGg%2Fe2NvZGU6Ik5PVF9QVVJDSEFTQUJMRSIsbWVzc2FnZToiZXhjbHVkZUJ5U2t1WmVybyJ9OlB9LHRoaXMuZXhjbHVkZUJ5VXJsPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlVcmwubGVuZ3RoKXJldHVybiBQO3ZhciB0PWUud2luZG93TG9jYXRpb25IcmVmO3JldHVybiBuLmV4Y2x1ZGUobi5ieVVybCx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCJeIi5jb25jYXQoQSgpKHgoKShuPWUudXJsKS5jYWxsKG4pKSkpLnRlc3QodCl9KX0sdGhpcy5leGNsdWRlQnlJdGVtTmFtZT1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbU5hbWUubGVuZ3RoKXJldHVybiBQO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5uYW1lfHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlJdGVtTmFtZSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCJeIi5jb25jYXQoeCgpKG49ZS5pdGVtTmFtZSkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGNsdWRlQnlJdGVtQ29kZT1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbUNvZGUubGVuZ3RoKXJldHVybiBQO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5jb2RlfHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlJdGVtQ29kZSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiB4KCkobj1lLml0ZW1Db2RlKS5jYWxsKG4pPT09dH0pfSx0aGlzLmV4Y2x1ZGVCeUNhdGVnb3J5PWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlDYXRlZ29yeS5sZW5ndGgpcmV0dXJuIFA7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNhdGVnb3J5fHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlDYXRlZ29yeSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiB4KCkobj1lLmNhdGVnb3J5KS5jYWxsKG4pPT09dH0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1EZXNjcmlwdGlvbj1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbURlc2NyaXB0aW9uLmxlbmd0aClyZXR1cm4gUDt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uZGVzY3JpcHRpb258fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1EZXNjcmlwdGlvbix0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCIiLmNvbmNhdCh4KCkobj1lLnRleHQpLmNhbGwobikpKS50ZXN0KHQpfSl9LHRoaXMuZXhlY3V0ZT1mdW5jdGlvbigpe3ZhciB0PSExLGU9W10scj1uLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcigpO2lmKCJOT05FIiE9PXIuY29kZSlyZXR1cm57aXNFeGNsdWRlZDohMCxyZWFzb25zOltyXX07Ik5PTkUiIT09KHI9bi5leGNsdWRlQnlOb3RQdXJjaGFzYWJsZSgpKS5jb2RlJiYodD0hMCxlLnB1c2gocikpO3ZhciBvLGk9aihuLmNvbmZpZ3VyZUV4Y2x1c2lvbk1ldGhvZHMoW24uZXhjbHVkZUJ5VXJsLG4uZXhjbHVkZUJ5SXRlbU5hbWUsbi5leGNsdWRlQnlJdGVtQ29kZSxuLmV4Y2x1ZGVCeUNhdGVnb3J5LG4uZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uXSkpO3RyeXtmb3IoaS5zKCk7IShvPWkubigpKS5kb25lOyl7dmFyIGE9KDAsby52YWx1ZSkoKTtpZigiTk9ORSIhPT1hLmNvZGUmJih0PSEwLGUucHVzaChhKSksIkVSUk9SIj09PWEuY29kZSlicmVha319Y2F0Y2godCl7aS5lKHQpfWZpbmFsbHl7aS5mKCl9cmV0dXJue2lzRXhjbHVkZWQ6dCxyZWFzb25zOmV9fSx0aGlzLnNjcmFwZXJSZXN1bHQ9cix0aGlzLmxvY2F0aW9uPW8sdGhpcy5kYXRhPWksdGhpcy5ieVVybD1pLmJ5VXJsLHRoaXMuYnlJdGVtTmFtZT1pLmJ5SXRlbU5hbWUsdGhpcy5ieUl0ZW1Db2RlPWkuYnlJdGVtQ29kZSx0aGlzLmJ5Q2F0ZWdvcnk9aS5ieUNhdGVnb3J5LHRoaXMuYnlJdGVtRGVzY3JpcHRpb249aS5ieUl0ZW1EZXNjcmlwdGlvbn1yZXR1cm4gRSgpKGUsW3trZXk6ImNvbmZpZ3VyZUV4Y2x1c2lvbk1ldGhvZHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0fX0se2tleToiZXhjbHVkZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBQfX1dLFt7a2V5OiJ3aW5kb3dMb2NhdGlvbkhyZWYiLGdldDpmdW5jdGlvbigpe3ZhciBlLG49d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLHI9d2luZG93LmxvY2F0aW9uLmhyZWY7aWYobSgpKGU9Qy5kZWJ1Z0hvc3RzKS5jYWxsKGUsbikpe3ZhciBvPW5ldyB2LmEod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCJ6enVybCIpO2lmKG8pdHJ5e3I9dC5mcm9tKG8sImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGYtOCIpfWNhdGNoKHQpe08uYS5lcnJvcih0KX19cmV0dXJuIHJ9fV0pLGV9KCl9KS5jYWxsKHRoaXMsbigyNzUpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODcpfSxmdW5jdGlvbih0LGUpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaCh0KXsib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX10LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaT1vJiYhci5jYWxsKHsxOjJ9LDEpO2UuZj1pP2Z1bmN0aW9uKHQpe3ZhciBlPW8odGhpcyx0KTtyZXR1cm4hIWUmJmUuZW51bWVyYWJsZX06cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDIxKSxpPSIiLnNwbGl0O3QuZXhwb3J0cz1yKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSk%2FZnVuY3Rpb24odCl7cmV0dXJuIlN0cmluZyI9PW8odCk%2FaS5jYWxsKHQsIiIpOk9iamVjdCh0KX06T2JqZWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDUpLGk9big2Myk7dC5leHBvcnRzPSFyJiYhbyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89LyN8XC5wcm90b3R5cGVcLi8saT1mdW5jdGlvbih0LGUpe3ZhciBuPXNbYSh0KV07cmV0dXJuIG49PWN8fG4hPXUmJigiZnVuY3Rpb24iPT10eXBlb2YgZT9yKGUpOiEhZSl9LGE9aS5ub3JtYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKG8sIi4iKS50b0xvd2VyQ2FzZSgpfSxzPWkuZGF0YT17fSx1PWkuTkFUSVZFPSJOIixjPWkuUE9MWUZJTEw9IlAiO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMiksbz1uKDE4KSxpPW4oNjUpLmluZGV4T2YsYT1uKDU1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixzPW8odCksdT0wLGM9W107Zm9yKG4gaW4gcykhcihhLG4pJiZyKHMsbikmJmMucHVzaChuKTtmb3IoO2UubGVuZ3RoPnU7KXIocyxuPWVbdSsrXSkmJih%2BaShjLG4pfHxjLnB1c2gobikpO3JldHVybiBjfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjYpLG89TWF0aC5tYXgsaT1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1yKHQpO3JldHVybiBuPDA%2FbyhuK2UsMCk6aShuLGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzApO3QuZXhwb3J0cz1yKCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTkpLG89big2KSxpPVtdLnNsaWNlLGE9e30scz1mdW5jdGlvbih0LGUsbil7aWYoIShlIGluIGEpKXtmb3IodmFyIHI9W10sbz0wO288ZTtvKyspcltvXT0iYVsiK28rIl0iO2FbZV09RnVuY3Rpb24oIkMsYSIsInJldHVybiBuZXcgQygiK3Iuam9pbigiLCIpKyIpIil9cmV0dXJuIGFbZV0odCxuKX07dC5leHBvcnRzPUZ1bmN0aW9uLmJpbmR8fGZ1bmN0aW9uKHQpe3ZhciBlPXIodGhpcyksbj1pLmNhbGwoYXJndW1lbnRzLDEpLGE9ZnVuY3Rpb24oKXt2YXIgcj1uLmNvbmNhdChpLmNhbGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBhP3MoZSxyLmxlbmd0aCxyKTplLmFwcGx5KHQscil9O3JldHVybiBvKGUucHJvdG90eXBlKSYmKGEucHJvdG90eXBlPWUucHJvdG90eXBlKSxhfX0sZnVuY3Rpb24odCxlLG4pe24oOTIpLG4oMzIpLG4oNTApLG4oMTQ4KSxuKDEwOCksbigxNTIpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oOTQpLGk9big0OSksYT1uKDcwKSxzPW4oMjQpLHU9bigxNSksYz1uKDMzKSxsPW4oMSksZj1uKDIyKSxwPW4oMjUpLGg9big5NSksZD1oLkl0ZXJhdG9yUHJvdG90eXBlLGc9aC5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHY9bCgiaXRlcmF0b3IiKSx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixsLGgsbSxiKXtvKG4sZSxsKTt2YXIgeCx3LGssUz1mdW5jdGlvbih0KXtpZih0PT09aCYmQylyZXR1cm4gQztpZighZyYmdCBpbiBBKXJldHVybiBBW3RdO3N3aXRjaCh0KXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpjYXNlImVudHJpZXMiOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9fSxFPWUrIiBJdGVyYXRvciIsVD0hMSxBPXQucHJvdG90eXBlLE89QVt2XXx8QVsiQEBpdGVyYXRvciJdfHxoJiZBW2hdLEM9IWcmJk98fFMoaCksaj0iQXJyYXkiPT1lJiZBLmVudHJpZXN8fE87aWYoaiYmKHg9aShqLmNhbGwobmV3IHQpKSxkIT09T2JqZWN0LnByb3RvdHlwZSYmeC5uZXh0JiYoZnx8aSh4KT09PWR8fChhP2EoeCxkKToiZnVuY3Rpb24iIT10eXBlb2YgeFt2XSYmdSh4LHYseSkpLHMoeCxFLCEwLCEwKSxmJiYocFtFXT15KSkpLCJ2YWx1ZXMiPT1oJiZPJiYidmFsdWVzIiE9PU8ubmFtZSYmKFQ9ITAsQz1mdW5jdGlvbigpe3JldHVybiBPLmNhbGwodGhpcyl9KSxmJiYhYnx8QVt2XT09PUN8fHUoQSx2LEMpLHBbZV09QyxoKWlmKHc9e3ZhbHVlczpTKCJ2YWx1ZXMiKSxrZXlzOm0%2FQzpTKCJrZXlzIiksZW50cmllczpTKCJlbnRyaWVzIil9LGIpZm9yKGsgaW4gdykhZyYmIVQmJmsgaW4gQXx8YyhBLGssd1trXSk7ZWxzZSByKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6Z3x8VH0sdyk7cmV0dXJuIHd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOTUpLkl0ZXJhdG9yUHJvdG90eXBlLG89big0NyksaT1uKDI4KSxhPW4oMjQpLHM9bigyNSksdT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBjPWUrIiBJdGVyYXRvciI7cmV0dXJuIHQucHJvdG90eXBlPW8ocix7bmV4dDppKDEsbil9KSxhKHQsYywhMSwhMCksc1tjXT11LHR9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLG8saSxhPW4oNDkpLHM9bigxNSksdT1uKDEyKSxjPW4oMSksbD1uKDIyKSxmPWMoIml0ZXJhdG9yIikscD0hMTtbXS5rZXlzJiYoIm5leHQiaW4oaT1bXS5rZXlzKCkpPyhvPWEoYShpKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmKHI9byk6cD0hMCksbnVsbD09ciYmKHI9e30pLGx8fHUocixmKXx8cyhyLGYsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuZXhwb3J0cz17SXRlcmF0b3JQcm90b3R5cGU6cixCVUdHWV9TQUZBUklfSVRFUkFUT1JTOnB9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgdCkhPT10LnByb3RvdHlwZX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxOCksbz1uKDcxKSxpPW4oMjUpLGE9big0OCkscz1uKDkzKSx1PWEuc2V0LGM9YS5nZXR0ZXJGb3IoIkFycmF5IEl0ZXJhdG9yIik7dC5leHBvcnRzPXMoQXJyYXksIkFycmF5IixmdW5jdGlvbih0LGUpe3UodGhpcyx7dHlwZToiQXJyYXkgSXRlcmF0b3IiLHRhcmdldDpyKHQpLGluZGV4OjAsa2luZDplfSl9LGZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzKSxlPXQudGFyZ2V0LG49dC5raW5kLHI9dC5pbmRleCsrO3JldHVybiFlfHxyPj1lLmxlbmd0aD8odC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6ZVtyXSxkb25lOiExfTp7dmFsdWU6W3IsZVtyXV0sZG9uZTohMX19LCJ2YWx1ZXMiKSxpLkFyZ3VtZW50cz1pLkFycmF5LG8oImtleXMiKSxvKCJ2YWx1ZXMiKSxvKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpO3QuZXhwb3J0cz1yLlByb21pc2V9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgbyBpbiBlKW4mJm4udW5zYWZlJiZ0W29dP3Rbb109ZVtvXTpyKHQsbyxlW29dLG4pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IFR5cGVFcnJvcigiSW5jb3JyZWN0ICIrKG4%2FbisiICI6IiIpKyJpbnZvY2F0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPW4oMjUpLGk9cigiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihvLkFycmF5PT09dHx8YVtpXT09PXQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3RyeXtyZXR1cm4gbz9lKHIobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbCh0KSksZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSgiaXRlcmF0b3IiKSxvPSExO3RyeXt2YXIgaT0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIWkrK319LHJldHVybjpmdW5jdGlvbigpe289ITB9fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFvKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgaT17fTtpW3JdPWZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX19fSx0KGkpfWNhdGNoKHQpe31yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89bigxOSksaT1uKDEpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1yKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0obj1yKGEpW2ldKT9lOm8obil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9big0KSxzPW4oNSksdT1uKDIxKSxjPW4oMjkpLGw9big4OSksZj1uKDYzKSxwPWEubG9jYXRpb24saD1hLnNldEltbWVkaWF0ZSxkPWEuY2xlYXJJbW1lZGlhdGUsZz1hLnByb2Nlc3Msdj1hLk1lc3NhZ2VDaGFubmVsLHk9YS5EaXNwYXRjaCxtPTAsYj17fSx4PWZ1bmN0aW9uKHQpe2lmKGIuaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPWJbdF07ZGVsZXRlIGJbdF0sZSgpfX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt4KHQpfX0saz1mdW5jdGlvbih0KXt4KHQuZGF0YSl9LFM9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh0KyIiLHAucHJvdG9jb2wrIi8vIitwLmhvc3QpfTtoJiZkfHwoaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO2FyZ3VtZW50cy5sZW5ndGg%2BbjspZS5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gYlsrK21dPWZ1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCkpLmFwcGx5KHZvaWQgMCxlKX0scihtKSxtfSxkPWZ1bmN0aW9uKHQpe2RlbGV0ZSBiW3RdfSwicHJvY2VzcyI9PXUoZyk%2Fcj1mdW5jdGlvbih0KXtnLm5leHRUaWNrKHcodCkpfTp5JiZ5Lm5vdz9yPWZ1bmN0aW9uKHQpe3kubm93KHcodCkpfTp2PyhpPShvPW5ldyB2KS5wb3J0MixvLnBvcnQxLm9ubWVzc2FnZT1rLHI9YyhpLnBvc3RNZXNzYWdlLGksMSkpOiFhLmFkZEV2ZW50TGlzdGVuZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBwb3N0TWVzc2FnZXx8YS5pbXBvcnRTY3JpcHRzfHxzKFMpP3I9Im9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbih0KXtsLmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlbW92ZUNoaWxkKHRoaXMpLHgodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHcodCksMCl9OihyPVMsYS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrLCExKSkpLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6ZH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89big2KSxpPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKHIodCksbyhlKSYmZS5jb25zdHJ1Y3Rvcj09PXQpcmV0dXJuIGU7dmFyIG49aS5mKHQpO3JldHVybigwLG4ucmVzb2x2ZSkoZSksbi5wcm9taXNlfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxOSksaT1uKDUyKSxhPW4oNTkpLHM9big1OCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YWxsU2V0dGxlZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49aS5mKGUpLHI9bi5yZXNvbHZlLHU9bi5yZWplY3QsYz1hKGZ1bmN0aW9uKCl7dmFyIG49byhlLnJlc29sdmUpLGk9W10sYT0wLHU9MTtzKHQsZnVuY3Rpb24odCl7dmFyIG89YSsrLHM9ITE7aS5wdXNoKHZvaWQgMCksdSsrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7c3x8KHM9ITAsaVtvXT17c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOnR9LC0tdXx8cihpKSl9LGZ1bmN0aW9uKHQpe3N8fChzPSEwLGlbb109e3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjp0fSwtLXV8fHIoaSkpfSl9KSwtLXV8fHIoaSl9KTtyZXR1cm4gYy5lcnJvciYmdShjLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89big1MyksaT1uKDEpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG8odCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj10LmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhbyhuLnByb3RvdHlwZSk%2FcihuKSYmbnVsbD09PShuPW5baV0pJiYobj12b2lkIDApOm49dm9pZCAwKSxuZXcodm9pZCAwPT09bj9BcnJheTpuKSgwPT09ZT8wOmUpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big1KSxpPW4oNTMpLGE9big2KSxzPW4oMjMpLHU9bigzMSksYz1uKDc0KSxsPW4oMTA5KSxmPW4oNzUpLHA9bigxKSgiaXNDb25jYXRTcHJlYWRhYmxlIiksaD0hbyhmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0W3BdPSExLHQuY29uY2F0KClbMF0hPT10fSksZD1mKCJjb25jYXQiKSxnPWZ1bmN0aW9uKHQpe2lmKCFhKHQpKXJldHVybiExO3ZhciBlPXRbcF07cmV0dXJuIHZvaWQgMCE9PWU%2FISFlOmkodCl9O3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohaHx8IWR9LHtjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhPXModGhpcyksZj1sKGEsMCkscD0wO2ZvcihlPS0xLHI9YXJndW1lbnRzLmxlbmd0aDtlPHI7ZSsrKWlmKGk9LTE9PT1lP2E6YXJndW1lbnRzW2VdLGcoaSkpe2lmKHArKG89dShpLmxlbmd0aCkpPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgVHlwZUVycm9yKCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQiKTtmb3Iobj0wO248bztuKysscCsrKW4gaW4gaSYmYyhmLHAsaVtuXSl9ZWxzZXtpZihwPj05MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7YyhmLHArKyxpKX1yZXR1cm4gZi5sZW5ndGg9cCxmfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Niksbz0iWyIrbig3NikrIl0iLGk9UmVnRXhwKCJeIitvK28rIioiKSxhPVJlZ0V4cChvK28rIiokIikscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKHIoZSkpO3JldHVybiAxJnQmJihuPW4ucmVwbGFjZShpLCIiKSksMiZ0JiYobj1uLnJlcGxhY2UoYSwiIikpLG59fTt0LmV4cG9ydHM9e3N0YXJ0OnMoMSksZW5kOnMoMiksdHJpbTpzKDMpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4Nil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTk4KX0sZnVuY3Rpb24odCxlLG4pe24oMTEwKSxuKDkyKSxuKDE5OSksbigyMDIpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMTEzKSxuKDIwNiksbigyMDcpLG4oMjA4KSxuKDIwOSksbigyMTApLG4oMjExKSxuKDIxMiksbigyMTMpLG4oMjE0KSxuKDIxNSksbigyMTYpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuU3ltYm9sfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4Nyksbz1uKDY3KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0KSxpPW4oNzIpLGE9W10uc2xpY2Uscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjIsbz1yP2EuY2FsbChhcmd1bWVudHMsMik6dm9pZCAwO3JldHVybiB0KHI%2FZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIGU%2FZTpGdW5jdGlvbihlKSkuYXBwbHkodGhpcyxvKX06ZSxuKX19O3Ioe2dsb2JhbDohMCxiaW5kOiEwLGZvcmNlZDovTVNJRSAuXC4vLnRlc3QoaSl9LHtzZXRUaW1lb3V0OnMoby5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpzKG8uc2V0SW50ZXJ2YWwpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89big1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBpdGVyYWJsZSIpO3JldHVybiByKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7bigyMzgpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuQXJyYXkuaXNBcnJheX0sZnVuY3Rpb24odCxlLG4pe24oMzIpLG4oMjQyKTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLkFycmF5LmZyb219LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0NSksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2xpY2U7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLnNsaWNlP3I6ZX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7KG51bGw9PWV8fGU%2BdC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjU4KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTczKSxvPW4oMTc3KSxpPW4oMTgxKTtmdW5jdGlvbiBhKGUsbixzKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJm8%2FdC5leHBvcnRzPWE9bzp0LmV4cG9ydHM9YT1mdW5jdGlvbih0LGUsbil7dmFyIG89aSh0LGUpO2lmKG8pe3ZhciBhPXIobyxlKTtyZXR1cm4gYS5nZXQ%2FYS5nZXQuY2FsbChuKTphLnZhbHVlfX0sYShlLG4sc3x8ZSl9dC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI7Ci8qIQogKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjQuMQogKiBodHRwczovL2pxdWVyeS5jb20vCiAqCiAqIEluY2x1ZGVzIFNpenpsZS5qcwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxOS0wNS0wMVQyMTowNFoKICovCi8qIQogKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjQuMQogKiBodHRwczovL2pxdWVyeS5jb20vCiAqCiAqIEluY2x1ZGVzIFNpenpsZS5qcwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxOS0wNS0wMVQyMTowNFoKICovCiFmdW5jdGlvbihlLG4peyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIHQuZXhwb3J0cz90LmV4cG9ydHM9ZS5kb2N1bWVudD9uKGUsITApOmZ1bmN0aW9uKHQpe2lmKCF0LmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBuKHQpfTpuKGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihuLG8peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1bXSxhPW4uZG9jdW1lbnQscz1PYmplY3QuZ2V0UHJvdG90eXBlT2YsdT1pLnNsaWNlLGM9aS5jb25jYXQsbD1pLnB1c2gsZj1pLmluZGV4T2YscD17fSxoPXAudG9TdHJpbmcsZD1wLmhhc093blByb3BlcnR5LGc9ZC50b1N0cmluZyx2PWcuY2FsbChPYmplY3QpLHk9e30sbT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSxiPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiZ0PT09dC53aW5kb3d9LHg9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiB3KHQsZSxuKXt2YXIgcixvLGk9KG49bnx8YSkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoaS50ZXh0PXQsZSlmb3IociBpbiB4KShvPWVbcl18fGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZShyKSkmJmkuc2V0QXR0cmlidXRlKHIsbyk7bi5oZWFkLmFwcGVuZENoaWxkKGkpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSl9ZnVuY3Rpb24gayh0KXtyZXR1cm4gbnVsbD09dD90KyIiOiJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQ%2FcFtoLmNhbGwodCldfHwib2JqZWN0Ijp0eXBlb2YgdH12YXIgUz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgUy5mbi5pbml0KHQsZSl9LEU9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO2Z1bmN0aW9uIFQodCl7dmFyIGU9ISF0JiYibGVuZ3RoImluIHQmJnQubGVuZ3RoLG49ayh0KTtyZXR1cm4hbSh0KSYmIWIodCkmJigiYXJyYXkiPT09bnx8MD09PWV8fCJudW1iZXIiPT10eXBlb2YgZSYmZT4wJiZlLTEgaW4gdCl9Uy5mbj1TLnByb3RvdHlwZT17anF1ZXJ5OiIzLjQuMSIsY29uc3RydWN0b3I6UyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHUuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3UuY2FsbCh0aGlzKTp0PDA%2FdGhpc1t0K3RoaXMubGVuZ3RoXTp0aGlzW3RdfSxwdXNoU3RhY2s6ZnVuY3Rpb24odCl7dmFyIGU9Uy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksdCk7cmV0dXJuIGUucHJldk9iamVjdD10aGlzLGV9LGVhY2g6ZnVuY3Rpb24odCl7cmV0dXJuIFMuZWFjaCh0aGlzLHQpfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMubWFwKHRoaXMsZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5jYWxsKGUsbixlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxlbmd0aCxuPSt0Kyh0PDA%2FZTowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjxlP1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpsLHNvcnQ6aS5zb3J0LHNwbGljZTppLnNwbGljZX0sUy5leHRlbmQ9Uy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixvLGksYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsYz0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGM9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KHQ9YXJndW1lbnRzW3NdKSlmb3IoZSBpbiB0KXI9dFtlXSwiX19wcm90b19fIiE9PWUmJmEhPT1yJiYoYyYmciYmKFMuaXNQbGFpbk9iamVjdChyKXx8KG89QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbZV0saT1vJiYhQXJyYXkuaXNBcnJheShuKT9bXTpvfHxTLmlzUGxhaW5PYmplY3Qobik%2Fbjp7fSxvPSExLGFbZV09Uy5leHRlbmQoYyxpLHIpKTp2b2lkIDAhPT1yJiYoYVtlXT1yKSk7cmV0dXJuIGF9LFMuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKygiMy40LjEiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKHQpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlLG47cmV0dXJuISghdHx8IltvYmplY3QgT2JqZWN0XSIhPT1oLmNhbGwodCkpJiYoIShlPXModCkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj1kLmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcikmJmcuY2FsbChuKT09PXYpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24odCxlKXt3KHQse25vbmNlOmUmJmUubm9uY2V9KX0sZWFjaDpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MDtpZihUKHQpKWZvcihuPXQubGVuZ3RoO3I8biYmITEhPT1lLmNhbGwodFtyXSxyLHRbcl0pO3IrKyk7ZWxzZSBmb3IociBpbiB0KWlmKCExPT09ZS5jYWxsKHRbcl0scix0W3JdKSlicmVhaztyZXR1cm4gdH0sdHJpbTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjoodCsiIikucmVwbGFjZShFLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49ZXx8W107cmV0dXJuIG51bGwhPXQmJihUKE9iamVjdCh0KSk%2FUy5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgdD9bdF06dCk6bC5jYWxsKG4sdCkpLG59LGluQXJyYXk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT1lPy0xOmYuY2FsbChlLHQsbil9LG1lcmdlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPStlLmxlbmd0aCxyPTAsbz10Lmxlbmd0aDtyPG47cisrKXRbbysrXT1lW3JdO3JldHVybiB0Lmxlbmd0aD1vLHR9LGdyZXA6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxvPTAsaT10Lmxlbmd0aCxhPSFuO288aTtvKyspIWUodFtvXSxvKSE9PWEmJnIucHVzaCh0W29dKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9MCxhPVtdO2lmKFQodCkpZm9yKHI9dC5sZW5ndGg7aTxyO2krKyludWxsIT0obz1lKHRbaV0saSxuKSkmJmEucHVzaChvKTtlbHNlIGZvcihpIGluIHQpbnVsbCE9KG89ZSh0W2ldLGksbikpJiZhLnB1c2gobyk7cmV0dXJuIGMuYXBwbHkoW10sYSl9LGd1aWQ6MSxzdXBwb3J0Onl9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUy5mbltTeW1ib2wuaXRlcmF0b3JdPWlbU3ltYm9sLml0ZXJhdG9yXSksUy5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe3BbIltvYmplY3QgIitlKyJdIl09ZS50b0xvd2VyQ2FzZSgpfSk7dmFyIEE9Ci8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjQKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanMuZm91bmRhdGlvbi8KICoKICogRGF0ZTogMjAxOS0wNC0wOAogKi8KZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdSxjLGwsZixwLGgsZCxnLHYseSxtLGIseD0ic2l6emxlIisxKm5ldyBEYXRlLHc9dC5kb2N1bWVudCxrPTAsUz0wLEU9dXQoKSxUPXV0KCksQT11dCgpLE89dXQoKSxDPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lJiYoZj0hMCksMH0saj17fS5oYXNPd25Qcm9wZXJ0eSxMPVtdLFA9TC5wb3AsUj1MLnB1c2gsTj1MLnB1c2gsST1MLnNsaWNlLEQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYodFtuXT09PWUpcmV0dXJuIG47cmV0dXJuLTF9LF89ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixVPSIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsQj0iXFxbIitNKyIqKCIrVSsiKSg%2FOiIrTSsiKihbKl4kfCF%2BXT89KSIrTSsiKig%2FOicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg%2FOlxcXFwufFteXFxcXFwiXSkqKVwifCgiK1UrIikpfCkiK00rIipcXF0iLHE9IjooIitVKyIpKD86XFwoKCgnKCg%2FOlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg%2FOlxcXFwufFteXFxcXCgpW1xcXV18IitCKyIpKil8LiopXFwpfCkiLEY9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLEg9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg%2FOlxcXFwuKSopIitNKyIrJCIsImciKSx6PW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksVz1uZXcgUmVnRXhwKCJeIitNKyIqKFs%2BK35dfCIrTSsiKSIrTSsiKiIpLCQ9bmV3IFJlZ0V4cChNKyJ8PiIpLFY9bmV3IFJlZ0V4cChxKSxZPW5ldyBSZWdFeHAoIl4iK1UrIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK1UrIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrVSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrVSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK0IpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitxKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitfKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls%2BK35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg%2FOi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxLPS9IVE1MJC9pLFg9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLFE9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyx0dD0vWyt%2BXS8sZXQ9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI%2FfCgiK00rIil8LikiLCJpZyIpLG50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0iMHgiK2UtNjU1MzY7cmV0dXJuIHIhPXJ8fG4%2FZTpyPDA%2FU3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKHI%2BPjEwfDU1Mjk2LDEwMjMmcnw1NjMyMCl9LHJ0PS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXDAtXHgxZlx4N2YtXHVGRkZGXHctXS9nLG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU%2FIlwwIj09PXQ%2FIu%2B%2FvSI6dC5zbGljZSgwLC0xKSsiXFwiK3QuY2hhckNvZGVBdCh0Lmxlbmd0aC0xKS50b1N0cmluZygxNikrIiAiOiJcXCIrdH0saXQ9ZnVuY3Rpb24oKXtwKCl9LGF0PXh0KGZ1bmN0aW9uKHQpe3JldHVybiEwPT09dC5kaXNhYmxlZCYmImZpZWxkc2V0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKX0se2RpcjoicGFyZW50Tm9kZSIsbmV4dDoibGVnZW5kIn0pO3RyeXtOLmFwcGx5KEw9SS5jYWxsKHcuY2hpbGROb2Rlcyksdy5jaGlsZE5vZGVzKSxMW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKHQpe049e2FwcGx5OkwubGVuZ3RoP2Z1bmN0aW9uKHQsZSl7Ui5hcHBseSh0LEkuY2FsbChlKSl9OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLHI9MDt0W24rK109ZVtyKytdOyk7dC5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc3QodCxlLHIsbyl7dmFyIGkscyxjLGwsZixkLHksbT1lJiZlLm93bmVyRG9jdW1lbnQsaz1lP2Uubm9kZVR5cGU6OTtpZihyPXJ8fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiByO2lmKCFvJiYoKGU%2FZS5vd25lckRvY3VtZW50fHxlOncpIT09aCYmcChlKSxlPWV8fGgsZykpe2lmKDExIT09ayYmKGY9Wi5leGVjKHQpKSlpZihpPWZbMV0pe2lmKDk9PT1rKXtpZighKGM9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIHI7aWYoYy5pZD09PWkpcmV0dXJuIHIucHVzaChjKSxyfWVsc2UgaWYobSYmKGM9bS5nZXRFbGVtZW50QnlJZChpKSkmJmIoZSxjKSYmYy5pZD09PWkpcmV0dXJuIHIucHVzaChjKSxyfWVsc2V7aWYoZlsyXSlyZXR1cm4gTi5hcHBseShyLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLHI7aWYoKGk9ZlszXSkmJm4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBOLmFwcGx5KHIsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxyfWlmKG4ucXNhJiYhT1t0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09a3x8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZih5PXQsbT1lLDE9PT1rJiYkLnRlc3QodCkpe2ZvcigobD1lLmdldEF0dHJpYnV0ZSgiaWQiKSk%2FbD1sLnJlcGxhY2UocnQsb3QpOmUuc2V0QXR0cmlidXRlKCJpZCIsbD14KSxzPShkPWEodCkpLmxlbmd0aDtzLS07KWRbc109IiMiK2wrIiAiK2J0KGRbc10pO3k9ZC5qb2luKCIsIiksbT10dC50ZXN0KHQpJiZ5dChlLnBhcmVudE5vZGUpfHxlfXRyeXtyZXR1cm4gTi5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh5KSkscn1jYXRjaChlKXtPKHQsITApfWZpbmFsbHl7bD09PXgmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIHUodC5yZXBsYWNlKEgsIiQxIiksZSxyLG8pfWZ1bmN0aW9uIHV0KCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uIGUobixvKXtyZXR1cm4gdC5wdXNoKG4rIiAiKT5yLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVt0LnNoaWZ0KCldLGVbbisiICJdPW99fWZ1bmN0aW9uIGN0KHQpe3JldHVybiB0W3hdPSEwLHR9ZnVuY3Rpb24gbHQodCl7dmFyIGU9aC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIXQoZSl9Y2F0Y2godCl7cmV0dXJuITF9ZmluYWxseXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlPW51bGx9fWZ1bmN0aW9uIGZ0KHQsZSl7Zm9yKHZhciBuPXQuc3BsaXQoInwiKSxvPW4ubGVuZ3RoO28tLTspci5hdHRySGFuZGxlW25bb11dPWV9ZnVuY3Rpb24gcHQodCxlKXt2YXIgbj1lJiZ0LHI9biYmMT09PXQubm9kZVR5cGUmJjE9PT1lLm5vZGVUeXBlJiZ0LnNvdXJjZUluZGV4LWUuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKWZvcig7bj1uLm5leHRTaWJsaW5nOylpZihuPT09ZSlyZXR1cm4tMTtyZXR1cm4gdD8xOi0xfWZ1bmN0aW9uIGh0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZ3QodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU%2FZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ%2FImxhYmVsImluIGU%2FImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZhdChlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiB2dCh0KXtyZXR1cm4gY3QoZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsY3QoZnVuY3Rpb24obixyKXtmb3IodmFyIG8saT10KFtdLG4ubGVuZ3RoLGUpLGE9aS5sZW5ndGg7YS0tOyluW289aVthXV0mJihuW29dPSEocltvXT1uW29dKSl9KX0pfWZ1bmN0aW9uIHl0KHQpe3JldHVybiB0JiZ2b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lJiZ0fWZvcihlIGluIG49c3Quc3VwcG9ydD17fSxpPXN0LmlzWE1MPWZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZXNwYWNlVVJJLG49KHQub3duZXJEb2N1bWVudHx8dCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFLLnRlc3QoZXx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0scD1zdC5zZXREb2N1bWVudD1mdW5jdGlvbih0KXt2YXIgZSxvLGE9dD90Lm93bmVyRG9jdW1lbnR8fHQ6dztyZXR1cm4gYSE9PWgmJjk9PT1hLm5vZGVUeXBlJiZhLmRvY3VtZW50RWxlbWVudD8oZD0oaD1hKS5kb2N1bWVudEVsZW1lbnQsZz0haShoKSx3IT09aCYmKG89aC5kZWZhdWx0VmlldykmJm8udG9wIT09byYmKG8uYWRkRXZlbnRMaXN0ZW5lcj9vLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsaXQsITEpOm8uYXR0YWNoRXZlbnQmJm8uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixpdCkpLG4uYXR0cmlidXRlcz1sdChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc05hbWU9ImkiLCF0LmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxuLmdldEVsZW1lbnRzQnlUYWdOYW1lPWx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmFwcGVuZENoaWxkKGguY3JlYXRlQ29tbWVudCgiIikpLCF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVEudGVzdChoLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLG4uZ2V0QnlJZD1sdChmdW5jdGlvbih0KXtyZXR1cm4gZC5hcHBlbmRDaGlsZCh0KS5pZD14LCFoLmdldEVsZW1lbnRzQnlOYW1lfHwhaC5nZXRFbGVtZW50c0J5TmFtZSh4KS5sZW5ndGh9KSxuLmdldEJ5SWQ%2FKHIuZmlsdGVyLklEPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj1lLmdldEVsZW1lbnRCeUlkKHQpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dm9pZCAwIT09dC5nZXRBdHRyaWJ1dGVOb2RlJiZ0LmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG4mJm4udmFsdWU9PT1lfX0sci5maW5kLklEPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixvLGk9ZS5nZXRFbGVtZW50QnlJZCh0KTtpZihpKXtpZigobj1pLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09dClyZXR1cm5baV07Zm9yKG89ZS5nZXRFbGVtZW50c0J5TmFtZSh0KSxyPTA7aT1vW3IrK107KWlmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltpXX1yZXR1cm5bXX19KSxyLmZpbmQuVEFHPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWU%2FZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09ZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpOm4ucXNhP2UucXVlcnlTZWxlY3RvckFsbCh0KTp2b2lkIDB9OmZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXSxvPTAsaT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpO2lmKCIqIj09PXQpe2Zvcig7bj1pW28rK107KTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIGl9LHIuZmluZC5DTEFTUz1uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZnKXJldHVybiBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodCl9LHk9W10sdj1bXSwobi5xc2E9US50ZXN0KGgucXVlcnlTZWxlY3RvckFsbCkpJiYobHQoZnVuY3Rpb24odCl7ZC5hcHBlbmRDaGlsZCh0KS5pbm5lckhUTUw9IjxhIGlkPSciK3grIic%2BPC9hPjxzZWxlY3QgaWQ9JyIreCsiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc%2BPC9vcHRpb24%2BPC9zZWxlY3Q%2BIix0LnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoJiZ2LnB1c2goIlsqXiRdPSIrTSsiKig%2FOicnfFwiXCIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHx2LnB1c2goIlxcWyIrTSsiKig%2FOnZhbHVlfCIrXysiKSIpLHQucXVlcnlTZWxlY3RvckFsbCgiW2lkfj0iK3grIi1dIikubGVuZ3RofHx2LnB1c2goIn49IiksdC5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8di5wdXNoKCI6Y2hlY2tlZCIpLHQucXVlcnlTZWxlY3RvckFsbCgiYSMiK3grIisqIikubGVuZ3RofHx2LnB1c2goIi4jLitbK35dIil9KSxsdChmdW5jdGlvbih0KXt0LmlubmVySFRNTD0iPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT48c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc%2BPG9wdGlvbi8%2BPC9zZWxlY3Q%2BIjt2YXIgZT1oLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSx0LmFwcGVuZENoaWxkKGUpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZ2LnB1c2goIm5hbWUiK00rIipbKl4kfCF%2BXT89IiksMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxkLmFwcGVuZENoaWxkKHQpLmRpc2FibGVkPSEwLDIhPT10LnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLHQucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLHYucHVzaCgiLC4qOiIpfSkpLChuLm1hdGNoZXNTZWxlY3Rvcj1RLnRlc3QobT1kLm1hdGNoZXN8fGQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxkLm1vek1hdGNoZXNTZWxlY3Rvcnx8ZC5vTWF0Y2hlc1NlbGVjdG9yfHxkLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmx0KGZ1bmN0aW9uKHQpe24uZGlzY29ubmVjdGVkTWF0Y2g9bS5jYWxsKHQsIioiKSxtLmNhbGwodCwiW3MhPScnXTp4IikseS5wdXNoKCIhPSIscSl9KSx2PXYubGVuZ3RoJiZuZXcgUmVnRXhwKHYuam9pbigifCIpKSx5PXkubGVuZ3RoJiZuZXcgUmVnRXhwKHkuam9pbigifCIpKSxlPVEudGVzdChkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSxiPWV8fFEudGVzdChkLmNvbnRhaW5zKT9mdW5jdGlvbih0LGUpe3ZhciBuPTk9PT10Lm5vZGVUeXBlP3QuZG9jdW1lbnRFbGVtZW50OnQscj1lJiZlLnBhcmVudE5vZGU7cmV0dXJuIHQ9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbih0LGUpe2lmKGUpZm9yKDtlPWUucGFyZW50Tm9kZTspaWYoZT09PXQpcmV0dXJuITA7cmV0dXJuITF9LEM9ZT9mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiBmPSEwLDA7dmFyIHI9IXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWUuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIHJ8fCgxJihyPSh0Lm93bmVyRG9jdW1lbnR8fHQpPT09KGUub3duZXJEb2N1bWVudHx8ZSk%2FdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKToxKXx8IW4uc29ydERldGFjaGVkJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpPT09cj90PT09aHx8dC5vd25lckRvY3VtZW50PT09dyYmYih3LHQpPy0xOmU9PT1ofHxlLm93bmVyRG9jdW1lbnQ9PT13JiZiKHcsZSk%2FMTpsP0QobCx0KS1EKGwsZSk6MDo0JnI%2FLTE6MSl9OmZ1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGY9ITAsMDt2YXIgbixyPTAsbz10LnBhcmVudE5vZGUsaT1lLnBhcmVudE5vZGUsYT1bdF0scz1bZV07aWYoIW98fCFpKXJldHVybiB0PT09aD8tMTplPT09aD8xOm8%2FLTE6aT8xOmw%2FRChsLHQpLUQobCxlKTowO2lmKG89PT1pKXJldHVybiBwdCh0LGUpO2ZvcihuPXQ7bj1uLnBhcmVudE5vZGU7KWEudW5zaGlmdChuKTtmb3Iobj1lO249bi5wYXJlbnROb2RlOylzLnVuc2hpZnQobik7Zm9yKDthW3JdPT09c1tyXTspcisrO3JldHVybiByP3B0KGFbcl0sc1tyXSk6YVtyXT09PXc%2FLTE6c1tyXT09PXc%2FMTowfSxoKTpofSxzdC5tYXRjaGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHN0KHQsbnVsbCxudWxsLGUpfSxzdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtpZigodC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFPW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSYmKCF2fHwhdi50ZXN0KGUpKSl0cnl7dmFyIHI9bS5jYWxsKHQsZSk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8dC5kb2N1bWVudCYmMTEhPT10LmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKHQpe08oZSwhMCl9cmV0dXJuIHN0KGUsaCxudWxsLFt0XSkubGVuZ3RoPjB9LHN0LmNvbnRhaW5zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpLGIodCxlKX0sc3QuYXR0cj1mdW5jdGlvbih0LGUpeyh0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KTt2YXIgbz1yLmF0dHJIYW5kbGVbZS50b0xvd2VyQ2FzZSgpXSxpPW8mJmouY2FsbChyLmF0dHJIYW5kbGUsZS50b0xvd2VyQ2FzZSgpKT9vKHQsZSwhZyk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1pP2k6bi5hdHRyaWJ1dGVzfHwhZz90LmdldEF0dHJpYnV0ZShlKTooaT10LmdldEF0dHJpYnV0ZU5vZGUoZSkpJiZpLnNwZWNpZmllZD9pLnZhbHVlOm51bGx9LHN0LmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odCsiIikucmVwbGFjZShydCxvdCl9LHN0LmVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIit0KX0sc3QudW5pcXVlU29ydD1mdW5jdGlvbih0KXt2YXIgZSxyPVtdLG89MCxpPTA7aWYoZj0hbi5kZXRlY3REdXBsaWNhdGVzLGw9IW4uc29ydFN0YWJsZSYmdC5zbGljZSgwKSx0LnNvcnQoQyksZil7Zm9yKDtlPXRbaSsrXTspZT09PXRbaV0mJihvPXIucHVzaChpKSk7Zm9yKDtvLS07KXQuc3BsaWNlKHJbb10sMSl9cmV0dXJuIGw9bnVsbCx0fSxvPXN0LmdldFRleHQ9ZnVuY3Rpb24odCl7dmFyIGUsbj0iIixyPTAsaT10Lm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIHQudGV4dENvbnRlbnQpcmV0dXJuIHQudGV4dENvbnRlbnQ7Zm9yKHQ9dC5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKW4rPW8odCl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIHQubm9kZVZhbHVlfWVsc2UgZm9yKDtlPXRbcisrXTspbis9byhlKTtyZXR1cm4gbn0sKHI9c3Quc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86Y3QsbWF0Y2g6RyxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI%2BIjp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMV09dFsxXS5yZXBsYWNlKGV0LG50KSx0WzNdPSh0WzNdfHx0WzRdfHx0WzVdfHwiIikucmVwbGFjZShldCxudCksIn49Ij09PXRbMl0mJih0WzNdPSIgIit0WzNdKyIgIiksdC5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbih0KXtyZXR1cm4gdFsxXT10WzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT10WzFdLnNsaWNlKDAsMyk%2FKHRbM118fHN0LmVycm9yKHRbMF0pLHRbNF09Kyh0WzRdP3RbNV0rKHRbNl18fDEpOjIqKCJldmVuIj09PXRbM118fCJvZGQiPT09dFszXSkpLHRbNV09Kyh0WzddK3RbOF18fCJvZGQiPT09dFszXSkpOnRbM10mJnN0LmVycm9yKHRbMF0pLHR9LFBTRVVETzpmdW5jdGlvbih0KXt2YXIgZSxuPSF0WzZdJiZ0WzJdO3JldHVybiBHLkNISUxELnRlc3QodFswXSk%2FbnVsbDoodFszXT90WzJdPXRbNF18fHRbNV18fCIiOm4mJlYudGVzdChuKSYmKGU9YShuLCEwKSkmJihlPW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtZSktbi5sZW5ndGgpJiYodFswXT10WzBdLnNsaWNlKDAsZSksdFsyXT1uLnNsaWNlKDAsZSkpLHQuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09dD9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZX19LENMQVNTOmZ1bmN0aW9uKHQpe3ZhciBlPUVbdCsiICJdO3JldHVybiBlfHwoZT1uZXcgUmVnRXhwKCIoXnwiK00rIikiK3QrIigiK00rInwkKSIpKSYmRSh0LGZ1bmN0aW9uKHQpe3JldHVybiBlLnRlc3QoInN0cmluZyI9PXR5cGVvZiB0LmNsYXNzTmFtZSYmdC5jbGFzc05hbWV8fHZvaWQgMCE9PXQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbz1zdC5hdHRyKHIsdCk7cmV0dXJuIG51bGw9PW8%2FIiE9Ij09PWU6IWV8fChvKz0iIiwiPSI9PT1lP289PT1uOiIhPSI9PT1lP28hPT1uOiJePSI9PT1lP24mJjA9PT1vLmluZGV4T2Yobik6Iio9Ij09PWU%2FbiYmby5pbmRleE9mKG4pPi0xOiIkPSI9PT1lP24mJm8uc2xpY2UoLW4ubGVuZ3RoKT09PW46In49Ij09PWU%2FKCIgIitvLnJlcGxhY2UoRiwiICIpKyIgIikuaW5kZXhPZihuKT4tMToifD0iPT09ZSYmKG89PT1ufHxvLnNsaWNlKDAsbi5sZW5ndGgrMSk9PT1uKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT0ibnRoIiE9PXQuc2xpY2UoMCwzKSxhPSJsYXN0IiE9PXQuc2xpY2UoLTQpLHM9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PXImJjA9PT1vP2Z1bmN0aW9uKHQpe3JldHVybiEhdC5wYXJlbnROb2RlfTpmdW5jdGlvbihlLG4sdSl7dmFyIGMsbCxmLHAsaCxkLGc9aSE9PWE%2FIm5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIix2PWUucGFyZW50Tm9kZSx5PXMmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxtPSF1JiYhcyxiPSExO2lmKHYpe2lmKGkpe2Zvcig7Zzspe2ZvcihwPWU7cD1wW2ddOylpZihzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpcmV0dXJuITE7ZD1nPSJvbmx5Ij09PXQmJiFkJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGQ9W2E%2Fdi5maXJzdENoaWxkOnYubGFzdENoaWxkXSxhJiZtKXtmb3IoYj0oaD0oYz0obD0oZj0ocD12KVt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XXx8W10pWzBdPT09ayYmY1sxXSkmJmNbMl0scD1oJiZ2LmNoaWxkTm9kZXNbaF07cD0rK2gmJnAmJnBbZ118fChiPWg9MCl8fGQucG9wKCk7KWlmKDE9PT1wLm5vZGVUeXBlJiYrK2ImJnA9PT1lKXtsW3RdPVtrLGgsYl07YnJlYWt9fWVsc2UgaWYobSYmKGI9aD0oYz0obD0oZj0ocD1lKVt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XXx8W10pWzBdPT09ayYmY1sxXSksITE9PT1iKWZvcig7KHA9KytoJiZwJiZwW2ddfHwoYj1oPTApfHxkLnBvcCgpKSYmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PXk6MSE9PXAubm9kZVR5cGUpfHwhKytifHwobSYmKChsPShmPXBbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF09W2ssYl0pLHAhPT1lKSk7KTtyZXR1cm4oYi09byk9PT1yfHxiJXI9PTAmJmIvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24odCxlKXt2YXIgbixvPXIucHNldWRvc1t0XXx8ci5zZXRGaWx0ZXJzW3QudG9Mb3dlckNhc2UoKV18fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrdCk7cmV0dXJuIG9beF0%2FbyhlKTpvLmxlbmd0aD4xPyhuPVt0LHQsIiIsZV0sci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KHQudG9Mb3dlckNhc2UoKSk%2FY3QoZnVuY3Rpb24odCxuKXtmb3IodmFyIHIsaT1vKHQsZSksYT1pLmxlbmd0aDthLS07KXRbcj1EKHQsaVthXSldPSEobltyXT1pW2FdKX0pOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCxuKX0pOm99fSxwc2V1ZG9zOntub3Q6Y3QoZnVuY3Rpb24odCl7dmFyIGU9W10sbj1bXSxyPXModC5yZXBsYWNlKEgsIiQxIikpO3JldHVybiByW3hdP2N0KGZ1bmN0aW9uKHQsZSxuLG8pe2Zvcih2YXIgaSxhPXIodCxudWxsLG8sW10pLHM9dC5sZW5ndGg7cy0tOykoaT1hW3NdKSYmKHRbc109IShlW3NdPWkpKX0pOmZ1bmN0aW9uKHQsbyxpKXtyZXR1cm4gZVswXT10LHIoZSxudWxsLGksbiksZVswXT1udWxsLCFuLnBvcCgpfX0pLGhhczpjdChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHN0KHQsZSkubGVuZ3RoPjB9fSksY29udGFpbnM6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKGV0LG50KSxmdW5jdGlvbihlKXtyZXR1cm4oZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KT4tMX19KSxsYW5nOmN0KGZ1bmN0aW9uKHQpe3JldHVybiBZLnRlc3QodHx8IiIpfHxzdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIit0KSx0PXQucmVwbGFjZShldCxudCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgbjtkb3tpZihuPWc%2FZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT10fHwwPT09bi5pbmRleE9mKHQrIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciBuPXQubG9jYXRpb24mJnQubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1kfSxmb2N1czpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWguYWN0aXZlRWxlbWVudCYmKCFoLmhhc0ZvY3VzfHxoLmhhc0ZvY3VzKCkpJiYhISh0LnR5cGV8fHQuaHJlZnx8fnQudGFiSW5kZXgpfSxlbmFibGVkOmd0KCExKSxkaXNhYmxlZDpndCghMCksY2hlY2tlZDpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiEhdC5jaGVja2VkfHwib3B0aW9uIj09PWUmJiEhdC5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT10LnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbih0KXtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpaWYodC5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIXIucHNldWRvcy5lbXB0eSh0KX0saGVhZGVyOmZ1bmN0aW9uKHQpe3JldHVybiBKLnRlc3QodC5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBYLnRlc3QodC5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiJidXR0b24iPT09dC50eXBlfHwiYnV0dG9uIj09PWV9LHRleHQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09dC50eXBlJiYobnVsbD09KGU9dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWUudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZ0KGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2dChmdW5jdGlvbih0LGUpe3JldHVybltlLTFdfSksZXE6dnQoZnVuY3Rpb24odCxlLG4pe3JldHVybltuPDA%2FbitlOm5dfSksZXZlbjp2dChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLG9kZDp2dChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0xO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLGx0OnZ0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjwwP24rZTpuPmU%2FZTpuOy0tcj49MDspdC5wdXNoKHIpO3JldHVybiB0fSksZ3Q6dnQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uPDA%2FbitlOm47KytyPGU7KXQucHVzaChyKTtyZXR1cm4gdH0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pci5wc2V1ZG9zW2VdPWh0KGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pci5wc2V1ZG9zW2VdPWR0KGUpO2Z1bmN0aW9uIG10KCl7fWZ1bmN0aW9uIGJ0KHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGgscj0iIjtlPG47ZSsrKXIrPXRbZV0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24geHQodCxlLG4pe3ZhciByPWUuZGlyLG89ZS5uZXh0LGk9b3x8cixhPW4mJiJwYXJlbnROb2RlIj09PWkscz1TKys7cmV0dXJuIGUuZmlyc3Q%2FZnVuY3Rpb24oZSxuLG8pe2Zvcig7ZT1lW3JdOylpZigxPT09ZS5ub2RlVHlwZXx8YSlyZXR1cm4gdChlLG4sbyk7cmV0dXJuITF9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxsLGYscD1bayxzXTtpZih1KXtmb3IoO2U9ZVtyXTspaWYoKDE9PT1lLm5vZGVUeXBlfHxhKSYmdChlLG4sdSkpcmV0dXJuITB9ZWxzZSBmb3IoO2U9ZVtyXTspaWYoMT09PWUubm9kZVR5cGV8fGEpaWYobD0oZj1lW3hdfHwoZVt4XT17fSkpW2UudW5pcXVlSURdfHwoZltlLnVuaXF1ZUlEXT17fSksbyYmbz09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbcl18fGU7ZWxzZXtpZigoYz1sW2ldKSYmY1swXT09PWsmJmNbMV09PT1zKXJldHVybiBwWzJdPWNbMl07aWYobFtpXT1wLHBbMl09dChlLG4sdSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHd0KHQpe3JldHVybiB0Lmxlbmd0aD4xP2Z1bmN0aW9uKGUsbixyKXtmb3IodmFyIG89dC5sZW5ndGg7by0tOylpZighdFtvXShlLG4scikpcmV0dXJuITE7cmV0dXJuITB9OnRbMF19ZnVuY3Rpb24ga3QodCxlLG4scixvKXtmb3IodmFyIGksYT1bXSxzPTAsdT10Lmxlbmd0aCxjPW51bGwhPWU7czx1O3MrKykoaT10W3NdKSYmKG4mJiFuKGkscixvKXx8KGEucHVzaChpKSxjJiZlLnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBTdCh0LGUsbixyLG8saSl7cmV0dXJuIHImJiFyW3hdJiYocj1TdChyKSksbyYmIW9beF0mJihvPVN0KG8saSkpLGN0KGZ1bmN0aW9uKGksYSxzLHUpe3ZhciBjLGwsZixwPVtdLGg9W10sZD1hLmxlbmd0aCxnPWl8fGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MCxvPWUubGVuZ3RoO3I8bztyKyspc3QodCxlW3JdLG4pO3JldHVybiBufShlfHwiKiIscy5ub2RlVHlwZT9bc106cyxbXSksdj0hdHx8IWkmJmU%2FZzprdChnLHAsdCxzLHUpLHk9bj9vfHwoaT90OmR8fHIpP1tdOmE6djtpZihuJiZuKHYseSxzLHUpLHIpZm9yKGM9a3QoeSxoKSxyKGMsW10scyx1KSxsPWMubGVuZ3RoO2wtLTspKGY9Y1tsXSkmJih5W2hbbF1dPSEodltoW2xdXT1mKSk7aWYoaSl7aWYob3x8dCl7aWYobyl7Zm9yKGM9W10sbD15Lmxlbmd0aDtsLS07KShmPXlbbF0pJiZjLnB1c2godltsXT1mKTtvKG51bGwseT1bXSxjLHUpfWZvcihsPXkubGVuZ3RoO2wtLTspKGY9eVtsXSkmJihjPW8%2FRChpLGYpOnBbbF0pPi0xJiYoaVtjXT0hKGFbY109ZikpfX1lbHNlIHk9a3QoeT09PWE%2FeS5zcGxpY2UoZCx5Lmxlbmd0aCk6eSksbz9vKG51bGwsYSx5LHUpOk4uYXBwbHkoYSx5KX0pfWZ1bmN0aW9uIEV0KHQpe2Zvcih2YXIgZSxuLG8saT10Lmxlbmd0aCxhPXIucmVsYXRpdmVbdFswXS50eXBlXSxzPWF8fHIucmVsYXRpdmVbIiAiXSx1PWE%2FMTowLGw9eHQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lfSxzLCEwKSxmPXh0KGZ1bmN0aW9uKHQpe3JldHVybiBEKGUsdCk%2BLTF9LHMsITApLHA9W2Z1bmN0aW9uKHQsbixyKXt2YXIgbz0hYSYmKHJ8fG4hPT1jKXx8KChlPW4pLm5vZGVUeXBlP2wodCxuLHIpOmYodCxuLHIpKTtyZXR1cm4gZT1udWxsLG99XTt1PGk7dSsrKWlmKG49ci5yZWxhdGl2ZVt0W3VdLnR5cGVdKXA9W3h0KHd0KHApLG4pXTtlbHNle2lmKChuPXIuZmlsdGVyW3RbdV0udHlwZV0uYXBwbHkobnVsbCx0W3VdLm1hdGNoZXMpKVt4XSl7Zm9yKG89Kyt1O288aSYmIXIucmVsYXRpdmVbdFtvXS50eXBlXTtvKyspO3JldHVybiBTdCh1PjEmJnd0KHApLHU%2BMSYmYnQodC5zbGljZSgwLHUtMSkuY29uY2F0KHt2YWx1ZToiICI9PT10W3UtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShILCIkMSIpLG4sdTxvJiZFdCh0LnNsaWNlKHUsbykpLG88aSYmRXQodD10LnNsaWNlKG8pKSxvPGkmJmJ0KHQpKX1wLnB1c2gobil9cmV0dXJuIHd0KHApfXJldHVybiBtdC5wcm90b3R5cGU9ci5maWx0ZXJzPXIucHNldWRvcyxyLnNldEZpbHRlcnM9bmV3IG10LGE9c3QudG9rZW5pemU9ZnVuY3Rpb24odCxlKXt2YXIgbixvLGksYSxzLHUsYyxsPVRbdCsiICJdO2lmKGwpcmV0dXJuIGU%2FMDpsLnNsaWNlKDApO2ZvcihzPXQsdT1bXSxjPXIucHJlRmlsdGVyO3M7KXtmb3IoYSBpbiBuJiYhKG89ei5leGVjKHMpKXx8KG8mJihzPXMuc2xpY2Uob1swXS5sZW5ndGgpfHxzKSx1LnB1c2goaT1bXSkpLG49ITEsKG89Vy5leGVjKHMpKSYmKG49by5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOm9bMF0ucmVwbGFjZShILCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKSxyLmZpbHRlcikhKG89R1thXS5leGVjKHMpKXx8Y1thXSYmIShvPWNbYV0obykpfHwobj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6YSxtYXRjaGVzOm99KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gZT9zLmxlbmd0aDpzP3N0LmVycm9yKHQpOlQodCx1KS5zbGljZSgwKX0scz1zdC5jb21waWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1bXSxpPVtdLHM9QVt0KyIgIl07aWYoIXMpe2ZvcihlfHwoZT1hKHQpKSxuPWUubGVuZ3RoO24tLTspKHM9RXQoZVtuXSkpW3hdP28ucHVzaChzKTppLnB1c2gocyk7KHM9QSh0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg%2BMCxvPXQubGVuZ3RoPjAsaT1mdW5jdGlvbihpLGEscyx1LGwpe3ZhciBmLGQsdix5PTAsbT0iMCIsYj1pJiZbXSx4PVtdLHc9YyxTPWl8fG8mJnIuZmluZC5UQUcoIioiLGwpLEU9ays9bnVsbD09dz8xOk1hdGgucmFuZG9tKCl8fC4xLFQ9Uy5sZW5ndGg7Zm9yKGwmJihjPWE9PT1ofHxhfHxsKTttIT09VCYmbnVsbCE9KGY9U1ttXSk7bSsrKXtpZihvJiZmKXtmb3IoZD0wLGF8fGYub3duZXJEb2N1bWVudD09PWh8fChwKGYpLHM9IWcpO3Y9dFtkKytdOylpZih2KGYsYXx8aCxzKSl7dS5wdXNoKGYpO2JyZWFrfWwmJihrPUUpfW4mJigoZj0hdiYmZikmJnktLSxpJiZiLnB1c2goZikpfWlmKHkrPW0sbiYmbSE9PXkpe2ZvcihkPTA7dj1lW2QrK107KXYoYix4LGEscyk7aWYoaSl7aWYoeT4wKWZvcig7bS0tOyliW21dfHx4W21dfHwoeFttXT1QLmNhbGwodSkpO3g9a3QoeCl9Ti5hcHBseSh1LHgpLGwmJiFpJiZ4Lmxlbmd0aD4wJiZ5K2UubGVuZ3RoPjEmJnN0LnVuaXF1ZVNvcnQodSl9cmV0dXJuIGwmJihrPUUsYz13KSxifTtyZXR1cm4gbj9jdChpKTppfShpLG8pKSkuc2VsZWN0b3I9dH1yZXR1cm4gc30sdT1zdC5zZWxlY3Q9ZnVuY3Rpb24odCxlLG4sbyl7dmFyIGksdSxjLGwsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LGg9IW8mJmEodD1wLnNlbGVjdG9yfHx0KTtpZihuPW58fFtdLDE9PT1oLmxlbmd0aCl7aWYoKHU9aFswXT1oWzBdLnNsaWNlKDApKS5sZW5ndGg%2BMiYmIklEIj09PShjPXVbMF0pLnR5cGUmJjk9PT1lLm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEoZT0oci5maW5kLklEKGMubWF0Y2hlc1swXS5yZXBsYWNlKGV0LG50KSxlKXx8W10pWzBdKSlyZXR1cm4gbjtwJiYoZT1lLnBhcmVudE5vZGUpLHQ9dC5zbGljZSh1LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoaT1HLm5lZWRzQ29udGV4dC50ZXN0KHQpPzA6dS5sZW5ndGg7aS0tJiYoYz11W2ldLCFyLnJlbGF0aXZlW2w9Yy50eXBlXSk7KWlmKChmPXIuZmluZFtsXSkmJihvPWYoYy5tYXRjaGVzWzBdLnJlcGxhY2UoZXQsbnQpLHR0LnRlc3QodVswXS50eXBlKSYmeXQoZS5wYXJlbnROb2RlKXx8ZSkpKXtpZih1LnNwbGljZShpLDEpLCEodD1vLmxlbmd0aCYmYnQodSkpKXJldHVybiBOLmFwcGx5KG4sbyksbjticmVha319cmV0dXJuKHB8fHModCxoKSkobyxlLCFnLG4sIWV8fHR0LnRlc3QodCkmJnl0KGUucGFyZW50Tm9kZSl8fGUpLG59LG4uc29ydFN0YWJsZT14LnNwbGl0KCIiKS5zb3J0KEMpLmpvaW4oIiIpPT09eCxuLmRldGVjdER1cGxpY2F0ZXM9ISFmLHAoKSxuLnNvcnREZXRhY2hlZD1sdChmdW5jdGlvbih0KXtyZXR1cm4gMSZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGguY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxsdChmdW5jdGlvbih0KXtyZXR1cm4gdC5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PXQuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmdCgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24odCxlLG4pe2lmKCFuKXJldHVybiB0LmdldEF0dHJpYnV0ZShlLCJ0eXBlIj09PWUudG9Mb3dlckNhc2UoKT8xOjIpfSksbi5hdHRyaWJ1dGVzJiZsdChmdW5jdGlvbih0KXtyZXR1cm4gdC5pbm5lckhUTUw9IjxpbnB1dC8%2BIix0LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmdCgidmFsdWUiLGZ1bmN0aW9uKHQsZSxuKXtpZighbiYmImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gdC5kZWZhdWx0VmFsdWV9KSxsdChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZnQoXyxmdW5jdGlvbih0LGUsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT10W2VdP2UudG9Mb3dlckNhc2UoKToocj10LmdldEF0dHJpYnV0ZU5vZGUoZSkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzdH0obik7Uy5maW5kPUEsUy5leHByPUEuc2VsZWN0b3JzLFMuZXhwclsiOiJdPVMuZXhwci5wc2V1ZG9zLFMudW5pcXVlU29ydD1TLnVuaXF1ZT1BLnVuaXF1ZVNvcnQsUy50ZXh0PUEuZ2V0VGV4dCxTLmlzWE1MRG9jPUEuaXNYTUwsUy5jb250YWlucz1BLmNvbnRhaW5zLFMuZXNjYXBlU2VsZWN0b3I9QS5lc2NhcGU7dmFyIE89ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxvPXZvaWQgMCE9PW47KHQ9dFtlXSkmJjkhPT10Lm5vZGVUeXBlOylpZigxPT09dC5ub2RlVHlwZSl7aWYobyYmUyh0KS5pcyhuKSlicmVhaztyLnB1c2godCl9cmV0dXJuIHJ9LEM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W107dDt0PXQubmV4dFNpYmxpbmcpMT09PXQubm9kZVR5cGUmJnQhPT1lJiZuLnB1c2godCk7cmV0dXJuIG59LGo9Uy5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBMKHQsZSl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWUudG9Mb3dlckNhc2UoKX12YXIgUD0vXjwoW2Etel1bXlwvXDA%2BOlx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBSKHQsZSxuKXtyZXR1cm4gbShlKT9TLmdyZXAodCxmdW5jdGlvbih0LHIpe3JldHVybiEhZS5jYWxsKHQscix0KSE9PW59KTplLm5vZGVUeXBlP1MuZ3JlcCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZSE9PW59KToic3RyaW5nIiE9dHlwZW9mIGU%2FUy5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIGYuY2FsbChlLHQpPi0xIT09bn0pOlMuZmlsdGVyKGUsdCxuKX1TLmZpbHRlcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXTtyZXR1cm4gbiYmKHQ9Ijpub3QoIit0KyIpIiksMT09PWUubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9TLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsdCk%2FW3JdOltdOlMuZmluZC5tYXRjaGVzKHQsUy5ncmVwKGUsZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfSkpfSxTLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbih0KXt2YXIgZSxuLHI9dGhpcy5sZW5ndGgsbz10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyh0KS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoZT0wO2U8cjtlKyspaWYoUy5jb250YWlucyhvW2VdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSxlPTA7ZTxyO2UrKylTLmZpbmQodCxvW2VdLG4pO3JldHVybiByPjE%2FUy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUih0aGlzLHR8fFtdLCExKSl9LG5vdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUih0aGlzLHR8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKHQpe3JldHVybiEhUih0aGlzLCJzdHJpbmciPT10eXBlb2YgdCYmai50ZXN0KHQpP1ModCk6dHx8W10sITEpLmxlbmd0aH19KTt2YXIgTixJPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KFMuZm4uaW5pdD1mdW5jdGlvbih0LGUsbil7dmFyIHIsbztpZighdClyZXR1cm4gdGhpcztpZihuPW58fE4sInN0cmluZyI9PXR5cGVvZiB0KXtpZighKHI9IjwiPT09dFswXSYmIj4iPT09dFt0Lmxlbmd0aC0xXSYmdC5sZW5ndGg%2BPTM%2FW251bGwsdCxudWxsXTpJLmV4ZWModCkpfHwhclsxXSYmZSlyZXR1cm4hZXx8ZS5qcXVlcnk%2FKGV8fG4pLmZpbmQodCk6dGhpcy5jb25zdHJ1Y3RvcihlKS5maW5kKHQpO2lmKHJbMV0pe2lmKGU9ZSBpbnN0YW5jZW9mIFM%2FZVswXTplLFMubWVyZ2UodGhpcyxTLnBhcnNlSFRNTChyWzFdLGUmJmUubm9kZVR5cGU%2FZS5vd25lckRvY3VtZW50fHxlOmEsITApKSxQLnRlc3QoclsxXSkmJlMuaXNQbGFpbk9iamVjdChlKSlmb3IociBpbiBlKW0odGhpc1tyXSk%2FdGhpc1tyXShlW3JdKTp0aGlzLmF0dHIocixlW3JdKTtyZXR1cm4gdGhpc31yZXR1cm4obz1hLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09byx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiB0Lm5vZGVUeXBlPyh0aGlzWzBdPXQsdGhpcy5sZW5ndGg9MSx0aGlzKTptKHQpP3ZvaWQgMCE9PW4ucmVhZHk%2Fbi5yZWFkeSh0KTp0KFMpOlMubWFrZUFycmF5KHQsdGhpcyl9KS5wcm90b3R5cGU9Uy5mbixOPVMoYSk7dmFyIEQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBNKHQsZSl7Zm9yKDsodD10W2VdKSYmMSE9PXQubm9kZVR5cGU7KTtyZXR1cm4gdH1TLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKHQpe3ZhciBlPVModCx0aGlzKSxuPWUubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8bjt0KyspaWYoUy5jb250YWlucyh0aGlzLGVbdF0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTAsbz10aGlzLmxlbmd0aCxpPVtdLGE9InN0cmluZyIhPXR5cGVvZiB0JiZTKHQpO2lmKCFqLnRlc3QodCkpZm9yKDtyPG87cisrKWZvcihuPXRoaXNbcl07biYmbiE9PWU7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE%2FYS5pbmRleChuKT4tMToxPT09bi5ub2RlVHlwZSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLHQpKSl7aS5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhpLmxlbmd0aD4xP1MudW5pcXVlU29ydChpKTppKX0saW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHQ%2FInN0cmluZyI9PXR5cGVvZiB0P2YuY2FsbChTKHQpLHRoaXNbMF0pOmYuY2FsbCh0aGlzLHQuanF1ZXJ5P3RbMF06dCk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy51bmlxdWVTb3J0KFMubWVyZ2UodGhpcy5nZXQoKSxTKHQsZSkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PXQ%2FdGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIodCkpfX0pLFMuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtyZXR1cm4gZSYmMTEhPT1lLm5vZGVUeXBlP2U6bnVsbH0scGFyZW50czpmdW5jdGlvbih0KXtyZXR1cm4gTyh0LCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE8odCwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24odCl7cmV0dXJuIE0odCwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbih0KXtyZXR1cm4gTSh0LCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbih0KXtyZXR1cm4gTyh0LCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPKHQsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTyh0LCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbih0KXtyZXR1cm4gQygodC5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCx0KX0sY2hpbGRyZW46ZnVuY3Rpb24odCl7cmV0dXJuIEModC5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQuY29udGVudERvY3VtZW50P3QuY29udGVudERvY3VtZW50OihMKHQsInRlbXBsYXRlIikmJih0PXQuY29udGVudHx8dCksUy5tZXJnZShbXSx0LmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbihuLHIpe3ZhciBvPVMubWFwKHRoaXMsZSxuKTtyZXR1cm4iVW50aWwiIT09dC5zbGljZSgtNSkmJihyPW4pLHImJiJzdHJpbmciPT10eXBlb2YgciYmKG89Uy5maWx0ZXIocixvKSksdGhpcy5sZW5ndGg%2BMSYmKF9bdF18fFMudW5pcXVlU29ydChvKSxELnRlc3QodCkmJm8ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhvKX19KTt2YXIgVT0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIEIodCl7cmV0dXJuIHR9ZnVuY3Rpb24gcSh0KXt0aHJvdyB0fWZ1bmN0aW9uIEYodCxlLG4scil7dmFyIG87dHJ5e3QmJm0obz10LnByb21pc2UpP28uY2FsbCh0KS5kb25lKGUpLmZhaWwobik6dCYmbShvPXQudGhlbik%2Fby5jYWxsKHQsZSxuKTplLmFwcGx5KHZvaWQgMCxbdF0uc2xpY2UocikpfWNhdGNoKHQpe24uYXBwbHkodm9pZCAwLFt0XSl9fVMuQ2FsbGJhY2tzPWZ1bmN0aW9uKHQpe3Q9InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiBTLmVhY2godC5tYXRjaChVKXx8W10sZnVuY3Rpb24odCxuKXtlW25dPSEwfSksZX0odCk6Uy5leHRlbmQoe30sdCk7dmFyIGUsbixyLG8saT1bXSxhPVtdLHM9LTEsdT1mdW5jdGlvbigpe2ZvcihvPW98fHQub25jZSxyPWU9ITA7YS5sZW5ndGg7cz0tMSlmb3Iobj1hLnNoaWZ0KCk7KytzPGkubGVuZ3RoOykhMT09PWlbc10uYXBwbHkoblswXSxuWzFdKSYmdC5zdG9wT25GYWxzZSYmKHM9aS5sZW5ndGgsbj0hMSk7dC5tZW1vcnl8fChuPSExKSxlPSExLG8mJihpPW4%2FW106IiIpfSxjPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKG4mJiFlJiYocz1pLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gZShuKXtTLmVhY2gobixmdW5jdGlvbihuLHIpe20ocik%2FdC51bmlxdWUmJmMuaGFzKHIpfHxpLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09ayhyKSYmZShyKX0pfShhcmd1bWVudHMpLG4mJiFlJiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBTLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuOyhuPVMuaW5BcnJheShlLGksbikpPi0xOylpLnNwbGljZShuLDEpLG48PXMmJnMtLX0pLHRoaXN9LGhhczpmdW5jdGlvbih0KXtyZXR1cm4gdD9TLmluQXJyYXkodCxpKT4tMTppLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBpJiYoaT1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBvPWE9W10saT1uPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWl9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gbz1hPVtdLG58fGV8fChpPW49IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhb30sZmlyZVdpdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gb3x8KG49W3QsKG49bnx8W10pLnNsaWNlP24uc2xpY2UoKTpuXSxhLnB1c2gobiksZXx8dSgpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFyfX07cmV0dXJuIGN9LFMuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbih0KXt2YXIgZT1bWyJub3RpZnkiLCJwcm9ncmVzcyIsUy5DYWxsYmFja3MoIm1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0scj0icGVuZGluZyIsbz17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gby50aGVuKG51bGwsdCl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHM7cmV0dXJuIFMuRGVmZXJyZWQoZnVuY3Rpb24obil7Uy5lYWNoKGUsZnVuY3Rpb24oZSxyKXt2YXIgbz1tKHRbcls0XV0pJiZ0W3JbNF1dO2lbclsxXV0oZnVuY3Rpb24oKXt2YXIgdD1vJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0JiZtKHQucHJvbWlzZSk%2FdC5wcm9taXNlKCkucHJvZ3Jlc3Mobi5ub3RpZnkpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KTpuW3JbMF0rIldpdGgiXSh0aGlzLG8%2FW3RdOmFyZ3VtZW50cyl9KX0pLHQ9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsbyl7dmFyIGk9MDtmdW5jdGlvbiBhKHQsZSxyLG8pe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsYz1mdW5jdGlvbigpe3ZhciBuLGM7aWYoISh0PGkpKXtpZigobj1yLmFwcGx5KHMsdSkpPT09ZS5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7Yz1uJiYoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJm4udGhlbixtKGMpP28%2FYy5jYWxsKG4sYShpLGUsQixvKSxhKGksZSxxLG8pKTooaSsrLGMuY2FsbChuLGEoaSxlLEIsbyksYShpLGUscSxvKSxhKGksZSxCLGUubm90aWZ5V2l0aCkpKToociE9PUImJihzPXZvaWQgMCx1PVtuXSksKG98fGUucmVzb2x2ZVdpdGgpKHMsdSkpfX0sbD1vP2M6ZnVuY3Rpb24oKXt0cnl7YygpfWNhdGNoKG4pe1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmUy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKG4sbC5zdGFja1RyYWNlKSx0KzE%2BPWkmJihyIT09cSYmKHM9dm9pZCAwLHU9W25dKSxlLnJlamVjdFdpdGgocyx1KSl9fTt0P2woKTooUy5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihsLnN0YWNrVHJhY2U9Uy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksbi5zZXRUaW1lb3V0KGwpKX19cmV0dXJuIFMuRGVmZXJyZWQoZnVuY3Rpb24obil7ZVswXVszXS5hZGQoYSgwLG4sbShvKT9vOkIsbi5ub3RpZnlXaXRoKSksZVsxXVszXS5hZGQoYSgwLG4sbSh0KT90OkIpKSxlWzJdWzNdLmFkZChhKDAsbixtKHIpP3I6cSkpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10P1MuZXh0ZW5kKHQsbyk6b319LGk9e307cmV0dXJuIFMuZWFjaChlLGZ1bmN0aW9uKHQsbil7dmFyIGE9blsyXSxzPW5bNV07b1tuWzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sZVszLXRdWzJdLmRpc2FibGUsZVszLXRdWzNdLmRpc2FibGUsZVswXVsyXS5sb2NrLGVbMF1bM10ubG9jayksYS5hZGQoblszXS5maXJlKSxpW25bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGlbblswXSsiV2l0aCJdKHRoaXM9PT1pP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30saVtuWzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLG8ucHJvbWlzZShpKSx0JiZ0LmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1lLHI9QXJyYXkobiksbz11LmNhbGwoYXJndW1lbnRzKSxpPVMuRGVmZXJyZWQoKSxhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyW3RdPXRoaXMsb1t0XT1hcmd1bWVudHMubGVuZ3RoPjE%2FdS5jYWxsKGFyZ3VtZW50cyk6biwtLWV8fGkucmVzb2x2ZVdpdGgocixvKX19O2lmKGU8PTEmJihGKHQsaS5kb25lKGEobikpLnJlc29sdmUsaS5yZWplY3QsIWUpLCJwZW5kaW5nIj09PWkuc3RhdGUoKXx8bShvW25dJiZvW25dLnRoZW4pKSlyZXR1cm4gaS50aGVuKCk7Zm9yKDtuLS07KUYob1tuXSxhKG4pLGkucmVqZWN0KTtyZXR1cm4gaS5wcm9taXNlKCl9fSk7dmFyIEg9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsZSl7bi5jb25zb2xlJiZuLmNvbnNvbGUud2FybiYmdCYmSC50ZXN0KHQubmFtZSkmJm4uY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLGUpfSxTLnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe24uc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIHo9Uy5EZWZlcnJlZCgpO2Z1bmN0aW9uIFcoKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFcpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsVyksUy5yZWFkeSgpfVMuZm4ucmVhZHk9ZnVuY3Rpb24odCl7cmV0dXJuIHoudGhlbih0KS5jYXRjaChmdW5jdGlvbih0KXtTLnJlYWR5RXhjZXB0aW9uKHQpfSksdGhpc30sUy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24odCl7KCEwPT09dD8tLVMucmVhZHlXYWl0OlMuaXNSZWFkeSl8fChTLmlzUmVhZHk9ITAsITAhPT10JiYtLVMucmVhZHlXYWl0PjB8fHoucmVzb2x2ZVdpdGgoYSxbU10pKX19KSxTLnJlYWR5LnRoZW49ei50aGVuLCJjb21wbGV0ZSI9PT1hLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWEucmVhZHlTdGF0ZSYmIWEuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP24uc2V0VGltZW91dChTLnJlYWR5KTooYS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixXKSxuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFcpKTt2YXIgJD1mdW5jdGlvbih0LGUsbixyLG8saSxhKXt2YXIgcz0wLHU9dC5sZW5ndGgsYz1udWxsPT1uO2lmKCJvYmplY3QiPT09ayhuKSlmb3IocyBpbiBvPSEwLG4pJCh0LGUscyxuW3NdLCEwLGksYSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYobz0hMCxtKHIpfHwoYT0hMCksYyYmKGE%2FKGUuY2FsbCh0LHIpLGU9bnVsbCk6KGM9ZSxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYy5jYWxsKFModCksbil9KSksZSkpZm9yKDtzPHU7cysrKWUodFtzXSxuLGE%2FcjpyLmNhbGwodFtzXSxzLGUodFtzXSxuKSkpO3JldHVybiBvP3Q6Yz9lLmNhbGwodCk6dT9lKHRbMF0sbik6aX0sVj0vXi1tcy0vLFk9Ly0oW2Etel0pL2c7ZnVuY3Rpb24gRyh0LGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gSyh0KXtyZXR1cm4gdC5yZXBsYWNlKFYsIm1zLSIpLnJlcGxhY2UoWSxHKX12YXIgWD1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV8fDk9PT10Lm5vZGVUeXBlfHwhK3Qubm9kZVR5cGV9O2Z1bmN0aW9uIEooKXt0aGlzLmV4cGFuZG89Uy5leHBhbmRvK0oudWlkKyt9Si51aWQ9MSxKLnByb3RvdHlwZT17Y2FjaGU6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmV4cGFuZG9dO3JldHVybiBlfHwoZT17fSxYKHQpJiYodC5ub2RlVHlwZT90W3RoaXMuZXhwYW5kb109ZTpPYmplY3QuZGVmaW5lUHJvcGVydHkodCx0aGlzLmV4cGFuZG8se3ZhbHVlOmUsY29uZmlndXJhYmxlOiEwfSkpKSxlfSxzZXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG89dGhpcy5jYWNoZSh0KTtpZigic3RyaW5nIj09dHlwZW9mIGUpb1tLKGUpXT1uO2Vsc2UgZm9yKHIgaW4gZSlvW0socildPWVbcl07cmV0dXJuIG99LGdldDpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuY2FjaGUodCk6dFt0aGlzLmV4cGFuZG9dJiZ0W3RoaXMuZXhwYW5kb11bSyhlKV19LGFjY2VzczpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWV8fGUmJiJzdHJpbmciPT10eXBlb2YgZSYmdm9pZCAwPT09bj90aGlzLmdldCh0LGUpOih0aGlzLnNldCh0LGUsbiksdm9pZCAwIT09bj9uOmUpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRbdGhpcy5leHBhbmRvXTtpZih2b2lkIDAhPT1yKXtpZih2b2lkIDAhPT1lKXtuPShlPUFycmF5LmlzQXJyYXkoZSk%2FZS5tYXAoSyk6KGU9SyhlKSlpbiByP1tlXTplLm1hdGNoKFUpfHxbXSkubGVuZ3RoO2Zvcig7bi0tOylkZWxldGUgcltlW25dXX0odm9pZCAwPT09ZXx8Uy5pc0VtcHR5T2JqZWN0KHIpKSYmKHQubm9kZVR5cGU%2FdFt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgdFt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT1lJiYhUy5pc0VtcHR5T2JqZWN0KGUpfX07dmFyIFE9bmV3IEosWj1uZXcgSix0dD0vXig%2FOlx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGV0PS9bQS1aXS9nO2Z1bmN0aW9uIG50KHQsZSxuKXt2YXIgcjtpZih2b2lkIDA9PT1uJiYxPT09dC5ub2RlVHlwZSlpZihyPSJkYXRhLSIrZS5yZXBsYWNlKGV0LCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj10LmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPWZ1bmN0aW9uKHQpe3JldHVybiJ0cnVlIj09PXR8fCJmYWxzZSIhPT10JiYoIm51bGwiPT09dD9udWxsOnQ9PT0rdCsiIj8rdDp0dC50ZXN0KHQpP0pTT04ucGFyc2UodCk6dCl9KG4pfWNhdGNoKHQpe31aLnNldCh0LGUsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1TLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gWi5oYXNEYXRhKHQpfHxRLmhhc0RhdGEodCl9LGRhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBaLmFjY2Vzcyh0LGUsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24odCxlKXtaLnJlbW92ZSh0LGUpfSxfZGF0YTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFEuYWNjZXNzKHQsZSxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24odCxlKXtRLnJlbW92ZSh0LGUpfX0pLFMuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGk9dGhpc1swXSxhPWkmJmkuYXR0cmlidXRlcztpZih2b2lkIDA9PT10KXtpZih0aGlzLmxlbmd0aCYmKG89Wi5nZXQoaSksMT09PWkubm9kZVR5cGUmJiFRLmdldChpLCJoYXNEYXRhQXR0cnMiKSkpe2ZvcihuPWEubGVuZ3RoO24tLTspYVtuXSYmMD09PShyPWFbbl0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9SyhyLnNsaWNlKDUpKSxudChpLHIsb1tyXSkpO1Euc2V0KGksImhhc0RhdGFBdHRycyIsITApfXJldHVybiBvfXJldHVybiJvYmplY3QiPT10eXBlb2YgdD90aGlzLmVhY2goZnVuY3Rpb24oKXtaLnNldCh0aGlzLHQpfSk6JCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBuO2lmKGkmJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PShuPVouZ2V0KGksdCkpP246dm9pZCAwIT09KG49bnQoaSx0KSk%2Fbjp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5zZXQodGhpcyx0LGUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1oucmVtb3ZlKHRoaXMsdCl9KX19KSxTLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKHQpcmV0dXJuIGU9KGV8fCJmeCIpKyJxdWV1ZSIscj1RLmdldCh0LGUpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPVEuYWNjZXNzKHQsZSxTLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbih0LGUpe2U9ZXx8ImZ4Ijt2YXIgbj1TLnF1ZXVlKHQsZSkscj1uLmxlbmd0aCxvPW4uc2hpZnQoKSxpPVMuX3F1ZXVlSG9va3ModCxlKTsiaW5wcm9ncmVzcyI9PT1vJiYobz1uLnNoaWZ0KCksci0tKSxvJiYoImZ4Ij09PWUmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBpLnN0b3Asby5jYWxsKHQsZnVuY3Rpb24oKXtTLmRlcXVldWUodCxlKX0saSkpLCFyJiZpJiZpLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24odCxlKXt2YXIgbj1lKyJxdWV1ZUhvb2tzIjtyZXR1cm4gUS5nZXQodCxuKXx8US5hY2Nlc3ModCxuLHtlbXB0eTpTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtRLnJlbW92ZSh0LFtlKyJxdWV1ZSIsbl0pfSl9KX19KSxTLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxlKXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKGU9dCx0PSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4%2FUy5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PWU%2FdGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1TLnF1ZXVlKHRoaXMsdCxlKTtTLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PW5bMF0mJlMuZGVxdWV1ZSh0aGlzLHQpfSl9LGRlcXVldWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZGVxdWV1ZSh0aGlzLHQpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVldWUodHx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTEsbz1TLkRlZmVycmVkKCksaT10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8by5yZXNvbHZlV2l0aChpLFtpXSl9O2Zvcigic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLHQ9dHx8ImZ4IjthLS07KShuPVEuZ2V0KGlbYV0sdCsicXVldWVIb29rcyIpKSYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxvLnByb21pc2UoZSl9fSk7dmFyIHJ0PS9bKy1dPyg%2FOlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLG90PW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitydCsiKShbYS16JV0qKSQiLCJpIiksaXQ9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxhdD1hLmRvY3VtZW50RWxlbWVudCxzdD1mdW5jdGlvbih0KXtyZXR1cm4gUy5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCl9LHV0PXtjb21wb3NlZDohMH07YXQuZ2V0Um9vdE5vZGUmJihzdD1mdW5jdGlvbih0KXtyZXR1cm4gUy5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCl8fHQuZ2V0Um9vdE5vZGUodXQpPT09dC5vd25lckRvY3VtZW50fSk7dmFyIGN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIm5vbmUiPT09KHQ9ZXx8dCkuc3R5bGUuZGlzcGxheXx8IiI9PT10LnN0eWxlLmRpc3BsYXkmJnN0KHQpJiYibm9uZSI9PT1TLmNzcyh0LCJkaXNwbGF5Iil9LGx0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYT17fTtmb3IoaSBpbiBlKWFbaV09dC5zdHlsZVtpXSx0LnN0eWxlW2ldPWVbaV07Zm9yKGkgaW4gbz1uLmFwcGx5KHQscnx8W10pLGUpdC5zdHlsZVtpXT1hW2ldO3JldHVybiBvfTtmdW5jdGlvbiBmdCh0LGUsbixyKXt2YXIgbyxpLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIFMuY3NzKHQsZSwiIil9LHU9cygpLGM9biYmblszXXx8KFMuY3NzTnVtYmVyW2VdPyIiOiJweCIpLGw9dC5ub2RlVHlwZSYmKFMuY3NzTnVtYmVyW2VdfHwicHgiIT09YyYmK3UpJiZvdC5leGVjKFMuY3NzKHQsZSkpO2lmKGwmJmxbM10hPT1jKXtmb3IodS89MixjPWN8fGxbM10sbD0rdXx8MTthLS07KVMuc3R5bGUodCxlLGwrYyksKDEtaSkqKDEtKGk9cygpL3V8fC41KSk8PTAmJihhPTApLGwvPWk7bCo9MixTLnN0eWxlKHQsZSxsK2MpLG49bnx8W119cmV0dXJuIG4mJihsPStsfHwrdXx8MCxvPW5bMV0%2FbCsoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9YyxyLnN0YXJ0PWwsci5lbmQ9bykpLG99dmFyIHB0PXt9O2Z1bmN0aW9uIGh0KHQpe3ZhciBlLG49dC5vd25lckRvY3VtZW50LHI9dC5ub2RlTmFtZSxvPXB0W3JdO3JldHVybiBvfHwoZT1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxvPVMuY3NzKGUsImRpc3BsYXkiKSxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksIm5vbmUiPT09byYmKG89ImJsb2NrIikscHRbcl09byxvKX1mdW5jdGlvbiBkdCh0LGUpe2Zvcih2YXIgbixyLG89W10saT0wLGE9dC5sZW5ndGg7aTxhO2krKykocj10W2ldKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LGU%2FKCJub25lIj09PW4mJihvW2ldPVEuZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxvW2ldfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmN0KHIpJiYob1tpXT1odChyKSkpOiJub25lIiE9PW4mJihvW2ldPSJub25lIixRLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihpPTA7aTxhO2krKyludWxsIT1vW2ldJiYodFtpXS5zdHlsZS5kaXNwbGF5PW9baV0pO3JldHVybiB0fVMuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGR0KHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGR0KHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdD90P3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2N0KHRoaXMpP1ModGhpcykuc2hvdygpOlModGhpcykuaGlkZSgpfSl9fSk7dmFyIGd0PS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHZ0PS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLHl0PS9eJHxebW9kdWxlJHxcLyg%2FOmphdmF8ZWNtYSlzY3JpcHQvaSxtdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc%2BIiwiPC9zZWxlY3Q%2BIl0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU%2BIl0sdHI6WzIsIjx0YWJsZT48dGJvZHk%2BIiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU%2BPHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk%2BPC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2Z1bmN0aW9uIGJ0KHQsZSl7dmFyIG47cmV0dXJuIG49dm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGV8fCIqIik6dm9pZCAwIT09dC5xdWVyeVNlbGVjdG9yQWxsP3QucXVlcnlTZWxlY3RvckFsbChlfHwiKiIpOltdLHZvaWQgMD09PWV8fGUmJkwodCxlKT9TLm1lcmdlKFt0XSxuKTpufWZ1bmN0aW9uIHh0KHQsZSl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKVEuc2V0KHRbbl0sImdsb2JhbEV2YWwiLCFlfHxRLmdldChlW25dLCJnbG9iYWxFdmFsIikpfW10Lm9wdGdyb3VwPW10Lm9wdGlvbixtdC50Ym9keT1tdC50Zm9vdD1tdC5jb2xncm91cD1tdC5jYXB0aW9uPW10LnRoZWFkLG10LnRoPW10LnRkO3ZhciB3dCxrdCxTdD0vPHwmIz9cdys7LztmdW5jdGlvbiBFdCh0LGUsbixyLG8pe2Zvcih2YXIgaSxhLHMsdSxjLGwsZj1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxwPVtdLGg9MCxkPXQubGVuZ3RoO2g8ZDtoKyspaWYoKGk9dFtoXSl8fDA9PT1pKWlmKCJvYmplY3QiPT09ayhpKSlTLm1lcmdlKHAsaS5ub2RlVHlwZT9baV06aSk7ZWxzZSBpZihTdC50ZXN0KGkpKXtmb3IoYT1hfHxmLmFwcGVuZENoaWxkKGUuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KHZ0LmV4ZWMoaSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1tdFtzXXx8bXQuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStTLmh0bWxQcmVmaWx0ZXIoaSkrdVsyXSxsPXVbMF07bC0tOylhPWEubGFzdENoaWxkO1MubWVyZ2UocCxhLmNoaWxkTm9kZXMpLChhPWYuZmlyc3RDaGlsZCkudGV4dENvbnRlbnQ9IiJ9ZWxzZSBwLnB1c2goZS5jcmVhdGVUZXh0Tm9kZShpKSk7Zm9yKGYudGV4dENvbnRlbnQ9IiIsaD0wO2k9cFtoKytdOylpZihyJiZTLmluQXJyYXkoaSxyKT4tMSlvJiZvLnB1c2goaSk7ZWxzZSBpZihjPXN0KGkpLGE9YnQoZi5hcHBlbmRDaGlsZChpKSwic2NyaXB0IiksYyYmeHQoYSksbilmb3IobD0wO2k9YVtsKytdOyl5dC50ZXN0KGkudHlwZXx8IiIpJiZuLnB1c2goaSk7cmV0dXJuIGZ9d3Q9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGt0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksa3Quc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLHd0LmFwcGVuZENoaWxkKGt0KSx5LmNoZWNrQ2xvbmU9d3QuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLHd0LmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIXd0LmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTt2YXIgVHQ9L15rZXkvLEF0PS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxPdD0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gQ3QoKXtyZXR1cm4hMH1mdW5jdGlvbiBqdCgpe3JldHVybiExfWZ1bmN0aW9uIEx0KHQsZSl7cmV0dXJuIHQ9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fWNhdGNoKHQpe319KCk9PSgiZm9jdXMiPT09ZSl9ZnVuY3Rpb24gUHQodCxlLG4scixvLGkpe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IocyBpbiJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCksZSlQdCh0LHMsbixyLGVbc10saSk7cmV0dXJuIHR9aWYobnVsbD09ciYmbnVsbD09bz8obz1uLHI9bj12b2lkIDApOm51bGw9PW8mJigic3RyaW5nIj09dHlwZW9mIG4%2FKG89cixyPXZvaWQgMCk6KG89cixyPW4sbj12b2lkIDApKSwhMT09PW8pbz1qdDtlbHNlIGlmKCFvKXJldHVybiB0O3JldHVybiAxPT09aSYmKGE9bywobz1mdW5jdGlvbih0KXtyZXR1cm4gUygpLm9mZih0KSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPVMuZ3VpZCsrKSksdC5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5hZGQodGhpcyxlLG8scixuKX0pfWZ1bmN0aW9uIFJ0KHQsZSxuKXtuPyhRLnNldCh0LGUsITEpLFMuZXZlbnQuYWRkKHQsZSx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIHIsbyxpPVEuZ2V0KHRoaXMsZSk7aWYoMSZ0LmlzVHJpZ2dlciYmdGhpc1tlXSl7aWYoaS5sZW5ndGgpKFMuZXZlbnQuc3BlY2lhbFtlXXx8e30pLmRlbGVnYXRlVHlwZSYmdC5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKGk9dS5jYWxsKGFyZ3VtZW50cyksUS5zZXQodGhpcyxlLGkpLHI9bih0aGlzLGUpLHRoaXNbZV0oKSxpIT09KG89US5nZXQodGhpcyxlKSl8fHI%2FUS5zZXQodGhpcyxlLCExKTpvPXt9LGkhPT1vKXJldHVybiB0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSxvLnZhbHVlfWVsc2UgaS5sZW5ndGgmJihRLnNldCh0aGlzLGUse3ZhbHVlOlMuZXZlbnQudHJpZ2dlcihTLmV4dGVuZChpWzBdLFMuRXZlbnQucHJvdG90eXBlKSxpLnNsaWNlKDEpLHRoaXMpfSksdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PVEuZ2V0KHQsZSkmJlMuZXZlbnQuYWRkKHQsZSxDdCl9Uy5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsaCxkLGcsdj1RLmdldCh0KTtpZih2KWZvcihuLmhhbmRsZXImJihuPShpPW4pLmhhbmRsZXIsbz1pLnNlbGVjdG9yKSxvJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGF0LG8pLG4uZ3VpZHx8KG4uZ3VpZD1TLmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz17fSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09UyYmUy5ldmVudC50cmlnZ2VyZWQhPT1lLnR5cGU%2FUy5ldmVudC5kaXNwYXRjaC5hcHBseSh0LGFyZ3VtZW50cyk6dm9pZCAwfSksYz0oZT0oZXx8IiIpLm1hdGNoKFUpfHxbIiJdKS5sZW5ndGg7Yy0tOyloPWc9KHM9T3QuZXhlYyhlW2NdKXx8W10pWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoJiYoZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LGg9KG8%2FZi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGgsZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LGw9Uy5leHRlbmQoe3R5cGU6aCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6byxuZWVkc0NvbnRleHQ6byYmUy5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KG8pLG5hbWVzcGFjZTpkLmpvaW4oIi4iKX0saSksKHA9dVtoXSl8fCgocD11W2hdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwodCxyLGQsYSl8fHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKGgsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbCh0LGwpLGwuaGFuZGxlci5ndWlkfHwobC5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksbz9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGwpOnAucHVzaChsKSxTLmV2ZW50Lmdsb2JhbFtoXT0hMCl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsaCxkLGcsdj1RLmhhc0RhdGEodCkmJlEuZ2V0KHQpO2lmKHYmJih1PXYuZXZlbnRzKSl7Zm9yKGM9KGU9KGV8fCIiKS5tYXRjaChVKXx8WyIiXSkubGVuZ3RoO2MtLTspaWYoaD1nPShzPU90LmV4ZWMoZVtjXSl8fFtdKVsxXSxkPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksaCl7Zm9yKGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxwPXVbaD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8aF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrZC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPWk9cC5sZW5ndGg7aS0tOylsPXBbaV0sIW8mJmchPT1sLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1sLmd1aWR8fHMmJiFzLnRlc3QobC5uYW1lc3BhY2UpfHxyJiZyIT09bC5zZWxlY3RvciYmKCIqKiIhPT1yfHwhbC5zZWxlY3Rvcil8fChwLnNwbGljZShpLDEpLGwuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKHQsbCkpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKHQsZCx2LmhhbmRsZSl8fFMucmVtb3ZlRXZlbnQodCxoLHYuaGFuZGxlKSxkZWxldGUgdVtoXSl9ZWxzZSBmb3IoaCBpbiB1KVMuZXZlbnQucmVtb3ZlKHQsaCtlW2NdLG4sciwhMCk7Uy5pc0VtcHR5T2JqZWN0KHUpJiZRLnJlbW92ZSh0LCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscz1TLmV2ZW50LmZpeCh0KSx1PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxjPShRLmdldCh0aGlzLCJldmVudHMiKXx8e30pW3MudHlwZV18fFtdLGw9Uy5ldmVudC5zcGVjaWFsW3MudHlwZV18fHt9O2Zvcih1WzBdPXMsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdVtlXT1hcmd1bWVudHNbZV07aWYocy5kZWxlZ2F0ZVRhcmdldD10aGlzLCFsLnByZURpc3BhdGNofHwhMSE9PWwucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHMpKXtmb3IoYT1TLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxzLGMpLGU9MDsobz1hW2UrK10pJiYhcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOylmb3Iocy5jdXJyZW50VGFyZ2V0PW8uZWxlbSxuPTA7KGk9by5oYW5kbGVyc1tuKytdKSYmIXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTspcy5ybmFtZXNwYWNlJiYhMSE9PWkubmFtZXNwYWNlJiYhcy5ybmFtZXNwYWNlLnRlc3QoaS5uYW1lc3BhY2UpfHwocy5oYW5kbGVPYmo9aSxzLmRhdGE9aS5kYXRhLHZvaWQgMCE9PShyPSgoUy5ldmVudC5zcGVjaWFsW2kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxpLmhhbmRsZXIpLmFwcGx5KG8uZWxlbSx1KSkmJiExPT09KHMucmVzdWx0PXIpJiYocy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCkpKTtyZXR1cm4gbC5wb3N0RGlzcGF0Y2gmJmwucG9zdERpc3BhdGNoLmNhbGwodGhpcyxzKSxzLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGksYSxzPVtdLHU9ZS5kZWxlZ2F0ZUNvdW50LGM9dC50YXJnZXQ7aWYodSYmYy5ub2RlVHlwZSYmISgiY2xpY2siPT09dC50eXBlJiZ0LmJ1dHRvbj49MSkpZm9yKDtjIT09dGhpcztjPWMucGFyZW50Tm9kZXx8dGhpcylpZigxPT09Yy5ub2RlVHlwZSYmKCJjbGljayIhPT10LnR5cGV8fCEwIT09Yy5kaXNhYmxlZCkpe2ZvcihpPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtvPShyPWVbbl0pLnNlbGVjdG9yKyIgIl0mJihhW29dPXIubmVlZHNDb250ZXh0P1Mobyx0aGlzKS5pbmRleChjKT4tMTpTLmZpbmQobyx0aGlzLG51bGwsW2NdKS5sZW5ndGgpLGFbb10mJmkucHVzaChyKTtpLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmMsaGFuZGxlcnM6aX0pfXJldHVybiBjPXRoaXMsdTxlLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmMsaGFuZGxlcnM6ZS5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoUy5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk%2FZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKHQpe3JldHVybiB0W1MuZXhwYW5kb10%2FdDpuZXcgUy5FdmVudCh0KX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzfHx0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUnQoZSwiY2xpY2siLEN0KSwhMX0sdHJpZ2dlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzfHx0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUnQoZSwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZRLmdldChlLCJjbGljayIpfHxMKGUsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQucmVzdWx0JiZ0Lm9yaWdpbmFsRXZlbnQmJih0Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9dC5yZXN1bHQpfX19fSxTLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKHQsZSxuKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXImJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4pfSxTLkV2ZW50PWZ1bmN0aW9uKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgUy5FdmVudCkpcmV0dXJuIG5ldyBTLkV2ZW50KHQsZSk7dCYmdC50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9dCx0aGlzLnR5cGU9dC50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPXQuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09dC5kZWZhdWx0UHJldmVudGVkJiYhMT09PXQucmV0dXJuVmFsdWU%2FQ3Q6anQsdGhpcy50YXJnZXQ9dC50YXJnZXQmJjM9PT10LnRhcmdldC5ub2RlVHlwZT90LnRhcmdldC5wYXJlbnROb2RlOnQudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD10LmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PXQucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPXQsZSYmUy5leHRlbmQodGhpcyxlKSx0aGlzLnRpbWVTdGFtcD10JiZ0LnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW1MuZXhwYW5kb109ITB9LFMuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpqdCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpqdCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpqdCxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1DdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1DdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Q3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LFMuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxjaGFyOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24odCl7dmFyIGU9dC5idXR0b247cmV0dXJuIG51bGw9PXQud2hpY2gmJlR0LnRlc3QodC50eXBlKT9udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlOiF0LndoaWNoJiZ2b2lkIDAhPT1lJiZBdC50ZXN0KHQudHlwZSk%2FMSZlPzE6MiZlPzM6NCZlPzI6MDp0LndoaWNofX0sUy5ldmVudC5hZGRQcm9wKSxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7Uy5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBSdCh0aGlzLHQsTHQpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIFJ0KHRoaXMsdCksITB9LGRlbGVnYXRlVHlwZTplfX0pLFMuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24odCxlKXtTLmV2ZW50LnNwZWNpYWxbdF09e2RlbGVnYXRlVHlwZTplLGJpbmRUeXBlOmUsaGFuZGxlOmZ1bmN0aW9uKHQpe3ZhciBuLHI9dGhpcyxvPXQucmVsYXRlZFRhcmdldCxpPXQuaGFuZGxlT2JqO3JldHVybiBvJiYobz09PXJ8fFMuY29udGFpbnMocixvKSl8fCh0LnR5cGU9aS5vcmlnVHlwZSxuPWkuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC50eXBlPWUpLG59fX0pLFMuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gUHQodGhpcyx0LGUsbixyKX0sb25lOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBQdCh0aGlzLHQsZSxuLHIsMSl9LG9mZjpmdW5jdGlvbih0LGUsbil7dmFyIHIsbztpZih0JiZ0LnByZXZlbnREZWZhdWx0JiZ0LmhhbmRsZU9iailyZXR1cm4gcj10LmhhbmRsZU9iaixTKHQuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlKyIuIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKG8gaW4gdCl0aGlzLm9mZihvLGUsdFtvXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZXx8KG49ZSxlPXZvaWQgMCksITE9PT1uJiYobj1qdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5yZW1vdmUodGhpcyx0LG4sZSl9KX19KTt2YXIgTnQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW2Etel1bXlwvXDA%2BXHgyMFx0XHJcblxmXSopW14%2BXSopXC8%2BL2dpLEl0PS88c2NyaXB0fDxzdHlsZXw8bGluay9pLER0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLF90PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg%2FOlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBNdCh0LGUpe3JldHVybiBMKHQsInRhYmxlIikmJkwoMTEhPT1lLm5vZGVUeXBlP2U6ZS5maXJzdENoaWxkLCJ0ciIpJiZTKHQpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHx0fWZ1bmN0aW9uIFV0KHQpe3JldHVybiB0LnR5cGU9KG51bGwhPT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrdC50eXBlLHR9ZnVuY3Rpb24gQnQodCl7cmV0dXJuInRydWUvIj09PSh0LnR5cGV8fCIiKS5zbGljZSgwLDUpP3QudHlwZT10LnR5cGUuc2xpY2UoNSk6dC5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSx0fWZ1bmN0aW9uIHF0KHQsZSl7dmFyIG4scixvLGksYSxzLHUsYztpZigxPT09ZS5ub2RlVHlwZSl7aWYoUS5oYXNEYXRhKHQpJiYoaT1RLmFjY2Vzcyh0KSxhPVEuc2V0KGUsaSksYz1pLmV2ZW50cykpZm9yKG8gaW4gZGVsZXRlIGEuaGFuZGxlLGEuZXZlbnRzPXt9LGMpZm9yKG49MCxyPWNbb10ubGVuZ3RoO248cjtuKyspUy5ldmVudC5hZGQoZSxvLGNbb11bbl0pO1ouaGFzRGF0YSh0KSYmKHM9Wi5hY2Nlc3ModCksdT1TLmV4dGVuZCh7fSxzKSxaLnNldChlLHUpKX19ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PW4mJmd0LnRlc3QodC50eXBlKT9lLmNoZWNrZWQ9dC5jaGVja2VkOiJpbnB1dCIhPT1uJiYidGV4dGFyZWEiIT09bnx8KGUuZGVmYXVsdFZhbHVlPXQuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBIdCh0LGUsbixyKXtlPWMuYXBwbHkoW10sZSk7dmFyIG8saSxhLHMsdSxsLGY9MCxwPXQubGVuZ3RoLGg9cC0xLGQ9ZVswXSxnPW0oZCk7aWYoZ3x8cD4xJiYic3RyaW5nIj09dHlwZW9mIGQmJiF5LmNoZWNrQ2xvbmUmJkR0LnRlc3QoZCkpcmV0dXJuIHQuZWFjaChmdW5jdGlvbihvKXt2YXIgaT10LmVxKG8pO2cmJihlWzBdPWQuY2FsbCh0aGlzLG8saS5odG1sKCkpKSxIdChpLGUsbixyKX0pO2lmKHAmJihpPShvPUV0KGUsdFswXS5vd25lckRvY3VtZW50LCExLHQscikpLmZpcnN0Q2hpbGQsMT09PW8uY2hpbGROb2Rlcy5sZW5ndGgmJihvPWkpLGl8fHIpKXtmb3Iocz0oYT1TLm1hcChidChvLCJzY3JpcHQiKSxVdCkpLmxlbmd0aDtmPHA7ZisrKXU9byxmIT09aCYmKHU9Uy5jbG9uZSh1LCEwLCEwKSxzJiZTLm1lcmdlKGEsYnQodSwic2NyaXB0IikpKSxuLmNhbGwodFtmXSx1LGYpO2lmKHMpZm9yKGw9YVthLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LFMubWFwKGEsQnQpLGY9MDtmPHM7ZisrKXU9YVtmXSx5dC50ZXN0KHUudHlwZXx8IiIpJiYhUS5hY2Nlc3ModSwiZ2xvYmFsRXZhbCIpJiZTLmNvbnRhaW5zKGwsdSkmJih1LnNyYyYmIm1vZHVsZSIhPT0odS50eXBlfHwiIikudG9Mb3dlckNhc2UoKT9TLl9ldmFsVXJsJiYhdS5ub01vZHVsZSYmUy5fZXZhbFVybCh1LnNyYyx7bm9uY2U6dS5ub25jZXx8dS5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9KTp3KHUudGV4dENvbnRlbnQucmVwbGFjZShfdCwiIiksdSxsKSl9cmV0dXJuIHR9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgcixvPWU%2FUy5maWx0ZXIoZSx0KTp0LGk9MDtudWxsIT0ocj1vW2ldKTtpKyspbnx8MSE9PXIubm9kZVR5cGV8fFMuY2xlYW5EYXRhKGJ0KHIpKSxyLnBhcmVudE5vZGUmJihuJiZzdChyKSYmeHQoYnQociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIHR9Uy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZShOdCwiPCQxPjwvJDI%2BIil9LGNsb25lOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzPXQuY2xvbmVOb2RlKCEwKSx1PXN0KHQpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PXQubm9kZVR5cGUmJjExIT09dC5ub2RlVHlwZXx8Uy5pc1hNTERvYyh0KSkpZm9yKGE9YnQocykscj0wLG89KGk9YnQodCkpLmxlbmd0aDtyPG87cisrKUZ0KGlbcl0sYVtyXSk7aWYoZSlpZihuKWZvcihpPWl8fGJ0KHQpLGE9YXx8YnQocykscj0wLG89aS5sZW5ndGg7cjxvO3IrKylxdChpW3JdLGFbcl0pO2Vsc2UgcXQodCxzKTtyZXR1cm4oYT1idChzLCJzY3JpcHQiKSkubGVuZ3RoPjAmJnh0KGEsIXUmJmJ0KHQsInNjcmlwdCIpKSxzfSxjbGVhbkRhdGE6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4scixvPVMuZXZlbnQuc3BlY2lhbCxpPTA7dm9pZCAwIT09KG49dFtpXSk7aSsrKWlmKFgobikpe2lmKGU9bltRLmV4cGFuZG9dKXtpZihlLmV2ZW50cylmb3IociBpbiBlLmV2ZW50cylvW3JdP1MuZXZlbnQucmVtb3ZlKG4scik6Uy5yZW1vdmVFdmVudChuLHIsZS5oYW5kbGUpO25bUS5leHBhbmRvXT12b2lkIDB9bltaLmV4cGFuZG9dJiYobltaLmV4cGFuZG9dPXZvaWQgMCl9fX0pLFMuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHRoaXMsdCwhMCl9LHJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4genQodGhpcyx0KX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P1MudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD10KX0pfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8TXQodGhpcyx0KS5hcHBlbmRDaGlsZCh0KX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgZT1NdCh0aGlzLHQpO2UuaW5zZXJ0QmVmb3JlKHQsZS5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9MDtudWxsIT0odD10aGlzW2VdKTtlKyspMT09PXQubm9kZVR5cGUmJihTLmNsZWFuRGF0YShidCh0LCExKSksdC50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9bnVsbCE9dCYmdCxlPW51bGw9PWU%2FdDplLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIFMuY2xvbmUodGhpcyx0LGUpfSl9LGh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0KXt2YXIgZT10aGlzWzBdfHx7fSxuPTAscj10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT10JiYxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZS5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYhSXQudGVzdCh0KSYmIW10Wyh2dC5leGVjKHQpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7dD1TLmh0bWxQcmVmaWx0ZXIodCk7dHJ5e2Zvcig7bjxyO24rKykxPT09KGU9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEoYnQoZSwhMSkpLGUuaW5uZXJIVE1MPXQpO2U9MH1jYXRjaCh0KXt9fWUmJnRoaXMuZW1wdHkoKS5hcHBlbmQodCl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5wYXJlbnROb2RlO1MuaW5BcnJheSh0aGlzLHQpPDAmJihTLmNsZWFuRGF0YShidCh0aGlzKSksbiYmbi5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LHQpfX0pLFMuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbih0KXtmb3IodmFyIG4scj1bXSxvPVModCksaT1vLmxlbmd0aC0xLGE9MDthPD1pO2ErKyluPWE9PT1pP3RoaXM6dGhpcy5jbG9uZSghMCksUyhvW2FdKVtlXShuKSxsLmFwcGx5KHIsbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpfX0pO3ZhciBXdD1uZXcgUmVnRXhwKCJeKCIrcnQrIikoPyFweClbYS16JV0rJCIsImkiKSwkdD1mdW5jdGlvbih0KXt2YXIgZT10Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGUmJmUub3BlbmVyfHwoZT1uKSxlLmdldENvbXB1dGVkU3R5bGUodCl9LFZ0PW5ldyBSZWdFeHAoaXQuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gWXQodCxlLG4pe3ZhciByLG8saSxhLHM9dC5zdHlsZTtyZXR1cm4obj1ufHwkdCh0KSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZShlKXx8bltlXSl8fHN0KHQpfHwoYT1TLnN0eWxlKHQsZSkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJld0LnRlc3QoYSkmJlZ0LnRlc3QoZSkmJihyPXMud2lkdGgsbz1zLm1pbldpZHRoLGk9cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1vLHMubWF4V2lkdGg9aSkpLHZvaWQgMCE9PWE%2FYSsiIjphfWZ1bmN0aW9uIEd0KHQsZSl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCF0KCkpcmV0dXJuKHRoaXMuZ2V0PWUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7aWYobCl7Yy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLGF0LmFwcGVuZENoaWxkKGMpLmFwcGVuZENoaWxkKGwpO3ZhciB0PW4uZ2V0Q29tcHV0ZWRTdHlsZShsKTtyPSIxJSIhPT10LnRvcCx1PTEyPT09ZSh0Lm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9IjYwJSIscz0zNj09PWUodC5yaWdodCksbz0zNj09PWUodC53aWR0aCksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT1lKGwub2Zmc2V0V2lkdGgvMyksYXQucmVtb3ZlQ2hpbGQoYyksbD1udWxsfX1mdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQodCkpfXZhciByLG8saSxzLHUsYz1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGw9YS5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLnN0eWxlJiYobC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGwuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09bC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxTLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHJ9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksaX19KSl9KCk7dmFyIEt0PVsiV2Via2l0IiwiTW96IiwibXMiXSxYdD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLEp0PXt9O2Z1bmN0aW9uIFF0KHQpe3ZhciBlPVMuY3NzUHJvcHNbdF18fEp0W3RdO3JldHVybiBlfHwodCBpbiBYdD90Okp0W3RdPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxuPUt0Lmxlbmd0aDtuLS07KWlmKCh0PUt0W25dK2UpaW4gWHQpcmV0dXJuIHR9KHQpfHx0KX12YXIgWnQ9L14obm9uZXx0YWJsZSg%2FIS1jW2VhXSkuKykvLHRlPS9eLS0vLGVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxuZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gcmUodCxlLG4pe3ZhciByPW90LmV4ZWMoZSk7cmV0dXJuIHI%2FTWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOmV9ZnVuY3Rpb24gb2UodCxlLG4scixvLGkpe3ZhciBhPSJ3aWR0aCI9PT1lPzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9Uy5jc3ModCxuK2l0W2FdLCEwLG8pKSxyPygiY29udGVudCI9PT1uJiYodS09Uy5jc3ModCwicGFkZGluZyIraXRbYV0sITAsbykpLCJtYXJnaW4iIT09biYmKHUtPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKSkpOih1Kz1TLmNzcyh0LCJwYWRkaW5nIitpdFthXSwhMCxvKSwicGFkZGluZyIhPT1uP3UrPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKTpzKz1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbykpO3JldHVybiFyJiZpPj0wJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0taS11LXMtLjUpKXx8MCksdX1mdW5jdGlvbiBpZSh0LGUsbil7dmFyIHI9JHQodCksbz0oIXkuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsciksaT1vLGE9WXQodCxlLHIpLHM9Im9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7aWYoV3QudGVzdChhKSl7aWYoIW4pcmV0dXJuIGE7YT0iYXV0byJ9cmV0dXJuKCF5LmJveFNpemluZ1JlbGlhYmxlKCkmJm98fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PVMuY3NzKHQsImRpc3BsYXkiLCExLHIpKSYmdC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKG89ImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxyKSwoaT1zIGluIHQpJiYoYT10W3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrb2UodCxlLG58fChvPyJib3JkZXIiOiJjb250ZW50IiksaSxyLGEpKyJweCJ9ZnVuY3Rpb24gYWUodCxlLG4scixvKXtyZXR1cm4gbmV3IGFlLnByb3RvdHlwZS5pbml0KHQsZSxuLHIsbyl9Uy5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24odCxlKXtpZihlKXt2YXIgbj1ZdCh0LCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbih0LGUsbixyKXtpZih0JiYzIT09dC5ub2RlVHlwZSYmOCE9PXQubm9kZVR5cGUmJnQuc3R5bGUpe3ZhciBvLGksYSxzPUsoZSksdT10ZS50ZXN0KGUpLGM9dC5zdHlsZTtpZih1fHwoZT1RdChzKSksYT1TLmNzc0hvb2tzW2VdfHxTLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KG89YS5nZXQodCwhMSxyKSk%2FbzpjW2VdOyJzdHJpbmciPT09KGk9dHlwZW9mIG4pJiYobz1vdC5leGVjKG4pKSYmb1sxXSYmKG49ZnQodCxlLG8pLGk9Im51bWJlciIpLG51bGwhPW4mJm49PW4mJigibnVtYmVyIiE9PWl8fHV8fChuKz1vJiZvWzNdfHwoUy5jc3NOdW1iZXJbc10%2FIiI6InB4IikpLHkuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT1lLmluZGV4T2YoImJhY2tncm91bmQiKXx8KGNbZV09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KHQsbixyKSl8fCh1P2Muc2V0UHJvcGVydHkoZSxuKTpjW2VdPW4pKX19LGNzczpmdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGEscz1LKGUpO3JldHVybiB0ZS50ZXN0KGUpfHwoZT1RdChzKSksKGE9Uy5jc3NIb29rc1tlXXx8Uy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKG89YS5nZXQodCwhMCxuKSksdm9pZCAwPT09byYmKG89WXQodCxlLHIpKSwibm9ybWFsIj09PW8mJmUgaW4gbmUmJihvPW5lW2VdKSwiIj09PW58fG4%2FKGk9cGFyc2VGbG9hdChvKSwhMD09PW58fGlzRmluaXRlKGkpP2l8fDA6byk6b319KSxTLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1tlXT17Z2V0OmZ1bmN0aW9uKHQsbixyKXtpZihuKXJldHVybiFadC50ZXN0KFMuY3NzKHQsImRpc3BsYXkiKSl8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg%2FaWUodCxlLHIpOmx0KHQsZWUsZnVuY3Rpb24oKXtyZXR1cm4gaWUodCxlLHIpfSl9LHNldDpmdW5jdGlvbih0LG4scil7dmFyIG8saT0kdCh0KSxhPSF5LnNjcm9sbGJveFNpemUoKSYmImFic29sdXRlIj09PWkucG9zaXRpb24scz0oYXx8cikmJiJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsaSksdT1yP29lKHQsZSxyLHMsaSk6MDtyZXR1cm4gcyYmYSYmKHUtPU1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbZV0pLW9lKHQsZSwiYm9yZGVyIiwhMSxpKS0uNSkpLHUmJihvPW90LmV4ZWMobikpJiYicHgiIT09KG9bM118fCJweCIpJiYodC5zdHlsZVtlXT1uLG49Uy5jc3ModCxlKSkscmUoMCxuLHUpfX19KSxTLmNzc0hvb2tzLm1hcmdpbkxlZnQ9R3QoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24odCxlKXtpZihlKXJldHVybihwYXJzZUZsb2F0KFl0KHQsIm1hcmdpbkxlZnQiKSl8fHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1sdCh0LHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksUy5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW3QrZV09e2V4cGFuZDpmdW5jdGlvbihuKXtmb3IodmFyIHI9MCxvPXt9LGk9InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07cjw0O3IrKylvW3QraXRbcl0rZV09aVtyXXx8aVtyLTJdfHxpWzBdO3JldHVybiBvfX0sIm1hcmdpbiIhPT10JiYoUy5jc3NIb29rc1t0K2VdLnNldD1yZSl9KSxTLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KGUpKXtmb3Iocj0kdCh0KSxvPWUubGVuZ3RoO2E8bzthKyspaVtlW2FdXT1TLmNzcyh0LGVbYV0sITEscik7cmV0dXJuIGl9cmV0dXJuIHZvaWQgMCE9PW4%2FUy5zdHlsZSh0LGUsbik6Uy5jc3ModCxlKX0sdCxlLGFyZ3VtZW50cy5sZW5ndGg%2BMSl9fSksUy5Ud2Vlbj1hZSxhZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmFlLGluaXQ6ZnVuY3Rpb24odCxlLG4scixvLGkpe3RoaXMuZWxlbT10LHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPW98fFMuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1lLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1pfHwoUy5jc3NOdW1iZXJbbl0%2FIiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciB0PWFlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0JiZ0LmdldD90LmdldCh0aGlzKTphZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24odCl7dmFyIGUsbj1hZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWU9Uy5lYXNpbmdbdGhpcy5lYXNpbmddKHQsdGhpcy5vcHRpb25zLmR1cmF0aW9uKnQsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9ZT10LHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSplK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOmFlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGFlLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1hZS5wcm90b3R5cGUsYWUucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiAxIT09dC5lbGVtLm5vZGVUeXBlfHxudWxsIT10LmVsZW1bdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW3QucHJvcF0%2FdC5lbGVtW3QucHJvcF06KGU9Uy5jc3ModC5lbGVtLHQucHJvcCwiIikpJiYiYXV0byIhPT1lP2U6MH0sc2V0OmZ1bmN0aW9uKHQpe1MuZnguc3RlcFt0LnByb3BdP1MuZnguc3RlcFt0LnByb3BdKHQpOjEhPT10LmVsZW0ubm9kZVR5cGV8fCFTLmNzc0hvb2tzW3QucHJvcF0mJm51bGw9PXQuZWxlbS5zdHlsZVtRdCh0LnByb3ApXT90LmVsZW1bdC5wcm9wXT10Lm5vdzpTLnN0eWxlKHQuZWxlbSx0LnByb3AsdC5ub3crdC51bml0KX19fSxhZS5wcm9wSG9va3Muc2Nyb2xsVG9wPWFlLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24odCl7dC5lbGVtLm5vZGVUeXBlJiZ0LmVsZW0ucGFyZW50Tm9kZSYmKHQuZWxlbVt0LnByb3BdPXQubm93KX19LFMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHN3aW5nOmZ1bmN0aW9uKHQpe3JldHVybi41LU1hdGguY29zKHQqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sUy5meD1hZS5wcm90b3R5cGUuaW5pdCxTLmZ4LnN0ZXA9e307dmFyIHNlLHVlLGNlPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxsZT0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGZlKCl7dWUmJighMT09PWEuaGlkZGVuJiZuLnJlcXVlc3RBbmltYXRpb25GcmFtZT9uLnJlcXVlc3RBbmltYXRpb25GcmFtZShmZSk6bi5zZXRUaW1lb3V0KGZlLFMuZnguaW50ZXJ2YWwpLFMuZngudGljaygpKX1mdW5jdGlvbiBwZSgpe3JldHVybiBuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZT12b2lkIDB9KSxzZT1EYXRlLm5vdygpfWZ1bmN0aW9uIGhlKHQsZSl7dmFyIG4scj0wLG89e2hlaWdodDp0fTtmb3IoZT1lPzE6MDtyPDQ7cis9Mi1lKW9bIm1hcmdpbiIrKG49aXRbcl0pXT1vWyJwYWRkaW5nIituXT10O3JldHVybiBlJiYoby5vcGFjaXR5PW8ud2lkdGg9dCksb31mdW5jdGlvbiBkZSh0LGUsbil7Zm9yKHZhciByLG89KGdlLnR3ZWVuZXJzW2VdfHxbXSkuY29uY2F0KGdlLnR3ZWVuZXJzWyIqIl0pLGk9MCxhPW8ubGVuZ3RoO2k8YTtpKyspaWYocj1vW2ldLmNhbGwobixlLHQpKXJldHVybiByfWZ1bmN0aW9uIGdlKHQsZSxuKXt2YXIgcixvLGk9MCxhPWdlLnByZWZpbHRlcnMubGVuZ3RoLHM9Uy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYobylyZXR1cm4hMTtmb3IodmFyIGU9c2V8fHBlKCksbj1NYXRoLm1heCgwLGMuc3RhcnRUaW1lK2MuZHVyYXRpb24tZSkscj0xLShuL2MuZHVyYXRpb258fDApLGk9MCxhPWMudHdlZW5zLmxlbmd0aDtpPGE7aSsrKWMudHdlZW5zW2ldLnJ1bihyKTtyZXR1cm4gcy5ub3RpZnlXaXRoKHQsW2MscixuXSkscjwxJiZhP246KGF8fHMubm90aWZ5V2l0aCh0LFtjLDEsMF0pLHMucmVzb2x2ZVdpdGgodCxbY10pLCExKX0sYz1zLnByb21pc2Uoe2VsZW06dCxwcm9wczpTLmV4dGVuZCh7fSxlKSxvcHRzOlMuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpTLmVhc2luZy5fZGVmYXVsdH0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOnNlfHxwZSgpLGR1cmF0aW9uOm4uZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsbil7dmFyIHI9Uy5Ud2Vlbih0LGMub3B0cyxlLG4sYy5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGMub3B0cy5lYXNpbmcpO3JldHVybiBjLnR3ZWVucy5wdXNoKHIpLHJ9LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIG49MCxyPWU%2FYy50d2VlbnMubGVuZ3RoOjA7aWYobylyZXR1cm4gdGhpcztmb3Iobz0hMDtuPHI7bisrKWMudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKHQsW2MsMSwwXSkscy5yZXNvbHZlV2l0aCh0LFtjLGVdKSk6cy5yZWplY3RXaXRoKHQsW2MsZV0pLHRoaXN9fSksbD1jLnByb3BzO2ZvcighZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saSxhO2ZvcihuIGluIHQpaWYobz1lW3I9SyhuKV0saT10W25dLEFycmF5LmlzQXJyYXkoaSkmJihvPWlbMV0saT10W25dPWlbMF0pLG4hPT1yJiYodFtyXT1pLGRlbGV0ZSB0W25dKSwoYT1TLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIGk9YS5leHBhbmQoaSksZGVsZXRlIHRbcl0saSluIGluIHR8fCh0W25dPWlbbl0sZVtuXT1vKTtlbHNlIGVbcl09b30obCxjLm9wdHMuc3BlY2lhbEVhc2luZyk7aTxhO2krKylpZihyPWdlLnByZWZpbHRlcnNbaV0uY2FsbChjLHQsbCxjLm9wdHMpKXJldHVybiBtKHIuc3RvcCkmJihTLl9xdWV1ZUhvb2tzKGMuZWxlbSxjLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIFMubWFwKGwsZGUsYyksbShjLm9wdHMuc3RhcnQpJiZjLm9wdHMuc3RhcnQuY2FsbCh0LGMpLGMucHJvZ3Jlc3MoYy5vcHRzLnByb2dyZXNzKS5kb25lKGMub3B0cy5kb25lLGMub3B0cy5jb21wbGV0ZSkuZmFpbChjLm9wdHMuZmFpbCkuYWx3YXlzKGMub3B0cy5hbHdheXMpLFMuZngudGltZXIoUy5leHRlbmQodSx7ZWxlbTp0LGFuaW06YyxxdWV1ZTpjLm9wdHMucXVldWV9KSksY31TLkFuaW1hdGlvbj1TLmV4dGVuZChnZSx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKHQsZSk7cmV0dXJuIGZ0KG4uZWxlbSx0LG90LmV4ZWMoZSksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKHQsZSl7bSh0KT8oZT10LHQ9WyIqIl0pOnQ9dC5tYXRjaChVKTtmb3IodmFyIG4scj0wLG89dC5sZW5ndGg7cjxvO3IrKyluPXRbcl0sZ2UudHdlZW5lcnNbbl09Z2UudHdlZW5lcnNbbl18fFtdLGdlLnR3ZWVuZXJzW25dLnVuc2hpZnQoZSl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYyxsLGY9IndpZHRoImluIGV8fCJoZWlnaHQiaW4gZSxwPXRoaXMsaD17fSxkPXQuc3R5bGUsZz10Lm5vZGVUeXBlJiZjdCh0KSx2PVEuZ2V0KHQsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1TLl9xdWV1ZUhvb2tzKHQsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFMucXVldWUodCwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksZSlpZihvPWVbcl0sY2UudGVzdChvKSl7aWYoZGVsZXRlIGVbcl0saT1pfHwidG9nZ2xlIj09PW8sbz09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1vfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWhbcl09diYmdltyXXx8Uy5zdHlsZSh0LHIpfWlmKCh1PSFTLmlzRW1wdHlPYmplY3QoZSkpfHwhUy5pc0VtcHR5T2JqZWN0KGgpKWZvcihyIGluIGYmJjE9PT10Lm5vZGVUeXBlJiYobi5vdmVyZmxvdz1bZC5vdmVyZmxvdyxkLm92ZXJmbG93WCxkLm92ZXJmbG93WV0sbnVsbD09KGM9diYmdi5kaXNwbGF5KSYmKGM9US5nZXQodCwiZGlzcGxheSIpKSwibm9uZSI9PT0obD1TLmNzcyh0LCJkaXNwbGF5IikpJiYoYz9sPWM6KGR0KFt0XSwhMCksYz10LnN0eWxlLmRpc3BsYXl8fGMsbD1TLmNzcyh0LCJkaXNwbGF5IiksZHQoW3RdKSkpLCgiaW5saW5lIj09PWx8fCJpbmxpbmUtYmxvY2siPT09bCYmbnVsbCE9YykmJiJub25lIj09PVMuY3NzKHQsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7ZC5kaXNwbGF5PWN9KSxudWxsPT1jJiYobD1kLmRpc3BsYXksYz0ibm9uZSI9PT1sPyIiOmwpKSxkLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoZC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2Qub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxkLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGQub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxoKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9US5hY2Nlc3ModCwiZnhzaG93Iix7ZGlzcGxheTpjfSksaSYmKHYuaGlkZGVuPSFnKSxnJiZkdChbdF0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGR0KFt0XSksUS5yZW1vdmUodCwiZnhzaG93IiksaClTLnN0eWxlKHQscixoW3JdKX0pKSx1PWRlKGc%2FdltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKHQsZSl7ZT9nZS5wcmVmaWx0ZXJzLnVuc2hpZnQodCk6Z2UucHJlZmlsdGVycy5wdXNoKHQpfX0pLFMuc3BlZWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQmJiJvYmplY3QiPT10eXBlb2YgdD9TLmV4dGVuZCh7fSx0KTp7Y29tcGxldGU6bnx8IW4mJmV8fG0odCkmJnQsZHVyYXRpb246dCxlYXNpbmc6biYmZXx8ZSYmIW0oZSkmJmV9O3JldHVybiBTLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBTLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVMuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249Uy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmUy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LFMuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGN0KS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmV9LHQsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1TLmlzRW1wdHlPYmplY3QodCksaT1TLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9Z2UodGhpcyxTLmV4dGVuZCh7fSx0KSxpKTsob3x8US5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxvfHwhMT09PWkucXVldWU%2FdGhpcy5lYWNoKGEpOnRoaXMucXVldWUoaS5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbih0LGUsbil7dmFyIHI9ZnVuY3Rpb24odCl7dmFyIGU9dC5zdG9wO2RlbGV0ZSB0LnN0b3AsZShuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYobj1lLGU9dCx0PXZvaWQgMCksZSYmITEhPT10JiZ0aGlzLnF1ZXVlKHR8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPSEwLG89bnVsbCE9dCYmdCsicXVldWVIb29rcyIsaT1TLnRpbWVycyxhPVEuZ2V0KHRoaXMpO2lmKG8pYVtvXSYmYVtvXS5zdG9wJiZyKGFbb10pO2Vsc2UgZm9yKG8gaW4gYSlhW29dJiZhW29dLnN0b3AmJmxlLnRlc3QobykmJnIoYVtvXSk7Zm9yKG89aS5sZW5ndGg7by0tOylpW29dLmVsZW0hPT10aGlzfHxudWxsIT10JiZpW29dLnF1ZXVlIT09dHx8KGlbb10uYW5pbS5zdG9wKG4pLGU9ITEsaS5zcGxpY2UobywxKSk7IWUmJm58fFMuZGVxdWV1ZSh0aGlzLHQpfSl9LGZpbmlzaDpmdW5jdGlvbih0KXtyZXR1cm4hMSE9PXQmJih0PXR8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLG49US5nZXQodGhpcykscj1uW3QrInF1ZXVlIl0sbz1uW3QrInF1ZXVlSG9va3MiXSxpPVMudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCxTLnF1ZXVlKHRoaXMsdCxbXSksbyYmby5zdG9wJiZvLnN0b3AuY2FsbCh0aGlzLCEwKSxlPWkubGVuZ3RoO2UtLTspaVtlXS5lbGVtPT09dGhpcyYmaVtlXS5xdWV1ZT09PXQmJihpW2VdLmFuaW0uc3RvcCghMCksaS5zcGxpY2UoZSwxKSk7Zm9yKGU9MDtlPGE7ZSsrKXJbZV0mJnJbZV0uZmluaXNoJiZyW2VdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pLFMuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24odCxlKXt2YXIgbj1TLmZuW2VdO1MuZm5bZV09ZnVuY3Rpb24odCxyLG8pe3JldHVybiBudWxsPT10fHwiYm9vbGVhbiI9PXR5cGVvZiB0P24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShoZShlLCEwKSx0LHIsbyl9fSksUy5lYWNoKHtzbGlkZURvd246aGUoInNob3ciKSxzbGlkZVVwOmhlKCJoaWRlIiksc2xpZGVUb2dnbGU6aGUoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKGUsdCxuLHIpfX0pLFMudGltZXJzPVtdLFMuZngudGljaz1mdW5jdGlvbigpe3ZhciB0LGU9MCxuPVMudGltZXJzO2ZvcihzZT1EYXRlLm5vdygpO2U8bi5sZW5ndGg7ZSsrKSh0PW5bZV0pKCl8fG5bZV0hPT10fHxuLnNwbGljZShlLS0sMSk7bi5sZW5ndGh8fFMuZnguc3RvcCgpLHNlPXZvaWQgMH0sUy5meC50aW1lcj1mdW5jdGlvbih0KXtTLnRpbWVycy5wdXNoKHQpLFMuZnguc3RhcnQoKX0sUy5meC5pbnRlcnZhbD0xMyxTLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7dWV8fCh1ZT0hMCxmZSgpKX0sUy5meC5zdG9wPWZ1bmN0aW9uKCl7dWU9bnVsbH0sUy5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sUy5mbi5kZWxheT1mdW5jdGlvbih0LGUpe3JldHVybiB0PVMuZngmJlMuZnguc3BlZWRzW3RdfHx0LGU9ZXx8ImZ4Iix0aGlzLnF1ZXVlKGUsZnVuY3Rpb24oZSxyKXt2YXIgbz1uLnNldFRpbWVvdXQoZSx0KTtyLnN0b3A9ZnVuY3Rpb24oKXtuLmNsZWFyVGltZW91dChvKX19KX0sZnVuY3Rpb24oKXt2YXIgdD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksZT1hLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO3QudHlwZT0iY2hlY2tib3giLHkuY2hlY2tPbj0iIiE9PXQudmFsdWUseS5vcHRTZWxlY3RlZD1lLnNlbGVjdGVkLCh0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLHQudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT10LnZhbHVlfSgpO3ZhciB2ZSx5ZT1TLmV4cHIuYXR0ckhhbmRsZTtTLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsUy5hdHRyLHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLnJlbW92ZUF0dHIodGhpcyx0KX0pfX0pLFMuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9dC5ub2RlVHlwZTtpZigzIT09aSYmOCE9PWkmJjIhPT1pKXJldHVybiB2b2lkIDA9PT10LmdldEF0dHJpYnV0ZT9TLnByb3AodCxlLG4pOigxPT09aSYmUy5pc1hNTERvYyh0KXx8KG89Uy5hdHRySG9va3NbZS50b0xvd2VyQ2FzZSgpXXx8KFMuZXhwci5tYXRjaC5ib29sLnRlc3QoZSk%2FdmU6dm9pZCAwKSksdm9pZCAwIT09bj9udWxsPT09bj92b2lkIFMucmVtb3ZlQXR0cih0LGUpOm8mJiJzZXQiaW4gbyYmdm9pZCAwIT09KHI9by5zZXQodCxuLGUpKT9yOih0LnNldEF0dHJpYnV0ZShlLG4rIiIpLG4pOm8mJiJnZXQiaW4gbyYmbnVsbCE9PShyPW8uZ2V0KHQsZSkpP3I6bnVsbD09KHI9Uy5maW5kLmF0dHIodCxlKSk%2Fdm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbih0LGUpe2lmKCF5LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1lJiZMKHQsImlucHV0Iikpe3ZhciBuPXQudmFsdWU7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJ0eXBlIixlKSxuJiYodC52YWx1ZT1uKSxlfX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLG89ZSYmZS5tYXRjaChVKTtpZihvJiYxPT09dC5ub2RlVHlwZSlmb3IoO249b1tyKytdOyl0LnJlbW92ZUF0dHJpYnV0ZShuKX19KSx2ZT17c2V0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hMT09PWU%2FUy5yZW1vdmVBdHRyKHQsbik6dC5zZXRBdHRyaWJ1dGUobixuKSxufX0sUy5lYWNoKFMuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKHQsZSl7dmFyIG49eWVbZV18fFMuZmluZC5hdHRyO3llW2VdPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGE9ZS50b0xvd2VyQ2FzZSgpO3JldHVybiByfHwoaT15ZVthXSx5ZVthXT1vLG89bnVsbCE9bih0LGUscik%2FYTpudWxsLHllW2FdPWkpLG99fSk7dmFyIG1lPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksYmU9L14oPzphfGFyZWEpJC9pO2Z1bmN0aW9uIHhlKHQpe3JldHVybih0Lm1hdGNoKFUpfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIHdlKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIGtlKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3Q6InN0cmluZyI9PXR5cGVvZiB0JiZ0Lm1hdGNoKFUpfHxbXX1TLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsUy5wcm9wLHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tTLnByb3BGaXhbdF18fHRdfSl9fSksUy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT10Lm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIDE9PT1pJiZTLmlzWE1MRG9jKHQpfHwoZT1TLnByb3BGaXhbZV18fGUsbz1TLnByb3BIb29rc1tlXSksdm9pZCAwIT09bj9vJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KHQsbixlKSk%2Fcjp0W2VdPW46byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQodCxlKSk%2Fcjp0W2VdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9Uy5maW5kLmF0dHIodCwidGFiaW5kZXgiKTtyZXR1cm4gZT9wYXJzZUludChlLDEwKTptZS50ZXN0KHQubm9kZU5hbWUpfHxiZS50ZXN0KHQubm9kZU5hbWUpJiZ0LmhyZWY%2FMDotMX19fSxwcm9wRml4Ontmb3I6Imh0bWxGb3IiLGNsYXNzOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChTLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtyZXR1cm4gZSYmZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO2UmJihlLnNlbGVjdGVkSW5kZXgsZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksUy5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtTLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksUy5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLHdlKHRoaXMpKSl9KTtpZigoZT1rZSh0KSkubGVuZ3RoKWZvcig7bj10aGlzW3UrK107KWlmKG89d2Uobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3hlKG8pKyIgIil7Zm9yKGE9MDtpPWVbYSsrXTspci5pbmRleE9mKCIgIitpKyIgIik8MCYmKHIrPWkrIiAiKTtvIT09KHM9eGUocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSx3ZSh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigoZT1rZSh0KSkubGVuZ3RoKWZvcig7bj10aGlzW3UrK107KWlmKG89d2Uobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3hlKG8pKyIgIil7Zm9yKGE9MDtpPWVbYSsrXTspZm9yKDtyLmluZGV4T2YoIiAiK2krIiAiKT4tMTspcj1yLnJlcGxhY2UoIiAiK2krIiAiLCIgIik7byE9PShzPXhlKHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdCxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheSh0KTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlJiZyP2U%2FdGhpcy5hZGRDbGFzcyh0KTp0aGlzLnJlbW92ZUNsYXNzKHQpOm0odCk%2FdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe1ModGhpcykudG9nZ2xlQ2xhc3ModC5jYWxsKHRoaXMsbix3ZSh0aGlzKSxlKSxlKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLG8saSxhO2lmKHIpZm9yKG89MCxpPVModGhpcyksYT1rZSh0KTtlPWFbbysrXTspaS5oYXNDbGFzcyhlKT9pLnJlbW92ZUNsYXNzKGUpOmkuYWRkQ2xhc3MoZSk7ZWxzZSB2b2lkIDAhPT10JiYiYm9vbGVhbiIhPT1ufHwoKGU9d2UodGhpcykpJiZRLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixlKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixlfHwhMT09PXQ%2FIiI6US5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj0wO2ZvcihlPSIgIit0KyIgIjtuPXRoaXNbcisrXTspaWYoMT09PW4ubm9kZVR5cGUmJigiICIreGUod2UobikpKyIgIikuaW5kZXhPZihlKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgU2U9L1xyL2c7Uy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbz10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW0odCksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBvOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KG89cj90LmNhbGwodGhpcyxuLFModGhpcykudmFsKCkpOnQpP289IiI6Im51bWJlciI9PXR5cGVvZiBvP28rPSIiOkFycmF5LmlzQXJyYXkobykmJihvPVMubWFwKG8sZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ%2FIiI6dCsiIn0pKSwoZT1TLnZhbEhvb2tzW3RoaXMudHlwZV18fFMudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gZSYmdm9pZCAwIT09ZS5zZXQodGhpcyxvLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1vKSl9KSk6bz8oZT1TLnZhbEhvb2tzW28udHlwZV18fFMudmFsSG9va3Nbby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJnZXQiaW4gZSYmdm9pZCAwIT09KG49ZS5nZXQobywidmFsdWUiKSk%2Fbjoic3RyaW5nIj09dHlwZW9mKG49by52YWx1ZSk%2Fbi5yZXBsYWNlKFNlLCIiKTpudWxsPT1uPyIiOm46dm9pZCAwfX0pLFMuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9Uy5maW5kLmF0dHIodCwidmFsdWUiKTtyZXR1cm4gbnVsbCE9ZT9lOnhlKFMudGV4dCh0KSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbz10Lm9wdGlvbnMsaT10LnNlbGVjdGVkSW5kZXgsYT0ic2VsZWN0LW9uZSI9PT10LnR5cGUscz1hP251bGw6W10sdT1hP2krMTpvLmxlbmd0aDtmb3Iocj1pPDA%2FdTphP2k6MDtyPHU7cisrKWlmKCgobj1vW3JdKS5zZWxlY3RlZHx8cj09PWkpJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFMKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGU9UyhuKS52YWwoKSxhKXJldHVybiBlO3MucHVzaChlKX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHIsbz10Lm9wdGlvbnMsaT1TLm1ha2VBcnJheShlKSxhPW8ubGVuZ3RoO2EtLTspKChyPW9bYV0pLnNlbGVjdGVkPVMuaW5BcnJheShTLnZhbEhvb2tzLm9wdGlvbi5nZXQociksaSk%2BLTEpJiYobj0hMCk7cmV0dXJuIG58fCh0LnNlbGVjdGVkSW5kZXg9LTEpLGl9fX19KSxTLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtTLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24odCxlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiB0LmNoZWNrZWQ9Uy5pbkFycmF5KFModCkudmFsKCksZSk%2BLTF9fSx5LmNoZWNrT258fChTLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6dC52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gbjt2YXIgRWU9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFRlPWZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9O1MuZXh0ZW5kKFMuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxlLHIsbyl7dmFyIGkscyx1LGMsbCxmLHAsaCxnPVtyfHxhXSx2PWQuY2FsbCh0LCJ0eXBlIik%2FdC50eXBlOnQseT1kLmNhbGwodCwibmFtZXNwYWNlIik%2FdC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1yPXJ8fGEsMyE9PXIubm9kZVR5cGUmJjghPT1yLm5vZGVUeXBlJiYhRWUudGVzdCh2K1MuZXZlbnQudHJpZ2dlcmVkKSYmKHYuaW5kZXhPZigiLiIpPi0xJiYoeT12LnNwbGl0KCIuIiksdj15LnNoaWZ0KCkseS5zb3J0KCkpLGw9di5pbmRleE9mKCI6Iik8MCYmIm9uIit2LCh0PXRbUy5leHBhbmRvXT90Om5ldyBTLkV2ZW50KHYsIm9iamVjdCI9PXR5cGVvZiB0JiZ0KSkuaXNUcmlnZ2VyPW8%2FMjozLHQubmFtZXNwYWNlPXkuam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit5LmpvaW4oIlxcLig%2FOi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9ciksZT1udWxsPT1lP1t0XTpTLm1ha2VBcnJheShlLFt0XSkscD1TLmV2ZW50LnNwZWNpYWxbdl18fHt9LG98fCFwLnRyaWdnZXJ8fCExIT09cC50cmlnZ2VyLmFwcGx5KHIsZSkpKXtpZighbyYmIXAubm9CdWJibGUmJiFiKHIpKXtmb3IoYz1wLmRlbGVnYXRlVHlwZXx8dixFZS50ZXN0KGMrdil8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSlnLnB1c2gocyksdT1zO3U9PT0oci5vd25lckRvY3VtZW50fHxhKSYmZy5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxuKX1mb3IoaT0wOyhzPWdbaSsrXSkmJiF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWg9cyx0LnR5cGU9aT4xP2M6cC5iaW5kVHlwZXx8diwoZj0oUS5nZXQocywiZXZlbnRzIil8fHt9KVt0LnR5cGVdJiZRLmdldChzLCJoYW5kbGUiKSkmJmYuYXBwbHkocyxlKSwoZj1sJiZzW2xdKSYmZi5hcHBseSYmWChzKSYmKHQucmVzdWx0PWYuYXBwbHkocyxlKSwhMT09PXQucmVzdWx0JiZ0LnByZXZlbnREZWZhdWx0KCkpO3JldHVybiB0LnR5cGU9dixvfHx0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHxwLl9kZWZhdWx0JiYhMSE9PXAuX2RlZmF1bHQuYXBwbHkoZy5wb3AoKSxlKXx8IVgocil8fGwmJm0oclt2XSkmJiFiKHIpJiYoKHU9cltsXSkmJihyW2xdPW51bGwpLFMuZXZlbnQudHJpZ2dlcmVkPXYsdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLmFkZEV2ZW50TGlzdGVuZXIodixUZSksclt2XSgpLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5yZW1vdmVFdmVudExpc3RlbmVyKHYsVGUpLFMuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCx1JiYocltsXT11KSksdC5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9Uy5leHRlbmQobmV3IFMuRXZlbnQsbix7dHlwZTp0LGlzU2ltdWxhdGVkOiEwfSk7Uy5ldmVudC50cmlnZ2VyKHIsbnVsbCxlKX19KSxTLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnRyaWdnZXIodCxlLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBTLmV2ZW50LnRyaWdnZXIodCxlLG4sITApfX0pLHkuZm9jdXNpbnx8Uy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe1MuZXZlbnQuc2ltdWxhdGUoZSx0LnRhcmdldCxTLmV2ZW50LmZpeCh0KSl9O1MuZXZlbnQuc3BlY2lhbFtlXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsbz1RLmFjY2VzcyhyLGUpO298fHIuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITApLFEuYWNjZXNzKHIsZSwob3x8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89US5hY2Nlc3MocixlKS0xO28%2FUS5hY2Nlc3MocixlLG8pOihyLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCEwKSxRLnJlbW92ZShyLGUpKX19fSk7dmFyIEFlPW4ubG9jYXRpb24sT2U9RGF0ZS5ub3coKSxDZT0vXD8vO1MucGFyc2VYTUw9ZnVuY3Rpb24odCl7dmFyIGU7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gbnVsbDt0cnl7ZT0obmV3IG4uRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC94bWwiKX1jYXRjaCh0KXtlPXZvaWQgMH1yZXR1cm4gZSYmIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxTLmVycm9yKCJJbnZhbGlkIFhNTDogIit0KSxlfTt2YXIgamU9L1xbXF0kLyxMZT0vXHI%2FXG4vZyxQZT0vXig%2FOnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksUmU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIE5lKHQsZSxuLHIpe3ZhciBvO2lmKEFycmF5LmlzQXJyYXkoZSkpUy5lYWNoKGUsZnVuY3Rpb24oZSxvKXtufHxqZS50ZXN0KHQpP3IodCxvKTpOZSh0KyJbIisoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT1vP2U6IiIpKyJdIixvLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09ayhlKSlyKHQsZSk7ZWxzZSBmb3IobyBpbiBlKU5lKHQrIlsiK28rIl0iLGVbb10sbixyKX1TLnBhcmFtPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXSxvPWZ1bmN0aW9uKHQsZSl7dmFyIG49bShlKT9lKCk6ZTtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQodCkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihudWxsPT10KXJldHVybiIiO2lmKEFycmF5LmlzQXJyYXkodCl8fHQuanF1ZXJ5JiYhUy5pc1BsYWluT2JqZWN0KHQpKVMuZWFjaCh0LGZ1bmN0aW9uKCl7byh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIHQpTmUobix0W25dLGUsbyk7cmV0dXJuIHIuam9pbigiJiIpfSxTLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIFMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgdD1TLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gdD9TLm1ha2VBcnJheSh0KTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFTKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmUmUudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVBlLnRlc3QodCkmJih0aGlzLmNoZWNrZWR8fCFndC50ZXN0KHQpKX0pLm1hcChmdW5jdGlvbih0LGUpe3ZhciBuPVModGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4%2FbnVsbDpBcnJheS5pc0FycmF5KG4pP1MubWFwKG4sZnVuY3Rpb24odCl7cmV0dXJue25hbWU6ZS5uYW1lLHZhbHVlOnQucmVwbGFjZShMZSwiXHJcbiIpfX0pOntuYW1lOmUubmFtZSx2YWx1ZTpuLnJlcGxhY2UoTGUsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIgSWU9LyUyMC9nLERlPS8jLiokLyxfZT0vKFs%2FJl0pXz1bXiZdKi8sTWU9L14oLio%2FKTpbIFx0XSooW15cclxuXSopJC9nbSxVZT0vXig%2FOkdFVHxIRUFEKSQvLEJlPS9eXC9cLy8scWU9e30sRmU9e30sSGU9IiovIi5jb25jYXQoIioiKSx6ZT1hLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBXZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXsic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT0iKiIpO3ZhciByLG89MCxpPWUudG9Mb3dlckNhc2UoKS5tYXRjaChVKXx8W107aWYobShuKSlmb3IoO3I9aVtvKytdOykiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwodFtyXT10W3JdfHxbXSkudW5zaGlmdChuKSk6KHRbcl09dFtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uICRlKHQsZSxuLHIpe3ZhciBvPXt9LGk9dD09PUZlO2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIG9bc109ITAsUy5lYWNoKHRbc118fFtdLGZ1bmN0aW9uKHQscyl7dmFyIGM9cyhlLG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxpfHxvW2NdP2k%2FISh1PWMpOnZvaWQgMDooZS5kYXRhVHlwZXMudW5zaGlmdChjKSxhKGMpLCExKX0pLHV9cmV0dXJuIGEoZS5kYXRhVHlwZXNbMF0pfHwhb1siKiJdJiZhKCIqIil9ZnVuY3Rpb24gVmUodCxlKXt2YXIgbixyLG89Uy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIGUpdm9pZCAwIT09ZVtuXSYmKChvW25dP3Q6cnx8KHI9e30pKVtuXT1lW25dKTtyZXR1cm4gciYmUy5leHRlbmQoITAsdCxyKSx0fXplLmhyZWY9QWUuaHJlZixTLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6QWUuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChBZS5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpIZSx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Uy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU%2FVmUoVmUodCxTLmFqYXhTZXR0aW5ncyksZSk6VmUoUy5hamF4U2V0dGluZ3MsdCl9LGFqYXhQcmVmaWx0ZXI6V2UocWUpLGFqYXhUcmFuc3BvcnQ6V2UoRmUpLGFqYXg6ZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLGU9ZXx8e307dmFyIHIsbyxpLHMsdSxjLGwsZixwLGgsZD1TLmFqYXhTZXR1cCh7fSxlKSxnPWQuY29udGV4dHx8ZCx2PWQuY29udGV4dCYmKGcubm9kZVR5cGV8fGcuanF1ZXJ5KT9TKGcpOlMuZXZlbnQseT1TLkRlZmVycmVkKCksbT1TLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxiPWQuc3RhdHVzQ29kZXx8e30seD17fSx3PXt9LGs9ImNhbmNlbGVkIixFPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24odCl7dmFyIGU7aWYobCl7aWYoIXMpZm9yKHM9e307ZT1NZS5leGVjKGkpOylzW2VbMV0udG9Mb3dlckNhc2UoKSsiICJdPShzW2VbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KGVbMl0pO2U9c1t0LnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09ZT9udWxsOmUuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGw%2FaTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWwmJih0PXdbdC50b0xvd2VyQ2FzZSgpXT13W3QudG9Mb3dlckNhc2UoKV18fHQseFt0XT1lKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT1sJiYoZC5taW1lVHlwZT10KSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHQpaWYobClFLmFsd2F5cyh0W0Uuc3RhdHVzXSk7ZWxzZSBmb3IoZSBpbiB0KWJbZV09W2JbZV0sdFtlXV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKHQpe3ZhciBlPXR8fGs7cmV0dXJuIHImJnIuYWJvcnQoZSksVCgwLGUpLHRoaXN9fTtpZih5LnByb21pc2UoRSksZC51cmw9KCh0fHxkLnVybHx8QWUuaHJlZikrIiIpLnJlcGxhY2UoQmUsQWUucHJvdG9jb2wrIi8vIiksZC50eXBlPWUubWV0aG9kfHxlLnR5cGV8fGQubWV0aG9kfHxkLnR5cGUsZC5kYXRhVHlwZXM9KGQuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChVKXx8WyIiXSxudWxsPT1kLmNyb3NzRG9tYWluKXtjPWEuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtjLmhyZWY9ZC51cmwsYy5ocmVmPWMuaHJlZixkLmNyb3NzRG9tYWluPXplLnByb3RvY29sKyIvLyIremUuaG9zdCE9Yy5wcm90b2NvbCsiLy8iK2MuaG9zdH1jYXRjaCh0KXtkLmNyb3NzRG9tYWluPSEwfX1pZihkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgZC5kYXRhJiYoZC5kYXRhPVMucGFyYW0oZC5kYXRhLGQudHJhZGl0aW9uYWwpKSwkZShxZSxkLGUsRSksbClyZXR1cm4gRTtmb3IocCBpbihmPVMuZXZlbnQmJmQuZ2xvYmFsKSYmMD09Uy5hY3RpdmUrKyYmUy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxkLnR5cGU9ZC50eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFVZS50ZXN0KGQudHlwZSksbz1kLnVybC5yZXBsYWNlKERlLCIiKSxkLmhhc0NvbnRlbnQ%2FZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiYwPT09KGQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKGQuZGF0YT1kLmRhdGEucmVwbGFjZShJZSwiKyIpKTooaD1kLnVybC5zbGljZShvLmxlbmd0aCksZC5kYXRhJiYoZC5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiBkLmRhdGEpJiYobys9KENlLnRlc3Qobyk%2FIiYiOiI%2FIikrZC5kYXRhLGRlbGV0ZSBkLmRhdGEpLCExPT09ZC5jYWNoZSYmKG89by5yZXBsYWNlKF9lLCIkMSIpLGg9KENlLnRlc3Qobyk%2FIiYiOiI%2FIikrIl89IitPZSsrK2gpLGQudXJsPW8raCksZC5pZk1vZGlmaWVkJiYoUy5sYXN0TW9kaWZpZWRbb10mJkUuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLFMubGFzdE1vZGlmaWVkW29dKSxTLmV0YWdbb10mJkUuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsUy5ldGFnW29dKSksKGQuZGF0YSYmZC5oYXNDb250ZW50JiYhMSE9PWQuY29udGVudFR5cGV8fGUuY29udGVudFR5cGUpJiZFLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksRS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGQuZGF0YVR5cGVzWzBdJiZkLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dP2QuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0rKCIqIiE9PWQuZGF0YVR5cGVzWzBdPyIsICIrSGUrIjsgcT0wLjAxIjoiIik6ZC5hY2NlcHRzWyIqIl0pLGQuaGVhZGVycylFLnNldFJlcXVlc3RIZWFkZXIocCxkLmhlYWRlcnNbcF0pO2lmKGQuYmVmb3JlU2VuZCYmKCExPT09ZC5iZWZvcmVTZW5kLmNhbGwoZyxFLGQpfHxsKSlyZXR1cm4gRS5hYm9ydCgpO2lmKGs9ImFib3J0IixtLmFkZChkLmNvbXBsZXRlKSxFLmRvbmUoZC5zdWNjZXNzKSxFLmZhaWwoZC5lcnJvcikscj0kZShGZSxkLGUsRSkpe2lmKEUucmVhZHlTdGF0ZT0xLGYmJnYudHJpZ2dlcigiYWpheFNlbmQiLFtFLGRdKSxsKXJldHVybiBFO2QuYXN5bmMmJmQudGltZW91dD4wJiYodT1uLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtFLmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtsPSExLHIuc2VuZCh4LFQpfWNhdGNoKHQpe2lmKGwpdGhyb3cgdDtUKC0xLHQpfX1lbHNlIFQoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIFQodCxlLGEscyl7dmFyIGMscCxoLHgsdyxrPWU7bHx8KGw9ITAsdSYmbi5jbGVhclRpbWVvdXQodSkscj12b2lkIDAsaT1zfHwiIixFLnJlYWR5U3RhdGU9dD4wPzQ6MCxjPXQ%2BPTIwMCYmdDwzMDB8fDMwND09PXQsYSYmKHg9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixvLGksYSxzPXQuY29udGVudHMsdT10LmRhdGFUeXBlczsiKiI9PT11WzBdOyl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9dC5taW1lVHlwZXx8ZS5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKG8gaW4gcylpZihzW29dJiZzW29dLnRlc3Qocikpe3UudW5zaGlmdChvKTticmVha31pZih1WzBdaW4gbilpPXVbMF07ZWxzZXtmb3IobyBpbiBuKXtpZighdVswXXx8dC5jb252ZXJ0ZXJzW28rIiAiK3VbMF1dKXtpPW87YnJlYWt9YXx8KGE9byl9aT1pfHxhfWlmKGkpcmV0dXJuIGkhPT11WzBdJiZ1LnVuc2hpZnQoaSksbltpXX0oZCxFLGEpKSx4PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzLHUsYz17fSxsPXQuZGF0YVR5cGVzLnNsaWNlKCk7aWYobFsxXSlmb3IoYSBpbiB0LmNvbnZlcnRlcnMpY1thLnRvTG93ZXJDYXNlKCldPXQuY29udmVydGVyc1thXTtmb3IoaT1sLnNoaWZ0KCk7aTspaWYodC5yZXNwb25zZUZpZWxkc1tpXSYmKG5bdC5yZXNwb25zZUZpZWxkc1tpXV09ZSksIXUmJnImJnQuZGF0YUZpbHRlciYmKGU9dC5kYXRhRmlsdGVyKGUsdC5kYXRhVHlwZSkpLHU9aSxpPWwuc2hpZnQoKSlpZigiKiI9PT1pKWk9dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1pKXtpZighKGE9Y1t1KyIgIitpXXx8Y1siKiAiK2ldKSlmb3IobyBpbiBjKWlmKChzPW8uc3BsaXQoIiAiKSlbMV09PT1pJiYoYT1jW3UrIiAiK3NbMF1dfHxjWyIqICIrc1swXV0pKXshMD09PWE%2FYT1jW29dOiEwIT09Y1tvXSYmKGk9c1swXSxsLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKCEwIT09YSlpZihhJiZ0LnRocm93cyllPWEoZSk7ZWxzZSB0cnl7ZT1hKGUpfWNhdGNoKHQpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE%2FdDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIraX19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTplfX0oZCx4LEUsYyksYz8oZC5pZk1vZGlmaWVkJiYoKHc9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKFMubGFzdE1vZGlmaWVkW29dPXcpLCh3PUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihTLmV0YWdbb109dykpLDIwND09PXR8fCJIRUFEIj09PWQudHlwZT9rPSJub2NvbnRlbnQiOjMwND09PXQ%2Faz0ibm90bW9kaWZpZWQiOihrPXguc3RhdGUscD14LmRhdGEsYz0hKGg9eC5lcnJvcikpKTooaD1rLCF0JiZrfHwoaz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0oZXx8aykrIiIsYz95LnJlc29sdmVXaXRoKGcsW3AsayxFXSk6eS5yZWplY3RXaXRoKGcsW0UsayxoXSksRS5zdGF0dXNDb2RlKGIpLGI9dm9pZCAwLGYmJnYudHJpZ2dlcihjPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsZCxjP3A6aF0pLG0uZmlyZVdpdGgoZyxbRSxrXSksZiYmKHYudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxkXSksLS1TLmFjdGl2ZXx8Uy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24odCxlLG4pe3JldHVybiBTLmdldCh0LGUsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUy5nZXQodCx2b2lkIDAsZSwic2NyaXB0Iil9fSksUy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKHQsZSl7U1tlXT1mdW5jdGlvbih0LG4scixvKXtyZXR1cm4gbShuKSYmKG89b3x8cixyPW4sbj12b2lkIDApLFMuYWpheChTLmV4dGVuZCh7dXJsOnQsdHlwZTplLGRhdGFUeXBlOm8sZGF0YTpuLHN1Y2Nlc3M6cn0sUy5pc1BsYWluT2JqZWN0KHQpJiZ0KSl9fSksUy5fZXZhbFVybD1mdW5jdGlvbih0LGUpe3JldHVybiBTLmFqYXgoe3VybDp0LHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKHQpe1MuZ2xvYmFsRXZhbCh0LGUpfX0pfSxTLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdGhpc1swXSYmKG0odCkmJih0PXQuY2FsbCh0aGlzWzBdKSksZT1TKHQsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZlLmluc2VydEJlZm9yZSh0aGlzWzBdKSxlLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzO3QuZmlyc3RFbGVtZW50Q2hpbGQ7KXQ9dC5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gdH0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKHQpe3JldHVybiBtKHQpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBJbm5lcih0LmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TKHRoaXMpLG49ZS5jb250ZW50cygpO24ubGVuZ3RoP24ud3JhcEFsbCh0KTplLmFwcGVuZCh0KX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBlPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXtTKHRoaXMpLndyYXBBbGwoZT90LmNhbGwodGhpcyxuKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucGFyZW50KHQpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLFMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4hUy5leHByLnBzZXVkb3MudmlzaWJsZSh0KX0sUy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4hISh0Lm9mZnNldFdpZHRofHx0Lm9mZnNldEhlaWdodHx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LFMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IG4uWE1MSHR0cFJlcXVlc3R9Y2F0Y2godCl7fX07dmFyIFllPXswOjIwMCwxMjIzOjIwNH0sR2U9Uy5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhR2UmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gR2UseS5hamF4PUdlPSEhR2UsUy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoeS5jb3JzfHxHZSYmIXQuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24obyxpKXt2YXIgYSxzPXQueGhyKCk7aWYocy5vcGVuKHQudHlwZSx0LnVybCx0LmFzeW5jLHQudXNlcm5hbWUsdC5wYXNzd29yZCksdC54aHJGaWVsZHMpZm9yKGEgaW4gdC54aHJGaWVsZHMpc1thXT10LnhockZpZWxkc1thXTtmb3IoYSBpbiB0Lm1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSh0Lm1pbWVUeXBlKSx0LmNyb3NzRG9tYWlufHxvWyJYLVJlcXVlc3RlZC1XaXRoIl18fChvWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksbylzLnNldFJlcXVlc3RIZWFkZXIoYSxvW2FdKTtlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2UmJihlPXI9cy5vbmxvYWQ9cy5vbmVycm9yPXMub25hYm9ydD1zLm9udGltZW91dD1zLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT10P3MuYWJvcnQoKToiZXJyb3IiPT09dD8ibnVtYmVyIiE9dHlwZW9mIHMuc3RhdHVzP2koMCwiZXJyb3IiKTppKHMuc3RhdHVzLHMuc3RhdHVzVGV4dCk6aShZZVtzLnN0YXR1c118fHMuc3RhdHVzLHMuc3RhdHVzVGV4dCwidGV4dCIhPT0ocy5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygcy5yZXNwb25zZVRleHQ%2Fe2JpbmFyeTpzLnJlc3BvbnNlfTp7dGV4dDpzLnJlc3BvbnNlVGV4dH0scy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0scy5vbmxvYWQ9ZSgpLHI9cy5vbmVycm9yPXMub250aW1lb3V0PWUoImVycm9yIiksdm9pZCAwIT09cy5vbmFib3J0P3Mub25hYm9ydD1yOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXMucmVhZHlTdGF0ZSYmbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSYmcigpfSl9LGU9ZSgiYWJvcnQiKTt0cnl7cy5zZW5kKHQuaGFzQ29udGVudCYmdC5kYXRhfHxudWxsKX1jYXRjaCh0KXtpZihlKXRocm93IHR9fSxhYm9ydDpmdW5jdGlvbigpe2UmJmUoKX19fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKHQpe3QuY3Jvc3NEb21haW4mJih0LmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbih0KXtyZXR1cm4gUy5nbG9iYWxFdmFsKHQpLHR9fX0pLFMuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbih0KXt2b2lkIDA9PT10LmNhY2hlJiYodC5jYWNoZT0hMSksdC5jcm9zc0RvbWFpbiYmKHQudHlwZT0iR0VUIil9KSxTLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24odCl7dmFyIGUsbjtpZih0LmNyb3NzRG9tYWlufHx0LnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKHIsbyl7ZT1TKCI8c2NyaXB0PiIpLmF0dHIodC5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6dC5zY3JpcHRDaGFyc2V0LHNyYzp0LnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKHQpe2UucmVtb3ZlKCksbj1udWxsLHQmJm8oImVycm9yIj09PXQudHlwZT80MDQ6MjAwLHQudHlwZSl9KSxhLmhlYWQuYXBwZW5kQ2hpbGQoZVswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19KTt2YXIgS2UsWGU9W10sSmU9Lyg9KVw%2FKD89JnwkKXxcP1w%2FLztTLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIHQ9WGUucG9wKCl8fFMuZXhwYW5kbysiXyIrT2UrKztyZXR1cm4gdGhpc1t0XT0hMCx0fX0pLFMuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYSxzPSExIT09dC5qc29ucCYmKEplLnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmSmUudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gbz10Lmpzb25wQ2FsbGJhY2s9bSh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKEplLCIkMSIrbyk6ITEhPT10Lmpzb25wJiYodC51cmwrPShDZS50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitvKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8Uy5lcnJvcihvKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsaT1uW29dLG5bb109ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP1MobikucmVtb3ZlUHJvcChvKTpuW29dPWksdFtvXSYmKHQuanNvbnBDYWxsYmFjaz1lLmpzb25wQ2FsbGJhY2ssWGUucHVzaChvKSksYSYmbShpKSYmaShhWzBdKSxhPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKEtlPWEuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0%2BIiwyPT09S2UuY2hpbGROb2Rlcy5sZW5ndGgpLFMucGFyc2VIVE1MPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQ%2FW106KCJib29sZWFuIj09dHlwZW9mIGUmJihuPWUsZT0hMSksZXx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0oZT1hLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1hLmxvY2F0aW9uLmhyZWYsZS5oZWFkLmFwcGVuZENoaWxkKHIpKTplPWEpLGk9IW4mJltdLChvPVAuZXhlYyh0KSk%2FW2UuY3JlYXRlRWxlbWVudChvWzFdKV06KG89RXQoW3RdLGUsaSksaSYmaS5sZW5ndGgmJlMoaSkucmVtb3ZlKCksUy5tZXJnZShbXSxvLmNoaWxkTm9kZXMpKSk7dmFyIHIsbyxpfSxTLmZuLmxvYWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPXRoaXMscz10LmluZGV4T2YoIiAiKTtyZXR1cm4gcz4tMSYmKHI9eGUodC5zbGljZShzKSksdD10LnNsaWNlKDAscykpLG0oZSk%2FKG49ZSxlPXZvaWQgMCk6ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYobz0iUE9TVCIpLGEubGVuZ3RoPjAmJlMuYWpheCh7dXJsOnQsdHlwZTpvfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTplfSkuZG9uZShmdW5jdGlvbih0KXtpPWFyZ3VtZW50cyxhLmh0bWwocj9TKCI8ZGl2PiIpLmFwcGVuZChTLnBhcnNlSFRNTCh0KSkuZmluZChyKTp0KX0pLmFsd2F5cyhuJiZmdW5jdGlvbih0LGUpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxpfHxbdC5yZXNwb25zZVRleHQsZSx0XSl9KX0pLHRoaXN9LFMuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKHQsZSl7Uy5mbltlXT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vbihlLHQpfX0pLFMuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKHQpe3JldHVybiBTLmdyZXAoUy50aW1lcnMsZnVuY3Rpb24oZSl7cmV0dXJuIHQ9PT1lLmVsZW19KS5sZW5ndGh9LFMub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjPVMuY3NzKHQsInBvc2l0aW9uIiksbD1TKHQpLGY9e307InN0YXRpYyI9PT1jJiYodC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxzPWwub2Zmc2V0KCksaT1TLmNzcyh0LCJ0b3AiKSx1PVMuY3NzKHQsImxlZnQiKSwoImFic29sdXRlIj09PWN8fCJmaXhlZCI9PT1jKSYmKGkrdSkuaW5kZXhPZigiYXV0byIpPi0xPyhhPShyPWwucG9zaXRpb24oKSkudG9wLG89ci5sZWZ0KTooYT1wYXJzZUZsb2F0KGkpfHwwLG89cGFyc2VGbG9hdCh1KXx8MCksbShlKSYmKGU9ZS5jYWxsKHQsbixTLmV4dGVuZCh7fSxzKSkpLG51bGwhPWUudG9wJiYoZi50b3A9ZS50b3Atcy50b3ArYSksbnVsbCE9ZS5sZWZ0JiYoZi5sZWZ0PWUubGVmdC1zLmxlZnQrbyksInVzaW5nImluIGU%2FZS51c2luZy5jYWxsKHQsZik6bC5jc3MoZil9fSxTLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXQ%2FdGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsdCxlKX0pO3ZhciBlLG4scj10aGlzWzBdO3JldHVybiByP3IuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg%2FKGU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOmUudG9wK24ucGFnZVlPZmZzZXQsbGVmdDplLmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9OnZvaWQgMH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgdCxlLG4scj10aGlzWzBdLG89e3RvcDowLGxlZnQ6MH07aWYoImZpeGVkIj09PVMuY3NzKHIsInBvc2l0aW9uIikpZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7Zm9yKGU9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCx0PXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt0JiYodD09PW4uYm9keXx8dD09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TLmNzcyh0LCJwb3NpdGlvbiIpOyl0PXQucGFyZW50Tm9kZTt0JiZ0IT09ciYmMT09PXQubm9kZVR5cGUmJigobz1TKHQpLm9mZnNldCgpKS50b3ArPVMuY3NzKHQsImJvcmRlclRvcFdpZHRoIiwhMCksby5sZWZ0Kz1TLmNzcyh0LCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDplLnRvcC1vLnRvcC1TLmNzcyhyLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmUubGVmdC1vLmxlZnQtUy5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLm9mZnNldFBhcmVudDt0JiYic3RhdGljIj09PVMuY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5vZmZzZXRQYXJlbnQ7cmV0dXJuIHR8fGF0fSl9fSksUy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PWU7Uy5mblt0XT1mdW5jdGlvbihyKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQscixvKXt2YXIgaTtpZihiKHQpP2k9dDo5PT09dC5ub2RlVHlwZSYmKGk9dC5kZWZhdWx0Vmlldyksdm9pZCAwPT09bylyZXR1cm4gaT9pW2VdOnRbcl07aT9pLnNjcm9sbFRvKG4%2FaS5wYWdlWE9mZnNldDpvLG4%2FbzppLnBhZ2VZT2Zmc2V0KTp0W3JdPW99LHQscixhcmd1bWVudHMubGVuZ3RoKX19KSxTLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW2VdPUd0KHkucGl4ZWxQb3NpdGlvbixmdW5jdGlvbih0LG4pe2lmKG4pcmV0dXJuIG49WXQodCxlKSxXdC50ZXN0KG4pP1ModCkucG9zaXRpb24oKVtlXSsicHgiOm59KX0pLFMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrdCxjb250ZW50OmUsIiI6Im91dGVyIit0fSxmdW5jdGlvbihuLHIpe1MuZm5bcl09ZnVuY3Rpb24obyxpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2Ygbykscz1ufHwoITA9PT1vfHwhMD09PWk%2FIm1hcmdpbiI6ImJvcmRlciIpO3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSxuLG8pe3ZhciBpO3JldHVybiBiKGUpPzA9PT1yLmluZGV4T2YoIm91dGVyIik%2FZVsiaW5uZXIiK3RdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK3RdOjk9PT1lLm5vZGVUeXBlPyhpPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIit0XSxpWyJzY3JvbGwiK3RdLGUuYm9keVsib2Zmc2V0Iit0XSxpWyJvZmZzZXQiK3RdLGlbImNsaWVudCIrdF0pKTp2b2lkIDA9PT1vP1MuY3NzKGUsbixzKTpTLnN0eWxlKGUsbixvLHMpfSxlLGE%2Fbzp2b2lkIDAsYSl9fSl9KSxTLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtTLmZuW2VdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg%2BMD90aGlzLm9uKGUsbnVsbCx0LG4pOnRoaXMudHJpZ2dlcihlKX19KSxTLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKHQpLm1vdXNlbGVhdmUoZXx8dCl9fSksUy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLm9uKHQsbnVsbCxlLG4pfSx1bmJpbmQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vZmYodCxudWxsLGUpfSxkZWxlZ2F0ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdGhpcy5vbihlLHQsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKHQsIioqIik6dGhpcy5vZmYoZSx0fHwiKioiLG4pfX0pLFMucHJveHk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLG87aWYoInN0cmluZyI9PXR5cGVvZiBlJiYobj10W2VdLGU9dCx0PW4pLG0odCkpcmV0dXJuIHI9dS5jYWxsKGFyZ3VtZW50cywyKSwobz1mdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGV8fHRoaXMsci5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKX0pLmd1aWQ9dC5ndWlkPXQuZ3VpZHx8Uy5ndWlkKyssb30sUy5ob2xkUmVhZHk9ZnVuY3Rpb24odCl7dD9TLnJlYWR5V2FpdCsrOlMucmVhZHkoITApfSxTLmlzQXJyYXk9QXJyYXkuaXNBcnJheSxTLnBhcnNlSlNPTj1KU09OLnBhcnNlLFMubm9kZU5hbWU9TCxTLmlzRnVuY3Rpb249bSxTLmlzV2luZG93PWIsUy5jYW1lbENhc2U9SyxTLnR5cGU9ayxTLm5vdz1EYXRlLm5vdyxTLmlzTnVtZXJpYz1mdW5jdGlvbih0KXt2YXIgZT1TLnR5cGUodCk7cmV0dXJuKCJudW1iZXIiPT09ZXx8InN0cmluZyI9PT1lKSYmIWlzTmFOKHQtcGFyc2VGbG9hdCh0KSl9LHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJuIFN9LmFwcGx5KGUsW10pKXx8KHQuZXhwb3J0cz1yKTt2YXIgUWU9bi5qUXVlcnksWmU9bi4kO3JldHVybiBTLm5vQ29uZmxpY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG4uJD09PVMmJihuLiQ9WmUpLHQmJm4ualF1ZXJ5PT09UyYmKG4ualF1ZXJ5PVFlKSxTfSxvfHwobi5qUXVlcnk9bi4kPVMpLFN9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyOCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3OSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX1yLnByb3RvPWZ1bmN0aW9uKCl7cmV0dXJuIFJlZ0V4cC5lc2NhcGU9cixyfSx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Myl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4OCkuZGVmYXVsdDt0LmV4cG9ydHM9cix0LmV4cG9ydHMuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM1KX0sZnVuY3Rpb24odCxlLG4pe24oMTM2KTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLlJlZmxlY3QuY29uc3RydWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMzApLGk9bigxOSksYT1uKDkpLHM9big2KSx1PW4oNDcpLGM9big5MCksbD1uKDUpLGY9bygiUmVmbGVjdCIsImNvbnN0cnVjdCIpLHA9bChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShmKGZ1bmN0aW9uKCl7fSxbXSx0KWluc3RhbmNlb2YgdCl9KSxoPSFsKGZ1bmN0aW9uKCl7ZihmdW5jdGlvbigpe30pfSksZD1wfHxoO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxmb3JjZWQ6ZCxzaGFtOmR9LHtjb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlKXtpKHQpLGEoZSk7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3Q6aShhcmd1bWVudHNbMl0pO2lmKGgmJiFwKXJldHVybiBmKHQsZSxuKTtpZih0PT1uKXtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKX12YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGUpLG5ldyhjLmFwcGx5KHQscikpfXZhciBvPW4ucHJvdG90eXBlLGw9dShzKG8pP286T2JqZWN0LnByb3RvdHlwZSksZD1GdW5jdGlvbi5hcHBseS5jYWxsKHQsbCxlKTtyZXR1cm4gcyhkKT9kOmx9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjApLGk9big5KSxhPW4oNjQpO3QuZXhwb3J0cz1yP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7aSh0KTtmb3IodmFyIG4scj1hKGUpLHM9ci5sZW5ndGgsdT0wO3M%2BdTspby5mKHQsbj1yW3UrK10sZVtuXSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3RyeXtvKHIsdCxlKX1jYXRjaChuKXtyW3RdPWV9cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9ZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlLG49T2JqZWN0LnByb3RvdHlwZSxyPW4uaGFzT3duUHJvcGVydHksbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxpPW8uaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixhPW8uYXN5bmNJdGVyYXRvcnx8IkBAYXN5bmNJdGVyYXRvciIscz1vLnRvU3RyaW5nVGFnfHwiQEB0b1N0cmluZ1RhZyI7ZnVuY3Rpb24gdSh0LGUsbil7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSx0W2VdfXRyeXt1KHt9LCIiKX1jYXRjaCh0KXt1PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1ufX1mdW5jdGlvbiBjKHQsZSxuLHIpe3ZhciBvPWUmJmUucHJvdG90eXBlIGluc3RhbmNlb2Ygdj9lOnYsaT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSxhPW5ldyBDKHJ8fFtdKTtyZXR1cm4gaS5faW52b2tlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mO3JldHVybiBmdW5jdGlvbihvLGkpe2lmKHI9PT1oKXRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2lmKHI9PT1kKXtpZigidGhyb3ciPT09byl0aHJvdyBpO3JldHVybiBMKCl9Zm9yKG4ubWV0aG9kPW8sbi5hcmc9aTs7KXt2YXIgYT1uLmRlbGVnYXRlO2lmKGEpe3ZhciBzPVQoYSxuKTtpZihzKXtpZihzPT09Zyljb250aW51ZTtyZXR1cm4gc319aWYoIm5leHQiPT09bi5tZXRob2Qpbi5zZW50PW4uX3NlbnQ9bi5hcmc7ZWxzZSBpZigidGhyb3ciPT09bi5tZXRob2Qpe2lmKHI9PT1mKXRocm93IHI9ZCxuLmFyZztuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKX1lbHNlInJldHVybiI9PT1uLm1ldGhvZCYmbi5hYnJ1cHQoInJldHVybiIsbi5hcmcpO3I9aDt2YXIgdT1sKHQsZSxuKTtpZigibm9ybWFsIj09PXUudHlwZSl7aWYocj1uLmRvbmU%2FZDpwLHUuYXJnPT09Zyljb250aW51ZTtyZXR1cm57dmFsdWU6dS5hcmcsZG9uZTpuLmRvbmV9fSJ0aHJvdyI9PT11LnR5cGUmJihyPWQsbi5tZXRob2Q9InRocm93IixuLmFyZz11LmFyZyl9fX0odCxuLGEpLGl9ZnVuY3Rpb24gbCh0LGUsbil7dHJ5e3JldHVybnt0eXBlOiJub3JtYWwiLGFyZzp0LmNhbGwoZSxuKX19Y2F0Y2godCl7cmV0dXJue3R5cGU6InRocm93Iixhcmc6dH19fXQud3JhcD1jO3ZhciBmPSJzdXNwZW5kZWRTdGFydCIscD0ic3VzcGVuZGVkWWllbGQiLGg9ImV4ZWN1dGluZyIsZD0iY29tcGxldGVkIixnPXt9O2Z1bmN0aW9uIHYoKXt9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiBtKCl7fXZhciBiPXt9O2JbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dmFyIHg9T2JqZWN0LmdldFByb3RvdHlwZU9mLHc9eCYmeCh4KGooW10pKSk7dyYmdyE9PW4mJnIuY2FsbCh3LGkpJiYoYj13KTt2YXIgaz1tLnByb3RvdHlwZT12LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIpO2Z1bmN0aW9uIFModCl7WyJuZXh0IiwidGhyb3ciLCJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UodCxlLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbnZva2UoZSx0KX0pfSl9ZnVuY3Rpb24gRSh0LGUpe3ZhciBuO3RoaXMuX2ludm9rZT1mdW5jdGlvbihvLGkpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gbmV3IGUoZnVuY3Rpb24obixhKXshZnVuY3Rpb24gbihvLGksYSxzKXt2YXIgdT1sKHRbb10sdCxpKTtpZigidGhyb3ciIT09dS50eXBlKXt2YXIgYz11LmFyZyxmPWMudmFsdWU7cmV0dXJuIGYmJiJvYmplY3QiPT10eXBlb2YgZiYmci5jYWxsKGYsIl9fYXdhaXQiKT9lLnJlc29sdmUoZi5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHQpe24oIm5leHQiLHQsYSxzKX0sZnVuY3Rpb24odCl7bigidGhyb3ciLHQsYSxzKX0pOmUucmVzb2x2ZShmKS50aGVuKGZ1bmN0aW9uKHQpe2MudmFsdWU9dCxhKGMpfSxmdW5jdGlvbih0KXtyZXR1cm4gbigidGhyb3ciLHQsYSxzKX0pfXModS5hcmcpfShvLGksbixhKX0pfXJldHVybiBuPW4%2Fbi50aGVuKGEsYSk6YSgpfX1mdW5jdGlvbiBUKHQsbil7dmFyIHI9dC5pdGVyYXRvcltuLm1ldGhvZF07aWYocj09PWUpe2lmKG4uZGVsZWdhdGU9bnVsbCwidGhyb3ciPT09bi5tZXRob2Qpe2lmKHQuaXRlcmF0b3IucmV0dXJuJiYobi5tZXRob2Q9InJldHVybiIsbi5hcmc9ZSxUKHQsbiksInRocm93Ij09PW4ubWV0aG9kKSlyZXR1cm4gZztuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2QiKX1yZXR1cm4gZ312YXIgbz1sKHIsdC5pdGVyYXRvcixuLmFyZyk7aWYoInRocm93Ij09PW8udHlwZSlyZXR1cm4gbi5tZXRob2Q9InRocm93IixuLmFyZz1vLmFyZyxuLmRlbGVnYXRlPW51bGwsZzt2YXIgaT1vLmFyZztyZXR1cm4gaT9pLmRvbmU%2FKG5bdC5yZXN1bHROYW1lXT1pLnZhbHVlLG4ubmV4dD10Lm5leHRMb2MsInJldHVybiIhPT1uLm1ldGhvZCYmKG4ubWV0aG9kPSJuZXh0IixuLmFyZz1lKSxuLmRlbGVnYXRlPW51bGwsZyk6aToobi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLG4uZGVsZWdhdGU9bnVsbCxnKX1mdW5jdGlvbiBBKHQpe3ZhciBlPXt0cnlMb2M6dFswXX07MSBpbiB0JiYoZS5jYXRjaExvYz10WzFdKSwyIGluIHQmJihlLmZpbmFsbHlMb2M9dFsyXSxlLmFmdGVyTG9jPXRbM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKGUpfWZ1bmN0aW9uIE8odCl7dmFyIGU9dC5jb21wbGV0aW9ufHx7fTtlLnR5cGU9Im5vcm1hbCIsZGVsZXRlIGUuYXJnLHQuY29tcGxldGlvbj1lfWZ1bmN0aW9uIEModCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLHQuZm9yRWFjaChBLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIGoodCl7aWYodCl7dmFyIG49dFtpXTtpZihuKXJldHVybiBuLmNhbGwodCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQubmV4dClyZXR1cm4gdDtpZighaXNOYU4odC5sZW5ndGgpKXt2YXIgbz0tMSxhPWZ1bmN0aW9uIG4oKXtmb3IoOysrbzx0Lmxlbmd0aDspaWYoci5jYWxsKHQsbykpcmV0dXJuIG4udmFsdWU9dFtvXSxuLmRvbmU9ITEsbjtyZXR1cm4gbi52YWx1ZT1lLG4uZG9uZT0hMCxufTtyZXR1cm4gYS5uZXh0PWF9fXJldHVybntuZXh0Okx9fWZ1bmN0aW9uIEwoKXtyZXR1cm57dmFsdWU6ZSxkb25lOiEwfX1yZXR1cm4geS5wcm90b3R5cGU9ay5jb25zdHJ1Y3Rvcj1tLG0uY29uc3RydWN0b3I9eSx5LmRpc3BsYXlOYW1lPXUobSxzLCJHZW5lcmF0b3JGdW5jdGlvbiIpLHQuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4hIWUmJihlPT09eXx8IkdlbmVyYXRvckZ1bmN0aW9uIj09PShlLmRpc3BsYXlOYW1lfHxlLm5hbWUpKX0sdC5tYXJrPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y%2FT2JqZWN0LnNldFByb3RvdHlwZU9mKHQsbSk6KHQuX19wcm90b19fPW0sdSh0LHMsIkdlbmVyYXRvckZ1bmN0aW9uIikpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoayksdH0sdC5hd3JhcD1mdW5jdGlvbih0KXtyZXR1cm57X19hd2FpdDp0fX0sUyhFLnByb3RvdHlwZSksRS5wcm90b3R5cGVbYV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5Bc3luY0l0ZXJhdG9yPUUsdC5hc3luYz1mdW5jdGlvbihlLG4scixvLGkpe3ZvaWQgMD09PWkmJihpPVByb21pc2UpO3ZhciBhPW5ldyBFKGMoZSxuLHIsbyksaSk7cmV0dXJuIHQuaXNHZW5lcmF0b3JGdW5jdGlvbihuKT9hOmEubmV4dCgpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIHQuZG9uZT90LnZhbHVlOmEubmV4dCgpfSl9LFMoayksdShrLHMsIkdlbmVyYXRvciIpLGtbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30say50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSx0LmtleXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlLnJldmVyc2UoKSxmdW5jdGlvbiBuKCl7Zm9yKDtlLmxlbmd0aDspe3ZhciByPWUucG9wKCk7aWYociBpbiB0KXJldHVybiBuLnZhbHVlPXIsbi5kb25lPSExLG59cmV0dXJuIG4uZG9uZT0hMCxufX0sdC52YWx1ZXM9aixDLnByb3RvdHlwZT17Y29uc3RydWN0b3I6QyxyZXNldDpmdW5jdGlvbih0KXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD1lLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPWUsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goTyksIXQpZm9yKHZhciBuIGluIHRoaXMpInQiPT09bi5jaGFyQXQoMCkmJnIuY2FsbCh0aGlzLG4pJiYhaXNOYU4oK24uc2xpY2UoMSkpJiYodGhpc1tuXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgdD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKHQpe2lmKHRoaXMuZG9uZSl0aHJvdyB0O3ZhciBuPXRoaXM7ZnVuY3Rpb24gbyhyLG8pe3JldHVybiBzLnR5cGU9InRocm93IixzLmFyZz10LG4ubmV4dD1yLG8mJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksISFvfWZvcih2YXIgaT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7aT49MDstLWkpe3ZhciBhPXRoaXMudHJ5RW50cmllc1tpXSxzPWEuY29tcGxldGlvbjtpZigicm9vdCI9PT1hLnRyeUxvYylyZXR1cm4gbygiZW5kIik7aWYoYS50cnlMb2M8PXRoaXMucHJldil7dmFyIHU9ci5jYWxsKGEsImNhdGNoTG9jIiksYz1yLmNhbGwoYSwiZmluYWxseUxvYyIpO2lmKHUmJmMpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiBvKGEuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIG8oYS5maW5hbGx5TG9jKX1lbHNlIGlmKHUpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiBvKGEuY2F0Y2hMb2MsITApfWVsc2V7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIG8oYS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIG89dGhpcy50cnlFbnRyaWVzW25dO2lmKG8udHJ5TG9jPD10aGlzLnByZXYmJnIuY2FsbChvLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxvLmZpbmFsbHlMb2Mpe3ZhciBpPW87YnJlYWt9fWkmJigiYnJlYWsiPT09dHx8ImNvbnRpbnVlIj09PXQpJiZpLnRyeUxvYzw9ZSYmZTw9aS5maW5hbGx5TG9jJiYoaT1udWxsKTt2YXIgYT1pP2kuY29tcGxldGlvbjp7fTtyZXR1cm4gYS50eXBlPXQsYS5hcmc9ZSxpPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PWkuZmluYWxseUxvYyxnKTp0aGlzLmNvbXBsZXRlKGEpfSxjb21wbGV0ZTpmdW5jdGlvbih0LGUpe2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuImJyZWFrIj09PXQudHlwZXx8ImNvbnRpbnVlIj09PXQudHlwZT90aGlzLm5leHQ9dC5hcmc6InJldHVybiI9PT10LnR5cGU%2FKHRoaXMucnZhbD10aGlzLmFyZz10LmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09dC50eXBlJiZlJiYodGhpcy5uZXh0PWUpLGd9LGZpbmlzaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U%2BPTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi5maW5hbGx5TG9jPT09dClyZXR1cm4gdGhpcy5jb21wbGV0ZShuLmNvbXBsZXRpb24sbi5hZnRlckxvYyksTyhuKSxnfX0sY2F0Y2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4udHJ5TG9jPT09dCl7dmFyIHI9bi5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1yLnR5cGUpe3ZhciBvPXIuYXJnO08obil9cmV0dXJuIG99fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpqKHQpLHJlc3VsdE5hbWU6bixuZXh0TG9jOnJ9LCJuZXh0Ij09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9ZSksZ319LHR9KHQuZXhwb3J0cyk7dHJ5e3JlZ2VuZXJhdG9yUnVudGltZT1yfWNhdGNoKHQpe0Z1bmN0aW9uKCJyIiwicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9big5MSksbigxNTMpLG4oMTU0KSxuKDE1NSksbigxNTYpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2Niksbz1uKDQ2KSxpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpLGEscz1TdHJpbmcobyhlKSksdT1yKG4pLGM9cy5sZW5ndGg7cmV0dXJuIHU8MHx8dT49Yz90PyIiOnZvaWQgMDooaT1zLmNoYXJDb2RlQXQodSkpPDU1Mjk2fHxpPjU2MzE5fHx1KzE9PT1jfHwoYT1zLmNoYXJDb2RlQXQodSsxKSk8NTYzMjB8fGE%2BNTczNDM%2FdD9zLmNoYXJBdCh1KTppOnQ%2Fcy5zbGljZSh1LHUrMik6YS01NjMyMCsoaS01NTI5Njw8MTApKzY1NTM2fX07dC5leHBvcnRzPXtjb2RlQXQ6aSghMSksY2hhckF0OmkoITApfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDE0NCksaT1yLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBpJiYvbmF0aXZlIGNvZGUvLnRlc3Qoby5jYWxsKGkpKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTcpO3QuZXhwb3J0cz1yKCJuYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nIixGdW5jdGlvbi50b1N0cmluZyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2OSksbz17fTtvW24oMSkoInRvU3RyaW5nVGFnIildPSJ6Iix0LmV4cG9ydHM9IltvYmplY3Qgel0iIT09U3RyaW5nKG8pP2Z1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIityKHRoaXMpKyJdIn06by50b1N0cmluZ30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpJiZudWxsIT09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IHNldCAiK1N0cmluZyh0KSsiIGFzIGEgcHJvdG90eXBlIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGEscz1uKDApLHU9bigyMiksYz1uKDQpLGw9bigyKSxmPW4oOTkpLHA9bigzMyksaD1uKDEwMCksZD1uKDI0KSxnPW4oMTQ5KSx2PW4oNikseT1uKDE5KSxtPW4oMTAxKSxiPW4oMjEpLHg9big1OCksdz1uKDEwNCksaz1uKDEwNSksUz1uKDEwNikuc2V0LEU9bigxNTApLFQ9bigxMDcpLEE9bigxNTEpLE89big1MiksQz1uKDU5KSxqPW4oNzIpLEw9big0OCksUD1uKDg2KSxSPW4oMSkoInNwZWNpZXMiKSxOPSJQcm9taXNlIixJPUwuZ2V0LEQ9TC5zZXQsXz1MLmdldHRlckZvcihOKSxNPWYsVT1jLlR5cGVFcnJvcixCPWMuZG9jdW1lbnQscT1jLnByb2Nlc3MsRj1jLmZldGNoLEg9cSYmcS52ZXJzaW9ucyx6PUgmJkgudjh8fCIiLFc9Ty5mLCQ9VyxWPSJwcm9jZXNzIj09YihxKSxZPSEhKEImJkIuY3JlYXRlRXZlbnQmJmMuZGlzcGF0Y2hFdmVudCksRz1QKE4sZnVuY3Rpb24oKXt2YXIgdD1NLnJlc29sdmUoMSksZT1mdW5jdGlvbigpe30sbj0odC5jb25zdHJ1Y3Rvcj17fSlbUl09ZnVuY3Rpb24odCl7dChlLGUpfTtyZXR1cm4hKChWfHwiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSYmKCF1fHx0LmZpbmFsbHkpJiZ0LnRoZW4oZSlpbnN0YW5jZW9mIG4mJjAhPT16LmluZGV4T2YoIjYuNiIpJiYtMT09PWouaW5kZXhPZigiQ2hyb21lLzY2IikpfSksSz1HfHwhdyhmdW5jdGlvbih0KXtNLmFsbCh0KS5jYXRjaChmdW5jdGlvbigpe30pfSksWD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4hKCF2KHQpfHwiZnVuY3Rpb24iIT10eXBlb2YoZT10LnRoZW4pKSYmZX0sSj1mdW5jdGlvbih0LGUsbil7aWYoIWUubm90aWZpZWQpe2Uubm90aWZpZWQ9ITA7dmFyIHI9ZS5yZWFjdGlvbnM7RShmdW5jdGlvbigpe2Zvcih2YXIgbz1lLnZhbHVlLGk9MT09ZS5zdGF0ZSxhPTA7ci5sZW5ndGg%2BYTspe3ZhciBzLHUsYyxsPXJbYSsrXSxmPWk%2FbC5vazpsLmZhaWwscD1sLnJlc29sdmUsaD1sLnJlamVjdCxkPWwuZG9tYWluO3RyeXtmPyhpfHwoMj09PWUucmVqZWN0aW9uJiZldCh0LGUpLGUucmVqZWN0aW9uPTEpLCEwPT09Zj9zPW86KGQmJmQuZW50ZXIoKSxzPWYobyksZCYmKGQuZXhpdCgpLGM9ITApKSxzPT09bC5wcm9taXNlP2goVSgiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToodT1YKHMpKT91LmNhbGwocyxwLGgpOnAocykpOmgobyl9Y2F0Y2godCl7ZCYmIWMmJmQuZXhpdCgpLGgodCl9fWUucmVhY3Rpb25zPVtdLGUubm90aWZpZWQ9ITEsbiYmIWUucmVqZWN0aW9uJiZaKHQsZSl9KX19LFE9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87WT8oKHI9Qi5jcmVhdGVFdmVudCgiRXZlbnQiKSkucHJvbWlzZT1lLHIucmVhc29uPW4sci5pbml0RXZlbnQodCwhMSwhMCksYy5kaXNwYXRjaEV2ZW50KHIpKTpyPXtwcm9taXNlOmUscmVhc29uOm59LChvPWNbIm9uIit0XSk%2FbyhyKToidW5oYW5kbGVkcmVqZWN0aW9uIj09PXQmJkEoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIsbil9LFo9ZnVuY3Rpb24odCxlKXtTLmNhbGwoYyxmdW5jdGlvbigpe3ZhciBuLHI9ZS52YWx1ZTtpZih0dChlKSYmKG49QyhmdW5jdGlvbigpe1Y%2FcS5lbWl0KCJ1bmhhbmRsZWRSZWplY3Rpb24iLHIsdCk6USgidW5oYW5kbGVkcmVqZWN0aW9uIix0LHIpfSksZS5yZWplY3Rpb249Vnx8dHQoZSk%2FMjoxLG4uZXJyb3IpKXRocm93IG4udmFsdWV9KX0sdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEhPT10LnJlamVjdGlvbiYmIXQucGFyZW50fSxldD1mdW5jdGlvbih0LGUpe1MuY2FsbChjLGZ1bmN0aW9uKCl7Vj9xLmVtaXQoInJlamVjdGlvbkhhbmRsZWQiLHQpOlEoInJlamVjdGlvbmhhbmRsZWQiLHQsZS52YWx1ZSl9KX0sbnQ9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGZ1bmN0aW9uKG8pe3QoZSxuLG8scil9fSxydD1mdW5jdGlvbih0LGUsbixyKXtlLmRvbmV8fChlLmRvbmU9ITAsciYmKGU9ciksZS52YWx1ZT1uLGUuc3RhdGU9MixKKHQsZSwhMCkpfSxvdD1mdW5jdGlvbih0LGUsbixyKXtpZighZS5kb25lKXtlLmRvbmU9ITAsciYmKGU9cik7dHJ5e2lmKHQ9PT1uKXRocm93IFUoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7dmFyIG89WChuKTtvP0UoZnVuY3Rpb24oKXt2YXIgcj17ZG9uZTohMX07dHJ5e28uY2FsbChuLG50KG90LHQscixlKSxudChydCx0LHIsZSkpfWNhdGNoKG4pe3J0KHQscixuLGUpfX0pOihlLnZhbHVlPW4sZS5zdGF0ZT0xLEoodCxlLCExKSl9Y2F0Y2gobil7cnQodCx7ZG9uZTohMX0sbixlKX19fTtHJiYoTT1mdW5jdGlvbih0KXttKHRoaXMsTSxOKSx5KHQpLHIuY2FsbCh0aGlzKTt2YXIgZT1JKHRoaXMpO3RyeXt0KG50KG90LHRoaXMsZSksbnQocnQsdGhpcyxlKSl9Y2F0Y2godCl7cnQodGhpcyxlLHQpfX0sKHI9ZnVuY3Rpb24odCl7RCh0aGlzLHt0eXBlOk4sZG9uZTohMSxub3RpZmllZDohMSxwYXJlbnQ6ITEscmVhY3Rpb25zOltdLHJlamVjdGlvbjohMSxzdGF0ZTowLHZhbHVlOnZvaWQgMH0pfSkucHJvdG90eXBlPWgoTS5wcm90b3R5cGUse3RoZW46ZnVuY3Rpb24odCxlKXt2YXIgbj1fKHRoaXMpLHI9VyhrKHRoaXMsTSkpO3JldHVybiByLm9rPSJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0LHIuZmFpbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxyLmRvbWFpbj1WP3EuZG9tYWluOnZvaWQgMCxuLnBhcmVudD0hMCxuLnJlYWN0aW9ucy5wdXNoKHIpLDAhPW4uc3RhdGUmJkoodGhpcyxuLCExKSxyLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfX0pLG89ZnVuY3Rpb24oKXt2YXIgdD1uZXcgcixlPUkodCk7dGhpcy5wcm9taXNlPXQsdGhpcy5yZXNvbHZlPW50KG90LHQsZSksdGhpcy5yZWplY3Q9bnQocnQsdCxlKX0sTy5mPVc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1NfHx0PT09aT9uZXcgbyh0KTokKHQpfSx1fHwiZnVuY3Rpb24iIT10eXBlb2YgZnx8KGE9Zi5wcm90b3R5cGUudGhlbixwKGYucHJvdG90eXBlLCJ0aGVuIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBNKGZ1bmN0aW9uKHQsZSl7YS5jYWxsKG4sdCxlKX0pLnRoZW4odCxlKX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBGJiZzKHtnbG9iYWw6ITAsZW51bWVyYWJsZTohMCxmb3JjZWQ6ITB9LHtmZXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gVChNLEYuYXBwbHkoYyxhcmd1bWVudHMpKX19KSkpLHMoe2dsb2JhbDohMCx3cmFwOiEwLGZvcmNlZDpHfSx7UHJvbWlzZTpNfSksZChNLE4sITEsITApLGcoTiksaT1sLlByb21pc2Uscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6R30se3JlamVjdDpmdW5jdGlvbih0KXt2YXIgZT1XKHRoaXMpO3JldHVybiBlLnJlamVjdC5jYWxsKHZvaWQgMCx0KSxlLnByb21pc2V9fSkscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6dXx8R30se3Jlc29sdmU6ZnVuY3Rpb24odCl7cmV0dXJuIFQodSYmdGhpcz09PWk%2FTTp0aGlzLHQpfX0pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOkt9LHthbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPVcoZSkscj1uLnJlc29sdmUsbz1uLnJlamVjdCxpPUMoZnVuY3Rpb24oKXt2YXIgbj15KGUucmVzb2x2ZSksaT1bXSxhPTAscz0xO3godCxmdW5jdGlvbih0KXt2YXIgdT1hKyssYz0hMTtpLnB1c2godm9pZCAwKSxzKyssbi5jYWxsKGUsdCkudGhlbihmdW5jdGlvbih0KXtjfHwoYz0hMCxpW3VdPXQsLS1zfHxyKGkpKX0sbyl9KSwtLXN8fHIoaSl9KTtyZXR1cm4gaS5lcnJvciYmbyhpLnZhbHVlKSxuLnByb21pc2V9LHJhY2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPVcoZSkscj1uLnJlamVjdCxvPUMoZnVuY3Rpb24oKXt2YXIgbz15KGUucmVzb2x2ZSk7eCh0LGZ1bmN0aW9uKHQpe28uY2FsbChlLHQpLnRoZW4obi5yZXNvbHZlLHIpfSl9KTtyZXR1cm4gby5lcnJvciYmcihvLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDIwKSxpPW4oMSksYT1uKDE0KSxzPWkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9cih0KSxuPW8uZjthJiZlJiYhZVtzXSYmbihlLHMse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYyxsPW4oNCksZj1uKDQ1KS5mLHA9bigyMSksaD1uKDEwNikuc2V0LGQ9big3MiksZz1sLk11dGF0aW9uT2JzZXJ2ZXJ8fGwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcix2PWwucHJvY2Vzcyx5PWwuUHJvbWlzZSxtPSJwcm9jZXNzIj09cCh2KSxiPWYobCwicXVldWVNaWNyb3Rhc2siKSx4PWImJmIudmFsdWU7eHx8KHI9ZnVuY3Rpb24oKXt2YXIgdCxlO2ZvcihtJiYodD12LmRvbWFpbikmJnQuZXhpdCgpO287KXtlPW8uZm4sbz1vLm5leHQ7dHJ5e2UoKX1jYXRjaCh0KXt0aHJvdyBvP2EoKTppPXZvaWQgMCx0fX1pPXZvaWQgMCx0JiZ0LmVudGVyKCl9LG0%2FYT1mdW5jdGlvbigpe3YubmV4dFRpY2socil9OmcmJiEvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QoZCk%2FKHM9ITAsdT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksbmV3IGcocikub2JzZXJ2ZSh1LHtjaGFyYWN0ZXJEYXRhOiEwfSksYT1mdW5jdGlvbigpe3UuZGF0YT1zPSFzfSk6eSYmeS5yZXNvbHZlPyhjPXkucmVzb2x2ZSh2b2lkIDApLGE9ZnVuY3Rpb24oKXtjLnRoZW4ocil9KTphPWZ1bmN0aW9uKCl7aC5jYWxsKGwscil9KSx0LmV4cG9ydHM9eHx8ZnVuY3Rpb24odCl7dmFyIGU9e2ZuOnQsbmV4dDp2b2lkIDB9O2kmJihpLm5leHQ9ZSksb3x8KG89ZSxhKCkpLGk9ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIuY29uc29sZTtuJiZuLmVycm9yJiYoMT09PWFyZ3VtZW50cy5sZW5ndGg%2Fbi5lcnJvcih0KTpuLmVycm9yKHQsZSkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyMiksaT1uKDk5KSxhPW4oMzApLHM9bigxMDUpLHU9bigxMDcpLGM9bigzMyk7cih7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsYSgiUHJvbWlzZSIpKSxuPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4obj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBufSl9OnQsbj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IG59KX06dCl9fSksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fGkucHJvdG90eXBlLmZpbmFsbHl8fGMoaS5wcm90b3R5cGUsImZpbmFsbHkiLGEoIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0OSksaT1uKDcwKSxhPW4oNDcpLHM9bigyOCksdT1uKDU4KSxjPW4oMTUpLGw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCEobiBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0LGUpO2kmJihuPWkobmV3IEVycm9yKGUpLG8obikpKTt2YXIgcj1bXTtyZXR1cm4gdSh0LHIucHVzaCxyKSxjKG4sImVycm9ycyIsciksdm9pZCAwIT09ZSYmYyhuLCJtZXNzYWdlIixTdHJpbmcoZSkpLG59O2wucHJvdG90eXBlPWEoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpzKDUsbCksbmFtZTpzKDUsIkFnZ3JlZ2F0ZUVycm9yIil9KSxyKHtnbG9iYWw6ITB9LHtBZ2dyZWdhdGVFcnJvcjpsfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEwOCl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNTIpLGk9big1OSk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7dHJ5OmZ1bmN0aW9uKHQpe3ZhciBlPW8uZih0aGlzKSxuPWkodCk7cmV0dXJuKG4uZXJyb3I%2FZS5yZWplY3Q6ZS5yZXNvbHZlKShuLnZhbHVlKSxlLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMTkpLGk9bigzMCksYT1uKDUyKSxzPW4oNTkpLHU9big1OCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hLmYoZSkscj1uLnJlc29sdmUsYz1uLnJlamVjdCxsPXMoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksYT1bXSxzPTAsbD0xLGY9ITE7dSh0LGZ1bmN0aW9uKHQpe3ZhciBvPXMrKyx1PSExO2EucHVzaCh2b2lkIDApLGwrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3V8fGZ8fChmPSEwLHIodCkpfSxmdW5jdGlvbih0KXt1fHxmfHwodT0hMCxhW29dPXQsLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKSl9KX0pLC0tbHx8YyhuZXcoaSgiQWdncmVnYXRlRXJyb3IiKSkoYSwiTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiKSl9KTtyZXR1cm4gbC5lcnJvciYmYyhsLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTgpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTkpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTYwKTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3MSksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2Myksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY29uY2F0O3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09by5jb25jYXQ%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTEwKTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5jb25jYXR9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjUpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNjYpLG89U3RyaW5nLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC50cmltO3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8dD09PW98fHQgaW5zdGFuY2VvZiBTdHJpbmcmJmU9PT1vLnRyaW0%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTY3KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiU3RyaW5nIikudHJpbX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxMTEpLnRyaW07cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpuKDE2OCkoInRyaW0iKX0se3RyaW06ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDc2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIoZnVuY3Rpb24oKXtyZXR1cm4hIW9bdF0oKXx8IuKAi8KF4aCOIiE9IuKAi8KF4aCOIlt0XSgpfHxvW3RdLm5hbWUhPT10fSl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTcwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3MSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE3Mik7dmFyIHI9bigyKS5PYmplY3Qsbz10LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiByLmRlZmluZVByb3BlcnR5KHQsZSxuKX07ci5kZWZpbmVQcm9wZXJ0eS5zaGFtJiYoby5zaGFtPSEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDE0KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IW8sc2hhbTohb30se2RlZmluZVByb3BlcnR5Om4oMjApLmZ9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3NCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzUpfSxmdW5jdGlvbih0LGUsbil7bigxNzYpO3ZhciByPW4oMikuT2JqZWN0LG89dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSl9O3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNSksaT1uKDE4KSxhPW4oNDUpLmYscz1uKDE0KSx1PW8oZnVuY3Rpb24oKXthKDEpfSk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFzfHx1LHNoYW06IXN9LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYShpKHQpLGUpfX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE4MCk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5SZWZsZWN0LmdldH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDYpLGk9big5KSxhPW4oMTIpLHM9big0NSksdT1uKDQ5KTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtnZXQ6ZnVuY3Rpb24gdChlLG4pe3ZhciByLGMsbD1hcmd1bWVudHMubGVuZ3RoPDM%2FZTphcmd1bWVudHNbMl07cmV0dXJuIGkoZSk9PT1sP2Vbbl06KHI9cy5mKGUsbikpP2EociwidmFsdWUiKT9yLnZhbHVlOnZvaWQgMD09PXIuZ2V0P3ZvaWQgMDpyLmdldC5jYWxsKGwpOm8oYz11KGUpKT90KGMsbixsKTp2b2lkIDB9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmbnVsbCE9PSh0PXIodCkpOyk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTgzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4NCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE4NSk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5PYmplY3QuZ2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big1KSxpPW4oMjMpLGE9big0OSkscz1uKDk2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6byhmdW5jdGlvbigpe2EoMSl9KSxzaGFtOiFzfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxODcpfSxmdW5jdGlvbih0LGUsbil7bigxODgpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpuKDcwKX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTkwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE5MSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE5Mik7dmFyIHI9bigyKS5PYmplY3Q7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY3JlYXRlKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsc2hhbTohbigxNCl9LHtjcmVhdGU6big0Nyl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEyKTtmdW5jdGlvbiBvKGUsbil7cmV0dXJuIHQuZXhwb3J0cz1vPXJ8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0sbyhlLG4pfXQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTUpLG89bigxMTQpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPSJmdW5jdGlvbiI9PXR5cGVvZiBvJiYic3ltYm9sIj09dHlwZW9mIHI%2FZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuY29uc3RydWN0b3I9PT1vJiZ0IT09by5wcm90b3R5cGU%2FInN5bWJvbCI6dHlwZW9mIHR9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxOTYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTk3KX0sZnVuY3Rpb24odCxlLG4pe24oMTEzKSxuKDMyKSxuKDUwKTt2YXIgcj1uKDc3KTt0LmV4cG9ydHM9ci5mKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE1KSxuKDIxNyksbigyMTgpLG4oMjE5KSxuKDIyMCksbigyMjEpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDQpLGk9bigyMiksYT1uKDE0KSxzPW4oOTcpLHU9big1KSxjPW4oMTIpLGw9big1MyksZj1uKDYpLHA9big5KSxoPW4oMjMpLGQ9bigxOCksZz1uKDU0KSx2PW4oMjgpLHk9big0NyksbT1uKDY0KSxiPW4oMTE2KSx4PW4oMjAwKSx3PW4oMjAxKSxrPW4oNDUpLFM9bigyMCksRT1uKDgzKSxUPW4oMTUpLEE9bigzMyksTz1uKDU3KSxDPW4oNTYpLGo9big1NSksTD1uKDY4KSxQPW4oMSksUj1uKDc3KSxOPW4oMyksST1uKDI0KSxEPW4oNDgpLF89big3MykuZm9yRWFjaCxNPUMoImhpZGRlbiIpLFU9UCgidG9QcmltaXRpdmUiKSxCPUQuc2V0LHE9RC5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsVj1TLmYsWT14LmYsRz1FLmYsSz1PKCJzeW1ib2xzIiksWD1PKCJvcC1zeW1ib2xzIiksSj1PKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1PKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1PKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoVih7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBWKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sVih0LGUsbiksciYmdCE9PUYmJlYoRixlLHIpfTpWLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I%2FZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU%2FKGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8Vih0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpWKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIF8ocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1ZKGQodCkpLG49W107cmV0dXJuIF8oZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoaix0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1ZKGU%2FWDpkKHQpKSxyPVtdO3JldHVybiBfKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KEEoKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoVihILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8QShGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxSLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFAodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksXyhtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxUKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxqW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOCksbz1uKDExNikuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM%2FT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7bigzKSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oMykoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyNCkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTtuKDI0KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oMykoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMjUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2Y7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmluZGV4T2Y%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjI2KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5pbmRleE9mfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDY1KS5pbmRleE9mLGk9bigyMjcpLGE9W10uaW5kZXhPZixzPSEhYSYmMS9bMV0uaW5kZXhPZigxLC0wKTwwLHU9aSgiaW5kZXhPZiIpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpzfHx1fSx7aW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gcz9hLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MDpvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXVt0XTtyZXR1cm4hbnx8IXIoZnVuY3Rpb24oKXtuLmNhbGwobnVsbCxlfHxmdW5jdGlvbigpe3Rocm93IDF9LDEpfSl9fSxmdW5jdGlvbih0LGUsbil7bigxMTcpLHQuZXhwb3J0cz1uKDIpLnNldFRpbWVvdXR9LGZ1bmN0aW9uKHQsZSxuKXtuKDExNyksdC5leHBvcnRzPW4oMikuc2V0SW50ZXJ2YWx9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzEpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSxvPXIuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmluZ2lmeS5hcHBseShvLGFyZ3VtZW50cyl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMzKX0sZnVuY3Rpb24odCxlLG4pe24oMjM0KTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLnBhcnNlSW50fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMjM1KTtyKHtnbG9iYWw6ITAsZm9yY2VkOnBhcnNlSW50IT1vfSx7cGFyc2VJbnQ6b30pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTExKS50cmltLGk9big3NiksYT1yLnBhcnNlSW50LHM9L15bKy1dPzBbWHhdLyx1PTghPT1hKGkrIjA4Iil8fDIyIT09YShpKyIweDE2Iik7dC5leHBvcnRzPXU%2FZnVuY3Rpb24odCxlKXt2YXIgbj1vKFN0cmluZyh0KSk7cmV0dXJuIGEobixlPj4%2BMHx8KHMudGVzdChuKT8xNjoxMCkpfTphfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oMTE4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExOSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6IkFycmF5IixzdGF0OiEwfSx7aXNBcnJheTpuKDUzKX0pfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oNTEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEyMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyNDMpO3Ioe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITAsZm9yY2VkOiFuKDEwNCkoZnVuY3Rpb24odCl7QXJyYXkuZnJvbSh0KX0pfSx7ZnJvbTpvfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyOSksbz1uKDIzKSxpPW4oMTAzKSxhPW4oMTAyKSxzPW4oMzEpLHU9big3NCksYz1uKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsbixsLGYscD1vKHQpLGg9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXM%2FdGhpczpBcnJheSxkPWFyZ3VtZW50cy5sZW5ndGgsZz1kPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCx2PXZvaWQgMCE9PWcseT0wLG09YyhwKTtpZih2JiYoZz1yKGcsZD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsMikpLG51bGw9PW18fGg9PUFycmF5JiZhKG0pKWZvcihuPW5ldyBoKGU9cyhwLmxlbmd0aCkpO2U%2BeTt5KyspdShuLHksdj9nKHBbeV0seSk6cFt5XSk7ZWxzZSBmb3IoZj1tLmNhbGwocCksbj1uZXcgaDshKGw9Zi5uZXh0KCkpLmRvbmU7eSsrKXUobix5LHY%2FaShmLGcsW2wudmFsdWUseV0sITApOmwudmFsdWUpO3JldHVybiBuLmxlbmd0aD15LG59fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTIxKX0sZnVuY3Rpb24odCxlLG4pe24oMjQ2KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5zbGljZX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big2KSxpPW4oNTMpLGE9big4OCkscz1uKDMxKSx1PW4oMTgpLGM9big3NCksbD1uKDc1KSxmPW4oMSkoInNwZWNpZXMiKSxwPVtdLnNsaWNlLGg9TWF0aC5tYXg7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFsKCJzbGljZSIpfSx7c2xpY2U6ZnVuY3Rpb24odCxlKXt2YXIgbixyLGwsZD11KHRoaXMpLGc9cyhkLmxlbmd0aCksdj1hKHQsZykseT1hKHZvaWQgMD09PWU%2FZzplLGcpO2lmKGkoZCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj1kLmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhaShuLnByb3RvdHlwZSk%2FbyhuKSYmbnVsbD09PShuPW5bZl0pJiYobj12b2lkIDApOm49dm9pZCAwLG49PT1BcnJheXx8dm9pZCAwPT09bikpcmV0dXJuIHAuY2FsbChkLHYseSk7Zm9yKHI9bmV3KHZvaWQgMD09PW4%2FQXJyYXk6bikoaCh5LXYsMCkpLGw9MDt2PHk7disrLGwrKyl2IGluIGQmJmMocixsLGRbdl0pO3JldHVybiByLmxlbmd0aD1sLHJ9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDgpfSxmdW5jdGlvbih0LGUsbil7bigyNDkpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuT2JqZWN0LmtleXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMyksaT1uKDY0KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6big1KShmdW5jdGlvbigpe2koMSl9KX0se2tleXM6ZnVuY3Rpb24odCl7cmV0dXJuIGkobyh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTEpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTIpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8ubWFwP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI1Myk7dmFyIHI9bigxNik7dC5leHBvcnRzPXIoIkFycmF5IikubWFwfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5tYXA7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDc1KSgibWFwIil9LHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjU1KSxvPW4oMTIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYocih0KSlyZXR1cm4gbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTIzKSxvPW4oMjU5KSxpPW4oMTE0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09aSYmbyhPYmplY3QodCkpKXJldHVybiByKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEyMCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjApfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oMjYxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjkpLG89bigxKSxpPW4oMjUpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0KHQpO3JldHVybiB2b2lkIDAhPT1lW2FdfHwiQEBpdGVyYXRvciJpbiBlfHxpLmhhc093blByb3BlcnR5KHIoZSkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTIzKSxvPW4oMjYzKSxpPW4oMTIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGkodCxlKTt2YXIgYT1vKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7cmV0dXJuIk9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpLCJNYXAiPT09YXx8IlNldCI9PT1hP3IodCk6IkFyZ3VtZW50cyI9PT1hfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChhKT9pKHQsZSk6dm9pZCAwfX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTIxKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNjgpLG89bigyNzApLGk9QXJyYXkucHJvdG90eXBlLGE9U3RyaW5nLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5pbmNsdWRlcztyZXR1cm4gdD09PWl8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PWkuaW5jbHVkZXM%2Fcjoic3RyaW5nIj09dHlwZW9mIHR8fHQ9PT1hfHx0IGluc3RhbmNlb2YgU3RyaW5nJiZlPT09YS5pbmNsdWRlcz9vOmV9fSxmdW5jdGlvbih0LGUsbil7bigyNjkpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluY2x1ZGVzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDY1KS5pbmNsdWRlcyxpPW4oNzEpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxpKCJpbmNsdWRlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyNzEpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS5pbmNsdWRlc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyNzIpLGk9big0Nik7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohbigyNzQpKCJpbmNsdWRlcyIpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuISF%2BU3RyaW5nKGkodGhpcykpLmluZGV4T2Yobyh0KSxhcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89bigyMSksaT1uKDEpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gcih0KSYmKHZvaWQgMCE9PShlPXRbaV0pPyEhZToiUmVnRXhwIj09byh0KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9Ly4vO3RyeXsiLy4vIlt0XShlKX1jYXRjaChuKXt0cnl7cmV0dXJuIGVbcl09ITEsIi8uLyJbdF0oZSl9Y2F0Y2godCl7fX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpewovKiEKICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuCiAqCiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPgogKiBAbGljZW5zZSAgTUlUCiAqLwp2YXIgcj1uKDI3Niksbz1uKDI3NyksaT1uKDI3OCk7ZnVuY3Rpb24gYSgpe3JldHVybiB1LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FMjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHModCxlKXtpZihhKCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpKS5fX3Byb3RvX189dS5wcm90b3R5cGU6KG51bGw9PT10JiYodD1uZXcgdShlKSksdC5sZW5ndGg9ZSksdH1mdW5jdGlvbiB1KHQsZSxuKXtpZighKHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIHUpKXJldHVybiBuZXcgdSh0LGUsbik7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBmKHRoaXMsdCl9cmV0dXJuIGModGhpcyx0LGUsbil9ZnVuY3Rpb24gYyh0LGUsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbih0LGUsbixyKXtpZihlLmJ5dGVMZW5ndGgsbjwwfHxlLmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO2U9dm9pZCAwPT09biYmdm9pZCAwPT09cj9uZXcgVWludDhBcnJheShlKTp2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KGUsbik6bmV3IFVpbnQ4QXJyYXkoZSxuLHIpO3UuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1lKS5fX3Byb3RvX189dS5wcm90b3R5cGU6dD1wKHQsZSk7cmV0dXJuIHR9KHQsZSxuLHIpOiJzdHJpbmciPT10eXBlb2YgZT9mdW5jdGlvbih0LGUsbil7InN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4Iik7aWYoIXUuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGQoZSxuKSxvPSh0PXModCxyKSkud3JpdGUoZSxuKTtvIT09ciYmKHQ9dC5zbGljZSgwLG8pKTtyZXR1cm4gdH0odCxlLG4pOmZ1bmN0aW9uKHQsZSl7aWYodS5pc0J1ZmZlcihlKSl7dmFyIG49MHxoKGUubGVuZ3RoKTtyZXR1cm4gMD09PSh0PXModCxuKSkubGVuZ3RoP3Q6KGUuY29weSh0LDAsMCxuKSx0KX1pZihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIGUpcmV0dXJuIm51bWJlciIhPXR5cGVvZiBlLmxlbmd0aHx8KHI9ZS5sZW5ndGgpIT1yP3ModCwwKTpwKHQsZSk7aWYoIkJ1ZmZlciI9PT1lLnR5cGUmJmkoZS5kYXRhKSlyZXR1cm4gcCh0LGUuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfSh0LGUpfWZ1bmN0aW9uIGwodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBmKHQsZSl7aWYobChlKSx0PXModCxlPDA%2FMDowfGgoZSkpLCF1LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjxlOysrbil0W25dPTA7cmV0dXJuIHR9ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPWUubGVuZ3RoPDA%2FMDowfGgoZS5sZW5ndGgpO3Q9cyh0LG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKXRbcl09MjU1JmVbcl07cmV0dXJuIHR9ZnVuY3Rpb24gaCh0KXtpZih0Pj1hKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2EoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gZCh0LGUpe2lmKHUuaXNCdWZmZXIodCkpcmV0dXJuIHQubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciBuPXQubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEYodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipuO2Nhc2UiaGV4IjpyZXR1cm4gbj4%2BPjE7Y2FzZSJiYXNlNjQiOnJldHVybiBIKHQpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEYodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZyh0LGUsbil7dmFyIHI9ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU%2BdGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PW58fG4%2BdGhpcy5sZW5ndGgpJiYobj10aGlzLmxlbmd0aCksbjw9MClyZXR1cm4iIjtpZigobj4%2BPj0wKTw9KGU%2BPj49MCkpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBMKHRoaXMsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBBKHRoaXMsZSxuKTtjYXNlImFzY2lpIjpyZXR1cm4gQyh0aGlzLGUsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gaih0aGlzLGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsZSxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFAodGhpcyxlLG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gdih0LGUsbil7dmFyIHI9dFtlXTt0W2VdPXRbbl0sdFtuXT1yfWZ1bmN0aW9uIHkodCxlLG4scixvKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc%2Fbj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1vPzA6dC5sZW5ndGgtMSksbjwwJiYobj10Lmxlbmd0aCtuKSxuPj10Lmxlbmd0aCl7aWYobylyZXR1cm4tMTtuPXQubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFvKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIGUmJihlPXUuZnJvbShlLHIpKSx1LmlzQnVmZmVyKGUpKXJldHVybiAwPT09ZS5sZW5ndGg%2FLTE6bSh0LGUsbixyLG8pO2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZSY9MjU1LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y%2Fbz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLG4pOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLG4pOm0odCxbZV0sbixyLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIG0odCxlLG4scixvKXt2YXIgaSxhPTEscz10Lmxlbmd0aCx1PWUubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKHQubGVuZ3RoPDJ8fGUubGVuZ3RoPDIpcmV0dXJuLTE7YT0yLHMvPTIsdS89MixuLz0yfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gMT09PWE%2FdFtlXTp0LnJlYWRVSW50MTZCRShlKmEpfWlmKG8pe3ZhciBsPS0xO2ZvcihpPW47aTxzO2krKylpZihjKHQsaSk9PT1jKGUsLTE9PT1sPzA6aS1sKSl7aWYoLTE9PT1sJiYobD1pKSxpLWwrMT09PXUpcmV0dXJuIGwqYX1lbHNlLTEhPT1sJiYoaS09aS1sKSxsPS0xfWVsc2UgZm9yKG4rdT5zJiYobj1zLXUpLGk9bjtpPj0wO2ktLSl7Zm9yKHZhciBmPSEwLHA9MDtwPHU7cCsrKWlmKGModCxpK3ApIT09YyhlLHApKXtmPSExO2JyZWFrfWlmKGYpcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gYih0LGUsbixyKXtuPU51bWJlcihuKXx8MDt2YXIgbz10Lmxlbmd0aC1uO3I%2FKHI9TnVtYmVyKHIpKT5vJiYocj1vKTpyPW87dmFyIGk9ZS5sZW5ndGg7aWYoaSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I%2BaS8yJiYocj1pLzIpO2Zvcih2YXIgYT0wO2E8cjsrK2Epe3ZhciBzPXBhcnNlSW50KGUuc3Vic3RyKDIqYSwyKSwxNik7aWYoaXNOYU4ocykpcmV0dXJuIGE7dFtuK2FdPXN9cmV0dXJuIGF9ZnVuY3Rpb24geCh0LGUsbixyKXtyZXR1cm4geihGKGUsdC5sZW5ndGgtbiksdCxuLHIpfWZ1bmN0aW9uIHcodCxlLG4scil7cmV0dXJuIHooZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbillLnB1c2goMjU1JnQuY2hhckNvZGVBdChuKSk7cmV0dXJuIGV9KGUpLHQsbixyKX1mdW5jdGlvbiBrKHQsZSxuLHIpe3JldHVybiB3KHQsZSxuLHIpfWZ1bmN0aW9uIFModCxlLG4scil7cmV0dXJuIHooSChlKSx0LG4scil9ZnVuY3Rpb24gRSh0LGUsbixyKXtyZXR1cm4geihmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLG8saT1bXSxhPTA7YTx0Lmxlbmd0aCYmISgoZS09Mik8MCk7KythKW49dC5jaGFyQ29kZUF0KGEpLHI9bj4%2BOCxvPW4lMjU2LGkucHVzaChvKSxpLnB1c2gocik7cmV0dXJuIGl9KGUsdC5sZW5ndGgtbiksdCxuLHIpfWZ1bmN0aW9uIFQodCxlLG4pe3JldHVybiAwPT09ZSYmbj09PXQubGVuZ3RoP3IuZnJvbUJ5dGVBcnJheSh0KTpyLmZyb21CeXRlQXJyYXkodC5zbGljZShlLG4pKX1mdW5jdGlvbiBBKHQsZSxuKXtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxvPWU7bzxuOyl7dmFyIGksYSxzLHUsYz10W29dLGw9bnVsbCxmPWM%2BMjM5PzQ6Yz4yMjM%2FMzpjPjE5MT8yOjE7aWYobytmPD1uKXN3aXRjaChmKXtjYXNlIDE6YzwxMjgmJihsPWMpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGk9dFtvKzFdKSkmJih1PSgzMSZjKTw8Nnw2MyZpKT4xMjcmJihsPXUpO2JyZWFrO2Nhc2UgMzppPXRbbysxXSxhPXRbbysyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmMpPDwxMnwoNjMmaSk8PDZ8NjMmYSk%2BMjA0NyYmKHU8NTUyOTZ8fHU%2BNTczNDMpJiYobD11KTticmVhaztjYXNlIDQ6aT10W28rMV0sYT10W28rMl0scz10W28rM10sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImYSkmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmMpPDwxOHwoNjMmaSk8PDEyfCg2MyZhKTw8Nnw2MyZzKT42NTUzNSYmdTwxMTE0MTEyJiYobD11KX1udWxsPT09bD8obD02NTUzMyxmPTEpOmw%2BNjU1MzUmJihsLT02NTUzNixyLnB1c2gobD4%2BPjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxyLnB1c2gobCksbys9Zn1yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9TylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIG49IiIscj0wO2Zvcig7cjxlOyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKHIscis9TykpO3JldHVybiBufShyKX1lLkJ1ZmZlcj11LGUuU2xvd0J1ZmZlcj1mdW5jdGlvbih0KXsrdCE9dCYmKHQ9MCk7cmV0dXJuIHUuYWxsb2MoK3QpfSxlLklOU1BFQ1RfTUFYX0JZVEVTPTUwLHUuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDAhPT10LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FdC5UWVBFRF9BUlJBWV9TVVBQT1JUOmZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0Ll9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09dC5mb28oKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc3ViYXJyYXkmJjA9PT10LnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaCh0KXtyZXR1cm4hMX19KCksZS5rTWF4TGVuZ3RoPWEoKSx1LnBvb2xTaXplPTgxOTIsdS5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189dS5wcm90b3R5cGUsdH0sdS5mcm9tPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYyhudWxsLHQsZSxuKX0sdS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYodS5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLHUuX19wcm90b19fPVVpbnQ4QXJyYXksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5zcGVjaWVzJiZ1W1N5bWJvbC5zcGVjaWVzXT09PXUmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH0pKSx1LmFsbG9jPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGwoZSksZTw9MD9zKHQsZSk6dm9pZCAwIT09bj8ic3RyaW5nIj09dHlwZW9mIHI%2Fcyh0LGUpLmZpbGwobixyKTpzKHQsZSkuZmlsbChuKTpzKHQsZSl9KG51bGwsdCxlLG4pfSx1LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBmKG51bGwsdCl9LHUuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBmKG51bGwsdCl9LHUuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfSx1LmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighdS5pc0J1ZmZlcih0KXx8IXUuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgbj10Lmxlbmd0aCxyPWUubGVuZ3RoLG89MCxpPU1hdGgubWluKG4scik7bzxpOysrbylpZih0W29dIT09ZVtvXSl7bj10W29dLHI9ZVtvXTticmVha31yZXR1cm4gbjxyPy0xOnI8bj8xOjB9LHUuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sdS5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighaSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB1LmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxuPTA7bjx0Lmxlbmd0aDsrK24pZSs9dFtuXS5sZW5ndGg7dmFyIHI9dS5hbGxvY1Vuc2FmZShlKSxvPTA7Zm9yKG49MDtuPHQubGVuZ3RoOysrbil7dmFyIGE9dFtuXTtpZighdS5pc0J1ZmZlcihhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7YS5jb3B5KHIsbyksbys9YS5sZW5ndGh9cmV0dXJuIHJ9LHUuYnl0ZUxlbmd0aD1kLHUucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCx1LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpdih0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KXYodGhpcyxlLGUrMyksdih0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpdih0aGlzLGUsZSs3KSx2KHRoaXMsZSsxLGUrNiksdih0aGlzLGUrMixlKzUpLHYodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9BKHRoaXMsMCx0KTpnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT11LmNvbXBhcmUodGhpcyx0KX0sdS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiLG49ZS5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg%2BMCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLG4pLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD5uJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LHUucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLG4scixvKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1vJiYobz10aGlzLmxlbmd0aCksZTwwfHxuPnQubGVuZ3RofHxyPDB8fG8%2BdGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI%2BPW8mJmU%2BPW4pcmV0dXJuIDA7aWYocj49bylyZXR1cm4tMTtpZihlPj1uKXJldHVybiAxO2lmKHRoaXM9PT10KXJldHVybiAwO2Zvcih2YXIgaT0obz4%2BPj0wKS0ocj4%2BPj0wKSxhPShuPj4%2BPTApLShlPj4%2BPTApLHM9TWF0aC5taW4oaSxhKSxjPXRoaXMuc2xpY2UocixvKSxsPXQuc2xpY2UoZSxuKSxmPTA7ZjxzOysrZilpZihjW2ZdIT09bFtmXSl7aT1jW2ZdLGE9bFtmXTticmVha31yZXR1cm4gaTxhPy0xOmE8aT8xOjB9LHUucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUsbil9LHUucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5KHRoaXMsdCxlLG4sITApfSx1LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkodGhpcyx0LGUsbiwhMSl9LHUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHZvaWQgMD09PWUpcj0idXRmOCIsbj10aGlzLmxlbmd0aCxlPTA7ZWxzZSBpZih2b2lkIDA9PT1uJiYic3RyaW5nIj09dHlwZW9mIGUpcj1lLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTtlfD0wLGlzRmluaXRlKG4pPyhufD0wLHZvaWQgMD09PXImJihyPSJ1dGY4IikpOihyPW4sbj12b2lkIDApfXZhciBvPXRoaXMubGVuZ3RoLWU7aWYoKHZvaWQgMD09PW58fG4%2BbykmJihuPW8pLHQubGVuZ3RoPjAmJihuPDB8fGU8MCl8fGU%2BdGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cnx8KHI9InV0ZjgiKTtmb3IodmFyIGk9ITE7Oylzd2l0Y2gocil7Y2FzZSJoZXgiOnJldHVybiBiKHRoaXMsdCxlLG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIHgodGhpcyx0LGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIHcodGhpcyx0LGUsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gayh0aGlzLHQsZSxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFModGhpcyx0LGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBFKHRoaXMsdCxlLG4pO2RlZmF1bHQ6aWYoaSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksaT0hMH19LHUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIE89NDA5NjtmdW5jdGlvbiBDKHQsZSxuKXt2YXIgcj0iIjtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgbz1lO288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmdFtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gaih0LGUsbil7dmFyIHI9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIG89ZTtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUodFtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTCh0LGUsbil7dmFyIHI9dC5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIW58fG48MHx8bj5yKSYmKG49cik7Zm9yKHZhciBvPSIiLGk9ZTtpPG47KytpKW8rPXEodFtpXSk7cmV0dXJuIG99ZnVuY3Rpb24gUCh0LGUsbil7Zm9yKHZhciByPXQuc2xpY2UoZSxuKSxvPSIiLGk9MDtpPHIubGVuZ3RoO2krPTIpbys9U3RyaW5nLmZyb21DaGFyQ29kZShyW2ldKzI1NipyW2krMV0pO3JldHVybiBvfWZ1bmN0aW9uIFIodCxlLG4pe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U%2Bbil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE4odCxlLG4scixvLGkpe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPm98fGU8aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYobityPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBJKHQsZSxuLHIpe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKHQubGVuZ3RoLW4sMik7bzxpOysrbyl0W24rb109KGUmMjU1PDw4KihyP286MS1vKSk%2BPj44KihyP286MS1vKX1mdW5jdGlvbiBEKHQsZSxuLHIpe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4odC5sZW5ndGgtbiw0KTtvPGk7KytvKXRbbitvXT1lPj4%2BOCoocj9vOjMtbykmMjU1fWZ1bmN0aW9uIF8odCxlLG4scixvLGkpe2lmKG4rcj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBNKHQsZSxuLHIsaSl7cmV0dXJuIGl8fF8odCwwLG4sNCksby53cml0ZSh0LGUsbixyLDIzLDQpLG4rNH1mdW5jdGlvbiBVKHQsZSxuLHIsaSl7cmV0dXJuIGl8fF8odCwwLG4sOCksby53cml0ZSh0LGUsbixyLDUyLDgpLG4rOH11LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcy5sZW5ndGg7aWYoKHQ9fn50KTwwPyh0Kz1yKTwwJiYodD0wKTp0PnImJih0PXIpLChlPXZvaWQgMD09PWU%2Fcjp%2BfmUpPDA%2FKGUrPXIpPDAmJihlPTApOmU%2BciYmKGU9ciksZTx0JiYoZT10KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQpKG49dGhpcy5zdWJhcnJheSh0LGUpKS5fX3Byb3RvX189dS5wcm90b3R5cGU7ZWxzZXt2YXIgbz1lLXQ7bj1uZXcgdShvLHZvaWQgMCk7Zm9yKHZhciBpPTA7aTxvOysraSluW2ldPXRoaXNbaSt0XX1yZXR1cm4gbn0sdS5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFIodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0XSxvPTEsaT0wOysraTxlJiYobyo9MjU2KTspcis9dGhpc1t0K2ldKm87cmV0dXJuIHJ9LHUucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxSKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdCstLWVdLG89MTtlPjAmJihvKj0yNTYpOylyKz10aGlzW3QrLS1lXSpvO3JldHVybiByfSx1LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LHUucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LHUucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LHUucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sdS5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSx1LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxSKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdF0sbz0xLGk9MDsrK2k8ZSYmKG8qPTI1Nik7KXIrPXRoaXNbdCtpXSpvO3JldHVybiByPj0obyo9MTI4KSYmKHItPU1hdGgucG93KDIsOCplKSkscn0sdS5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8Uih0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj1lLG89MSxpPXRoaXNbdCstLXJdO3I%2BMCYmKG8qPTI1Nik7KWkrPXRoaXNbdCstLXJdKm87cmV0dXJuIGk%2BPShvKj0xMjgpJiYoaS09TWF0aC5wb3coMiw4KmUpKSxpfSx1LnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0%2FLTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LHUucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Uih0LDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSx1LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fFIodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sdS5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sdS5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITAsMjMsNCl9LHUucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCExLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITAsNTIsOCl9LHUucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMSw1Miw4KX0sdS5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLG4scil7KHQ9K3QsZXw9MCxufD0wLHIpfHxOKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89MSxpPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytpPG4mJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUsbixyKXsodD0rdCxlfD0wLG58PTAscil8fE4odGhpcyx0LGUsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz1uLTEsaT0xO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYoaSo9MjU2KTspdGhpc1tlK29dPXQvaSYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDEsMjU1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4%2BPjgpOkkodGhpcyx0LGUsITApLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsNjU1MzUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ%2BPj44LHRoaXNbZSsxXT0yNTUmdCk6SSh0aGlzLHQsZSwhMSksZSsyfSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ%2BPj4yNCx0aGlzW2UrMl09dD4%2BPjE2LHRoaXNbZSsxXT10Pj4%2BOCx0aGlzW2VdPTI1NSZ0KTpEKHRoaXMsdCxlLCEwKSxlKzR9LHUucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ%2BPj4yNCx0aGlzW2UrMV09dD4%2BPjE2LHRoaXNbZSsyXT10Pj4%2BOCx0aGlzW2UrM109MjU1JnQpOkQodGhpcyx0LGUsITEpLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUsbixyKXtpZih0PSt0LGV8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO04odGhpcyx0LGUsbixvLTEsLW8pfXZhciBpPTAsYT0xLHM9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2k8biYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UraS0xXSYmKHM9MSksdGhpc1tlK2ldPSh0L2E%2BPjApLXMmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLG4scil7aWYodD0rdCxlfD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtOKHRoaXMsdCxlLG4sby0xLC1vKX12YXIgaT1uLTEsYT0xLHM9MDtmb3IodGhpc1tlK2ldPTI1NSZ0Oy0taT49MCYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UraSsxXSYmKHM9MSksdGhpc1tlK2ldPSh0L2E%2BPjApLXMmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDEsMTI3LC0xMjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sdS5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4%2BPjgpOkkodGhpcyx0LGUsITApLGUrMn0sdS5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4%2BOCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FKHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ%2BPj44LHRoaXNbZSsyXT10Pj4%2BMTYsdGhpc1tlKzNdPXQ%2BPj4yNCk6RCh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4%2BMjQsdGhpc1tlKzFdPXQ%2BPj4xNix0aGlzW2UrMl09dD4%2BPjgsdGhpc1tlKzNdPTI1NSZ0KTpEKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE0odGhpcyx0LGUsITAsbil9LHUucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE0odGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVSh0aGlzLHQsZSwhMSxuKX0sdS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUsbixyKXtpZihufHwobj0wKSxyfHwwPT09cnx8KHI9dGhpcy5sZW5ndGgpLGU%2BPXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCkscj4wJiZyPG4mJihyPW4pLHI9PT1uKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7cj50aGlzLmxlbmd0aCYmKHI9dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8ci1uJiYocj10Lmxlbmd0aC1lK24pO3ZhciBvLGk9ci1uO2lmKHRoaXM9PT10JiZuPGUmJmU8cilmb3Iobz1pLTE7bz49MDstLW8pdFtvK2VdPXRoaXNbbytuXTtlbHNlIGlmKGk8MWUzfHwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihvPTA7bzxpOysrbyl0W28rZV09dGhpc1tvK25dO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KG4sbitpKSxlKTtyZXR1cm4gaX0sdS5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8ocj1lLGU9MCxuPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIG4mJihyPW4sbj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgbz10LmNoYXJDb2RlQXQoMCk7bzwyNTYmJih0PW8pfWlmKHZvaWQgMCE9PXImJiJzdHJpbmciIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiByJiYhdS5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPD1lKXJldHVybiB0aGlzO3ZhciBpO2lmKGU%2BPj49MCxuPXZvaWQgMD09PW4%2FdGhpcy5sZW5ndGg6bj4%2BPjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihpPWU7aTxuOysraSl0aGlzW2ldPXQ7ZWxzZXt2YXIgYT11LmlzQnVmZmVyKHQpP3Q6RihuZXcgdSh0LHIpLnRvU3RyaW5nKCkpLHM9YS5sZW5ndGg7Zm9yKGk9MDtpPG4tZTsrK2kpdGhpc1tpK2VdPWFbaSVzXX1yZXR1cm4gdGhpc307dmFyIEI9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gRih0LGUpe3ZhciBuO2U9ZXx8MS8wO2Zvcih2YXIgcj10Lmxlbmd0aCxvPW51bGwsaT1bXSxhPTA7YTxyOysrYSl7aWYoKG49dC5jaGFyQ29kZUF0KGEpKT41NTI5NSYmbjw1NzM0NCl7aWYoIW8pe2lmKG4%2BNTYzMTkpeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihhKzE9PT1yKXsoZS09Myk%2BLTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bz1uO2NvbnRpbnVlfWlmKG48NTYzMjApeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxvPW47Y29udGludWV9bj02NTUzNisoby01NTI5Njw8MTB8bi01NjMyMCl9ZWxzZSBvJiYoZS09Myk%2BLTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYobz1udWxsLG48MTI4KXtpZigoZS09MSk8MClicmVhaztpLnB1c2gobil9ZWxzZSBpZihuPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO2kucHVzaChuPj42fDE5Miw2MyZufDEyOCl9ZWxzZSBpZihuPDY1NTM2KXtpZigoZS09Myk8MClicmVhaztpLnB1c2gobj4%2BMTJ8MjI0LG4%2BPjYmNjN8MTI4LDYzJm58MTI4KX1lbHNle2lmKCEobjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO2kucHVzaChuPj4xOHwyNDAsbj4%2BMTImNjN8MTI4LG4%2BPjYmNjN8MTI4LDYzJm58MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gSCh0KXtyZXR1cm4gci50b0J5dGVBcnJheShmdW5jdGlvbih0KXtpZigodD1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSh0KS5yZXBsYWNlKEIsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIHoodCxlLG4scil7Zm9yKHZhciBvPTA7bzxyJiYhKG8rbj49ZS5sZW5ndGh8fG8%2BPXQubGVuZ3RoKTsrK28pZVtvK25dPXRbb107cmV0dXJuIG99fSkuY2FsbCh0aGlzLG4oODIpKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmJ5dGVMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9Yyh0KSxuPWVbMF0scj1lWzFdO3JldHVybiAzKihuK3IpLzQtcn0sZS50b0J5dGVBcnJheT1mdW5jdGlvbih0KXt2YXIgZSxuLHI9Yyh0KSxhPXJbMF0scz1yWzFdLHU9bmV3IGkoZnVuY3Rpb24odCxlLG4pe3JldHVybiAzKihlK24pLzQtbn0oMCxhLHMpKSxsPTAsZj1zPjA%2FYS00OmE7Zm9yKG49MDtuPGY7bis9NCllPW9bdC5jaGFyQ29kZUF0KG4pXTw8MTh8b1t0LmNoYXJDb2RlQXQobisxKV08PDEyfG9bdC5jaGFyQ29kZUF0KG4rMildPDw2fG9bdC5jaGFyQ29kZUF0KG4rMyldLHVbbCsrXT1lPj4xNiYyNTUsdVtsKytdPWU%2BPjgmMjU1LHVbbCsrXT0yNTUmZTsyPT09cyYmKGU9b1t0LmNoYXJDb2RlQXQobildPDwyfG9bdC5jaGFyQ29kZUF0KG4rMSldPj40LHVbbCsrXT0yNTUmZSk7MT09PXMmJihlPW9bdC5jaGFyQ29kZUF0KG4pXTw8MTB8b1t0LmNoYXJDb2RlQXQobisxKV08PDR8b1t0LmNoYXJDb2RlQXQobisyKV0%2BPjIsdVtsKytdPWU%2BPjgmMjU1LHVbbCsrXT0yNTUmZSk7cmV0dXJuIHV9LGUuZnJvbUJ5dGVBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj10Lmxlbmd0aCxvPW4lMyxpPVtdLGE9MCxzPW4tbzthPHM7YSs9MTYzODMpaS5wdXNoKGwodCxhLGErMTYzODM%2Bcz9zOmErMTYzODMpKTsxPT09bz8oZT10W24tMV0saS5wdXNoKHJbZT4%2BMl0rcltlPDw0JjYzXSsiPT0iKSk6Mj09PW8mJihlPSh0W24tMl08PDgpK3Rbbi0xXSxpLnB1c2gocltlPj4xMF0rcltlPj40JjYzXStyW2U8PDImNjNdKyI9IikpO3JldHVybiBpLmpvaW4oIiIpfTtmb3IodmFyIHI9W10sbz1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGE9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHM9MCx1PWEubGVuZ3RoO3M8dTsrK3MpcltzXT1hW3NdLG9bYS5jaGFyQ29kZUF0KHMpXT1zO2Z1bmN0aW9uIGModCl7dmFyIGU9dC5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49dC5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj1lKSxbbixuPT09ZT8wOjQtbiU0XX1mdW5jdGlvbiBsKHQsZSxuKXtmb3IodmFyIG8saSxhPVtdLHM9ZTtzPG47cys9MylvPSh0W3NdPDwxNiYxNjcxMTY4MCkrKHRbcysxXTw8OCY2NTI4MCkrKDI1NSZ0W3MrMl0pLGEucHVzaChyWyhpPW8pPj4xOCY2M10rcltpPj4xMiY2M10rcltpPj42JjYzXStyWzYzJmldKTtyZXR1cm4gYS5qb2luKCIiKX1vWyItIi5jaGFyQ29kZUF0KDApXT02MixvWyJfIi5jaGFyQ29kZUF0KDApXT02M30sZnVuY3Rpb24odCxlKXtlLnJlYWQ9ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHM9OCpvLXItMSx1PSgxPDxzKS0xLGM9dT4%2BMSxsPS03LGY9bj9vLTE6MCxwPW4%2FLTE6MSxoPXRbZStmXTtmb3IoZis9cCxpPWgmKDE8PC1sKS0xLGg%2BPj0tbCxsKz1zO2w%2BMDtpPTI1NippK3RbZStmXSxmKz1wLGwtPTgpO2ZvcihhPWkmKDE8PC1sKS0xLGk%2BPj0tbCxsKz1yO2w%2BMDthPTI1NiphK3RbZStmXSxmKz1wLGwtPTgpO2lmKDA9PT1pKWk9MS1jO2Vsc2V7aWYoaT09PXUpcmV0dXJuIGE%2FTmFOOjEvMCooaD8tMToxKTthKz1NYXRoLnBvdygyLHIpLGktPWN9cmV0dXJuKGg%2FLTE6MSkqYSpNYXRoLnBvdygyLGktcil9LGUud3JpdGU9ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhLHMsdSxjPTgqaS1vLTEsbD0oMTw8YyktMSxmPWw%2BPjEscD0yMz09PW8%2FTWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGg9cj8wOmktMSxkPXI%2FMTotMSxnPWU8MHx8MD09PWUmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8ocz1pc05hTihlKT8xOjAsYT1sKTooYT1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKih1PU1hdGgucG93KDIsLWEpKTwxJiYoYS0tLHUqPTIpLChlKz1hK2Y%2BPTE%2FcC91OnAqTWF0aC5wb3coMiwxLWYpKSp1Pj0yJiYoYSsrLHUvPTIpLGErZj49bD8ocz0wLGE9bCk6YStmPj0xPyhzPShlKnUtMSkqTWF0aC5wb3coMixvKSxhKz1mKToocz1lKk1hdGgucG93KDIsZi0xKSpNYXRoLnBvdygyLG8pLGE9MCkpO28%2BPTg7dFtuK2hdPTI1NSZzLGgrPWQscy89MjU2LG8tPTgpO2ZvcihhPWE8PG98cyxjKz1vO2M%2BMDt0W24raF09MjU1JmEsaCs9ZCxhLz0yNTYsYy09OCk7dFtuK2gtZF18PTEyOCpnfX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09bi5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4MCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDI4MSk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5VUkxTZWFyY2hQYXJhbXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7big5OCk7dmFyIHI9bigwKSxvPW4oMjgyKSxpPW4oMzMpLGE9bigxMDApLHM9bigyNCksdT1uKDk0KSxjPW4oNDgpLGw9bigxMDEpLGY9bigxMikscD1uKDI5KSxoPW4oOSksZD1uKDYpLGc9bigxMTgpLHY9big1MSkseT1uKDEpKCJpdGVyYXRvciIpLG09Yy5zZXQsYj1jLmdldHRlckZvcigiVVJMU2VhcmNoUGFyYW1zIikseD1jLmdldHRlckZvcigiVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IiKSx3PS9cKy9nLGs9QXJyYXkoNCksUz1mdW5jdGlvbih0KXtyZXR1cm4ga1t0LTFdfHwoa1t0LTFdPVJlZ0V4cCgiKCg%2FOiVbXFxkYS1mXXsyfSl7Iit0KyJ9KSIsImdpIikpfSxFPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQpfWNhdGNoKGUpe3JldHVybiB0fX0sVD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UodywiICIpLG49NDt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaCh0KXtmb3IoO247KWU9ZS5yZXBsYWNlKFMobi0tKSxFKTtyZXR1cm4gZX19LEE9L1shJygpfl18JTIwL2csTz17IiEiOiIlMjEiLCInIjoiJTI3IiwiKCI6IiUyOCIsIikiOiIlMjkiLCJ%2BIjoiJTdFIiwiJTIwIjoiKyJ9LEM9ZnVuY3Rpb24odCl7cmV0dXJuIE9bdF19LGo9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKEEsQyl9LEw9ZnVuY3Rpb24odCxlKXtpZihlKWZvcih2YXIgbixyLG89ZS5zcGxpdCgiJiIpLGk9MDtpPG8ubGVuZ3RoOykobj1vW2krK10pLmxlbmd0aCYmKHI9bi5zcGxpdCgiPSIpLHQucHVzaCh7a2V5OlQoci5zaGlmdCgpKSx2YWx1ZTpUKHIuam9pbigiPSIpKX0pKX0sUD1mdW5jdGlvbih0KXt0aGlzLmVudHJpZXMubGVuZ3RoPTAsTCh0aGlzLmVudHJpZXMsdCl9LFI9ZnVuY3Rpb24odCxlKXtpZih0PGUpdGhyb3cgVHlwZUVycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpfSxOPXUoZnVuY3Rpb24odCxlKXttKHRoaXMse3R5cGU6IlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIixpdGVyYXRvcjpnKGIodCkuZW50cmllcyksa2luZDplfSl9LCJJdGVyYXRvciIsZnVuY3Rpb24oKXt2YXIgdD14KHRoaXMpLGU9dC5raW5kLG49dC5pdGVyYXRvci5uZXh0KCkscj1uLnZhbHVlO3JldHVybiBuLmRvbmV8fChuLnZhbHVlPSJrZXlzIj09PWU%2Fci5rZXk6InZhbHVlcyI9PT1lP3IudmFsdWU6W3Iua2V5LHIudmFsdWVdKSxufSksST1mdW5jdGlvbigpe2wodGhpcyxJLCJVUkxTZWFyY2hQYXJhbXMiKTt2YXIgdCxlLG4scixvLGksYSxzPWFyZ3VtZW50cy5sZW5ndGg%2BMD9hcmd1bWVudHNbMF06dm9pZCAwLHU9dGhpcyxjPVtdO2lmKG0odSx7dHlwZToiVVJMU2VhcmNoUGFyYW1zIixlbnRyaWVzOmMsdXBkYXRlVVJMOmZ1bmN0aW9uKCl7fSx1cGRhdGVTZWFyY2hQYXJhbXM6UH0pLHZvaWQgMCE9PXMpaWYoZChzKSlpZigiZnVuY3Rpb24iPT10eXBlb2YodD12KHMpKSlmb3IoZT10LmNhbGwocyk7IShuPWUubmV4dCgpKS5kb25lOyl7aWYoKG89KHI9ZyhoKG4udmFsdWUpKSkubmV4dCgpKS5kb25lfHwoaT1yLm5leHQoKSkuZG9uZXx8IXIubmV4dCgpLmRvbmUpdGhyb3cgVHlwZUVycm9yKCJFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyIik7Yy5wdXNoKHtrZXk6by52YWx1ZSsiIix2YWx1ZTppLnZhbHVlKyIifSl9ZWxzZSBmb3IoYSBpbiBzKWYocyxhKSYmYy5wdXNoKHtrZXk6YSx2YWx1ZTpzW2FdKyIifSk7ZWxzZSBMKGMsInN0cmluZyI9PXR5cGVvZiBzPyI%2FIj09PXMuY2hhckF0KDApP3Muc2xpY2UoMSk6czpzKyIiKX0sRD1JLnByb3RvdHlwZTthKEQse2FwcGVuZDpmdW5jdGlvbih0LGUpe1IoYXJndW1lbnRzLmxlbmd0aCwyKTt2YXIgbj1iKHRoaXMpO24uZW50cmllcy5wdXNoKHtrZXk6dCsiIix2YWx1ZTplKyIifSksbi51cGRhdGVVUkwoKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe1IoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKSxuPWUuZW50cmllcyxyPXQrIiIsbz0wO288bi5sZW5ndGg7KW5bb10ua2V5PT09cj9uLnNwbGljZShvLDEpOm8rKztlLnVwZGF0ZVVSTCgpfSxnZXQ6ZnVuY3Rpb24odCl7Uihhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdLmtleT09PW4pcmV0dXJuIGVbcl0udmFsdWU7cmV0dXJuIG51bGx9LGdldEFsbDpmdW5jdGlvbih0KXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcykuZW50cmllcyxuPXQrIiIscj1bXSxvPTA7bzxlLmxlbmd0aDtvKyspZVtvXS5rZXk9PT1uJiZyLnB1c2goZVtvXS52YWx1ZSk7cmV0dXJuIHJ9LGhhczpmdW5jdGlvbih0KXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcykuZW50cmllcyxuPXQrIiIscj0wO3I8ZS5sZW5ndGg7KWlmKGVbcisrXS5rZXk9PT1uKXJldHVybiEwO3JldHVybiExfSxzZXQ6ZnVuY3Rpb24odCxlKXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBuLHI9Yih0aGlzKSxvPXIuZW50cmllcyxpPSExLGE9dCsiIixzPWUrIiIsdT0wO3U8by5sZW5ndGg7dSsrKShuPW9bdV0pLmtleT09PWEmJihpP28uc3BsaWNlKHUtLSwxKTooaT0hMCxuLnZhbHVlPXMpKTtpfHxvLnB1c2goe2tleTphLHZhbHVlOnN9KSxyLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9Yih0aGlzKSxvPXIuZW50cmllcyxpPW8uc2xpY2UoKTtmb3Ioby5sZW5ndGg9MCxuPTA7bjxpLmxlbmd0aDtuKyspe2Zvcih0PWlbbl0sZT0wO2U8bjtlKyspaWYob1tlXS5rZXk%2BdC5rZXkpe28uc3BsaWNlKGUsMCx0KTticmVha31lPT09biYmby5wdXNoKHQpfXIudXBkYXRlVVJMKCl9LGZvckVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49Yih0aGlzKS5lbnRyaWVzLHI9cCh0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89MDtvPG4ubGVuZ3RoOylyKChlPW5bbysrXSkudmFsdWUsZS5rZXksdGhpcyl9LGtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywia2V5cyIpfSx2YWx1ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywidmFsdWVzIil9LGVudHJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywiZW50cmllcyIpfX0se2VudW1lcmFibGU6ITB9KSxpKEQseSxELmVudHJpZXMpLGkoRCwidG9TdHJpbmciLGZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9Yih0aGlzKS5lbnRyaWVzLG49W10scj0wO3I8ZS5sZW5ndGg7KXQ9ZVtyKytdLG4ucHVzaChqKHQua2V5KSsiPSIraih0LnZhbHVlKSk7cmV0dXJuIG4uam9pbigiJiIpfSx7ZW51bWVyYWJsZTohMH0pLHMoSSwiVVJMU2VhcmNoUGFyYW1zIikscih7Z2xvYmFsOiEwLGZvcmNlZDohb30se1VSTFNlYXJjaFBhcmFtczpJfSksdC5leHBvcnRzPXtVUkxTZWFyY2hQYXJhbXM6SSxnZXRTdGF0ZTpifX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDEpLGk9bigyMiksYT1vKCJpdGVyYXRvciIpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3ZhciB0PW5ldyBVUkwoImI%2FZT0xIiwiaHR0cDovL2EiKSxlPXQuc2VhcmNoUGFyYW1zO3JldHVybiB0LnBhdGhuYW1lPSJjJTIwZCIsaSYmIXQudG9KU09OfHwhZS5zb3J0fHwiaHR0cDovL2EvYyUyMGQ%2FZT0xIiE9PXQuaHJlZnx8IjEiIT09ZS5nZXQoImUiKXx8ImE9MSIhPT1TdHJpbmcobmV3IFVSTFNlYXJjaFBhcmFtcygiP2E9MSIpKXx8IWVbYV18fCJhIiE9PW5ldyBVUkwoImh0dHBzOi8vYUBiIikudXNlcm5hbWV8fCJiIiE9PW5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygiYT1iIikpLmdldCgiYSIpfHwieG4tLWUxYXliYyIhPT1uZXcgVVJMKCJodHRwOi8v0YLQtdGB0YIiKS5ob3N0fHwiIyVEMCVCMSIhPT1uZXcgVVJMKCJodHRwOi8vYSPQsSIpLmhhc2h9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4NCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4NSksbz1GdW5jdGlvbi5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuYmluZDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBGdW5jdGlvbiYmZT09PW8uYmluZD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyODYpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJGdW5jdGlvbiIpLmJpbmR9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6IkZ1bmN0aW9uIixwcm90bzohMH0se2JpbmQ6big5MCl9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDkxKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbiYmdChlLnByb3RvdHlwZSxuKSxyJiZ0KGUsciksZX19KCksbz1mdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9KG4oMjg5KSksaT1wKG4oMjkwKSksYT1wKG4oMjkxKSkscz1wKG4oMjkyKSksdT1wKG4oMjkzKSksYz1wKG4oMjk0KSksbD1wKG4oMjk1KSksZj1wKG4oMjk2KSk7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19dmFyIGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSx0aGlzLnR5cGU9Imxhbmd1YWdlRGV0ZWN0b3IiLHRoaXMuZGV0ZWN0b3JzPXt9LHRoaXMuaW5pdChlLG4pfXJldHVybiByKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg%2BMiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTt0aGlzLnNlcnZpY2VzPXQsdGhpcy5vcHRpb25zPW8uZGVmYXVsdHMoZSx0aGlzLm9wdGlvbnN8fHt9LHtvcmRlcjpbInF1ZXJ5c3RyaW5nIiwiY29va2llIiwibG9jYWxTdG9yYWdlIiwibmF2aWdhdG9yIiwiaHRtbFRhZyJdLGxvb2t1cFF1ZXJ5c3RyaW5nOiJsbmciLGxvb2t1cENvb2tpZToiaTE4bmV4dCIsbG9va3VwTG9jYWxTdG9yYWdlOiJpMThuZXh0TG5nIixjYWNoZXM6WyJsb2NhbFN0b3JhZ2UiXSxleGNsdWRlQ2FjaGVGb3I6WyJjaW1vZGUiXX0pLHRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXgmJih0aGlzLm9wdGlvbnMubG9va3VwRnJvbVBhdGhJbmRleD10aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4KSx0aGlzLmkxOG5PcHRpb25zPW4sdGhpcy5hZGREZXRlY3RvcihpLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoYS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKHMuZGVmYXVsdCksdGhpcy5hZGREZXRlY3Rvcih1LmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoYy5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGwuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihmLmRlZmF1bHQpfX0se2tleToiYWRkRGV0ZWN0b3IiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuZGV0ZWN0b3JzW3QubmFtZV09dH19LHtrZXk6ImRldGVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0fHwodD10aGlzLm9wdGlvbnMub3JkZXIpO3ZhciBuPVtdO3QuZm9yRWFjaChmdW5jdGlvbih0KXtpZihlLmRldGVjdG9yc1t0XSl7dmFyIHI9ZS5kZXRlY3RvcnNbdF0ubG9va3VwKGUub3B0aW9ucyk7ciYmInN0cmluZyI9PXR5cGVvZiByJiYocj1bcl0pLHImJihuPW4uY29uY2F0KHIpKX19KTt2YXIgcj12b2lkIDA7aWYobi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFyKXt2YXIgbj1lLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO2Uuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5pc1doaXRlbGlzdGVkKG4pJiYocj1uKX19KSwhcil7dmFyIG89dGhpcy5pMThuT3B0aW9ucy5mYWxsYmFja0xuZzsic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSksb3x8KG89W10pLHI9IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobyk%2Fb1swXTpvWzBdfHxvLmRlZmF1bHQmJm8uZGVmYXVsdFswXX1yZXR1cm4gcn19LHtrZXk6ImNhY2hlVXNlckxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7ZXx8KGU9dGhpcy5vcHRpb25zLmNhY2hlcyksZSYmKHRoaXMub3B0aW9ucy5leGNsdWRlQ2FjaGVGb3ImJnRoaXMub3B0aW9ucy5leGNsdWRlQ2FjaGVGb3IuaW5kZXhPZih0KT4tMXx8ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24uZGV0ZWN0b3JzW2VdJiZuLmRldGVjdG9yc1tlXS5jYWNoZVVzZXJMYW5ndWFnZSh0LG4ub3B0aW9ucyl9KSl9fV0pLHR9KCk7aC50eXBlPSJsYW5ndWFnZURldGVjdG9yIixlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0cz1mdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKGkuY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIG4gaW4gZSl2b2lkIDA9PT10W25dJiYodFtuXT1lW25dKX0pLHR9LGUuZXh0ZW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNhbGwoaS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbihlKXtpZihlKWZvcih2YXIgbiBpbiBlKXRbbl09ZVtuXX0pLHR9O3ZhciByPVtdLG89ci5mb3JFYWNoLGk9ci5zbGljZX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24odCxlLG4scil7dmFyIG89dm9pZCAwO2lmKG4pe3ZhciBpPW5ldyBEYXRlO2kuc2V0VGltZShpLmdldFRpbWUoKSs2MCpuKjFlMyksbz0iOyBleHBpcmVzPSIraS50b0dNVFN0cmluZygpfWVsc2Ugbz0iIjtyPXI%2FImRvbWFpbj0iK3IrIjsiOiIiLGRvY3VtZW50LmNvb2tpZT10KyI9IitlK28rIjsiK3IrInBhdGg9LyJ9LG89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQrIj0iLG49ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7Iikscj0wO3I8bi5sZW5ndGg7cisrKXtmb3IodmFyIG89bltyXTsiICI9PT1vLmNoYXJBdCgwKTspbz1vLnN1YnN0cmluZygxLG8ubGVuZ3RoKTtpZigwPT09by5pbmRleE9mKGUpKXJldHVybiBvLnN1YnN0cmluZyhlLmxlbmd0aCxvLmxlbmd0aCl9cmV0dXJuIG51bGx9O2UuZGVmYXVsdD17bmFtZToiY29va2llIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKHQubG9va3VwQ29va2llJiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgbj1vKHQubG9va3VwQ29va2llKTtuJiYoZT1uKX1yZXR1cm4gZX0sY2FjaGVVc2VyTGFuZ3VhZ2U6ZnVuY3Rpb24odCxlKXtlLmxvb2t1cENvb2tpZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmcihlLmxvb2t1cENvb2tpZSx0LGUuY29va2llTWludXRlcyxlLmNvb2tpZURvbWFpbil9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJxdWVyeXN0cmluZyIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdylmb3IodmFyIG49d2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoIiYiKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl0uaW5kZXhPZigiPSIpO2lmKG8%2BMCluW3JdLnN1YnN0cmluZygwLG8pPT09dC5sb29rdXBRdWVyeXN0cmluZyYmKGU9bltyXS5zdWJzdHJpbmcobysxKSl9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9dm9pZCAwO3RyeXtyPSJ1bmRlZmluZWQiIT09d2luZG93JiZudWxsIT09d2luZG93LmxvY2FsU3RvcmFnZTt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oImkxOG5leHQudHJhbnNsYXRlLmJvbyIsImZvbyIpLHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgiaTE4bmV4dC50cmFuc2xhdGUuYm9vIil9Y2F0Y2godCl7cj0hMX1lLmRlZmF1bHQ9e25hbWU6ImxvY2FsU3RvcmFnZSIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZih0Lmxvb2t1cExvY2FsU3RvcmFnZSYmcil7dmFyIG49d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHQubG9va3VwTG9jYWxTdG9yYWdlKTtuJiYoZT1uKX1yZXR1cm4gZX0sY2FjaGVVc2VyTGFuZ3VhZ2U6ZnVuY3Rpb24odCxlKXtlLmxvb2t1cExvY2FsU3RvcmFnZSYmciYmd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGUubG9va3VwTG9jYWxTdG9yYWdlLHQpfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToibmF2aWdhdG9yIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9W107aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3Ipe2lmKG5hdmlnYXRvci5sYW5ndWFnZXMpZm9yKHZhciBuPTA7bjxuYXZpZ2F0b3IubGFuZ3VhZ2VzLmxlbmd0aDtuKyspZS5wdXNoKG5hdmlnYXRvci5sYW5ndWFnZXNbbl0pO25hdmlnYXRvci51c2VyTGFuZ3VhZ2UmJmUucHVzaChuYXZpZ2F0b3IudXNlckxhbmd1YWdlKSxuYXZpZ2F0b3IubGFuZ3VhZ2UmJmUucHVzaChuYXZpZ2F0b3IubGFuZ3VhZ2UpfXJldHVybiBlLmxlbmd0aD4wP2U6dm9pZCAwfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToiaHRtbFRhZyIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMCxuPXQuaHRtbFRhZ3x8KCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ%2FZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Om51bGwpO3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5nZXRBdHRyaWJ1dGUmJihlPW4uZ2V0QXR0cmlidXRlKCJsYW5nIikpLGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJwYXRoIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUubWF0Y2goL1wvKFthLXpBLVotXSopL2cpO2lmKG4gaW5zdGFuY2VvZiBBcnJheSlpZigibnVtYmVyIj09dHlwZW9mIHQubG9va3VwRnJvbVBhdGhJbmRleCl7aWYoInN0cmluZyIhPXR5cGVvZiBuW3QubG9va3VwRnJvbVBhdGhJbmRleF0pcmV0dXJuO2U9blt0Lmxvb2t1cEZyb21QYXRoSW5kZXhdLnJlcGxhY2UoIi8iLCIiKX1lbHNlIGU9blswXS5yZXBsYWNlKCIvIiwiIil9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJzdWJkb21haW4iLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBuPXdpbmRvdy5sb2NhdGlvbi5ocmVmLm1hdGNoKC8oPzpodHRwW3NdKlw6XC9cLykqKC4qPylcLig%2FPVteXC9dKlwuLnsyLDV9KS9naSk7biBpbnN0YW5jZW9mIEFycmF5JiYoZT0ibnVtYmVyIj09dHlwZW9mIHQubG9va3VwRnJvbVN1YmRvbWFpbkluZGV4P25bdC5sb29rdXBGcm9tU3ViZG9tYWluSW5kZXhdLnJlcGxhY2UoImh0dHA6Ly8iLCIiKS5yZXBsYWNlKCJodHRwczovLyIsIiIpLnJlcGxhY2UoIi4iLCIiKTpuWzBdLnJlcGxhY2UoImh0dHA6Ly8iLCIiKS5yZXBsYWNlKCJodHRwczovLyIsIiIpLnJlcGxhY2UoIi4iLCIiKSl9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLnIoZSk7dmFyIHI9big4KSxvPW4ubihyKSxpPW4oNDIpLGE9bi5uKGkpLHM9big2MCksdT1uLm4ocyksYz1uKDI3KSxsPW4ubihjKSxmPW4oMTcpLHA9bi5uKGYpLGg9big3KSxkPW4ubihoKSxnPW4oMTApLHY9bi5uKGcpLHk9bigxMSksbT1uLm4oeSksYj1uKDEyNCkseD1uLm4oYiksdz1uKDI2KSxrPW4ubih3KSxTPW4oMzQpLEU9bi5uKFMpLFQ9bigxMyksQT1uLm4oVCksTz1uKDEyNSksQz1uLm4oTyksaj1uKDEyNik7ZnVuY3Rpb24gTCgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgUD1uKDEyNyksUj1uLm4oUCksTj1uKDEyOCksST1uLm4oTiksRD0iemlnemFnIjt2YXIgXz1uKDM1KSxNPSJ1c2FnZSIsVT0iemlnemFnLWZsb3ctY29udHJvbGxlZCI7ZnVuY3Rpb24gQih0LGUpe3dpbmRvdy4kJiZmdW5jdGlvbihuKXt2YXIgcj1uKHQpO2lmKHImJnIubGVuZ3RoPjApZm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKz0xKXt2YXIgaT1yLmdldChvKTtpLmhhc0F0dHJpYnV0ZShVKXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBxPXtwcmVzZXJ2ZU9yaWdpbmFsRXZlbnQ6ITEsZGlzYWJsZVBvaW50ZXJFdmVudDohMX07ZnVuY3Rpb24gRih0KXt2YXIgZT1JKCkoZnVuY3Rpb24oKXt2YXIgbixyLG89d2luZG93LnppZ3phZzsiZGVhY3RpdmF0ZWQiPT09KG49TSxyPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShEKSxKU09OLnBhcnNlKHI%2FZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBIKHQsZSl7dmFyIG49d2luZG93LnppZ3phZztSKCkoZnVuY3Rpb24oKXsvQ2hyb21lLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSYmMD09PXQoZSkubGVuZ3RoJiZuJiYiaXRlbSI9PT1uLmRpc2NvdmVyeVN0YXR1cyYmXy5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp%2BipsuW9k%2BOBmeOCi%2BODleODreODvOWItuW%2BoeeUqOOBruimgee0oOOBjOimi%2BOBpOOBi%2BOCiuOBvuOBm%2BOCkyIpKX0sNWUzKX12YXIgej17b25DaGFuZ2VzUmVhZHk6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOlsiamEiXTtCb29sZWFuKGwoKShlKS5jYWxsKGUsZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuLTEhPT1DKCkoZT1MKCkpLmNhbGwoZSx0KX0pKXx8RihmdW5jdGlvbigpe3Qoail9KX0sb3ZlcnJpZGVDbGlja0V2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106cTtpZihIKHQsZSksci5kaXNhYmxlUG9pbnRlckV2ZW50KXtpZih3aW5kb3cuZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoVSkpcmV0dXJuO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7by5pbm5lckhUTUw9IlxuICAgICIuY29uY2F0KGUsIiB7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9Iik7dmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0Iik7cmV0dXJuIGkmJmkucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvLGkpLHQoZG9jdW1lbnQpLm9uKCJjbGljayIsZnVuY3Rpb24ocil7ci50YXJnZXQmJnQoci50YXJnZXQpLmNsb3Nlc3QodChlKS5wYXJlbnQoKSkubGVuZ3RoPjAmJm4ocil9KSx2b2lkIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZShVLCIxIil9ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fEIoZSwiY2xpY2siKTtmb3IodmFyIGE9dChlKSxzPTA7czxhLmxlbmd0aDtzKz0xKXt2YXIgdT1hLmdldChzKTt1Lmhhc0F0dHJpYnV0ZShVKXx8KHUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKHQpe3IucHJlc2VydmVPcmlnaW5hbEV2ZW50fHwodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpLG4odCl9LCEwKSx1LnNldEF0dHJpYnV0ZShVLCIxIikpfX0sb3ZlcnJpZGVTdWJtaXRFdmVudDpmdW5jdGlvbih0LGUsbil7SCh0LGUpLEIoZSwic3VibWl0Iik7dmFyIHI9dChlKTtpZihyJiZyLmxlbmd0aD4wKWZvcih2YXIgbz0wO288ci5sZW5ndGg7bys9MSl7dmFyIGk9ci5nZXQobyk7aS5oYXNBdHRyaWJ1dGUoVSl8fCh0KGkpLm9uKCJzdWJtaXQiLG4pLGkuc2V0QXR0cmlidXRlKFUsIjEiKSl9fSx1bmJpbmRPcmlnaW5hbEpRdWVyeUV2ZW50czpCfSxXPW4oNzgpLCQ9bi5uKFcpO2Z1bmN0aW9uIFYodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOjAsbj0kKCkodC5yZXBsYWNlKC9bXjAtOV0vZ2ksIiIpLDEwKTtyZXR1cm4gbnx8ZX1mdW5jdGlvbiBZKHQpe3ZhciBlPSIiLG49dC5jb250ZW50cygpO2lmKG4ubGVuZ3RoPjApZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKz0xKXt2YXIgbz1uLmdldChyKTszPT09by5ub2RlVHlwZSYmby5kYXRhJiYoZSs9by5kYXRhKX1yZXR1cm4gZX1mdW5jdGlvbiBHKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3JldHVybiB0KGUpLmxlbmd0aD4wJiYiaW1nIj09PXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk%2FdChlKS5hdHRyKCJhbHQiKXx8IiI6dChlKS50ZXh0KCkucmVwbGFjZSgvXG4vLCIiKX1mdW5jdGlvbiBLKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3ZhciBuPSIiO2lmKHQoZSkubGVuZ3RoPjApe3ZhciByPXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk7bj0iaW5wdXQiPT09cj90KGUpLnZhbCgpOiJtZXRhIj09PXI%2FdChlKS5hdHRyKCJjb250ZW50Iil8fCIiOlkodChlKSl9cmV0dXJuIG49bi5yZXBsYWNlKC9bXjAtOV0vZywiIiksJCgpKG4sMTApfXZhciBYPW4oMzYpLEo9bi5uKFgpLFE9bigzNyksWj1uLm4oUSksdHQ9bigzOCksZXQ9bi5uKHR0KSxudD1uKDM5KSxydD1uLm4obnQpLG90PW4oNDApLGl0PW4ubihvdCksYXQ9big0MSksc3Q9bi5uKGF0KSx1dD1uKDYxKSxjdD1uLm4odXQpO2Z1bmN0aW9uIGx0KHQsZSl7dmFyIG47aWYodm9pZCAwPT09cnQuYXx8bnVsbD09ZXQoKSh0KSl7aWYoWigpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGZ0KHQsZSk7dmFyIHI9c3QoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gaXQoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg%2FOjh8MTZ8MzIpKD86Q2xhbXBlZCk%2FQXJyYXkkLy50ZXN0KHIpKXJldHVybiBmdCh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI%2BPXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLGE9ITAscz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249SigpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IGl9fX19ZnVuY3Rpb24gZnQodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBwdCh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNLVeOBjOS4jeato%2BOBp%2BOBmSIpO2lmKDA9PT1jdCgpKHQpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNLVemgheebruaVsOOBjOS4jeato%2BOBp%2BOBmSIpfXZhciBodD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49ZS4kLHI9ZS5uYW1lLG89ZS5wcmljZTt2KCkodGhpcyx0KSx0aGlzLiQ9bix0aGlzLm5hbWVTZWxlY3Rvcj1yfHwiIix0aGlzLnByaWNlU2VsZWN0b3I9b3x8IiJ9cmV0dXJuIG0oKSh0LFt7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuITB9fSx7a2V5OiJleGVjdXRlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGUsbixyPSEwO3RyeXtyZXR1cm4gdD10aGlzLmdldEl0ZW0oKSxlPXRoaXMuZ2V0U2t1Um93cyh0KSxyPXRoaXMuZ2V0UHVyY2hhc2FibGUoe2l0ZW06dCxza3VSb3dzOmV9KSxmdW5jdGlvbih0KXt2YXIgZT10Lml0ZW0sbj10LnNrdVJvd3M7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6DjgYzkuI3mraPjgafjgZkiKTtpZighZS5uYW1lKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og5ZCN5YmN44GM5LiN5q2j44Gn44GZIik7aWYoIShuJiYwIT09bi5sZW5ndGh8fGUucHJpY2UpKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og6YeR6aGN44GM5LiN5q2j44Gn44GZIik7aWYobil7dmFyIHIsbz1sdChuKTt0cnl7Zm9yKG8ucygpOyEocj1vLm4oKSkuZG9uZTspe3B0KHIudmFsdWUpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX19fSh7aXRlbTp0LHNrdVJvd3M6ZX0pLHtpdGVtOnQsc2t1Um93czplLHB1cmNoYXNhYmxlOnJ9fWNhdGNoKHQpe249dH12YXIgbz17cHVyY2hhc2FibGU6cn07cmV0dXJuIHQmJihvLml0ZW09dCksZSYmKG8uc2t1Um93cz1lKSxuJiYoby5lcnJvcj1uKSxvfX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17bmFtZToiIixwcmljZTowfTt0aGlzLm5hbWVTZWxlY3Rvcj90Lm5hbWU9dGhpcy5nZXRJdGVtTmFtZShHKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3RvcikpOnQubmFtZT10aGlzLmdldEl0ZW1OYW1lKCksdGhpcy5wcmljZVNlbGVjdG9yP3QucHJpY2U9dGhpcy5nZXRJdGVtUHJpY2UoSyh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKSk6dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZSgpO3ZhciBlPXRoaXMuZ2V0SXRlbUNvZGUoKTtyZXR1cm4gZSYmKHQuY29kZT1lKSx0fX0se2tleToiZ2V0SXRlbU5hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOiIiO3JldHVybiB0aGlzLm5hbWVTZWxlY3Rvcj9HKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MDtyZXR1cm4gdGhpcy5wcmljZVNlbGVjdG9yP0sodGhpcy4kLHRoaXMucHJpY2VTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIifX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuW119fV0pLHR9KCksZHQ9big0NCksZ3Q9bi5uKGR0KSx2dD1uKDc5KSx5dD1uLm4odnQpLG10PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1lLmRhdGE7digpKHRoaXMsdCksdGhpcy5kYXRhPW59cmV0dXJuIG0oKSh0LG51bGwsW3trZXk6ImNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9MTtyPGUubGVuZ3RoO3IrPTEpe2Zvcih2YXIgbz17fSxpPTA7aTx0Lmxlbmd0aDtpKz0xKW9bdFtpXV09ZVtyXVtpXTtuLnB1c2gobyl9cmV0dXJuIG59fSx7a2V5OiJzcGxpdENvdW50cmllcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ%2FIiI9PT10fHwiLCI9PT10P1tdOnQuc3BsaXQoIiwiKTpbXX19LHtrZXk6Im5vcm1hbGl6ZVJhd0RhdGEiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9MCxvPWN0KCkodCk7cjxvLmxlbmd0aDtyKyspe3ZhciBpLGE9dFtvW3JdXTthLnNoaWZ0KCksbj1wKCkoaT1bXSkuY2FsbChpLHl0KCkobikseXQoKShhKSl9cmV0dXJuIG4udW5zaGlmdChlKSx7ZGF0YTpufX19XSksdH0oKTtmdW5jdGlvbiBidCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IW8uYSlyZXR1cm4hMTtpZihvLmEuc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8oKShEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUEoKSh0KTtpZihlKXt2YXIgaT1BKCkodGhpcykuY29uc3RydWN0b3I7bj1vKCkocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBFKCkodGhpcyxuKX19dmFyIHh0PXtieVVybDp7bmFtZToiYnlVcmwiLGNvbHVtbnM6WyJ1cmwiLCJjb3VudHJpZXMiXX0sYnlJdGVtTmFtZTp7bmFtZToiYnlJdGVtTmFtZSIsY29sdW1uczpbIml0ZW1OYW1lIiwiY291bnRyaWVzIl19LGJ5SXRlbUNvZGU6e25hbWU6ImJ5SXRlbUNvZGUiLGNvbHVtbnM6WyJpdGVtQ29kZSIsImNvdW50cmllcyJdfSxieUNhdGVnb3J5OntuYW1lOiJieUNhdGVnb3J5Iixjb2x1bW5zOlsiY2F0ZWdvcnkiLCJjb3VudHJpZXMiXX0sYnlJdGVtRGVzY3JpcHRpb246e25hbWU6ImJ5SXRlbURlc2NyaXB0aW9uIixjb2x1bW5zOlsidGV4dCIsImNvdW50cmllcyJdfX0sd3Q9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9YnQobik7ZnVuY3Rpb24gbih0KXt2YXIgcjtyZXR1cm4gdigpKHRoaXMsbiksKHI9ZS5jYWxsKHRoaXMsdCkpLmRhdGE9dC5kYXRhLHIuc2hlZXRUeXBlPXQuc2hlZXRUeXBlfHx4dCxyfXJldHVybiBtKCkobixbe2tleToiYnlVcmwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5VXJsKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5VXJsO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6bXQuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbU5hbWU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczptdC5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUl0ZW1Db2RlKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGU7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPW10LmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gZ3QoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtQ29kZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOm10LnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5Q2F0ZWdvcnkiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnkpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlDYXRlZ29yeTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9bXQuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBndCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6bXQuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dGV4dDplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOm10LnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImV4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2V4Y2x1c2lvbjp7YnlVcmw6dGhpcy5ieVVybCgpLGJ5SXRlbU5hbWU6dGhpcy5ieUl0ZW1OYW1lKCksYnlJdGVtQ29kZTp0aGlzLmJ5SXRlbUNvZGUoKSxieUNhdGVnb3J5OnRoaXMuYnlDYXRlZ29yeSgpLGJ5SXRlbURlc2NyaXB0aW9uOnRoaXMuYnlJdGVtRGVzY3JpcHRpb24oKX19fX1dKSxufShtdCksa3Q9big2MiksU3Q9bi5uKGt0KSxFdD1uKDgwKTtmdW5jdGlvbiBUdCh0LGUpe3ZhciBuO2lmKHZvaWQgMD09PXJ0LmF8fG51bGw9PWV0KCkodCkpe2lmKFooKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBBdCh0LGUpO3ZhciByPXN0KCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIGl0KCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gQXQodCxlKX0odCkpfHxlJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXtuJiYodD1uKTt2YXIgcj0wLG89ZnVuY3Rpb24oKXt9O3JldHVybntzOm8sbjpmdW5jdGlvbigpe3JldHVybiByPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtyKytdfX0sZTpmdW5jdGlvbih0KXt0aHJvdyB0fSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgaSxhPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPUooKSh0KX0sbjpmdW5jdGlvbigpe3ZhciB0PW4ubmV4dCgpO3JldHVybiBhPXQuZG9uZSx0fSxlOmZ1bmN0aW9uKHQpe3M9ITAsaT10fSxmOmZ1bmN0aW9uKCl7dHJ5e2F8fG51bGw9PW4ucmV0dXJufHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBpfX19fWZ1bmN0aW9uIEF0KHQsZSl7KG51bGw9PWV8fGU%2BdC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gT3QodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1BKCkodCk7aWYoZSl7dmFyIGk9QSgpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gRSgpKHRoaXMsbil9fXZhciBDdD1mdW5jdGlvbih0KXtrKCkobix0KTt2YXIgZT1PdChuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIHYoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBtKCkobixbe2tleToiZXhjbHVkZSIsdmFsdWU6ZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYSxzPSExLHU9dGhpcy5sb2NhdGlvbi5jb3VudHJ5LGM9VHQodCk7dHJ5e2ZvcihjLnMoKTshKG89Yy5uKCkpLmRvbmU7KXt2YXIgbD1vLnZhbHVlO2lmKHIobCkpe3M9bi5tYXRjaENvdW50cnkobCx1KTticmVha319fWNhdGNoKHQpe2MuZSh0KX1maW5hbGx5e2MuZigpfXJldHVybiBzPyhfLmEuZGVidWcocCgpKGk9IkVYQ0xVREVEIEJZIFNQUkVBRFNIRUVUOiAiLmNvbmNhdChlLCIsICIpKS5jYWxsKGksdSkpLHtjb2RlOiJFWENMVURFRF9CWV9CTEFDS0xJU1QiLG1lc3NhZ2U6cCgpKGE9IiIuY29uY2F0KGUsIiwgIikpLmNhbGwoYSx1LCIg44Gr6Kmy5b2T44GX44Gf44Gf44KB6Zmk5aSWIikscGFyYW1zOnt2YWx1ZTplLGNvdW50cnk6dX19KTpFdC5hfX1dLFt7a2V5OiJtYXRjaENvdW50cnkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuISghdC5pc0FsbCYmMCE9PXQuY291bnRyaWVzLmxlbmd0aCl8fFN0KCkobj10LmNvdW50cmllcykuY2FsbChuLGUpfX1dKSxufShFdC5iKTt2YXIganQ9bigxMzIpLEx0PW4ubihqdCksUHQ9big4MSksUnQ9bi5uKFB0KTtmdW5jdGlvbiBOdCh0KXtyZXR1cm4oTnQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I%2FZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU%2FInN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBJdCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9ZnVuY3Rpb24gRHQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP09iamVjdChhcmd1bWVudHNbZV0pOnt9LHI9T2JqZWN0LmtleXMobik7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihyPXIuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkuZW51bWVyYWJsZX0pKSksci5mb3JFYWNoKGZ1bmN0aW9uKGUpe0l0KHQsZSxuW2VdKX0pfXJldHVybiB0fWZ1bmN0aW9uIF90KHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gTXQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIGUmJk10KHQucHJvdG90eXBlLGUpLG4mJk10KHQsbiksdH1mdW5jdGlvbiBCdCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gcXQodCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPT1OdChlKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU%2FQnQodCk6ZX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4oRnQ9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIEh0KHQsZSl7cmV0dXJuKEh0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiB6dCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZIdCh0LGUpfXZhciBXdD17dHlwZToibG9nZ2VyIixsb2c6ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoImxvZyIsdCl9LHdhcm46ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoIndhcm4iLHQpfSxlcnJvcjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgiZXJyb3IiLHQpfSxvdXRwdXQ6ZnVuY3Rpb24odCxlKXtjb25zb2xlJiZjb25zb2xlW3RdJiZjb25zb2xlW3RdLmFwcGx5KGNvbnNvbGUsZSl9fSwkdD1uZXcoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtfdCh0aGlzLHQpLHRoaXMuaW5pdChlLG4pfXJldHVybiBVdCh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5wcmVmaXg9ZS5wcmVmaXh8fCJpMThuZXh0OiIsdGhpcy5sb2dnZXI9dHx8V3QsdGhpcy5vcHRpb25zPWUsdGhpcy5kZWJ1Zz1lLmRlYnVnfX0se2tleToic2V0RGVidWciLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuZGVidWc9dH19LHtrZXk6ImxvZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsImxvZyIsIiIsITApfX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsIndhcm4iLCIiLCEwKX19LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwiZXJyb3IiLCIiKX19LHtrZXk6ImRlcHJlY2F0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsIndhcm4iLCJXQVJOSU5HIERFUFJFQ0FURUQ6ICIsITApfX0se2tleToiZm9yd2FyZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHImJiF0aGlzLmRlYnVnP251bGw6KCJzdHJpbmciPT10eXBlb2YgdFswXSYmKHRbMF09IiIuY29uY2F0KG4pLmNvbmNhdCh0aGlzLnByZWZpeCwiICIpLmNvbmNhdCh0WzBdKSksdGhpcy5sb2dnZXJbZV0odCkpfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQodGhpcy5sb2dnZXIsRHQoe30se3ByZWZpeDoiIi5jb25jYXQodGhpcy5wcmVmaXgsIjoiKS5jb25jYXQoZSwiOiIpfSx0aGlzLm9wdGlvbnMpKX19XSksdH0oKSksVnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7X3QodGhpcyx0KSx0aGlzLm9ic2VydmVycz17fX1yZXR1cm4gVXQodCxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdC5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7bi5vYnNlcnZlcnNbdF09bi5vYnNlcnZlcnNbdF18fFtdLG4ub2JzZXJ2ZXJzW3RdLnB1c2goZSl9KSx0aGlzfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMub2JzZXJ2ZXJzW3RdJiYoZT90aGlzLm9ic2VydmVyc1t0XT10aGlzLm9ic2VydmVyc1t0XS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1lfSk6ZGVsZXRlIHRoaXMub2JzZXJ2ZXJzW3RdKX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KGU%2BMT9lLTE6MCkscj0xO3I8ZTtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtpZih0aGlzLm9ic2VydmVyc1t0XSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW3RdKTtvLmZvckVhY2goZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsbil9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgaT1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7aS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYXBwbHkoZSxbdF0uY29uY2F0KG4pKX0pfX19XSksdH0oKTtmdW5jdGlvbiBZdCgpe3ZhciB0LGUsbj1uZXcgUHJvbWlzZShmdW5jdGlvbihuLHIpe3Q9bixlPXJ9KTtyZXR1cm4gbi5yZXNvbHZlPXQsbi5yZWplY3Q9ZSxufWZ1bmN0aW9uIEd0KHQpe3JldHVybiBudWxsPT10PyIiOiIiK3R9ZnVuY3Rpb24gS3QodCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuaW5kZXhPZigiIyMjIik%2BLTE%2FdC5yZXBsYWNlKC8jIyMvZywiLiIpOnR9ZnVuY3Rpb24gbygpe3JldHVybiF0fHwic3RyaW5nIj09dHlwZW9mIHR9Zm9yKHZhciBpPSJzdHJpbmciIT10eXBlb2YgZT9bXS5jb25jYXQoZSk6ZS5zcGxpdCgiLiIpO2kubGVuZ3RoPjE7KXtpZihvKCkpcmV0dXJue307dmFyIGE9cihpLnNoaWZ0KCkpOyF0W2FdJiZuJiYodFthXT1uZXcgbiksdD10W2FdfXJldHVybiBvKCk%2Fe306e29iajp0LGs6cihpLnNoaWZ0KCkpfX1mdW5jdGlvbiBYdCh0LGUsbil7dmFyIHI9S3QodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIEp0KHQsZSl7dmFyIG49S3QodCxlKSxyPW4ub2JqLG89bi5rO2lmKHIpcmV0dXJuIHJbb119ZnVuY3Rpb24gUXQodCxlLG4pe3ZhciByPUp0KHQsbik7cmV0dXJuIHZvaWQgMCE9PXI%2FcjpKdChlLG4pfWZ1bmN0aW9uIFp0KHQsZSxuKXtmb3IodmFyIHIgaW4gZSkiX19wcm90b19fIiE9PXImJiJjb25zdHJ1Y3RvciIhPT1yJiYociBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFtyXXx8dFtyXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIGVbcl18fGVbcl1pbnN0YW5jZW9mIFN0cmluZz9uJiYodFtyXT1lW3JdKTpadCh0W3JdLGVbcl0sbik6dFtyXT1lW3JdKTtyZXR1cm4gdH1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgZWU9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBuZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ%2FdC5yZXBsYWNlKC9bJjw%2BIidcL10vZyxmdW5jdGlvbih0KXtyZXR1cm4gZWVbdF19KTp0fXZhciByZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm5hdmlnYXRvciYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKT4tMSxvZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOntuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOiJ0cmFuc2xhdGlvbiJ9O3JldHVybiBfdCh0aGlzLGUpLG49cXQodGhpcyxGdChlKS5jYWxsKHRoaXMpKSxyZSYmVnQuY2FsbChCdChuKSksbi5kYXRhPXR8fHt9LG4ub3B0aW9ucz1yLHZvaWQgMD09PW4ub3B0aW9ucy5rZXlTZXBhcmF0b3ImJihuLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksbn1yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToiYWRkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmdGhpcy5vcHRpb25zLm5zLnB1c2godCl9fSx7a2V5OiJyZW1vdmVOYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGUsMSl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg%2BMyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxvPXZvaWQgMCE9PXIua2V5U2VwYXJhdG9yP3Iua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT1bdCxlXTtyZXR1cm4gbiYmInN0cmluZyIhPXR5cGVvZiBuJiYoaT1pLmNvbmNhdChuKSksbiYmInN0cmluZyI9PXR5cGVvZiBuJiYoaT1pLmNvbmNhdChvP24uc3BsaXQobyk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYoaT10LnNwbGl0KCIuIikpLEp0KHRoaXMuZGF0YSxpKX19LHtrZXk6ImFkZFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06e3NpbGVudDohMX0saT10aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO3ZvaWQgMD09PWkmJihpPSIuIik7dmFyIGE9W3QsZV07biYmKGE9YS5jb25jYXQoaT9uLnNwbGl0KGkpOm4pKSx0LmluZGV4T2YoIi4iKT4tMSYmKHI9ZSxlPShhPXQuc3BsaXQoIi4iKSlbMV0pLHRoaXMuYWRkTmFtZXNwYWNlcyhlKSxYdCh0aGlzLmRhdGEsYSxyKSxvLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4scil9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciBvIGluIG4pInN0cmluZyIhPXR5cGVvZiBuW29dJiYiW29iamVjdCBBcnJheV0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuW29dKXx8dGhpcy5hZGRSZXNvdXJjZSh0LGUsbyxuW29dLHtzaWxlbnQ6ITB9KTtyLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4pfX0se2tleToiYWRkUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0%2FYXJndW1lbnRzWzVdOntzaWxlbnQ6ITF9LGE9W3QsZV07dC5pbmRleE9mKCIuIik%2BLTEmJihyPW4sbj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpO3ZhciBzPUp0KHRoaXMuZGF0YSxhKXx8e307cj9adChzLG4sbyk6cz1EdCh7fSxzLG4pLFh0KHRoaXMuZGF0YSxhLHMpLGkuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHQsZSkmJmRlbGV0ZSB0aGlzLmRhdGFbdF1bZV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGUpLHRoaXMuZW1pdCgicmVtb3ZlZCIsdCxlKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT10aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8KGU9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksInYxIj09PXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJP0R0KHt9LHt9LHRoaXMuZ2V0UmVzb3VyY2UodCxlKSk6dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0RGF0YUJ5TGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdF19fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX19XSksZX0oKSxpZT17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPXRoaXM7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtpLnByb2Nlc3NvcnNbdF0mJihlPWkucHJvY2Vzc29yc1t0XS5wcm9jZXNzKGUsbixyLG8pKX0pLGV9fSxhZT17fSxzZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOnt9O3JldHVybiBfdCh0aGlzLGUpLG49cXQodGhpcyxGdChlKS5jYWxsKHRoaXMpKSxyZSYmVnQuY2FsbChCdChuKSksZnVuY3Rpb24odCxlLG4pe3QuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdJiYoblt0XT1lW3RdKX0pfShbInJlc291cmNlU3RvcmUiLCJsYW5ndWFnZVV0aWxzIiwicGx1cmFsUmVzb2x2ZXIiLCJpbnRlcnBvbGF0b3IiLCJiYWNrZW5kQ29ubmVjdG9yIiwiaTE4bkZvcm1hdCIsInV0aWxzIl0sdCxCdChuKSksbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxuLmxvZ2dlcj0kdC5jcmVhdGUoInRyYW5zbGF0b3IiKSxufXJldHVybiB6dChlLFZ0KSxVdChlLFt7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7dCYmKHRoaXMubGFuZ3VhZ2U9dCl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7aW50ZXJwb2xhdGlvbjp7fX0sbj10aGlzLnJlc29sdmUodCxlKTtyZXR1cm4gbiYmdm9pZCAwIT09bi5yZXN9fSx7a2V5OiJleHRyYWN0RnJvbUtleSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj12b2lkIDAhPT1lLm5zU2VwYXJhdG9yP2UubnNTZXBhcmF0b3I6dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3ZvaWQgMD09PW4mJihuPSI6Iik7dmFyIHI9dm9pZCAwIT09ZS5rZXlTZXBhcmF0b3I%2FZS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixvPWUubnN8fHRoaXMub3B0aW9ucy5kZWZhdWx0TlM7aWYobiYmdC5pbmRleE9mKG4pPi0xKXt2YXIgaT10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2lmKGkmJmkubGVuZ3RoPjApcmV0dXJue2tleTp0LG5hbWVzcGFjZXM6b307dmFyIGE9dC5zcGxpdChuKTsobiE9PXJ8fG49PT1yJiZ0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihhWzBdKT4tMSkmJihvPWEuc2hpZnQoKSksdD1hLmpvaW4ocil9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBvJiYobz1bb10pLHtrZXk6dCxuYW1lc3BhY2VzOm99fX0se2tleToidHJhbnNsYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztpZigib2JqZWN0IiE9PU50KGUpJiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJihlPXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSxlfHwoZT17fSksbnVsbD09dClyZXR1cm4iIjtBcnJheS5pc0FycmF5KHQpfHwodD1bU3RyaW5nKHQpXSk7dmFyIG89dm9pZCAwIT09ZS5rZXlTZXBhcmF0b3I%2FZS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPXRoaXMuZXh0cmFjdEZyb21LZXkodFt0Lmxlbmd0aC0xXSxlKSxhPWkua2V5LHM9aS5uYW1lc3BhY2VzLHU9c1tzLmxlbmd0aC0xXSxjPWUubG5nfHx0aGlzLmxhbmd1YWdlLGw9ZS5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZXx8dGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO2lmKGMmJiJjaW1vZGUiPT09Yy50b0xvd2VyQ2FzZSgpKXtpZihsKXt2YXIgZj1lLm5zU2VwYXJhdG9yfHx0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7cmV0dXJuIHUrZithfXJldHVybiBhfXZhciBwPXRoaXMucmVzb2x2ZSh0LGUpLGg9cCYmcC5yZXMsZD1wJiZwLnVzZWRLZXl8fGEsZz1wJiZwLmV4YWN0VXNlZEtleXx8YSx2PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoaCkseT1bIltvYmplY3QgTnVtYmVyXSIsIltvYmplY3QgRnVuY3Rpb25dIiwiW29iamVjdCBSZWdFeHBdIl0sbT12b2lkIDAhPT1lLmpvaW5BcnJheXM%2FZS5qb2luQXJyYXlzOnRoaXMub3B0aW9ucy5qb2luQXJyYXlzLGI9IXRoaXMuaTE4bkZvcm1hdHx8dGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0LHg9InN0cmluZyIhPXR5cGVvZiBoJiYiYm9vbGVhbiIhPXR5cGVvZiBoJiYibnVtYmVyIiE9dHlwZW9mIGg7aWYoYiYmaCYmeCYmeS5pbmRleE9mKHYpPDAmJigic3RyaW5nIiE9dHlwZW9mIG18fCJbb2JqZWN0IEFycmF5XSIhPT12KSl7aWYoIWUucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKSx0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIoZCxoLGUpOiJrZXkgJyIuY29uY2F0KGEsIiAoIikuY29uY2F0KHRoaXMubGFuZ3VhZ2UsIiknIHJldHVybmVkIGFuIG9iamVjdCBpbnN0ZWFkIG9mIHN0cmluZy4iKTtpZihvKXt2YXIgdz0iW29iamVjdCBBcnJheV0iPT09dixrPXc%2FW106e30sUz13P2c6ZDtmb3IodmFyIEUgaW4gaClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaCxFKSl7dmFyIFQ9IiIuY29uY2F0KFMpLmNvbmNhdChvKS5jb25jYXQoRSk7a1tFXT10aGlzLnRyYW5zbGF0ZShULER0KHt9LGUse2pvaW5BcnJheXM6ITEsbnM6c30pKSxrW0VdPT09VCYmKGtbRV09aFtFXSl9aD1rfX1lbHNlIGlmKGImJiJzdHJpbmciPT10eXBlb2YgbSYmIltvYmplY3QgQXJyYXldIj09PXYpKGg9aC5qb2luKG0pKSYmKGg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLHQsZSxuKSk7ZWxzZXt2YXIgQT0hMSxPPSExO2lmKCF0aGlzLmlzVmFsaWRMb29rdXAoaCkmJnZvaWQgMCE9PWUuZGVmYXVsdFZhbHVlKXtpZihBPSEwLHZvaWQgMCE9PWUuY291bnQpe3ZhciBDPXRoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KGMsZS5jb3VudCk7aD1lWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChDKV19aHx8KGg9ZS5kZWZhdWx0VmFsdWUpfXRoaXMuaXNWYWxpZExvb2t1cChoKXx8KE89ITAsaD1hKTt2YXIgaj1lLmRlZmF1bHRWYWx1ZSYmZS5kZWZhdWx0VmFsdWUhPT1oJiZ0aGlzLm9wdGlvbnMudXBkYXRlTWlzc2luZztpZihPfHxBfHxqKXtpZih0aGlzLmxvZ2dlci5sb2coaj8idXBkYXRlS2V5IjoibWlzc2luZ0tleSIsYyx1LGEsaj9lLmRlZmF1bHRWYWx1ZTpoKSxvKXt2YXIgTD10aGlzLnJlc29sdmUoYSxEdCh7fSxlLHtrZXlTZXBhcmF0b3I6ITF9KSk7TCYmTC5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgUD1bXSxSPXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxlLmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZSJiZSWzBdKWZvcih2YXIgTj0wO048Ui5sZW5ndGg7TisrKVAucHVzaChSW05dKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9QPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZS5sbmd8fHRoaXMubGFuZ3VhZ2UpOlAucHVzaChlLmxuZ3x8dGhpcy5sYW5ndWFnZSk7dmFyIEk9ZnVuY3Rpb24odCxuKXtyLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI%2Fci5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKHQsdSxuLGo%2FZS5kZWZhdWx0VmFsdWU6aCxqLGUpOnIuYmFja2VuZENvbm5lY3RvciYmci5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcodCx1LG4saj9lLmRlZmF1bHRWYWx1ZTpoLGosZSksci5lbWl0KCJtaXNzaW5nS2V5Iix0LHUsbixoKX07aWYodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nKXt2YXIgRD12b2lkIDAhPT1lLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIGUuY291bnQ7dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nUGx1cmFscyYmRD9QLmZvckVhY2goZnVuY3Rpb24odCl7ci5wbHVyYWxSZXNvbHZlci5nZXRQbHVyYWxGb3Jtc09mS2V5KHQsYSkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gSShbdF0sZSl9KX0pOkkoUCxhKX19aD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLHAsbiksTyYmaD09PWEmJnRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXkmJihoPSIiLmNvbmNhdCh1LCI6IikuY29uY2F0KGEpKSxPJiZ0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlciYmKGg9dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoaCkpfXJldHVybiBofX0se2tleToiZXh0ZW5kVHJhbnNsYXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztpZih0aGlzLmkxOG5Gb3JtYXQmJnRoaXMuaTE4bkZvcm1hdC5wYXJzZSl0PXRoaXMuaTE4bkZvcm1hdC5wYXJzZSh0LG4sci51c2VkTG5nLHIudXNlZE5TLHIudXNlZEtleSx7cmVzb2x2ZWQ6cn0pO2Vsc2UgaWYoIW4uc2tpcEludGVycG9sYXRpb24pe24uaW50ZXJwb2xhdGlvbiYmdGhpcy5pbnRlcnBvbGF0b3IuaW5pdChEdCh7fSxuLHtpbnRlcnBvbGF0aW9uOkR0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLG4uaW50ZXJwb2xhdGlvbil9KSk7dmFyIGEscz1uLmludGVycG9sYXRpb24mJm4uaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztpZihzKXt2YXIgdT10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2E9dSYmdS5sZW5ndGh9dmFyIGM9bi5yZXBsYWNlJiYic3RyaW5nIiE9dHlwZW9mIG4ucmVwbGFjZT9uLnJlcGxhY2U6bjtpZih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzJiYoYz1EdCh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzLGMpKSx0PXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHQsYyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSxuKSxzKXt2YXIgbD10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2E8KGwmJmwubGVuZ3RoKSYmKG4ubmVzdD0hMSl9ITEhPT1uLm5lc3QmJih0PXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QodCxmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KHQpLGE9MDthPHQ7YSsrKXJbYV09YXJndW1lbnRzW2FdO3JldHVybiBvJiZvWzBdPT09clswXSYmIW4uY29udGV4dD8oaS5sb2dnZXIud2FybigiSXQgc2VlbXMgeW91IGFyZSBuZXN0aW5nIHJlY3Vyc2l2ZWx5IGtleTogIi5jb25jYXQoclswXSwiIGluIGtleTogIikuY29uY2F0KGVbMF0pKSxudWxsKTppLnRyYW5zbGF0ZS5hcHBseShpLHIuY29uY2F0KFtlXSkpfSxuKSksbi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5yZXNldCgpfXZhciBmPW4ucG9zdFByb2Nlc3N8fHRoaXMub3B0aW9ucy5wb3N0UHJvY2VzcyxwPSJzdHJpbmciPT10eXBlb2YgZj9bZl06ZjtyZXR1cm4gbnVsbCE9dCYmcCYmcC5sZW5ndGgmJiExIT09bi5hcHBseVBvc3RQcm9jZXNzb3ImJih0PWllLmhhbmRsZShwLHQsZSx0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5wb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZD9EdCh7aTE4blJlc29sdmVkOnJ9LG4pOm4sdGhpcykpLHR9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGE9dGhpcyxzPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe3ZhciB1PWEuZXh0cmFjdEZyb21LZXkodCxzKSxjPXUua2V5O249Yzt2YXIgbD11Lm5hbWVzcGFjZXM7YS5vcHRpb25zLmZhbGxiYWNrTlMmJihsPWwuY29uY2F0KGEub3B0aW9ucy5mYWxsYmFja05TKSk7dmFyIGY9dm9pZCAwIT09cy5jb3VudCYmInN0cmluZyIhPXR5cGVvZiBzLmNvdW50LHA9dm9pZCAwIT09cy5jb250ZXh0JiYic3RyaW5nIj09dHlwZW9mIHMuY29udGV4dCYmIiIhPT1zLmNvbnRleHQsaD1zLmxuZ3M%2Fcy5sbmdzOmEubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkocy5sbmd8fGEubGFuZ3VhZ2Uscy5mYWxsYmFja0xuZyk7bC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EuaXNWYWxpZExvb2t1cChlKXx8KGk9dCwhYWVbIiIuY29uY2F0KGhbMF0sIi0iKS5jb25jYXQodCldJiZhLnV0aWxzJiZhLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIWEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGkpJiYoYWVbIiIuY29uY2F0KGhbMF0sIi0iKS5jb25jYXQodCldPSEwLGEubG9nZ2VyLndhcm4oJ2tleSAiJy5jb25jYXQobiwnIiBmb3IgbGFuZ3VhZ2VzICInKS5jb25jYXQoaC5qb2luKCIsICIpLCciIHdvblwndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICInKS5jb25jYXQoaSwnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLGguZm9yRWFjaChmdW5jdGlvbihuKXtpZighYS5pc1ZhbGlkTG9va3VwKGUpKXtvPW47dmFyIGksdSxsPWMsaD1bbF07aWYoYS5pMThuRm9ybWF0JiZhLmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cylhLmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cyhoLGMsbix0LHMpO2Vsc2UgZiYmKGk9YS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgobixzLmNvdW50KSksZiYmcCYmaC5wdXNoKGwraSkscCYmaC5wdXNoKGwrPSIiLmNvbmNhdChhLm9wdGlvbnMuY29udGV4dFNlcGFyYXRvcikuY29uY2F0KHMuY29udGV4dCkpLGYmJmgucHVzaChsKz1pKTtmb3IoO3U9aC5wb3AoKTspYS5pc1ZhbGlkTG9va3VwKGUpfHwocj11LGU9YS5nZXRSZXNvdXJjZShuLHQsdSxzKSl9fSkpfSl9fSkse3JlczplLHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOm8sdXNlZE5TOml9fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISh2b2lkIDA9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybk51bGwmJm51bGw9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiYiIj09PXQpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSh0LGUsbixyKTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UodCxlLG4scil9fV0pLGV9KCk7ZnVuY3Rpb24gdWUodCl7cmV0dXJuIHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX12YXIgY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe190KHRoaXMsdCksdGhpcy5vcHRpb25zPWUsdGhpcy53aGl0ZWxpc3Q9dGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3N8fCExLHRoaXMuc3VwcG9ydGVkTG5ncz10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5sb2dnZXI9JHQuY3JlYXRlKCJsYW5ndWFnZVV0aWxzIil9cmV0dXJuIFV0KHQsW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiAyPT09ZS5sZW5ndGg%2FbnVsbDooZS5wb3AoKSwieCI9PT1lW2UubGVuZ3RoLTFdLnRvTG93ZXJDYXNlKCk%2FbnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlLmpvaW4oIi0iKSkpfX0se2tleToiZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0fHx0LmluZGV4T2YoIi0iKTwwKXJldHVybiB0O3ZhciBlPXQuc3BsaXQoIi0iKTtyZXR1cm4gdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoZVswXSl9fSx7a2V5OiJmb3JtYXRMYW5ndWFnZUNvZGUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmdC5pbmRleE9mKCItIik%2BLTEpe3ZhciBlPVsiaGFucyIsImhhbnQiLCJsYXRuIiwiY3lybCIsImNhbnMiLCJtb25nIiwiYXJhYiJdLG49dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP249bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX0pOjI9PT1uLmxlbmd0aD8oblswXT1uWzBdLnRvTG93ZXJDYXNlKCksblsxXT1uWzFdLnRvVXBwZXJDYXNlKCksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk%2BLTEmJihuWzFdPXVlKG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk%2BLTEmJihuWzFdPXVlKG5bMV0udG9Mb3dlckNhc2UoKSkpLGUuaW5kZXhPZihuWzJdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsyXT11ZShuWzJdLnRvTG93ZXJDYXNlKCkpKSksbi5qb2luKCItIil9cmV0dXJuIHRoaXMub3B0aW9ucy5jbGVhbkNvZGV8fHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc%2FdC50b0xvd2VyQ2FzZSgpOnR9fSx7a2V5OiJpc1doaXRlbGlzdGVkIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJsYW5ndWFnZVV0aWxzLmlzV2hpdGVsaXN0ZWQiLCdmdW5jdGlvbiAiaXNXaGl0ZWxpc3RlZCIgd2lsbCBiZSByZW5hbWVkIHRvICJpc1N1cHBvcnRlZENvZGUiIGluIHRoZSBuZXh0IG1ham9yIC0gcGxlYXNlIG1ha2Ugc3VyZSB0byByZW5hbWUgaXRcJ3MgdXNhZ2UgYXNhcC4nKSx0aGlzLmlzU3VwcG9ydGVkQ29kZSh0KX19LHtrZXk6ImlzU3VwcG9ydGVkQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuKCJsYW5ndWFnZU9ubHkiPT09dGhpcy5vcHRpb25zLmxvYWR8fHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpJiYodD10aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSwhdGhpcy5zdXBwb3J0ZWRMbmdzfHwhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aHx8dGhpcy5zdXBwb3J0ZWRMbmdzLmluZGV4T2YodCk%2BLTF9fSx7a2V5OiJnZXRCZXN0TWF0Y2hGcm9tQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcztyZXR1cm4gdD8odC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmZvcm1hdExhbmd1YWdlQ29kZSh0KTtuLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmIW4uaXNTdXBwb3J0ZWRDb2RlKHIpfHwoZT1yKX19KSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJnQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighZSl7dmFyIHI9bi5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KTtpZihuLmlzU3VwcG9ydGVkQ29kZShyKSlyZXR1cm4gZT1yO2U9bi5vcHRpb25zLnN1cHBvcnRlZExuZ3MuZmluZChmdW5jdGlvbih0KXtpZigwPT09dC5pbmRleE9mKHIpKXJldHVybiB0fSl9fSksZXx8KGU9dGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF0pLGUpOm51bGx9fSx7a2V5OiJnZXRGYWxsYmFja0NvZGVzIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybltdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD10KGUpKSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodCkpcmV0dXJuIHQ7aWYoIWUpcmV0dXJuIHQuZGVmYXVsdHx8W107dmFyIG49dFtlXTtyZXR1cm4gbnx8KG49dFt0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShlKV0pLG58fChuPXRbdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoZSldKSxufHwobj10W3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoZSldKSxufHwobj10LmRlZmF1bHQpLG58fFtdfX0se2tleToidG9SZXNvbHZlSGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldEZhbGxiYWNrQ29kZXMoZXx8dGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nfHxbXSx0KSxvPVtdLGk9ZnVuY3Rpb24odCl7dCYmKG4uaXNTdXBwb3J0ZWRDb2RlKHQpP28ucHVzaCh0KTpuLmxvZ2dlci53YXJuKCJyZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogIi5jb25jYXQodCkpKX07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMT8oImxhbmd1YWdlT25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksImxhbmd1YWdlT25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmImN1cnJlbnRPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKHQpKSwiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KSkpOiJzdHJpbmciPT10eXBlb2YgdCYmaSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksci5mb3JFYWNoKGZ1bmN0aW9uKHQpe28uaW5kZXhPZih0KTwwJiZpKG4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKX0pLG99fV0pLHR9KCksbGU9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0aSIsInRyIiwidXoiLCJ3YSJdLG5yOlsxLDJdLGZjOjF9LHtsbmdzOlsiYWYiLCJhbiIsImFzdCIsImF6IiwiYmciLCJibiIsImNhIiwiZGEiLCJkZSIsImRldiIsImVsIiwiZW4iLCJlbyIsImVzIiwiZXQiLCJldSIsImZpIiwiZm8iLCJmdXIiLCJmeSIsImdsIiwiZ3UiLCJoYSIsImhpIiwiaHUiLCJoeSIsImlhIiwiaXQiLCJrbiIsImt1IiwibGIiLCJtYWkiLCJtbCIsIm1uIiwibXIiLCJuYWgiLCJuYXAiLCJuYiIsIm5lIiwibmwiLCJubiIsIm5vIiwibnNvIiwicGEiLCJwYXAiLCJwbXMiLCJwcyIsInB0LVBUIiwicm0iLCJzY28iLCJzZSIsInNpIiwic28iLCJzb24iLCJzcSIsInN2Iiwic3ciLCJ0YSIsInRlIiwidGsiLCJ1ciIsInlvIl0sbnI6WzEsMl0sZmM6Mn0se2xuZ3M6WyJheSIsImJvIiwiY2dnIiwiZmEiLCJodCIsImlkIiwiamEiLCJqYm8iLCJrYSIsImtrIiwia20iLCJrbyIsImt5IiwibG8iLCJtcyIsInNhaCIsInN1IiwidGgiLCJ0dCIsInVnIiwidmkiLCJ3byIsInpoIl0sbnI6WzFdLGZjOjN9LHtsbmdzOlsiYmUiLCJicyIsImNuciIsImR6IiwiaHIiLCJydSIsInNyIiwidWsiXSxucjpbMSwyLDVdLGZjOjR9LHtsbmdzOlsiYXIiXSxucjpbMCwxLDIsMywxMSwxMDBdLGZjOjV9LHtsbmdzOlsiY3MiLCJzayJdLG5yOlsxLDIsNV0sZmM6Nn0se2xuZ3M6WyJjc2IiLCJwbCJdLG5yOlsxLDIsNV0sZmM6N30se2xuZ3M6WyJjeSJdLG5yOlsxLDIsMyw4XSxmYzo4fSx7bG5nczpbImZyIl0sbnI6WzEsMl0sZmM6OX0se2xuZ3M6WyJnYSJdLG5yOlsxLDIsMyw3LDExXSxmYzoxMH0se2xuZ3M6WyJnZCJdLG5yOlsxLDIsMywyMF0sZmM6MTF9LHtsbmdzOlsiaXMiXSxucjpbMSwyXSxmYzoxMn0se2xuZ3M6WyJqdiJdLG5yOlswLDFdLGZjOjEzfSx7bG5nczpbImt3Il0sbnI6WzEsMiwzLDRdLGZjOjE0fSx7bG5nczpbImx0Il0sbnI6WzEsMiwxMF0sZmM6MTV9LHtsbmdzOlsibHYiXSxucjpbMSwyLDBdLGZjOjE2fSx7bG5nczpbIm1rIl0sbnI6WzEsMl0sZmM6MTd9LHtsbmdzOlsibW5rIl0sbnI6WzAsMSwyXSxmYzoxOH0se2xuZ3M6WyJtdCJdLG5yOlsxLDIsMTEsMjBdLGZjOjE5fSx7bG5nczpbIm9yIl0sbnI6WzIsMV0sZmM6Mn0se2xuZ3M6WyJybyJdLG5yOlsxLDIsMjBdLGZjOjIwfSx7bG5nczpbInNsIl0sbnI6WzUsMSwyLDNdLGZjOjIxfSx7bG5nczpbImhlIiwiaXciXSxucjpbMSwyLDIwLDIxXSxmYzoyMn1dLGZlPXsxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD4xKX0sMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDEhPXQpfSwzOmZ1bmN0aW9uKHQpe3JldHVybiAwfSw0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjI9PXQ%2FMjp0JTEwMD49MyYmdCUxMDA8PTEwPzM6dCUxMDA%2BPTExPzQ6NSl9LDY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dD49MiYmdDw9ND8xOjIpfSw3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOnQlMTA%2BPTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA%2BPTIwKT8xOjIpfSw4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMTo4IT10JiYxMSE9dD8yOjMpfSw5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD49Mil9LDEwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMTp0PDc%2FMjp0PDExPzM6NCl9LDExOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dHx8MTE9PXQ%2FMDoyPT10fHwxMj09dD8xOnQ%2BMiYmdDwyMD8yOjMpfSwxMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAhPTF8fHQlMTAwPT0xMSl9LDEzOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMCE9PXQpfSwxNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ%2FMDoyPT10PzE6Mz09dD8yOjMpfSwxNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA%2BPTImJih0JTEwMDwxMHx8dCUxMDA%2BPTIwKT8xOjIpfSwxNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOjAhPT10PzE6Mil9LDE3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dHx8dCUxMD09MSYmdCUxMDAhPTExPzA6MSl9LDE4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMD09dD8wOjE9PXQ%2FMToyKX0sMTk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6MD09dHx8dCUxMDA%2BMSYmdCUxMDA8MTE%2FMTp0JTEwMD4xMCYmdCUxMDA8MjA%2FMjozKX0sMjA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6MD09dHx8dCUxMDA%2BMCYmdCUxMDA8MjA%2FMToyKX0sMjE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwMD09MT8xOnQlMTAwPT0yPzI6dCUxMDA9PTN8fHQlMTAwPT00PzM6MCl9LDIyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMToodDwwfHx0PjEwKSYmdCUxMD09MD8yOjMpfX07dmFyIHBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbixyPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtfdCh0aGlzLHQpLHRoaXMubGFuZ3VhZ2VVdGlscz1lLHRoaXMub3B0aW9ucz1yLHRoaXMubG9nZ2VyPSR0LmNyZWF0ZSgicGx1cmFsUmVzb2x2ZXIiKSx0aGlzLnJ1bGVzPShuPXt9LGxlLmZvckVhY2goZnVuY3Rpb24odCl7dC5sbmdzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlXT17bnVtYmVyczp0Lm5yLHBsdXJhbHM6ZmVbdC5mY119fSl9KSxuKX1yZXR1cm4gVXQodCxbe2tleToiYWRkUnVsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLnJ1bGVzW3RdPWV9fSx7a2V5OiJnZXRSdWxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ydWxlc1t0XXx8dGhpcy5ydWxlc1t0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCldfX0se2tleToibmVlZHNQbHVyYWwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gZSYmZS5udW1iZXJzLmxlbmd0aD4xfX0se2tleToiZ2V0UGx1cmFsRm9ybXNPZktleSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9W10sbz10aGlzLmdldFJ1bGUodCk7cmV0dXJuIG8%2FKG8ubnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPW4uZ2V0U3VmZml4KHQsbyk7ci5wdXNoKCIiLmNvbmNhdChlKS5jb25jYXQoaSkpfSkscik6cn19LHtrZXk6ImdldFN1ZmZpeCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5nZXRSdWxlKHQpO2lmKHIpe3ZhciBvPXIubm9BYnM%2Fci5wbHVyYWxzKGUpOnIucGx1cmFscyhNYXRoLmFicyhlKSksaT1yLm51bWJlcnNbb107dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4JiYyPT09ci5udW1iZXJzLmxlbmd0aCYmMT09PXIubnVtYmVyc1swXSYmKDI9PT1pP2k9InBsdXJhbCI6MT09PWkmJihpPSIiKSk7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gbi5vcHRpb25zLnByZXBlbmQmJmkudG9TdHJpbmcoKT9uLm9wdGlvbnMucHJlcGVuZCtpLnRvU3RyaW5nKCk6aS50b1N0cmluZygpfTtyZXR1cm4idjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPzE9PT1pPyIiOiJudW1iZXIiPT10eXBlb2YgaT8iX3BsdXJhbF8iLmNvbmNhdChpLnRvU3RyaW5nKCkpOmEoKToidjIiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OP2EoKTp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdP2EoKTp0aGlzLm9wdGlvbnMucHJlcGVuZCYmby50b1N0cmluZygpP3RoaXMub3B0aW9ucy5wcmVwZW5kK28udG9TdHJpbmcoKTpvLnRvU3RyaW5nKCl9cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIm5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogIi5jb25jYXQodCkpLCIifX1dKSx0fSgpLGhlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtfdCh0aGlzLHQpLHRoaXMubG9nZ2VyPSR0LmNyZWF0ZSgiaW50ZXJwb2xhdG9yIiksdGhpcy5vcHRpb25zPWUsdGhpcy5mb3JtYXQ9ZS5pbnRlcnBvbGF0aW9uJiZlLmludGVycG9sYXRpb24uZm9ybWF0fHxmdW5jdGlvbih0KXtyZXR1cm4gdH0sdGhpcy5pbml0KGUpfXJldHVybiBVdCh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0LmludGVycG9sYXRpb258fCh0LmludGVycG9sYXRpb249e2VzY2FwZVZhbHVlOiEwfSk7dmFyIGU9dC5pbnRlcnBvbGF0aW9uO3RoaXMuZXNjYXBlPXZvaWQgMCE9PWUuZXNjYXBlP2UuZXNjYXBlOm5lLHRoaXMuZXNjYXBlVmFsdWU9dm9pZCAwPT09ZS5lc2NhcGVWYWx1ZXx8ZS5lc2NhcGVWYWx1ZSx0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGU9dm9pZCAwIT09ZS51c2VSYXdWYWx1ZVRvRXNjYXBlJiZlLnVzZVJhd1ZhbHVlVG9Fc2NhcGUsdGhpcy5wcmVmaXg9ZS5wcmVmaXg%2FdGUoZS5wcmVmaXgpOmUucHJlZml4RXNjYXBlZHx8Int7Iix0aGlzLnN1ZmZpeD1lLnN1ZmZpeD90ZShlLnN1ZmZpeCk6ZS5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1lLnVuZXNjYXBlU3VmZml4PyIiOmUudW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg%2FIiI6ZS51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PWUubmVzdGluZ1ByZWZpeD90ZShlLm5lc3RpbmdQcmVmaXgpOmUubmVzdGluZ1ByZWZpeEVzY2FwZWR8fHRlKCIkdCgiKSx0aGlzLm5lc3RpbmdTdWZmaXg9ZS5uZXN0aW5nU3VmZml4P3RlKGUubmVzdGluZ1N1ZmZpeCk6ZS5uZXN0aW5nU3VmZml4RXNjYXBlZHx8dGUoIikiKSx0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yPWUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I%2FZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjplLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yfHwiLCIsdGhpcy5tYXhSZXBsYWNlcz1lLm1heFJlcGxhY2VzP2UubWF4UmVwbGFjZXM6MWUzLHRoaXMuYWx3YXlzRm9ybWF0PXZvaWQgMCE9PWUuYWx3YXlzRm9ybWF0JiZlLmFsd2F5c0Zvcm1hdCx0aGlzLnJlc2V0UmVnRXhwKCl9fSx7a2V5OiJyZXNldCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMmJnRoaXMuaW5pdCh0aGlzLm9wdGlvbnMpfX0se2tleToicmVzZXRSZWdFeHAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9IiIuY29uY2F0KHRoaXMucHJlZml4LCIoLis%2FKSIpLmNvbmNhdCh0aGlzLnN1ZmZpeCk7dGhpcy5yZWdleHA9bmV3IFJlZ0V4cCh0LCJnIik7dmFyIGU9IiIuY29uY2F0KHRoaXMucHJlZml4KS5jb25jYXQodGhpcy51bmVzY2FwZVByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy51bmVzY2FwZVN1ZmZpeCkuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cFVuZXNjYXBlPW5ldyBSZWdFeHAoZSwiZyIpO3ZhciBuPSIiLmNvbmNhdCh0aGlzLm5lc3RpbmdQcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMubmVzdGluZ1N1ZmZpeCk7dGhpcy5uZXN0aW5nUmVnZXhwPW5ldyBSZWdFeHAobiwiZyIpfX0se2tleToiaW50ZXJwb2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzPXRoaXMsdT10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uJiZ0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzfHx7fTtmdW5jdGlvbiBjKHQpe3JldHVybiB0LnJlcGxhY2UoL1wkL2csIiQkJCQiKX12YXIgbD1mdW5jdGlvbih0KXtpZih0LmluZGV4T2Yocy5mb3JtYXRTZXBhcmF0b3IpPDApe3ZhciBvPVF0KGUsdSx0KTtyZXR1cm4gcy5hbHdheXNGb3JtYXQ%2Fcy5mb3JtYXQobyx2b2lkIDAsbik6b312YXIgaT10LnNwbGl0KHMuZm9ybWF0U2VwYXJhdG9yKSxhPWkuc2hpZnQoKS50cmltKCksYz1pLmpvaW4ocy5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtyZXR1cm4gcy5mb3JtYXQoUXQoZSx1LGEpLGMsbixyKX07dGhpcy5yZXNldFJlZ0V4cCgpO3ZhciBmPXImJnIubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyfHx0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyLHA9ciYmci5pbnRlcnBvbGF0aW9uJiZyLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzfHx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM7cmV0dXJuW3tyZWdleDp0aGlzLnJlZ2V4cFVuZXNjYXBlLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gYyh0KX19LHtyZWdleDp0aGlzLnJlZ2V4cCxzYWZlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHMuZXNjYXBlVmFsdWU%2FYyhzLmVzY2FwZSh0KSk6Yyh0KX19XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihhPTA7bz1lLnJlZ2V4LmV4ZWModCk7KXtpZih2b2lkIDA9PT0oaT1sKG9bMV0udHJpbSgpKSkpaWYoImZ1bmN0aW9uIj09dHlwZW9mIGYpe3ZhciBuPWYodCxvLHIpO2k9InN0cmluZyI9PXR5cGVvZiBuP246IiJ9ZWxzZXtpZihwKXtpPW9bMF07Y29udGludWV9cy5sb2dnZXIud2FybigibWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgIi5jb25jYXQob1sxXSwiIGZvciBpbnRlcnBvbGF0aW5nICIpLmNvbmNhdCh0KSksaT0iIn1lbHNlInN0cmluZyI9PXR5cGVvZiBpfHxzLnVzZVJhd1ZhbHVlVG9Fc2NhcGV8fChpPUd0KGkpKTtpZih0PXQucmVwbGFjZShvWzBdLGUuc2FmZVZhbHVlKGkpKSxlLnJlZ2V4Lmxhc3RJbmRleD0wLCsrYT49cy5tYXhSZXBsYWNlcylicmVha319KSx0fX0se2tleToibmVzdCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG89dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg%2BMiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxhPUR0KHt9LGkpO2Z1bmN0aW9uIHModCxlKXt2YXIgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHQuaW5kZXhPZihuKTwwKXJldHVybiB0O3ZhciByPXQuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQobiwiWyBdKnsiKSkpLG89InsiLmNvbmNhdChyWzFdKTt0PXJbMF0sbz0obz10aGlzLmludGVycG9sYXRlKG8sYSkpLnJlcGxhY2UoLycvZywnIicpO3RyeXthPUpTT04ucGFyc2UobyksZSYmKGE9RHQoe30sZSxhKSl9Y2F0Y2goZSl7cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImZhaWxlZCBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nIGluIG5lc3RpbmcgZm9yIGtleSAiLmNvbmNhdCh0KSxlKSwiIi5jb25jYXQodCkuY29uY2F0KG4pLmNvbmNhdChvKX1yZXR1cm4gZGVsZXRlIGEuZGVmYXVsdFZhbHVlLHR9Zm9yKGEuYXBwbHlQb3N0UHJvY2Vzc29yPSExLGRlbGV0ZSBhLmRlZmF1bHRWYWx1ZTtuPXRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKHQpOyl7dmFyIHU9W10sYz0hMTtpZihuWzBdLmluY2x1ZGVzKHRoaXMuZm9ybWF0U2VwYXJhdG9yKSYmIS97Lip9Ly50ZXN0KG5bMV0pKXt2YXIgbD1uWzFdLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSk7blsxXT1sLnNoaWZ0KCksdT1sLGM9ITB9aWYoKHI9ZShzLmNhbGwodGhpcyxuWzFdLnRyaW0oKSxhKSxhKSkmJm5bMF09PT10JiYic3RyaW5nIiE9dHlwZW9mIHIpcmV0dXJuIHI7InN0cmluZyIhPXR5cGVvZiByJiYocj1HdChyKSkscnx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG5bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHI9IiIpLGMmJihyPXUucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uZm9ybWF0KHQsZSxpLmxuZyxpKX0sci50cmltKCkpKSx0PXQucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiB0fX1dKSx0fSgpO3ZhciBkZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsbixyKXt2YXIgbyxpPWFyZ3VtZW50cy5sZW5ndGg%2BMyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gX3QodGhpcyxlKSxvPXF0KHRoaXMsRnQoZSkuY2FsbCh0aGlzKSkscmUmJlZ0LmNhbGwoQnQobykpLG8uYmFja2VuZD10LG8uc3RvcmU9bixvLnNlcnZpY2VzPXIsby5sYW5ndWFnZVV0aWxzPXIubGFuZ3VhZ2VVdGlscyxvLm9wdGlvbnM9aSxvLmxvZ2dlcj0kdC5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSxvLnN0YXRlPXt9LG8ucXVldWU9W10sby5iYWNrZW5kJiZvLmJhY2tlbmQuaW5pdCYmby5iYWNrZW5kLmluaXQocixpLmJhY2tlbmQsaSksb31yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToicXVldWVMb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz10aGlzLGk9W10sYT1bXSxzPVtdLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj0hMDtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHM9IiIuY29uY2F0KHQsInwiKS5jb25jYXQoZSk7IW4ucmVsb2FkJiZvLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHQsZSk%2Fby5zdGF0ZVtzXT0yOm8uc3RhdGVbc108MHx8KDE9PT1vLnN0YXRlW3NdP2EuaW5kZXhPZihzKTwwJiZhLnB1c2gocyk6KG8uc3RhdGVbc109MSxyPSExLGEuaW5kZXhPZihzKTwwJiZhLnB1c2gocyksaS5pbmRleE9mKHMpPDAmJmkucHVzaChzKSx1LmluZGV4T2YoZSk8MCYmdS5wdXNoKGUpKSl9KSxyfHxzLnB1c2godCl9KSwoaS5sZW5ndGh8fGEubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOmEsbG9hZGVkOnt9LGVycm9yczpbXSxjYWxsYmFjazpyfSkse3RvTG9hZDppLHBlbmRpbmc6YSx0b0xvYWRMYW5ndWFnZXM6cyx0b0xvYWROYW1lc3BhY2VzOnV9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5zcGxpdCgifCIpLG89clswXSxpPXJbMV07ZSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixvLGksZSksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShvLGksbiksdGhpcy5zdGF0ZVt0XT1lPy0xOjI7dmFyIGE9e307dGhpcy5xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKG4peyFmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1LdCh0LGUsT2JqZWN0KSxpPW8ub2JqLGE9by5rO2lbYV09aVthXXx8W10sciYmKGlbYV09aVthXS5jb25jYXQobikpLHJ8fGlbYV0ucHVzaChuKX0obi5sb2FkZWQsW29dLGkpLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuaW5kZXhPZihlKTstMSE9PW47KXQuc3BsaWNlKG4sMSksbj10LmluZGV4T2YoZSl9KG4ucGVuZGluZyx0KSxlJiZuLmVycm9ycy5wdXNoKGUpLDAhPT1uLnBlbmRpbmcubGVuZ3RofHxuLmRvbmV8fChPYmplY3Qua2V5cyhuLmxvYWRlZCkuZm9yRWFjaChmdW5jdGlvbih0KXthW3RdfHwoYVt0XT1bXSksbi5sb2FkZWRbdF0ubGVuZ3RoJiZuLmxvYWRlZFt0XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2FbdF0uaW5kZXhPZihlKTwwJiZhW3RdLnB1c2goZSl9KX0pLG4uZG9uZT0hMCxuLmVycm9ycy5sZW5ndGg%2Fbi5jYWxsYmFjayhuLmVycm9ycyk6bi5jYWxsYmFjaygpKX0pLHRoaXMuZW1pdCgibG9hZGVkIixhKSx0aGlzLnF1ZXVlPXRoaXMucXVldWUuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRvbmV9KX19LHtrZXk6InJlYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10%2FYXJndW1lbnRzWzNdOjAsaT1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MzUwLGE9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7cmV0dXJuIHQubGVuZ3RoP3RoaXMuYmFja2VuZFtuXSh0LGUsZnVuY3Rpb24ocyx1KXtzJiZ1JiZvPDU%2Fc2V0VGltZW91dChmdW5jdGlvbigpe3IucmVhZC5jYWxsKHIsdCxlLG4sbysxLDIqaSxhKX0saSk6YShzLHUpfSk6YShudWxsLHt9KX19LHtrZXk6InByZXBhcmVMb2FkaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30sbz1hcmd1bWVudHMubGVuZ3RoPjM%2FYXJndW1lbnRzWzNdOnZvaWQgMDtpZighdGhpcy5iYWNrZW5kKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLiIpLG8mJm8oKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkpLCJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKTt2YXIgaT10aGlzLnF1ZXVlTG9hZCh0LGUscixvKTtpZighaS50b0xvYWQubGVuZ3RoKXJldHVybiBpLnBlbmRpbmcubGVuZ3RofHxvKCksbnVsbDtpLnRvTG9hZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ubG9hZE9uZSh0KX0pfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMucHJlcGFyZUxvYWRpbmcodCxlLHt9LG4pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse3JlbG9hZDohMH0sbil9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOiIiLHI9dC5zcGxpdCgifCIpLG89clswXSxpPXJbMV07dGhpcy5yZWFkKG8saSwicmVhZCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihyLGEpe3ImJmUubG9nZ2VyLndhcm4oIiIuY29uY2F0KG4sImxvYWRpbmcgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvLCIgZmFpbGVkIiksciksIXImJmEmJmUubG9nZ2VyLmxvZygiIi5jb25jYXQobiwibG9hZGVkIG5hbWVzcGFjZSAiKS5jb25jYXQoaSwiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQobyksYSksZS5sb2FkZWQodCxyLGEpfSl9fSx7a2V5OiJzYXZlTWlzc2luZyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e307dGhpcy5zZXJ2aWNlcy51dGlscyYmdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShlKT90aGlzLmxvZ2dlci53YXJuKCdkaWQgbm90IHNhdmUga2V5ICInLmNvbmNhdChuLCciIGFzIHRoZSBuYW1lc3BhY2UgIicpLmNvbmNhdChlLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKTpudWxsIT1uJiYiIiE9PW4mJih0aGlzLmJhY2tlbmQmJnRoaXMuYmFja2VuZC5jcmVhdGUmJnRoaXMuYmFja2VuZC5jcmVhdGUodCxlLG4scixudWxsLER0KHt9LGkse2lzVXBkYXRlOm99KSksdCYmdFswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZSh0WzBdLGUsbixyKSl9fV0pLGV9KCk7ZnVuY3Rpb24gZ2UoKXtyZXR1cm57ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsd2hpdGVsaXN0OiExLG5vbkV4cGxpY2l0V2hpdGVsaXN0OiExLHN1cHBvcnRlZExuZ3M6ITEsbm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzOiExLGxvYWQ6ImFsbCIscHJlbG9hZDohMSxzaW1wbGlmeVBsdXJhbFN1ZmZpeDohMCxrZXlTZXBhcmF0b3I6Ii4iLG5zU2VwYXJhdG9yOiI6IixwbHVyYWxTZXBhcmF0b3I6Il8iLGNvbnRleHRTZXBhcmF0b3I6Il8iLHBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzOiExLHNhdmVNaXNzaW5nOiExLHVwZGF0ZU1pc3Npbmc6ITEsc2F2ZU1pc3NpbmdUbzoiZmFsbGJhY2siLHNhdmVNaXNzaW5nUGx1cmFsczohMCxtaXNzaW5nS2V5SGFuZGxlcjohMSxtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXI6ITEscG9zdFByb2Nlc3M6ITEscG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ6ITEscmV0dXJuTnVsbDohMCxyZXR1cm5FbXB0eVN0cmluZzohMCxyZXR1cm5PYmplY3RzOiExLGpvaW5BcnJheXM6ITEscmV0dXJuZWRPYmplY3RIYW5kbGVyOiExLHBhcnNlTWlzc2luZ0tleUhhbmRsZXI6ITEsYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5OiExLGFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlOiExLG92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXt9O2lmKCJvYmplY3QiPT09TnQodFsxXSkmJihlPXRbMV0pLCJzdHJpbmciPT10eXBlb2YgdFsxXSYmKGUuZGVmYXVsdFZhbHVlPXRbMV0pLCJzdHJpbmciPT10eXBlb2YgdFsyXSYmKGUudERlc2NyaXB0aW9uPXRbMl0pLCJvYmplY3QiPT09TnQodFsyXSl8fCJvYmplY3QiPT09TnQodFszXSkpe3ZhciBuPXRbM118fHRbMl07T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW5bdF19KX1yZXR1cm4gZX0saW50ZXJwb2xhdGlvbjp7ZXNjYXBlVmFsdWU6ITAsZm9ybWF0OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0fSxwcmVmaXg6Int7IixzdWZmaXg6In19Iixmb3JtYXRTZXBhcmF0b3I6IiwiLHVuZXNjYXBlUHJlZml4OiItIixuZXN0aW5nUHJlZml4OiIkdCgiLG5lc3RpbmdTdWZmaXg6IikiLG5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOiIsIixtYXhSZXBsYWNlczoxZTMsc2tpcE9uVmFyaWFibGVzOiExfX19ZnVuY3Rpb24gdmUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0Lm5zJiYodC5ucz1bdC5uc10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja0xuZyYmKHQuZmFsbGJhY2tMbmc9W3QuZmFsbGJhY2tMbmddKSwic3RyaW5nIj09dHlwZW9mIHQuZmFsbGJhY2tOUyYmKHQuZmFsbGJhY2tOUz1bdC5mYWxsYmFja05TXSksdC53aGl0ZWxpc3QmJih0LndoaXRlbGlzdCYmdC53aGl0ZWxpc3QuaW5kZXhPZigiY2ltb2RlIik8MCYmKHQud2hpdGVsaXN0PXQud2hpdGVsaXN0LmNvbmNhdChbImNpbW9kZSJdKSksdC5zdXBwb3J0ZWRMbmdzPXQud2hpdGVsaXN0KSx0Lm5vbkV4cGxpY2l0V2hpdGVsaXN0JiYodC5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M9dC5ub25FeHBsaWNpdFdoaXRlbGlzdCksdC5zdXBwb3J0ZWRMbmdzJiZ0LnN1cHBvcnRlZExuZ3MuaW5kZXhPZigiY2ltb2RlIik8MCYmKHQuc3VwcG9ydGVkTG5ncz10LnN1cHBvcnRlZExuZ3MuY29uY2F0KFsiY2ltb2RlIl0pKSx0fWZ1bmN0aW9uIHllKCl7fXZhciBtZT1uZXcoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciB0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoX3QodGhpcyxlKSx0PXF0KHRoaXMsRnQoZSkuY2FsbCh0aGlzKSkscmUmJlZ0LmNhbGwoQnQodCkpLHQub3B0aW9ucz12ZShuKSx0LnNlcnZpY2VzPXt9LHQubG9nZ2VyPSR0LHQubW9kdWxlcz17ZXh0ZXJuYWw6W119LHImJiF0LmlzSW5pdGlhbGl6ZWQmJiFuLmlzQ2xvbmUpe2lmKCF0Lm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gdC5pbml0KG4scikscXQodCxCdCh0KSk7c2V0VGltZW91dChmdW5jdGlvbigpe3QuaW5pdChuLHIpfSwwKX1yZXR1cm4gdH1yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdD9uZXcgdDp0Om51bGx9aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUmJihuPWUsZT17fSksZS53aGl0ZWxpc3QmJiFlLnN1cHBvcnRlZExuZ3MmJnRoaXMubG9nZ2VyLmRlcHJlY2F0ZSgid2hpdGVsaXN0Iiwnb3B0aW9uICJ3aGl0ZWxpc3QiIHdpbGwgYmUgcmVuYW1lZCB0byAic3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLGUubm9uRXhwbGljaXRXaGl0ZWxpc3QmJiFlLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb25zICJub25FeHBsaWNpdFdoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MiIGluIHRoZSBuZXh0IG1ham9yIC0gcGxlYXNlIG1ha2Ugc3VyZSB0byByZW5hbWUgdGhpcyBvcHRpb24gYXNhcC4nKSx0aGlzLm9wdGlvbnM9RHQoe30sZ2UoKSx0aGlzLm9wdGlvbnMsdmUoZSkpLHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxufHwobj15ZSksIXRoaXMub3B0aW9ucy5pc0Nsb25lKXt0aGlzLm1vZHVsZXMubG9nZ2VyPyR0LmluaXQocih0aGlzLm1vZHVsZXMubG9nZ2VyKSx0aGlzLm9wdGlvbnMpOiR0LmluaXQobnVsbCx0aGlzLm9wdGlvbnMpO3ZhciBvPW5ldyBjZSh0aGlzLm9wdGlvbnMpO3RoaXMuc3RvcmU9bmV3IG9lKHRoaXMub3B0aW9ucy5yZXNvdXJjZXMsdGhpcy5vcHRpb25zKTt2YXIgaT10aGlzLnNlcnZpY2VzO2kubG9nZ2VyPSR0LGkucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLGkubGFuZ3VhZ2VVdGlscz1vLGkucGx1cmFsUmVzb2x2ZXI9bmV3IHBlKG8se3ByZXBlbmQ6dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcixjb21wYXRpYmlsaXR5SlNPTjp0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04sc2ltcGxpZnlQbHVyYWxTdWZmaXg6dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4fSksaS5pbnRlcnBvbGF0b3I9bmV3IGhlKHRoaXMub3B0aW9ucyksaS51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LGkuYmFja2VuZENvbm5lY3Rvcj1uZXcgZGUocih0aGlzLm1vZHVsZXMuYmFja2VuZCksaS5yZXNvdXJjZVN0b3JlLGksdGhpcy5vcHRpb25zKSxpLmJhY2tlbmRDb25uZWN0b3Iub24oIioiLGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4%2BMT9uLTE6MCksbz0xO288bjtvKyspcltvLTFdPWFyZ3VtZW50c1tvXTt0LmVtaXQuYXBwbHkodCxbZV0uY29uY2F0KHIpKX0pLHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yJiYoaS5sYW5ndWFnZURldGVjdG9yPXIodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpLGkubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KGksdGhpcy5vcHRpb25zLmRldGVjdGlvbix0aGlzLm9wdGlvbnMpKSx0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCYmKGkuaTE4bkZvcm1hdD1yKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSxpLmkxOG5Gb3JtYXQuaW5pdCYmaS5pMThuRm9ybWF0LmluaXQodGhpcykpLHRoaXMudHJhbnNsYXRvcj1uZXcgc2UodGhpcy5zZXJ2aWNlcyx0aGlzLm9wdGlvbnMpLHRoaXMudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pbml0JiZlLmluaXQodCl9KX10aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3J8fHRoaXMub3B0aW9ucy5sbmd8fHRoaXMubG9nZ2VyLndhcm4oImluaXQ6IG5vIGxhbmd1YWdlRGV0ZWN0b3IgaXMgdXNlZCBhbmQgbm8gbG5nIGlzIGRlZmluZWQiKTt2YXIgYT1bImdldFJlc291cmNlIiwiaGFzUmVzb3VyY2VCdW5kbGUiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsImdldERhdGFCeUxhbmd1YWdlIl07YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4obj10LnN0b3JlKVtlXS5hcHBseShuLGFyZ3VtZW50cyl9fSk7dmFyIHM9WyJhZGRSZXNvdXJjZSIsImFkZFJlc291cmNlcyIsImFkZFJlc291cmNlQnVuZGxlIiwicmVtb3ZlUmVzb3VyY2VCdW5kbGUiXTtzLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKSx0fX0pO3ZhciB1PVl0KCksYz1mdW5jdGlvbigpe3QuY2hhbmdlTGFuZ3VhZ2UodC5vcHRpb25zLmxuZyxmdW5jdGlvbihlLHIpe3QuaXNJbml0aWFsaXplZD0hMCx0Lm9wdGlvbnMuaXNDbG9uZXx8dC5sb2dnZXIubG9nKCJpbml0aWFsaXplZCIsdC5vcHRpb25zKSx0LmVtaXQoImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHUucmVzb2x2ZShyKSxuKGUscil9KX07cmV0dXJuIHRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fCF0aGlzLm9wdGlvbnMuaW5pdEltbWVkaWF0ZT9jKCk6c2V0VGltZW91dChjLDApLHV9fSx7a2V5OiJsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOnllLHI9bixvPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMubGFuZ3VhZ2U7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihyPXQpLCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHx0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpe2lmKG8mJiJjaW1vZGUiPT09by50b0xvd2VyQ2FzZSgpKXJldHVybiByKCk7dmFyIGk9W10sYT1mdW5jdGlvbih0KXt0JiZlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2goZnVuY3Rpb24odCl7aS5pbmRleE9mKHQpPDAmJmkucHVzaCh0KX0pfTtpZihvKWEobyk7ZWxzZXt2YXIgcz10aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpO3MuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gYSh0KX0pfXRoaXMub3B0aW9ucy5wcmVsb2FkJiZ0aGlzLm9wdGlvbnMucHJlbG9hZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmxvYWQoaSx0aGlzLm9wdGlvbnMubnMscil9ZWxzZSByKG51bGwpfX0se2tleToicmVsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9WXQoKTtyZXR1cm4gdHx8KHQ9dGhpcy5sYW5ndWFnZXMpLGV8fChlPXRoaXMub3B0aW9ucy5ucyksbnx8KG49eWUpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5yZWxvYWQodCxlLGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLG4odCl9KSxyfX0se2tleToidXNlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhbiB1bmRlZmluZWQgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO2lmKCF0LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYSB3cm9uZyBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7cmV0dXJuImJhY2tlbmQiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmJhY2tlbmQ9dCksKCJsb2dnZXIiPT09dC50eXBlfHx0LmxvZyYmdC53YXJuJiZ0LmVycm9yKSYmKHRoaXMubW9kdWxlcy5sb2dnZXI9dCksImxhbmd1YWdlRGV0ZWN0b3IiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3I9dCksImkxOG5Gb3JtYXQiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQ9dCksInBvc3RQcm9jZXNzb3IiPT09dC50eXBlJiZpZS5hZGRQb3N0UHJvY2Vzc29yKHQpLCIzcmRQYXJ0eSI9PT10LnR5cGUmJnRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKHQpLHRoaXN9fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89dDt2YXIgcj1ZdCgpO3RoaXMuZW1pdCgibGFuZ3VhZ2VDaGFuZ2luZyIsdCk7dmFyIG89ZnVuY3Rpb24odCl7dmFyIG89InN0cmluZyI9PXR5cGVvZiB0P3Q6bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEJlc3RNYXRjaEZyb21Db2Rlcyh0KTtvJiYobi5sYW5ndWFnZXx8KG4ubGFuZ3VhZ2U9byxuLmxhbmd1YWdlcz1uLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KG8pKSxuLnRyYW5zbGF0b3IubGFuZ3VhZ2V8fG4udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShvKSxuLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJm4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5jYWNoZVVzZXJMYW5ndWFnZShvKSksbi5sb2FkUmVzb3VyY2VzKG8sZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsbyl7bz8obi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobyksbi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLG4uZW1pdCgibGFuZ3VhZ2VDaGFuZ2VkIixvKSxuLmxvZ2dlci5sb2coImxhbmd1YWdlQ2hhbmdlZCIsbykpOm4uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLHIucmVzb2x2ZShmdW5jdGlvbigpe3JldHVybiBuLnQuYXBwbHkobixhcmd1bWVudHMpfSksZSYmZSh0LGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KX0odCxvKX0pfTtyZXR1cm4gdHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyF0JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz90aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KG8pOm8odCk6byh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpLHJ9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWZ1bmN0aW9uIHQoZSxyKXt2YXIgbztpZigib2JqZWN0IiE9PU50KHIpKXtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShpPjI%2FaS0yOjApLHM9MjtzPGk7cysrKWFbcy0yXT1hcmd1bWVudHNbc107bz1uLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoW2Uscl0uY29uY2F0KGEpKX1lbHNlIG89RHQoe30scik7cmV0dXJuIG8ubG5nPW8ubG5nfHx0LmxuZyxvLmxuZ3M9by5sbmdzfHx0LmxuZ3Msby5ucz1vLm5zfHx0Lm5zLG4udChlLG8pfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ%2Fci5sbmc9dDpyLmxuZ3M9dCxyLm5zPWUscn19LHtrZXk6InQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS50cmFuc2xhdGUuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJih0PXRoaXMudHJhbnNsYXRvcikuZXhpc3RzLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6InNldERlZmF1bHROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5kZWZhdWx0TlM9dH19LHtrZXk6Imhhc0xvYWRlZE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighdGhpcy5pc0luaXRpYWxpemVkKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG5leHQgd2FzIG5vdCBpbml0aWFsaXplZCIsdGhpcy5sYW5ndWFnZXMpLCExO2lmKCF0aGlzLmxhbmd1YWdlc3x8IXRoaXMubGFuZ3VhZ2VzLmxlbmd0aClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuLmxhbmd1YWdlcyB3ZXJlIHVuZGVmaW5lZCBvciBlbXB0eSIsdGhpcy5sYW5ndWFnZXMpLCExO3ZhciByPXRoaXMubGFuZ3VhZ2VzWzBdLG89ISF0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxpPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZigiY2ltb2RlIj09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDt2YXIgYT1mdW5jdGlvbih0LG4pe3ZhciByPWUuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQodCwifCIpLmNvbmNhdChuKV07cmV0dXJuLTE9PT1yfHwyPT09cn07aWYobi5wcmVjaGVjayl7dmFyIHM9bi5wcmVjaGVjayh0aGlzLGEpO2lmKHZvaWQgMCE9PXMpcmV0dXJuIHN9cmV0dXJuISF0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHIsdCl8fCghdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmR8fCEoIWEocix0KXx8byYmIWEoaSx0KSkpfX0se2tleToibG9hZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPVl0KCk7cmV0dXJuIHRoaXMub3B0aW9ucy5ucz8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZuLm9wdGlvbnMubnMucHVzaCh0KX0pLHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbih0KXtyLnJlc29sdmUoKSxlJiZlKHQpfSkscik6KGUmJmUoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJsb2FkTGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPVl0KCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pO3ZhciByPXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxvPXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiByLmluZGV4T2YodCk8MH0pO3JldHVybiBvLmxlbmd0aD8odGhpcy5vcHRpb25zLnByZWxvYWQ9ci5jb25jYXQobyksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe24ucmVzb2x2ZSgpLGUmJmUodCl9KSxuKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImRpciIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodHx8KHQ9dGhpcy5sYW5ndWFnZXMmJnRoaXMubGFuZ3VhZ2VzLmxlbmd0aD4wP3RoaXMubGFuZ3VhZ2VzWzBdOnRoaXMubGFuZ3VhZ2UpLCF0KXJldHVybiJydGwiO3JldHVyblsiYXIiLCJzaHUiLCJzcXIiLCJzc2giLCJ4YWEiLCJ5aGQiLCJ5dWQiLCJhYW8iLCJhYmgiLCJhYnYiLCJhY20iLCJhY3EiLCJhY3ciLCJhY3giLCJhY3kiLCJhZGYiLCJhZHMiLCJhZWIiLCJhZWMiLCJhZmIiLCJhanAiLCJhcGMiLCJhcGQiLCJhcmIiLCJhcnEiLCJhcnMiLCJhcnkiLCJhcnoiLCJhdXoiLCJhdmwiLCJheWgiLCJheWwiLCJheW4iLCJheXAiLCJiYnoiLCJwZ2EiLCJoZSIsIml3IiwicHMiLCJwYnQiLCJwYnUiLCJwc3QiLCJwcnAiLCJwcmQiLCJ1ZyIsInVyIiwieWRkIiwieWRzIiwieWloIiwiamkiLCJ5aSIsImhibyIsIm1lbiIsInhtbiIsImZhIiwianByIiwicGVvIiwicGVzIiwicHJzIiwiZHYiLCJzYW0iXS5pbmRleE9mKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KSk%2BPTA%2FInJ0bCI6Imx0ciJ9fSx7a2V5OiJjcmVhdGVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMDtyZXR1cm4gbmV3IGUodCxuKX19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp5ZSxvPUR0KHt9LHRoaXMub3B0aW9ucyxuLHtpc0Nsb25lOiEwfSksaT1uZXcgZShvKSxhPVsic3RvcmUiLCJzZXJ2aWNlcyIsImxhbmd1YWdlIl07cmV0dXJuIGEuZm9yRWFjaChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSxpLnNlcnZpY2VzPUR0KHt9LHRoaXMuc2VydmljZXMpLGkuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTppLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKGkpfSxpLnRyYW5zbGF0b3I9bmV3IHNlKGkuc2VydmljZXMsaS5vcHRpb25zKSxpLnRyYW5zbGF0b3Iub24oIioiLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KGU%2BMT9lLTE6MCkscj0xO3I8ZTtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtpLmVtaXQuYXBwbHkoaSxbdF0uY29uY2F0KG4pKX0pLGkuaW5pdChvLHIpLGkudHJhbnNsYXRvci5vcHRpb25zPWkub3B0aW9ucyxpLnRyYW5zbGF0b3IuYmFja2VuZENvbm5lY3Rvci5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGl9fV0pLGV9KCkpLGJlPW4oMTMzKSx4ZT1uLm4oYmUpO2Z1bmN0aW9uIHdlKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBrZSh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0%2FYXJndW1lbnRzW2VdOnt9LHI9T2JqZWN0LmtleXMobik7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihyPXIuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkuZW51bWVyYWJsZX0pKSksci5mb3JFYWNoKGZ1bmN0aW9uKGUpe3dlKHQsZSxuW2VdKX0pfXJldHVybiB0fWZ1bmN0aW9uIFNlKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gRWUodCxlLG4pe3ZhciByO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMsaT1hcmd1bWVudHMsYT1mdW5jdGlvbigpe3I9bnVsbCxufHx0LmFwcGx5KG8saSl9LHM9biYmIXI7Y2xlYXJUaW1lb3V0KHIpLHI9c2V0VGltZW91dChhLGUpLHMmJnQuYXBwbHkobyxpKX19ZnVuY3Rpb24gVGUodCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuaW5kZXhPZigiIyMjIik%2BLTE%2FdC5yZXBsYWNlKC8jIyMvZywiLiIpOnR9Zm9yKHZhciBvPSJzdHJpbmciIT10eXBlb2YgZT9bXS5jb25jYXQoZSk6ZS5zcGxpdCgiLiIpO28ubGVuZ3RoPjE7KXtpZighdClyZXR1cm57fTt2YXIgaT1yKG8uc2hpZnQoKSk7IXRbaV0mJm4mJih0W2ldPW5ldyBuKSx0PXRbaV19cmV0dXJuIHQ%2Fe29iajp0LGs6cihvLnNoaWZ0KCkpfTp7fX1mdW5jdGlvbiBBZSh0LGUsbil7dmFyIHI9VGUodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIE9lKHQsZSl7dmFyIG49VGUodCxlKSxyPW4ub2JqLG89bi5rO2lmKHIpcmV0dXJuIHJbb119dmFyIENlPW5ldyBSZWdFeHAoInt7KC4rPyl9fSIsImciKTtmdW5jdGlvbiBqZSh0LGUsbil7dmFyIHIsbyxpO2Zvcig7cj1DZS5leGVjKHQpOykic3RyaW5nIiE9dHlwZW9mKG89clsxXS50cmltKCkpJiYobz1udWxsPT0oaT1vKT8iIjoiIitpKSxvfHwobz0iIiksbz1vLnJlcGxhY2UoL1wkL2csIiQkJCQiKSx0PXQucmVwbGFjZShyWzBdLGVbb118fG8pLENlLmxhc3RJbmRleD0wO3JldHVybiB0fWZ1bmN0aW9uIExlKHQsZSxuLHIsbyl7dHJ5e3ZhciBpPW5ldyhYTUxIdHRwUmVxdWVzdHx8QWN0aXZlWE9iamVjdCkoIk1TWE1MMi5YTUxIVFRQLjMuMCIpO2kub3BlbihyPyJQT1NUIjoiR0VUIix0LDEpLGUuY3Jvc3NEb21haW58fGkuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0IiksZS5hdXRob3JpemUmJmUuYXBpS2V5JiZpLnNldFJlcXVlc3RIZWFkZXIoIkF1dGhvcml6YXRpb24iLGUuYXBpS2V5KSwocnx8ZS5zZXRDb250ZW50VHlwZUpTT04pJiZpLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL2pzb24iKSxpLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2kucmVhZHlTdGF0ZT4zJiZuJiZuKGkucmVzcG9uc2VUZXh0LGkpfSxpLnNlbmQoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoKHQpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyh0KX19dmFyIFBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4scil7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksZSYmZS5wcm9qZWN0SWQ%2FdGhpcy5pbml0KG51bGwsZSx7fSxuKTp0aGlzLmluaXQobnVsbCxuLHt9LHIpLHRoaXMudHlwZT0iYmFja2VuZCJ9dmFyIGUsbixyO3JldHVybiBlPXQsKG49W3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30scj1hcmd1bWVudHMubGVuZ3RoPjI%2FYXJndW1lbnRzWzJdOnZvaWQgMCxvPWFyZ3VtZW50cy5sZW5ndGg%2BMz9hcmd1bWVudHNbM106dm9pZCAwO3RoaXMub3B0aW9ucz1rZSh7fSx7bG9hZFBhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iixwcml2YXRlUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3ByaXZhdGUve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIscHVsbFBhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby9wdWxsL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLGdldExhbmd1YWdlc1BhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby9sYW5ndWFnZXMve3twcm9qZWN0SWR9fSIsYWRkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL21pc3Npbmcve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsdXBkYXRlUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3VwZGF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixyZWZlcmVuY2VMbmc6ImVuIixjcm9zc0RvbWFpbjohMCxzZXRDb250ZW50VHlwZUpTT046ITEsdmVyc2lvbjoibGF0ZXN0IixwdWxsOiExLHByaXZhdGU6ITEsd2hpdGVsaXN0VGhyZXNob2xkOi45LGZhaWxMb2FkaW5nT25FbXB0eUpTT046ITEsYWxsb3dlZEFkZE9yVXBkYXRlSG9zdHM6WyJsb2NhbGhvc3QiXX0sdGhpcy5vcHRpb25zLG4pLHRoaXMuc2VydmljZXM9dCx0aGlzLm9wdGlvbnMucHVsbCYmY29uc29sZS53YXJuKCJkZXByZWNhdGVkOiBwdWxsIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMgYW5kIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGxvY2l6ZSBwcml2YXRlIHZlcnNpb25zIik7dmFyIGk9d2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7aT8odGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZD10aGlzLm9wdGlvbnMuYWxsb3dlZEFkZE9yVXBkYXRlSG9zdHMuaW5kZXhPZihpKT4tMSxyLnNhdmVNaXNzaW5nJiYhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZCYmdCYmdC5sb2dnZXImJnQubG9nZ2VyLndhcm4oJ2xvY2l6ZS1iYWNrZW5kOiB3aWxsIG5vdCBzYXZlIG1pc3NpbmdzIGJlY2F1c2UgdGhlIGhvc3QgIicuY29uY2F0KGksJyIgd2FzIG5vdCBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czogJykuY29uY2F0KHRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5qb2luKCIsICIpLCIgKG1hdGNoZXMgbmVlZCB0byBiZSBleGFjdCkuIikpKTp0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZ0aGlzLmdldE9wdGlvbnMoZnVuY3Rpb24odCxyKXtpZih0KXJldHVybiBvKHQpO2Uub3B0aW9ucy5yZWZlcmVuY2VMbmc9bi5yZWZlcmVuY2VMbmd8fHIucmVmZXJlbmNlTG5nfHxlLm9wdGlvbnMucmVmZXJlbmNlTG5nLG8obnVsbCxyKX0pLHRoaXMucXVldWVkV3JpdGVzPXt9LHRoaXMuZGVib3VuY2VkUHJvY2Vzcz1FZSh0aGlzLnByb2Nlc3MsMWU0KX19LHtrZXk6ImdldExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9amUodGhpcy5vcHRpb25zLmdldExhbmd1YWdlc1BhdGgse3Byb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkfSk7dGhpcy5sb2FkVXJsKGUse30sdCl9fSx7a2V5OiJnZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuZ2V0TGFuZ3VhZ2VzKGZ1bmN0aW9uKG4scil7aWYobilyZXR1cm4gdChuKTt2YXIgbz1PYmplY3Qua2V5cyhyKTtpZighby5sZW5ndGgpcmV0dXJuIHQobmV3IEVycm9yKCJ3YXMgdW5hYmxlIHRvIGxvYWQgbGFuZ3VhZ2VzIHZpYSBBUEkiKSk7dmFyIGk9by5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gcltlXS5pc1JlZmVyZW5jZUxhbmd1YWdlJiYodD1lKSx0fSwiIiksYT1vLnJlZHVjZShmdW5jdGlvbih0LG4pe3ZhciBvPXJbbl07cmV0dXJuIG8udHJhbnNsYXRlZFtlLm9wdGlvbnMudmVyc2lvbl0mJm8udHJhbnNsYXRlZFtlLm9wdGlvbnMudmVyc2lvbl0%2BPWUub3B0aW9ucy53aGl0ZWxpc3RUaHJlc2hvbGQmJnQucHVzaChuKSx0fSxbXSkscz1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBlLmluZGV4T2YoIi0iKT4tMXx8dH0sITEpO3QobnVsbCx7ZmFsbGJhY2tMbmc6aSxyZWZlcmVuY2VMbmc6aSx3aGl0ZWxpc3Q6YSxsb2FkOnM%2FImFsbCI6Imxhbmd1YWdlT25seSJ9KX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG89e307dGhpcy5vcHRpb25zLnByaXZhdGU%2FKHI9amUodGhpcy5vcHRpb25zLnByaXZhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPXthdXRob3JpemU6ITB9KTp0aGlzLm9wdGlvbnMucHVsbD8ocj1qZSh0aGlzLm9wdGlvbnMucHVsbFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnI9amUodGhpcy5vcHRpb25zLmxvYWRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSx0aGlzLmxvYWRVcmwocixvLG4pfX0se2tleToibG9hZFVybCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7TGUodCxrZSh7fSx0aGlzLm9wdGlvbnMsZSksZnVuY3Rpb24oZSxvKXtpZihvLnN0YXR1cz49NTAwJiZvLnN0YXR1czw2MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMCk7aWYoby5zdGF0dXM%2BPTQwMCYmby5zdGF0dXM8NTAwKXJldHVybiBuKCJmYWlsZWQgbG9hZGluZyAiK3QsITEpO3ZhciBpLGE7dHJ5e2k9SlNPTi5wYXJzZShlKX1jYXRjaChlKXthPSJmYWlsZWQgcGFyc2luZyAiK3QrIiB0byBqc29uIn1yZXR1cm4gYT9uKGEsITEpOnIub3B0aW9ucy5mYWlsTG9hZGluZ09uRW1wdHlKU09OJiYhT2JqZWN0LmtleXMoaSkubGVuZ3RoP24oImxvYWRlZCByZXN1bHQgZW1wdHkgZm9yICIrdCwhMSk6dm9pZCBuKG51bGwsaSl9KX19LHtrZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byBjcmVhdGUga2V5LiIpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmd9KS5sZW5ndGg8MSYmdGhpcy5zZXJ2aWNlcyYmdGhpcy5zZXJ2aWNlcy5sb2dnZXImJnRoaXMuc2VydmljZXMubG9nZ2VyLndhcm4oJ2xvY2l6ZS1iYWNrZW5kOiB3aWxsIG5vdCBzYXZlIG1pc3NpbmdzIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSAiJy5jb25jYXQodGhpcy5vcHRpb25zLnJlZmVyZW5jZUxuZywnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIHRvIHNhdmUgbGFuZ3VhZ2VzOiAnKS5jb25jYXQodC5qb2luKCIsICIpLCIgKG9wZW4geW91ciBzaXRlIGluIHRoZSByZWZlcmVuY2UgbGFuZ3VhZ2UgdG8gc2F2ZSBtaXNzaW5ncykuIikpLHQuZm9yRWFjaChmdW5jdGlvbih0KXt0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZyYmYS5xdWV1ZS5jYWxsKGEsYS5vcHRpb25zLnJlZmVyZW5jZUxuZyxlLG4scixvLGkpfSl9fSx7a2V5OiJ1cGRhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt2YXIgYT10aGlzO2lmKG98fChvPWZ1bmN0aW9uKCl7fSksIXRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQpcmV0dXJuIG8oImhvc3QgaXMgbm90IGFsbG93ZWQgdG8gdXBkYXRlIGtleS4iKTtpfHwoaT17fSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLGkuaXNVcGRhdGU9ITAsdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6IndyaXRlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIU9lKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0pKXt2YXIgcj1qZSh0aGlzLm9wdGlvbnMuYWRkUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz1qZSh0aGlzLm9wdGlvbnMudXBkYXRlUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksaT1PZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSk7aWYoQWUodGhpcy5xdWV1ZWRXcml0ZXMsW3QsZV0sW10pLGkubGVuZ3RoKXtBZSh0aGlzLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCEwKTt2YXIgYT0hMSxzPSExLHU9e30sYz17fTtpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5vcHRpb25zJiZ0Lm9wdGlvbnMudERlc2NyaXB0aW9uP3t2YWx1ZTp0LmZhbGxiYWNrVmFsdWV8fCIiLGNvbnRleHQ6e3RleHQ6dC5vcHRpb25zLnREZXNjcmlwdGlvbn19OnQuZmFsbGJhY2tWYWx1ZXx8IiI7dC5vcHRpb25zJiZ0Lm9wdGlvbnMuaXNVcGRhdGU%2FKHN8fChzPSEwKSxjW3Qua2V5XT1lKTooYXx8KGE9ITApLHVbdC5rZXldPWUpfSk7dmFyIGw9MDthJiZsKysscyYmbCsrO3ZhciBmPWZ1bmN0aW9uKCl7LS1sfHwoQWUobi5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSwhMSksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuY2FsbGJhY2smJnQuY2FsbGJhY2soKX0pLG4uZGVib3VuY2VkUHJvY2Vzcyh0LGUpKX07bHx8ZigpLGEmJkxlKHIsa2Uoe30se2F1dGhvcml6ZTohMH0sdGhpcy5vcHRpb25zKSxmdW5jdGlvbih0LGUpe2YoKX0sdSkscyYmTGUobyxrZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSxjKX19fX0se2tleToicHJvY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO09iamVjdC5rZXlzKHRoaXMucXVldWVkV3JpdGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJsb2NrcyIhPT1lJiZPYmplY3Qua2V5cyh0LnF1ZXVlZFdyaXRlc1tlXSkuZm9yRWFjaChmdW5jdGlvbihuKXt0LnF1ZXVlZFdyaXRlc1tlXVtuXS5sZW5ndGgmJnQud3JpdGUoZSxuKX0pfSl9fSx7a2V5OiJxdWV1ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpeyFmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1UZSh0LGUsT2JqZWN0KSxpPW8ub2JqLGE9by5rO2lbYV09aVthXXx8W10sciYmKGlbYV09aVthXS5jb25jYXQobikpLHJ8fGlbYV0ucHVzaChuKX0odGhpcy5xdWV1ZWRXcml0ZXMsW3QsZV0se2tleTpuLGZhbGxiYWNrVmFsdWU6cnx8IiIsY2FsbGJhY2s6byxvcHRpb25zOml9KSx0aGlzLmRlYm91bmNlZFByb2Nlc3MoKX19XSkmJlNlKGUucHJvdG90eXBlLG4pLHImJlNlKGUsciksdH0oKTtQZS50eXBlPSJiYWNrZW5kIjt2YXIgUmU9UGUsTmU9big0Myk7ZnVuY3Rpb24gSWUoKXtyZXR1cm4oSWU9dSgpKGEuYS5tYXJrKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0LmFicnVwdCgicmV0dXJuIixuZXcgUnQuYShmdW5jdGlvbih0KXttZS5jaGFuZ2VMYW5ndWFnZShlLGZ1bmN0aW9uKCl7dCh2b2lkIDApfSl9KSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSx0KX0pKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIERlKCl7dmFyIHQ7cmV0dXJuIEx0KCkodD1tZS50KS5jYWxsKHQsbWUpfXZhciBfZT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQuYShmdW5jdGlvbih0LGUpe21lLnVzZShuZXcgeGUuYShudWxsLHtvcmRlcjpbIm5hdmlnYXRvciJdfSkpLnVzZShSZSkuaW5pdCh7ZmFsbGJhY2tMbmc6ImVuIixuczpbImRlZmF1bHQiXSxkZWZhdWx0TlM6ImRlZmF1bHQiLGJhY2tlbmQ6e3Byb2plY3RJZDpOZS5sb2NpemUucHJvZHVjdElkLHZlcnNpb246TmUubG9jaXplLnZlcnNpb24sYXBpS2V5Ok5lLmxvY2l6ZS5hcGlLZXkscmVmZXJlbmNlTG5nOiJlbiJ9fSxmdW5jdGlvbihuLHIpe3JldHVybiBuP2Uobik6dChyKX0pfSl9LGNoYW5nZUxhbmd1YWdlOmZ1bmN0aW9uKHQpe3JldHVybiBJZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGdldExhbmd1YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIG1lLmxhbmd1YWdlfSxnZXRUOkRlfTtmdW5jdGlvbiBNZSh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IW8uYSlyZXR1cm4hMTtpZihvLmEuc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8oKShEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUEoKSh0KTtpZihlKXt2YXIgaT1BKCkodGhpcykuY29uc3RydWN0b3I7bj1vKCkocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBFKCkodGhpcyxuKX19dmFyIFVlPXtieUl0ZW1Db2RlOntuYW1lOiJkYXRhIixjb2x1bW5zOlsicHJvZHVjdENvZGUiLCJkZW5pZWRDb3VudHJpZXMiXX19LEJlPXdpbmRvdy56aWd6YWcscWU9L1wvaXRlbVwvZGV0YWlsLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTt6Lm9uQ2hhbmdlc1JlYWR5KGZ1bmN0aW9uKHQpe3oub3ZlcnJpZGVDbGlja0V2ZW50KHQsJ2FbaHJlZio9IiNtb2RhbC1jYXJ0Il0sIGJ1dHRvbi5hZGQtY2FydCcsZnVuY3Rpb24oKXtCZS5wYWdlVG8oIml0ZW0iKX0pLHoub3ZlcnJpZGVDbGlja0V2ZW50KHQsJ2FbaHJlZio9Ii9jYXJ0LyJdJyxmdW5jdGlvbigpe0JlLnBhZ2VUbygiY2FydCIpfSl9KTt2YXIgRmU9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9TWUobik7ZnVuY3Rpb24gbigpe3JldHVybiB2KCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbSgpKG4sW3trZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PW5ldyBSZWdFeHAoIi8oWzAtOV0rKS8%2FJCIpLmV4ZWMod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtyZXR1cm4gdCYmdC5sZW5ndGg%2BMT90WzFdOiIifX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbz1CZS51dGlscy4kLGk9eCgpKEEoKShuLnByb3RvdHlwZSksImdldEl0ZW0iLHRoaXMpLmNhbGwodGhpcyksYT1kKCkodD1vKCIuZGV0YWlsIC5icmFuZCIpLnRleHQoKSkuY2FsbCh0KSxzPWQoKShlPW8oIi5nZW5kZXIgLmlzLWN1cnJlbnQiKS50ZXh0KCkpLmNhbGwoZSk7cmV0dXJuIGkuY2F0ZWdvcnk9cCgpKHI9IiIuY29uY2F0KGEsIiAoIikpLmNhbGwocixzLCIpIiksaX19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MCxlPXRoaXMuJCgiLmRldGFpbCAucHJpY2UgLmFmdGVyIik7cmV0dXJuIGUubGVuZ3RoPjA%2FVihZKGUpKTp0fX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kLG49W10scj1lKCJ1bC5jb2xvcj5saSIpO2lmKHIubGVuZ3RoPjApZm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKz0xKWZvcih2YXIgaT1lKHIuZ2V0KG8pKSxhPWwoKShpKS5jYWxsKGksIi50aHVtYiAubmFtZSIpLHM9bCgpKGkpLmNhbGwoaSwiLnNpemUgbGkiKSx1PTA7dTxzLmxlbmd0aDt1Kz0xKXt2YXIgYz1lKHMuZ2V0KHUpKSxmPWwoKShjKS5jYWxsKGMsIi5kYXRhIC5uYW1lIik7aWYobCgpKGMpLmNhbGwoYywiLmFkZC1jYXJ0IikubGVuZ3RoPjApe3ZhciBwLGgsZz17fTtnWyJza3UuY29sb3IiXT1kKCkocD1hLnRleHQoKSkuY2FsbChwKSxnWyJza3Uuc2l6ZSJdPWQoKShoPWYudGV4dCgpKS5jYWxsKGgpLGcucHJpY2U9dC5wcmljZSxnLnN0b2NrPTEsbi5wdXNoKGcpfX1yZXR1cm4gbn19LHtrZXk6ImdldFB1cmNoYXNhYmxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5za3VSb3dzLmxlbmd0aD4wfX1dKSxufShodCksSGU9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9TWUobik7ZnVuY3Rpb24gbigpe3JldHVybiB2KCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQ3QpO0JlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmxvY2F0aW9uLG49dC5jYWxsYmFjazshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKCl7dmFyIHQ9dSgpKGEuYS5tYXJrKGZ1bmN0aW9uIHQocil7dmFyIG8saSxzO3JldHVybiBhLmEud3JhcChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZih0LnByZXY9MCxxZSl7dC5uZXh0PTM7YnJlYWt9cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG4oKSk7Y2FzZSAzOnJldHVybiBvPW5ldyB3dCh7ZGF0YTpCZS5zaG9wRGF0YXx8e30sc2hlZXRUeXBlOlVlfSkuZXhlY3V0ZSgpLCIuZGV0YWlsIC5uYW1lIiwiLmRldGFpbCAucHJpY2UiLGk9bmV3IEZlKHskOnIsbmFtZToiLmRldGFpbCAubmFtZSIscHJpY2U6Ii5kZXRhaWwgLnByaWNlIn0pLmV4ZWN1dGUoKSxzPW5ldyBIZSh7bG9jYXRpb246ZSxzY3JhcGVyUmVzdWx0OmksZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKSx0LmFicnVwdCgicmV0dXJuIixuKG51bGwse2l0ZW06aS5pdGVtLHNrdVJvd3M6aS5za3VSb3dzLGV4Y2x1c2lvbjpzfSkpO2Nhc2UgMTE6cmV0dXJuIHQucHJldj0xMSx0LnQwPXQuY2F0Y2goMCksdC5hYnJ1cHQoInJldHVybiIsbih0LnQwKSk7Y2FzZSAxNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0sdCxudWxsLFtbMCwxMV1dKX0pKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSl9KTt2YXIgemU9bmV3IERhdGUoIk1vbiBGZWIgMSAyMDIxIDAwOjAwOjAwIEdNVCswODAwIiksV2U9bmV3IERhdGUoIlN1biBGZWIgMTQgMjAyMSAyMzo1OTo1OSBHTVQrMDgwMCIpLCRlPW5ldyBEYXRlLFZlPSRlLmdldFRpbWUoKT49emUuZ2V0VGltZSgpJiYkZS5nZXRUaW1lKCk8PVdlLmdldFRpbWUoKSxZZT0vXnpoL2kudGVzdChMKCkpLEdlPSgwLEJlLnV0aWxzLiQpKCIuaXMtbW9iaWxlIikubGVuZ3RoPjA7aWYoVmUmJlllKXt2YXIgS2U9RGUoKTtCZS5ub3RpY2VNb2RhbChmdW5jdGlvbigpe3ZhciB0LGU7cmV0dXJuIEdlP3tqdW1ib3Ryb246e2h0bWw6cCgpKHQ9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDEgc3R5bGU9ImZvbnQtc2l6ZTogMzBweCAhaW1wb3J0YW50OyBjb2xvcjogIzMzMzMzNCAhaW1wb3J0YW50OyI%2BPHNwYW4%2BPGltZyBzcmM9Imh0dHBzOi8vY2hlY2tvdXQtc3RhdGljLndvcmxkc2hvcHBpbmcuanAvaW1hZ2VzL2NvbW1vbi9sb2dvLnN2ZyIgYWx0PSJXb3JsZFNob3BwaW5nIj48L3NwYW4%2BJy5jb25jYXQoS2UoImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgICAgICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50OyBjb2xvcjogIzMzMzMzNCAhaW1wb3J0YW50OyI%2BJykpLmNhbGwodCxLZSgiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1zcF8yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyI%2BXG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgJyl9fTp7anVtYm90cm9uOntodG1sOnAoKShlPSdcbiAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbjogNnB4IDAgMCAhaW1wb3J0YW50OyI%2BXG4gICAgICAgIDxkaXY%2BXG4gICAgICAgICAgPGgxIHN0eWxlPSJmb250LXNpemU6IDMwcHggIWltcG9ydGFudDsgY29sb3I6ICMzMzMzMzQgIWltcG9ydGFudDsiPjxzcGFuPjxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vbG9nby5zdmciIGFsdD0iV29ybGRTaG9wcGluZyI%2BPC9zcGFuPicuY29uY2F0KEtlKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgxIiksJzwvaDE%2BXG4gICAgICAgICAgPGgyIHN0eWxlPSJmb250LXNpemU6IDE2cHggIWltcG9ydGFudDsgY29sb3I6ICMzMzMzMzQgIWltcG9ydGFudDsiPicpKS5jYWxsKGUsS2UoImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwnPC9oMj5cbiAgICAgICAgPC9kaXY%2BXG4gICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1wY18yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDM4MHB4ICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvZGl2PlxuICAgICAgJyl9fX0pLEJlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3JldHVybiBHZT97Ym90dG9tOntodG1sOidcbiAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICA8aW1nIHNyYz0iaHR0cHM6Ly9zdGF0aWMtY29udGVudHMud29ybGRzaG9wcGluZy5qcC9zaG9wcy90b3dlcl9qcC9jYW1wYWlnbi1iYW5uZXItc3BfMjAyMTAxMjIucG5nIiBzdHlsZT0id2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPlxuICA8L2E%2BXG4gICd9fTp7Ym90dG9tOntodG1sOidcbiAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXBjXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiA4NSUgIWltcG9ydGFudDsgbWF4LXdpZHRoOiAyNDBweCAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAtMTVweCFpbXBvcnRhbnQ7Ij5cbiAgJ319fSksX2UuaW5pdGlhbGl6ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gQmUucnVuKCl9KX1lbHNlIEJlLnJ1bigpfV0pO30%3D&_u=aHhACEALBAAAAG~&jid=1778502842&gjid=642362726&cid=158121857.1614430449&tid=UA-53738514-61&_gid=2132399153.1614430455&_r=1&gtm=2wg2h0KC52B6&z=1692434106
Domain
www.google-analytics.com
URL
https://www.google-analytics.com/j/collect?v=1&_v=j88&a=71325334&t=event&ni=0&_s=1&dl=https%3A%2F%2Fbaycrews.jp%2F&ul=en-us&de=UTF-8&dt=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=JS%20ERROR&ea=46%20%3A%20Uncaught%20TypeError%3A%20Cannot%20read%20property%20%27getItem%27%20of%20null&el=data%3Atext%2Fjavascript%3Bbase64%2CZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU%2FZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0yOTcpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQpLG89big0NSkuZixpPW4oODYpLGE9bigyKSxzPW4oMjkpLHU9bigxNSksYz1uKDEyKSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg%2FcyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oNTcpLGk9big2OCksYT1uKDk3KSxzPXIuU3ltYm9sLHU9bygid2tzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB1W3RdfHwodVt0XT1hJiZzW3RdfHwoYT9zOmkpKCJTeW1ib2wuIit0KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMiksbz1uKDEyKSxpPW4oNzcpLGE9bigyMCkuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ci5TeW1ib2x8fChyLlN5bWJvbD17fSk7byhlLHQpfHxhKGUsdCx7dmFsdWU6aS5mKHQpfSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09TWF0aCYmdH07dC5leHBvcnRzPXIodHlwZW9mIGdsb2JhbFRoaXM9PW4mJmdsb2JhbFRoaXMpfHxyKHR5cGVvZiB3aW5kb3c9PW4mJndpbmRvdyl8fHIodHlwZW9mIHNlbGY9PW4mJnNlbGYpfHxyKHR5cGVvZiBlPT1uJiZlKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0pLmNhbGwodGhpcyxuKDgyKSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ%2FbnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY0KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEzNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpKyIgaXMgbm90IGFuIG9iamVjdCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2OSk7ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCkscih0LG8ua2V5LG8pfX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlJiZvKHQucHJvdG90eXBlLGUpLG4mJm8odCxuKSx0fX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5jYWxsKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxODIpLG89bigxMTIpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8%2FcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjApLGk9bigyOCk7dC5leHBvcnRzPXI%2FZnVuY3Rpb24odCxlLG4pe3JldHVybiBvLmYodCxlLGkoMSxuKSl9OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1uLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHJbdCsiUHJvdG90eXBlIl19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTYxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODQpLG89big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByKG8odCkpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDg1KSxpPW4oOSksYT1uKDU0KSxzPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmY9cj9zOmZ1bmN0aW9uKHQsZSxuKXtpZihpKHQpLGU9YShlLCEwKSxpKG4pLG8pdHJ5e3JldHVybiBzKHQsZSxuKX1jYXRjaCh0KXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCIpO3JldHVybiJ2YWx1ZSJpbiBuJiYodFtlXT1uLnZhbHVlKSx0fX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMCkuZixvPW4oMTUpLGk9bigxMiksYT1uKDE0NSkscz1uKDEpKCJ0b1N0cmluZ1RhZyIpLHU9YSE9PXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXtpZih0KXt2YXIgbD1uP3Q6dC5wcm90b3R5cGU7aShsLHMpfHxyKGwscyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KSxjJiZ1JiZvKGwsInRvU3RyaW5nIixhKX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTg5KSxvPW4oMTkzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1Nyl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYocih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChuKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FsbChlKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5jYWxsKGUsbil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gdC5jYWxsKGUsbixyKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHIsbyl7cmV0dXJuIHQuY2FsbChlLG4scixvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpLG89big0KSxpPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2koclt0XSl8fGkob1t0XSk6clt0XSYmclt0XVtlXXx8b1t0XSYmb1t0XVtlXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY2KSxvPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP28ocih0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MikuY2hhckF0LG89big0OCksaT1uKDkzKSxhPW8uc2V0LHM9by5nZXR0ZXJGb3IoIlN0cmluZyBJdGVyYXRvciIpO2koU3RyaW5nLCJTdHJpbmciLGZ1bmN0aW9uKHQpe2EodGhpcyx7dHlwZToiU3RyaW5nIEl0ZXJhdG9yIixzdHJpbmc6U3RyaW5nKHQpLGluZGV4OjB9KX0sZnVuY3Rpb24oKXt2YXIgdCxlPXModGhpcyksbj1lLnN0cmluZyxvPWUuaW5kZXg7cmV0dXJuIG8%2BPW4ubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9cihuLG8pLGUuaW5kZXgrPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe28mJm8uZW51bWVyYWJsZT90W2VdPW46cih0LGUsbil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTQpLG89bigyMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PXIoZSkmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP28odCk6ZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMjkpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM2KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM5KX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPUpTT04ucGFyc2UoJ3sibG9jaXplIjp7InByb2R1Y3RJZCI6IjYwZmY4MjI0LWJiY2MtNDgwMi04ZDU5LWM4OTgzZGVhZThkMCIsImFwaUtleSI6IjczOTZlNzc4LTA5MDMtNGU3ZS04MjgyLWU2NzE1ODU4YmI4YyIsInZlcnNpb24iOiJwcm9kdWN0aW9uIn0sImludGVncmF0aW9ucyI6eyJjb2xvcm1lQXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9jb2xvcm1lLndvcmxkc2hvcHBpbmcuanAvdjEvcHJvZHVjdCJ9fSwic2hvcGlmeUFwcCI6eyJhcGkiOnsicHJvZHVjdCI6Imh0dHBzOi8vYXBwLXMud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19fSwibGFtYmRhIjp7ImNyZWF0ZSI6InNob3AtZGF0YS1wcm9kLWNyZWF0ZSIsImNsZWFyIjoic2hvcC1kYXRhLXByb2QtY2xlYXIifSwic2ZkYyI6eyJjb25uZWN0aW9uU2V0dGluZ3NQYXRoIjoiL3NmZGMvcHJvZC9hcGkifSwiZGVidWdIb3N0cyI6WyJzaG9wLWRhc2hib2FyZC53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWRldi53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWxvY2FsLndvcmxkc2hvcHBpbmcuYml6Il19Jyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDgzKSxpPW4oMjgpLGE9bigxOCkscz1uKDU0KSx1PW4oMTIpLGM9big4NSksbD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2UuZj1yP2w6ZnVuY3Rpb24odCxlKXtpZih0PWEodCksZT1zKGUsITApLGMpdHJ5e3JldHVybiBsKHQsZSl9Y2F0Y2godCl7fWlmKHUodCxlKSlyZXR1cm4gaSghby5mLmNhbGwodCxlKSx0W2VdKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSksbz1uKDEzNyksaT1uKDY3KSxhPW4oNTUpLHM9big4OSksdT1uKDYzKSxjPW4oNTYpKCJJRV9QUk9UTyIpLGw9ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24oKXt2YXIgdCxlPXUoImlmcmFtZSIpLG49aS5sZW5ndGg7Zm9yKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIscy5hcHBlbmRDaGlsZChlKSxlLnNyYz1TdHJpbmcoImphdmFzY3JpcHQ6IiksKHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksdC53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSx0LmNsb3NlKCksZj10LkY7bi0tOylkZWxldGUgZi5wcm90b3R5cGVbaVtuXV07cmV0dXJuIGYoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG51bGwhPT10PyhsLnByb3RvdHlwZT1yKHQpLG49bmV3IGwsbC5wcm90b3R5cGU9bnVsbCxuW2NdPXQpOm49ZigpLHZvaWQgMD09PWU%2FbjpvKG4sZSl9LGFbY109ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT1uKDE0Mykscz1uKDQpLHU9big2KSxjPW4oMTUpLGw9bigxMiksZj1uKDU2KSxwPW4oNTUpLGg9cy5XZWFrTWFwO2lmKGEpe3ZhciBkPW5ldyBoLGc9ZC5nZXQsdj1kLmhhcyx5PWQuc2V0O3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5jYWxsKGQsdCxlKSxlfSxvPWZ1bmN0aW9uKHQpe3JldHVybiBnLmNhbGwoZCx0KXx8e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHYuY2FsbChkLHQpfX1lbHNle3ZhciBtPWYoInN0YXRlIik7cFttXT0hMCxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGModCxtLGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKT90W21dOnt9fSxpPWZ1bmN0aW9uKHQpe3JldHVybiBsKHQsbSl9fXQuZXhwb3J0cz17c2V0OnIsZ2V0Om8saGFzOmksZW5mb3JjZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KT9vKHQpOnIodCx7fSl9LGdldHRlckZvcjpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG47aWYoIXUoZSl8fChuPW8oZSkpLnR5cGUhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3QrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMiksbz1uKDIzKSxpPW4oNTYpLGE9big5Nikscz1pKCJJRV9QUk9UTyIpLHU9T2JqZWN0LnByb3RvdHlwZTt0LmV4cG9ydHM9YT9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9byh0KSxyKHQscyk%2FdFtzXToiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3RvciYmdCBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3I%2FdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIE9iamVjdD91Om51bGx9fSxmdW5jdGlvbih0LGUsbil7big5OCk7dmFyIHI9bigxNDcpLG89big0KSxpPW4oMTUpLGE9bigyNSkscz1uKDEpKCJ0b1N0cmluZ1RhZyIpO2Zvcih2YXIgdSBpbiByKXt2YXIgYz1vW3VdLGw9YyYmYy5wcm90b3R5cGU7bCYmIWxbc10mJmkobCxzLHUpLGFbdV09YS5BcnJheX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY5KSxvPW4oMjUpLGk9bigxKSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtpXXx8dFsiQEBpdGVyYXRvciJdfHxvW3IodCldfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE5KSxvPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5wcm9taXNlPW5ldyB0KGZ1bmN0aW9uKHQscil7aWYodm9pZCAwIT09ZXx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7ZT10LG49cn0pLHRoaXMucmVzb2x2ZT1yKGUpLHRoaXMucmVqZWN0PXIobil9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFyKHQpKXJldHVybiB0O3ZhciBuLG87aWYoZSYmImZ1bmN0aW9uIj09dHlwZW9mKG49dC50b1N0cmluZykmJiFyKG89bi5jYWxsKHQpKSlyZXR1cm4gbztpZigiZnVuY3Rpb24iPT10eXBlb2Yobj10LnZhbHVlT2YpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoIWUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87dGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1Nyksbz1uKDY4KSxpPXIoImtleXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlbdF18fChpW3RdPW8odCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDEzOCksaT1uKDIyKSxhPXJbIl9fY29yZS1qc19zaGFyZWRfXyJdfHxvKCJfX2NvcmUtanNfc2hhcmVkX18iLHt9KTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFbdF18fChhW3RdPXZvaWQgMCE9PWU%2FZTp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjIuMCIsbW9kZTppPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89bigxMDIpLGk9bigzMSksYT1uKDI5KSxzPW4oNTEpLHU9bigxMDMpLGM9ZnVuY3Rpb24odCxlKXt0aGlzLnN0b3BwZWQ9dCx0aGlzLnJlc3VsdD1lfTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGwsZil7dmFyIHAsaCxkLGcsdix5LG09YShlLG4sbD8yOjEpO2lmKGYpcD10O2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mKGg9cyh0KSkpdGhyb3cgVHlwZUVycm9yKCJUYXJnZXQgaXMgbm90IGl0ZXJhYmxlIik7aWYobyhoKSl7Zm9yKGQ9MCxnPWkodC5sZW5ndGgpO2c%2BZDtkKyspaWYoKHY9bD9tKHIoeT10W2RdKVswXSx5WzFdKTptKHRbZF0pKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX1wPWguY2FsbCh0KX1mb3IoOyEoeT1wLm5leHQoKSkuZG9uZTspaWYoKHY9dShwLG0seS52YWx1ZSxsKSkmJnYgaW5zdGFuY2VvZiBjKXJldHVybiB2O3JldHVybiBuZXcgYyghMSl9KS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYyghMCx0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm57ZXJyb3I6ITEsdmFsdWU6dCgpfX1jYXRjaCh0KXtyZXR1cm57ZXJyb3I6ITAsdmFsdWU6dH19fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwKTtmdW5jdGlvbiBvKHQsZSxuLG8saSxhLHMpe3RyeXt2YXIgdT10W2FdKHMpLGM9dS52YWx1ZX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBuKHQpfXUuZG9uZT9lKGMpOnIucmVzb2x2ZShjKS50aGVuKG8saSl9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKHIsaSl7dmFyIGE9dC5hcHBseShlLG4pO2Z1bmN0aW9uIHModCl7byhhLHIsaSxzLHUsIm5leHQiLHQpfWZ1bmN0aW9uIHUodCl7byhhLHIsaSxzLHUsInRocm93Iix0KX1zKHZvaWQgMCl9KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ3KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI2Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89big2KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg3KSxvPW4oNjcpO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4KSxvPW4oMzEpLGk9big4OCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA%2FcjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjEpLG89bigxKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk%2FcihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSksbz1uKDE0Nik7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzApO3QuZXhwb3J0cz1yKCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiKXx8IiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI5KSxvPW4oODQpLGk9bigyMyksYT1uKDMxKSxzPW4oMTA5KSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsVD1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKVRbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoVCx5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY%2FLTE6Y3x8bD9sOlR9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTQpLG89bigyMCksaT1uKDI4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBhPXIoZSk7YSBpbiB0P28uZih0LGEsaSgwLG4pKTp0W2FdPW59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oMSkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIXIoZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4oZS5jb25zdHJ1Y3Rvcj17fSlbb109ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fSwxIT09ZVt0XShCb29sZWFuKS5mb299KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSJcdFxuXHZcZlxyIMKg4ZqA4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXHUyMDI4XHUyMDI5XHVmZWZmIn0sZnVuY3Rpb24odCxlLG4pe2UuZj1uKDEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjU0KSxvPW4oMjU3KSxpPW4oMjYyKSxhPW4oMjY1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCl8fG8odCl8fGkodCl8fGEoKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBQfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KTt2YXIgcj1uKDM2KSxvPW4ubihyKSxpPW4oMzcpLGE9bi5uKGkpLHM9bigzOCksdT1uLm4ocyksYz1uKDM5KSxsPW4ubihjKSxmPW4oNDApLHA9bi5uKGYpLGg9big0MSksZD1uLm4oaCksZz1uKDEzMCksdj1uLm4oZykseT1uKDYyKSxtPW4ubih5KSxiPW4oNykseD1uLm4oYiksdz1uKDEwKSxrPW4ubih3KSxTPW4oMTEpLEU9bi5uKFMpLFQ9bigxMzEpLEE9bi5uKFQpLE89bigzNSksQz1uKDQzKTtmdW5jdGlvbiBqKHQsZSl7dmFyIG47aWYodm9pZCAwPT09bC5hfHxudWxsPT11KCkodCkpe2lmKGEoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBMKHQsZSk7dmFyIHI9ZCgpKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7Ik9iamVjdCI9PT1yJiZ0LmNvbnN0cnVjdG9yJiYocj10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09cnx8IlNldCI9PT1yKXJldHVybiBwKCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gTCh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI%2BPXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBzLGM9ITAsZj0hMTtyZXR1cm57czpmdW5jdGlvbigpe249bygpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGM9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7Zj0hMCxzPXR9LGY6ZnVuY3Rpb24oKXt0cnl7Y3x8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihmKXRocm93IHN9fX19ZnVuY3Rpb24gTCh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfXZhciBQPXtjb2RlOiJOT05FIn0sUj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49dGhpcyxyPXQuc2NyYXBlclJlc3VsdCxvPXQubG9jYXRpb24saT10LmRhdGE7aygpKHRoaXMsZSksdGhpcy5leGNsdWRlQnlTY3JhcGVyRXJyb3I9ZnVuY3Rpb24oKXt2YXIgdD1uLnNjcmFwZXJSZXN1bHQ7cmV0dXJuIHQuZXJyb3I%2Fe2NvZGU6IkVSUk9SIixtZXNzYWdlOiJleGNsdWRlQnlTY3JhcGVyRXJyb3I6ICIuY29uY2F0KHQuZXJyb3IpfTp0Lml0ZW0%2FKHQuc2t1Um93c3x8KHQuc2t1Um93cz1bXSksUCk6e2NvZGU6IkVSUk9SIixtZXNzYWdlOiJleGNsdWRlQnlTY3JhcGVyRXJyb3I6IG5vIGl0ZW0ifX0sdGhpcy5leGNsdWRlQnlOb3RQdXJjaGFzYWJsZT1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQucHVyY2hhc2FibGU%2FUDp7Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlOb3RQdXJjaGFzYWJsZSJ9fSx0aGlzLmV4Y2x1ZGVCeVNrdVplcm89ZnVuY3Rpb24oKXtyZXR1cm4gbi5zY3JhcGVyUmVzdWx0LnNrdVJvd3MmJjA9PT1uLnNjcmFwZXJSZXN1bHQuc2t1Um93cy5sZW5ndGg%2Fe2NvZGU6Ik5PVF9QVVJDSEFTQUJMRSIsbWVzc2FnZToiZXhjbHVkZUJ5U2t1WmVybyJ9OlB9LHRoaXMuZXhjbHVkZUJ5VXJsPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlVcmwubGVuZ3RoKXJldHVybiBQO3ZhciB0PWUud2luZG93TG9jYXRpb25IcmVmO3JldHVybiBuLmV4Y2x1ZGUobi5ieVVybCx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCJeIi5jb25jYXQoQSgpKHgoKShuPWUudXJsKS5jYWxsKG4pKSkpLnRlc3QodCl9KX0sdGhpcy5leGNsdWRlQnlJdGVtTmFtZT1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbU5hbWUubGVuZ3RoKXJldHVybiBQO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5uYW1lfHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlJdGVtTmFtZSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCJeIi5jb25jYXQoeCgpKG49ZS5pdGVtTmFtZSkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGNsdWRlQnlJdGVtQ29kZT1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbUNvZGUubGVuZ3RoKXJldHVybiBQO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5jb2RlfHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlJdGVtQ29kZSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiB4KCkobj1lLml0ZW1Db2RlKS5jYWxsKG4pPT09dH0pfSx0aGlzLmV4Y2x1ZGVCeUNhdGVnb3J5PWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlDYXRlZ29yeS5sZW5ndGgpcmV0dXJuIFA7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNhdGVnb3J5fHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlDYXRlZ29yeSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiB4KCkobj1lLmNhdGVnb3J5KS5jYWxsKG4pPT09dH0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1EZXNjcmlwdGlvbj1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbURlc2NyaXB0aW9uLmxlbmd0aClyZXR1cm4gUDt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uZGVzY3JpcHRpb258fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1EZXNjcmlwdGlvbix0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCIiLmNvbmNhdCh4KCkobj1lLnRleHQpLmNhbGwobikpKS50ZXN0KHQpfSl9LHRoaXMuZXhlY3V0ZT1mdW5jdGlvbigpe3ZhciB0PSExLGU9W10scj1uLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcigpO2lmKCJOT05FIiE9PXIuY29kZSlyZXR1cm57aXNFeGNsdWRlZDohMCxyZWFzb25zOltyXX07Ik5PTkUiIT09KHI9bi5leGNsdWRlQnlOb3RQdXJjaGFzYWJsZSgpKS5jb2RlJiYodD0hMCxlLnB1c2gocikpO3ZhciBvLGk9aihuLmNvbmZpZ3VyZUV4Y2x1c2lvbk1ldGhvZHMoW24uZXhjbHVkZUJ5VXJsLG4uZXhjbHVkZUJ5SXRlbU5hbWUsbi5leGNsdWRlQnlJdGVtQ29kZSxuLmV4Y2x1ZGVCeUNhdGVnb3J5LG4uZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uXSkpO3RyeXtmb3IoaS5zKCk7IShvPWkubigpKS5kb25lOyl7dmFyIGE9KDAsby52YWx1ZSkoKTtpZigiTk9ORSIhPT1hLmNvZGUmJih0PSEwLGUucHVzaChhKSksIkVSUk9SIj09PWEuY29kZSlicmVha319Y2F0Y2godCl7aS5lKHQpfWZpbmFsbHl7aS5mKCl9cmV0dXJue2lzRXhjbHVkZWQ6dCxyZWFzb25zOmV9fSx0aGlzLnNjcmFwZXJSZXN1bHQ9cix0aGlzLmxvY2F0aW9uPW8sdGhpcy5kYXRhPWksdGhpcy5ieVVybD1pLmJ5VXJsLHRoaXMuYnlJdGVtTmFtZT1pLmJ5SXRlbU5hbWUsdGhpcy5ieUl0ZW1Db2RlPWkuYnlJdGVtQ29kZSx0aGlzLmJ5Q2F0ZWdvcnk9aS5ieUNhdGVnb3J5LHRoaXMuYnlJdGVtRGVzY3JpcHRpb249aS5ieUl0ZW1EZXNjcmlwdGlvbn1yZXR1cm4gRSgpKGUsW3trZXk6ImNvbmZpZ3VyZUV4Y2x1c2lvbk1ldGhvZHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0fX0se2tleToiZXhjbHVkZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBQfX1dLFt7a2V5OiJ3aW5kb3dMb2NhdGlvbkhyZWYiLGdldDpmdW5jdGlvbigpe3ZhciBlLG49d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLHI9d2luZG93LmxvY2F0aW9uLmhyZWY7aWYobSgpKGU9Qy5kZWJ1Z0hvc3RzKS5jYWxsKGUsbikpe3ZhciBvPW5ldyB2LmEod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCJ6enVybCIpO2lmKG8pdHJ5e3I9dC5mcm9tKG8sImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGYtOCIpfWNhdGNoKHQpe08uYS5lcnJvcih0KX19cmV0dXJuIHJ9fV0pLGV9KCl9KS5jYWxsKHRoaXMsbigyNzUpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODcpfSxmdW5jdGlvbih0LGUpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaCh0KXsib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX10LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaT1vJiYhci5jYWxsKHsxOjJ9LDEpO2UuZj1pP2Z1bmN0aW9uKHQpe3ZhciBlPW8odGhpcyx0KTtyZXR1cm4hIWUmJmUuZW51bWVyYWJsZX06cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDIxKSxpPSIiLnNwbGl0O3QuZXhwb3J0cz1yKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSk%2FZnVuY3Rpb24odCl7cmV0dXJuIlN0cmluZyI9PW8odCk%2FaS5jYWxsKHQsIiIpOk9iamVjdCh0KX06T2JqZWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDUpLGk9big2Myk7dC5leHBvcnRzPSFyJiYhbyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89LyN8XC5wcm90b3R5cGVcLi8saT1mdW5jdGlvbih0LGUpe3ZhciBuPXNbYSh0KV07cmV0dXJuIG49PWN8fG4hPXUmJigiZnVuY3Rpb24iPT10eXBlb2YgZT9yKGUpOiEhZSl9LGE9aS5ub3JtYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKG8sIi4iKS50b0xvd2VyQ2FzZSgpfSxzPWkuZGF0YT17fSx1PWkuTkFUSVZFPSJOIixjPWkuUE9MWUZJTEw9IlAiO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMiksbz1uKDE4KSxpPW4oNjUpLmluZGV4T2YsYT1uKDU1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixzPW8odCksdT0wLGM9W107Zm9yKG4gaW4gcykhcihhLG4pJiZyKHMsbikmJmMucHVzaChuKTtmb3IoO2UubGVuZ3RoPnU7KXIocyxuPWVbdSsrXSkmJih%2BaShjLG4pfHxjLnB1c2gobikpO3JldHVybiBjfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjYpLG89TWF0aC5tYXgsaT1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1yKHQpO3JldHVybiBuPDA%2FbyhuK2UsMCk6aShuLGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzApO3QuZXhwb3J0cz1yKCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTkpLG89big2KSxpPVtdLnNsaWNlLGE9e30scz1mdW5jdGlvbih0LGUsbil7aWYoIShlIGluIGEpKXtmb3IodmFyIHI9W10sbz0wO288ZTtvKyspcltvXT0iYVsiK28rIl0iO2FbZV09RnVuY3Rpb24oIkMsYSIsInJldHVybiBuZXcgQygiK3Iuam9pbigiLCIpKyIpIil9cmV0dXJuIGFbZV0odCxuKX07dC5leHBvcnRzPUZ1bmN0aW9uLmJpbmR8fGZ1bmN0aW9uKHQpe3ZhciBlPXIodGhpcyksbj1pLmNhbGwoYXJndW1lbnRzLDEpLGE9ZnVuY3Rpb24oKXt2YXIgcj1uLmNvbmNhdChpLmNhbGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBhP3MoZSxyLmxlbmd0aCxyKTplLmFwcGx5KHQscil9O3JldHVybiBvKGUucHJvdG90eXBlKSYmKGEucHJvdG90eXBlPWUucHJvdG90eXBlKSxhfX0sZnVuY3Rpb24odCxlLG4pe24oOTIpLG4oMzIpLG4oNTApLG4oMTQ4KSxuKDEwOCksbigxNTIpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oOTQpLGk9big0OSksYT1uKDcwKSxzPW4oMjQpLHU9bigxNSksYz1uKDMzKSxsPW4oMSksZj1uKDIyKSxwPW4oMjUpLGg9big5NSksZD1oLkl0ZXJhdG9yUHJvdG90eXBlLGc9aC5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHY9bCgiaXRlcmF0b3IiKSx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixsLGgsbSxiKXtvKG4sZSxsKTt2YXIgeCx3LGssUz1mdW5jdGlvbih0KXtpZih0PT09aCYmQylyZXR1cm4gQztpZighZyYmdCBpbiBBKXJldHVybiBBW3RdO3N3aXRjaCh0KXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpjYXNlImVudHJpZXMiOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9fSxFPWUrIiBJdGVyYXRvciIsVD0hMSxBPXQucHJvdG90eXBlLE89QVt2XXx8QVsiQEBpdGVyYXRvciJdfHxoJiZBW2hdLEM9IWcmJk98fFMoaCksaj0iQXJyYXkiPT1lJiZBLmVudHJpZXN8fE87aWYoaiYmKHg9aShqLmNhbGwobmV3IHQpKSxkIT09T2JqZWN0LnByb3RvdHlwZSYmeC5uZXh0JiYoZnx8aSh4KT09PWR8fChhP2EoeCxkKToiZnVuY3Rpb24iIT10eXBlb2YgeFt2XSYmdSh4LHYseSkpLHMoeCxFLCEwLCEwKSxmJiYocFtFXT15KSkpLCJ2YWx1ZXMiPT1oJiZPJiYidmFsdWVzIiE9PU8ubmFtZSYmKFQ9ITAsQz1mdW5jdGlvbigpe3JldHVybiBPLmNhbGwodGhpcyl9KSxmJiYhYnx8QVt2XT09PUN8fHUoQSx2LEMpLHBbZV09QyxoKWlmKHc9e3ZhbHVlczpTKCJ2YWx1ZXMiKSxrZXlzOm0%2FQzpTKCJrZXlzIiksZW50cmllczpTKCJlbnRyaWVzIil9LGIpZm9yKGsgaW4gdykhZyYmIVQmJmsgaW4gQXx8YyhBLGssd1trXSk7ZWxzZSByKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6Z3x8VH0sdyk7cmV0dXJuIHd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOTUpLkl0ZXJhdG9yUHJvdG90eXBlLG89big0NyksaT1uKDI4KSxhPW4oMjQpLHM9bigyNSksdT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBjPWUrIiBJdGVyYXRvciI7cmV0dXJuIHQucHJvdG90eXBlPW8ocix7bmV4dDppKDEsbil9KSxhKHQsYywhMSwhMCksc1tjXT11LHR9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLG8saSxhPW4oNDkpLHM9bigxNSksdT1uKDEyKSxjPW4oMSksbD1uKDIyKSxmPWMoIml0ZXJhdG9yIikscD0hMTtbXS5rZXlzJiYoIm5leHQiaW4oaT1bXS5rZXlzKCkpPyhvPWEoYShpKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmKHI9byk6cD0hMCksbnVsbD09ciYmKHI9e30pLGx8fHUocixmKXx8cyhyLGYsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuZXhwb3J0cz17SXRlcmF0b3JQcm90b3R5cGU6cixCVUdHWV9TQUZBUklfSVRFUkFUT1JTOnB9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgdCkhPT10LnByb3RvdHlwZX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxOCksbz1uKDcxKSxpPW4oMjUpLGE9big0OCkscz1uKDkzKSx1PWEuc2V0LGM9YS5nZXR0ZXJGb3IoIkFycmF5IEl0ZXJhdG9yIik7dC5leHBvcnRzPXMoQXJyYXksIkFycmF5IixmdW5jdGlvbih0LGUpe3UodGhpcyx7dHlwZToiQXJyYXkgSXRlcmF0b3IiLHRhcmdldDpyKHQpLGluZGV4OjAsa2luZDplfSl9LGZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzKSxlPXQudGFyZ2V0LG49dC5raW5kLHI9dC5pbmRleCsrO3JldHVybiFlfHxyPj1lLmxlbmd0aD8odC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6ZVtyXSxkb25lOiExfTp7dmFsdWU6W3IsZVtyXV0sZG9uZTohMX19LCJ2YWx1ZXMiKSxpLkFyZ3VtZW50cz1pLkFycmF5LG8oImtleXMiKSxvKCJ2YWx1ZXMiKSxvKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpO3QuZXhwb3J0cz1yLlByb21pc2V9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgbyBpbiBlKW4mJm4udW5zYWZlJiZ0W29dP3Rbb109ZVtvXTpyKHQsbyxlW29dLG4pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IFR5cGVFcnJvcigiSW5jb3JyZWN0ICIrKG4%2FbisiICI6IiIpKyJpbnZvY2F0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPW4oMjUpLGk9cigiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihvLkFycmF5PT09dHx8YVtpXT09PXQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3RyeXtyZXR1cm4gbz9lKHIobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbCh0KSksZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSgiaXRlcmF0b3IiKSxvPSExO3RyeXt2YXIgaT0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIWkrK319LHJldHVybjpmdW5jdGlvbigpe289ITB9fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFvKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgaT17fTtpW3JdPWZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX19fSx0KGkpfWNhdGNoKHQpe31yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89bigxOSksaT1uKDEpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1yKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0obj1yKGEpW2ldKT9lOm8obil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9big0KSxzPW4oNSksdT1uKDIxKSxjPW4oMjkpLGw9big4OSksZj1uKDYzKSxwPWEubG9jYXRpb24saD1hLnNldEltbWVkaWF0ZSxkPWEuY2xlYXJJbW1lZGlhdGUsZz1hLnByb2Nlc3Msdj1hLk1lc3NhZ2VDaGFubmVsLHk9YS5EaXNwYXRjaCxtPTAsYj17fSx4PWZ1bmN0aW9uKHQpe2lmKGIuaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPWJbdF07ZGVsZXRlIGJbdF0sZSgpfX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt4KHQpfX0saz1mdW5jdGlvbih0KXt4KHQuZGF0YSl9LFM9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh0KyIiLHAucHJvdG9jb2wrIi8vIitwLmhvc3QpfTtoJiZkfHwoaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO2FyZ3VtZW50cy5sZW5ndGg%2BbjspZS5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gYlsrK21dPWZ1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCkpLmFwcGx5KHZvaWQgMCxlKX0scihtKSxtfSxkPWZ1bmN0aW9uKHQpe2RlbGV0ZSBiW3RdfSwicHJvY2VzcyI9PXUoZyk%2Fcj1mdW5jdGlvbih0KXtnLm5leHRUaWNrKHcodCkpfTp5JiZ5Lm5vdz9yPWZ1bmN0aW9uKHQpe3kubm93KHcodCkpfTp2PyhpPShvPW5ldyB2KS5wb3J0MixvLnBvcnQxLm9ubWVzc2FnZT1rLHI9YyhpLnBvc3RNZXNzYWdlLGksMSkpOiFhLmFkZEV2ZW50TGlzdGVuZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBwb3N0TWVzc2FnZXx8YS5pbXBvcnRTY3JpcHRzfHxzKFMpP3I9Im9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbih0KXtsLmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlbW92ZUNoaWxkKHRoaXMpLHgodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHcodCksMCl9OihyPVMsYS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrLCExKSkpLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6ZH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89big2KSxpPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKHIodCksbyhlKSYmZS5jb25zdHJ1Y3Rvcj09PXQpcmV0dXJuIGU7dmFyIG49aS5mKHQpO3JldHVybigwLG4ucmVzb2x2ZSkoZSksbi5wcm9taXNlfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxOSksaT1uKDUyKSxhPW4oNTkpLHM9big1OCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YWxsU2V0dGxlZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49aS5mKGUpLHI9bi5yZXNvbHZlLHU9bi5yZWplY3QsYz1hKGZ1bmN0aW9uKCl7dmFyIG49byhlLnJlc29sdmUpLGk9W10sYT0wLHU9MTtzKHQsZnVuY3Rpb24odCl7dmFyIG89YSsrLHM9ITE7aS5wdXNoKHZvaWQgMCksdSsrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7c3x8KHM9ITAsaVtvXT17c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOnR9LC0tdXx8cihpKSl9LGZ1bmN0aW9uKHQpe3N8fChzPSEwLGlbb109e3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjp0fSwtLXV8fHIoaSkpfSl9KSwtLXV8fHIoaSl9KTtyZXR1cm4gYy5lcnJvciYmdShjLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89big1MyksaT1uKDEpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG8odCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj10LmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhbyhuLnByb3RvdHlwZSk%2FcihuKSYmbnVsbD09PShuPW5baV0pJiYobj12b2lkIDApOm49dm9pZCAwKSxuZXcodm9pZCAwPT09bj9BcnJheTpuKSgwPT09ZT8wOmUpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big1KSxpPW4oNTMpLGE9big2KSxzPW4oMjMpLHU9bigzMSksYz1uKDc0KSxsPW4oMTA5KSxmPW4oNzUpLHA9bigxKSgiaXNDb25jYXRTcHJlYWRhYmxlIiksaD0hbyhmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0W3BdPSExLHQuY29uY2F0KClbMF0hPT10fSksZD1mKCJjb25jYXQiKSxnPWZ1bmN0aW9uKHQpe2lmKCFhKHQpKXJldHVybiExO3ZhciBlPXRbcF07cmV0dXJuIHZvaWQgMCE9PWU%2FISFlOmkodCl9O3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohaHx8IWR9LHtjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhPXModGhpcyksZj1sKGEsMCkscD0wO2ZvcihlPS0xLHI9YXJndW1lbnRzLmxlbmd0aDtlPHI7ZSsrKWlmKGk9LTE9PT1lP2E6YXJndW1lbnRzW2VdLGcoaSkpe2lmKHArKG89dShpLmxlbmd0aCkpPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgVHlwZUVycm9yKCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQiKTtmb3Iobj0wO248bztuKysscCsrKW4gaW4gaSYmYyhmLHAsaVtuXSl9ZWxzZXtpZihwPj05MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7YyhmLHArKyxpKX1yZXR1cm4gZi5sZW5ndGg9cCxmfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Niksbz0iWyIrbig3NikrIl0iLGk9UmVnRXhwKCJeIitvK28rIioiKSxhPVJlZ0V4cChvK28rIiokIikscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKHIoZSkpO3JldHVybiAxJnQmJihuPW4ucmVwbGFjZShpLCIiKSksMiZ0JiYobj1uLnJlcGxhY2UoYSwiIikpLG59fTt0LmV4cG9ydHM9e3N0YXJ0OnMoMSksZW5kOnMoMiksdHJpbTpzKDMpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4Nil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTk4KX0sZnVuY3Rpb24odCxlLG4pe24oMTEwKSxuKDkyKSxuKDE5OSksbigyMDIpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMTEzKSxuKDIwNiksbigyMDcpLG4oMjA4KSxuKDIwOSksbigyMTApLG4oMjExKSxuKDIxMiksbigyMTMpLG4oMjE0KSxuKDIxNSksbigyMTYpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuU3ltYm9sfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4Nyksbz1uKDY3KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0KSxpPW4oNzIpLGE9W10uc2xpY2Uscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjIsbz1yP2EuY2FsbChhcmd1bWVudHMsMik6dm9pZCAwO3JldHVybiB0KHI%2FZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIGU%2FZTpGdW5jdGlvbihlKSkuYXBwbHkodGhpcyxvKX06ZSxuKX19O3Ioe2dsb2JhbDohMCxiaW5kOiEwLGZvcmNlZDovTVNJRSAuXC4vLnRlc3QoaSl9LHtzZXRUaW1lb3V0OnMoby5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpzKG8uc2V0SW50ZXJ2YWwpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89big1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBpdGVyYWJsZSIpO3JldHVybiByKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7bigyMzgpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuQXJyYXkuaXNBcnJheX0sZnVuY3Rpb24odCxlLG4pe24oMzIpLG4oMjQyKTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLkFycmF5LmZyb219LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0NSksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2xpY2U7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLnNsaWNlP3I6ZX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7KG51bGw9PWV8fGU%2BdC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjU4KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTczKSxvPW4oMTc3KSxpPW4oMTgxKTtmdW5jdGlvbiBhKGUsbixzKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJm8%2FdC5leHBvcnRzPWE9bzp0LmV4cG9ydHM9YT1mdW5jdGlvbih0LGUsbil7dmFyIG89aSh0LGUpO2lmKG8pe3ZhciBhPXIobyxlKTtyZXR1cm4gYS5nZXQ%2FYS5nZXQuY2FsbChuKTphLnZhbHVlfX0sYShlLG4sc3x8ZSl9dC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI7Ci8qIQogKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjQuMQogKiBodHRwczovL2pxdWVyeS5jb20vCiAqCiAqIEluY2x1ZGVzIFNpenpsZS5qcwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxOS0wNS0wMVQyMTowNFoKICovCi8qIQogKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjQuMQogKiBodHRwczovL2pxdWVyeS5jb20vCiAqCiAqIEluY2x1ZGVzIFNpenpsZS5qcwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxOS0wNS0wMVQyMTowNFoKICovCiFmdW5jdGlvbihlLG4peyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIHQuZXhwb3J0cz90LmV4cG9ydHM9ZS5kb2N1bWVudD9uKGUsITApOmZ1bmN0aW9uKHQpe2lmKCF0LmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBuKHQpfTpuKGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihuLG8peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1bXSxhPW4uZG9jdW1lbnQscz1PYmplY3QuZ2V0UHJvdG90eXBlT2YsdT1pLnNsaWNlLGM9aS5jb25jYXQsbD1pLnB1c2gsZj1pLmluZGV4T2YscD17fSxoPXAudG9TdHJpbmcsZD1wLmhhc093blByb3BlcnR5LGc9ZC50b1N0cmluZyx2PWcuY2FsbChPYmplY3QpLHk9e30sbT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSxiPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiZ0PT09dC53aW5kb3d9LHg9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiB3KHQsZSxuKXt2YXIgcixvLGk9KG49bnx8YSkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoaS50ZXh0PXQsZSlmb3IociBpbiB4KShvPWVbcl18fGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZShyKSkmJmkuc2V0QXR0cmlidXRlKHIsbyk7bi5oZWFkLmFwcGVuZENoaWxkKGkpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSl9ZnVuY3Rpb24gayh0KXtyZXR1cm4gbnVsbD09dD90KyIiOiJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQ%2FcFtoLmNhbGwodCldfHwib2JqZWN0Ijp0eXBlb2YgdH12YXIgUz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgUy5mbi5pbml0KHQsZSl9LEU9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO2Z1bmN0aW9uIFQodCl7dmFyIGU9ISF0JiYibGVuZ3RoImluIHQmJnQubGVuZ3RoLG49ayh0KTtyZXR1cm4hbSh0KSYmIWIodCkmJigiYXJyYXkiPT09bnx8MD09PWV8fCJudW1iZXIiPT10eXBlb2YgZSYmZT4wJiZlLTEgaW4gdCl9Uy5mbj1TLnByb3RvdHlwZT17anF1ZXJ5OiIzLjQuMSIsY29uc3RydWN0b3I6UyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHUuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3UuY2FsbCh0aGlzKTp0PDA%2FdGhpc1t0K3RoaXMubGVuZ3RoXTp0aGlzW3RdfSxwdXNoU3RhY2s6ZnVuY3Rpb24odCl7dmFyIGU9Uy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksdCk7cmV0dXJuIGUucHJldk9iamVjdD10aGlzLGV9LGVhY2g6ZnVuY3Rpb24odCl7cmV0dXJuIFMuZWFjaCh0aGlzLHQpfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMubWFwKHRoaXMsZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5jYWxsKGUsbixlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxlbmd0aCxuPSt0Kyh0PDA%2FZTowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjxlP1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpsLHNvcnQ6aS5zb3J0LHNwbGljZTppLnNwbGljZX0sUy5leHRlbmQ9Uy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixvLGksYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsYz0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGM9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KHQ9YXJndW1lbnRzW3NdKSlmb3IoZSBpbiB0KXI9dFtlXSwiX19wcm90b19fIiE9PWUmJmEhPT1yJiYoYyYmciYmKFMuaXNQbGFpbk9iamVjdChyKXx8KG89QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbZV0saT1vJiYhQXJyYXkuaXNBcnJheShuKT9bXTpvfHxTLmlzUGxhaW5PYmplY3Qobik%2Fbjp7fSxvPSExLGFbZV09Uy5leHRlbmQoYyxpLHIpKTp2b2lkIDAhPT1yJiYoYVtlXT1yKSk7cmV0dXJuIGF9LFMuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKygiMy40LjEiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKHQpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlLG47cmV0dXJuISghdHx8IltvYmplY3QgT2JqZWN0XSIhPT1oLmNhbGwodCkpJiYoIShlPXModCkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj1kLmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcikmJmcuY2FsbChuKT09PXYpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24odCxlKXt3KHQse25vbmNlOmUmJmUubm9uY2V9KX0sZWFjaDpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MDtpZihUKHQpKWZvcihuPXQubGVuZ3RoO3I8biYmITEhPT1lLmNhbGwodFtyXSxyLHRbcl0pO3IrKyk7ZWxzZSBmb3IociBpbiB0KWlmKCExPT09ZS5jYWxsKHRbcl0scix0W3JdKSlicmVhaztyZXR1cm4gdH0sdHJpbTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjoodCsiIikucmVwbGFjZShFLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49ZXx8W107cmV0dXJuIG51bGwhPXQmJihUKE9iamVjdCh0KSk%2FUy5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgdD9bdF06dCk6bC5jYWxsKG4sdCkpLG59LGluQXJyYXk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT1lPy0xOmYuY2FsbChlLHQsbil9LG1lcmdlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPStlLmxlbmd0aCxyPTAsbz10Lmxlbmd0aDtyPG47cisrKXRbbysrXT1lW3JdO3JldHVybiB0Lmxlbmd0aD1vLHR9LGdyZXA6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxvPTAsaT10Lmxlbmd0aCxhPSFuO288aTtvKyspIWUodFtvXSxvKSE9PWEmJnIucHVzaCh0W29dKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9MCxhPVtdO2lmKFQodCkpZm9yKHI9dC5sZW5ndGg7aTxyO2krKyludWxsIT0obz1lKHRbaV0saSxuKSkmJmEucHVzaChvKTtlbHNlIGZvcihpIGluIHQpbnVsbCE9KG89ZSh0W2ldLGksbikpJiZhLnB1c2gobyk7cmV0dXJuIGMuYXBwbHkoW10sYSl9LGd1aWQ6MSxzdXBwb3J0Onl9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUy5mbltTeW1ib2wuaXRlcmF0b3JdPWlbU3ltYm9sLml0ZXJhdG9yXSksUy5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe3BbIltvYmplY3QgIitlKyJdIl09ZS50b0xvd2VyQ2FzZSgpfSk7dmFyIEE9Ci8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjQKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanMuZm91bmRhdGlvbi8KICoKICogRGF0ZTogMjAxOS0wNC0wOAogKi8KZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdSxjLGwsZixwLGgsZCxnLHYseSxtLGIseD0ic2l6emxlIisxKm5ldyBEYXRlLHc9dC5kb2N1bWVudCxrPTAsUz0wLEU9dXQoKSxUPXV0KCksQT11dCgpLE89dXQoKSxDPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lJiYoZj0hMCksMH0saj17fS5oYXNPd25Qcm9wZXJ0eSxMPVtdLFA9TC5wb3AsUj1MLnB1c2gsTj1MLnB1c2gsST1MLnNsaWNlLEQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYodFtuXT09PWUpcmV0dXJuIG47cmV0dXJuLTF9LF89ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixVPSIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsQj0iXFxbIitNKyIqKCIrVSsiKSg%2FOiIrTSsiKihbKl4kfCF%2BXT89KSIrTSsiKig%2FOicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg%2FOlxcXFwufFteXFxcXFwiXSkqKVwifCgiK1UrIikpfCkiK00rIipcXF0iLHE9IjooIitVKyIpKD86XFwoKCgnKCg%2FOlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg%2FOlxcXFwufFteXFxcXCgpW1xcXV18IitCKyIpKil8LiopXFwpfCkiLEY9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLEg9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg%2FOlxcXFwuKSopIitNKyIrJCIsImciKSx6PW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksVz1uZXcgUmVnRXhwKCJeIitNKyIqKFs%2BK35dfCIrTSsiKSIrTSsiKiIpLCQ9bmV3IFJlZ0V4cChNKyJ8PiIpLFY9bmV3IFJlZ0V4cChxKSxZPW5ldyBSZWdFeHAoIl4iK1UrIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK1UrIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrVSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrVSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK0IpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitxKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitfKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls%2BK35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg%2FOi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxLPS9IVE1MJC9pLFg9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLFE9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyx0dD0vWyt%2BXS8sZXQ9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI%2FfCgiK00rIil8LikiLCJpZyIpLG50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0iMHgiK2UtNjU1MzY7cmV0dXJuIHIhPXJ8fG4%2FZTpyPDA%2FU3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKHI%2BPjEwfDU1Mjk2LDEwMjMmcnw1NjMyMCl9LHJ0PS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXDAtXHgxZlx4N2YtXHVGRkZGXHctXS9nLG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU%2FIlwwIj09PXQ%2FIu%2B%2FvSI6dC5zbGljZSgwLC0xKSsiXFwiK3QuY2hhckNvZGVBdCh0Lmxlbmd0aC0xKS50b1N0cmluZygxNikrIiAiOiJcXCIrdH0saXQ9ZnVuY3Rpb24oKXtwKCl9LGF0PXh0KGZ1bmN0aW9uKHQpe3JldHVybiEwPT09dC5kaXNhYmxlZCYmImZpZWxkc2V0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKX0se2RpcjoicGFyZW50Tm9kZSIsbmV4dDoibGVnZW5kIn0pO3RyeXtOLmFwcGx5KEw9SS5jYWxsKHcuY2hpbGROb2Rlcyksdy5jaGlsZE5vZGVzKSxMW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKHQpe049e2FwcGx5OkwubGVuZ3RoP2Z1bmN0aW9uKHQsZSl7Ui5hcHBseSh0LEkuY2FsbChlKSl9OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLHI9MDt0W24rK109ZVtyKytdOyk7dC5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc3QodCxlLHIsbyl7dmFyIGkscyxjLGwsZixkLHksbT1lJiZlLm93bmVyRG9jdW1lbnQsaz1lP2Uubm9kZVR5cGU6OTtpZihyPXJ8fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiByO2lmKCFvJiYoKGU%2FZS5vd25lckRvY3VtZW50fHxlOncpIT09aCYmcChlKSxlPWV8fGgsZykpe2lmKDExIT09ayYmKGY9Wi5leGVjKHQpKSlpZihpPWZbMV0pe2lmKDk9PT1rKXtpZighKGM9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIHI7aWYoYy5pZD09PWkpcmV0dXJuIHIucHVzaChjKSxyfWVsc2UgaWYobSYmKGM9bS5nZXRFbGVtZW50QnlJZChpKSkmJmIoZSxjKSYmYy5pZD09PWkpcmV0dXJuIHIucHVzaChjKSxyfWVsc2V7aWYoZlsyXSlyZXR1cm4gTi5hcHBseShyLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLHI7aWYoKGk9ZlszXSkmJm4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBOLmFwcGx5KHIsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxyfWlmKG4ucXNhJiYhT1t0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09a3x8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZih5PXQsbT1lLDE9PT1rJiYkLnRlc3QodCkpe2ZvcigobD1lLmdldEF0dHJpYnV0ZSgiaWQiKSk%2FbD1sLnJlcGxhY2UocnQsb3QpOmUuc2V0QXR0cmlidXRlKCJpZCIsbD14KSxzPShkPWEodCkpLmxlbmd0aDtzLS07KWRbc109IiMiK2wrIiAiK2J0KGRbc10pO3k9ZC5qb2luKCIsIiksbT10dC50ZXN0KHQpJiZ5dChlLnBhcmVudE5vZGUpfHxlfXRyeXtyZXR1cm4gTi5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh5KSkscn1jYXRjaChlKXtPKHQsITApfWZpbmFsbHl7bD09PXgmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIHUodC5yZXBsYWNlKEgsIiQxIiksZSxyLG8pfWZ1bmN0aW9uIHV0KCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uIGUobixvKXtyZXR1cm4gdC5wdXNoKG4rIiAiKT5yLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVt0LnNoaWZ0KCldLGVbbisiICJdPW99fWZ1bmN0aW9uIGN0KHQpe3JldHVybiB0W3hdPSEwLHR9ZnVuY3Rpb24gbHQodCl7dmFyIGU9aC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIXQoZSl9Y2F0Y2godCl7cmV0dXJuITF9ZmluYWxseXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlPW51bGx9fWZ1bmN0aW9uIGZ0KHQsZSl7Zm9yKHZhciBuPXQuc3BsaXQoInwiKSxvPW4ubGVuZ3RoO28tLTspci5hdHRySGFuZGxlW25bb11dPWV9ZnVuY3Rpb24gcHQodCxlKXt2YXIgbj1lJiZ0LHI9biYmMT09PXQubm9kZVR5cGUmJjE9PT1lLm5vZGVUeXBlJiZ0LnNvdXJjZUluZGV4LWUuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKWZvcig7bj1uLm5leHRTaWJsaW5nOylpZihuPT09ZSlyZXR1cm4tMTtyZXR1cm4gdD8xOi0xfWZ1bmN0aW9uIGh0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZ3QodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU%2FZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ%2FImxhYmVsImluIGU%2FImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZhdChlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiB2dCh0KXtyZXR1cm4gY3QoZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsY3QoZnVuY3Rpb24obixyKXtmb3IodmFyIG8saT10KFtdLG4ubGVuZ3RoLGUpLGE9aS5sZW5ndGg7YS0tOyluW289aVthXV0mJihuW29dPSEocltvXT1uW29dKSl9KX0pfWZ1bmN0aW9uIHl0KHQpe3JldHVybiB0JiZ2b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lJiZ0fWZvcihlIGluIG49c3Quc3VwcG9ydD17fSxpPXN0LmlzWE1MPWZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZXNwYWNlVVJJLG49KHQub3duZXJEb2N1bWVudHx8dCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFLLnRlc3QoZXx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0scD1zdC5zZXREb2N1bWVudD1mdW5jdGlvbih0KXt2YXIgZSxvLGE9dD90Lm93bmVyRG9jdW1lbnR8fHQ6dztyZXR1cm4gYSE9PWgmJjk9PT1hLm5vZGVUeXBlJiZhLmRvY3VtZW50RWxlbWVudD8oZD0oaD1hKS5kb2N1bWVudEVsZW1lbnQsZz0haShoKSx3IT09aCYmKG89aC5kZWZhdWx0VmlldykmJm8udG9wIT09byYmKG8uYWRkRXZlbnRMaXN0ZW5lcj9vLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsaXQsITEpOm8uYXR0YWNoRXZlbnQmJm8uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixpdCkpLG4uYXR0cmlidXRlcz1sdChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc05hbWU9ImkiLCF0LmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxuLmdldEVsZW1lbnRzQnlUYWdOYW1lPWx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmFwcGVuZENoaWxkKGguY3JlYXRlQ29tbWVudCgiIikpLCF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVEudGVzdChoLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLG4uZ2V0QnlJZD1sdChmdW5jdGlvbih0KXtyZXR1cm4gZC5hcHBlbmRDaGlsZCh0KS5pZD14LCFoLmdldEVsZW1lbnRzQnlOYW1lfHwhaC5nZXRFbGVtZW50c0J5TmFtZSh4KS5sZW5ndGh9KSxuLmdldEJ5SWQ%2FKHIuZmlsdGVyLklEPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj1lLmdldEVsZW1lbnRCeUlkKHQpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dm9pZCAwIT09dC5nZXRBdHRyaWJ1dGVOb2RlJiZ0LmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG4mJm4udmFsdWU9PT1lfX0sci5maW5kLklEPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixvLGk9ZS5nZXRFbGVtZW50QnlJZCh0KTtpZihpKXtpZigobj1pLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09dClyZXR1cm5baV07Zm9yKG89ZS5nZXRFbGVtZW50c0J5TmFtZSh0KSxyPTA7aT1vW3IrK107KWlmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltpXX1yZXR1cm5bXX19KSxyLmZpbmQuVEFHPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWU%2FZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09ZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpOm4ucXNhP2UucXVlcnlTZWxlY3RvckFsbCh0KTp2b2lkIDB9OmZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXSxvPTAsaT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpO2lmKCIqIj09PXQpe2Zvcig7bj1pW28rK107KTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIGl9LHIuZmluZC5DTEFTUz1uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZnKXJldHVybiBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodCl9LHk9W10sdj1bXSwobi5xc2E9US50ZXN0KGgucXVlcnlTZWxlY3RvckFsbCkpJiYobHQoZnVuY3Rpb24odCl7ZC5hcHBlbmRDaGlsZCh0KS5pbm5lckhUTUw9IjxhIGlkPSciK3grIic%2BPC9hPjxzZWxlY3QgaWQ9JyIreCsiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc%2BPC9vcHRpb24%2BPC9zZWxlY3Q%2BIix0LnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoJiZ2LnB1c2goIlsqXiRdPSIrTSsiKig%2FOicnfFwiXCIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHx2LnB1c2goIlxcWyIrTSsiKig%2FOnZhbHVlfCIrXysiKSIpLHQucXVlcnlTZWxlY3RvckFsbCgiW2lkfj0iK3grIi1dIikubGVuZ3RofHx2LnB1c2goIn49IiksdC5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8di5wdXNoKCI6Y2hlY2tlZCIpLHQucXVlcnlTZWxlY3RvckFsbCgiYSMiK3grIisqIikubGVuZ3RofHx2LnB1c2goIi4jLitbK35dIil9KSxsdChmdW5jdGlvbih0KXt0LmlubmVySFRNTD0iPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT48c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc%2BPG9wdGlvbi8%2BPC9zZWxlY3Q%2BIjt2YXIgZT1oLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSx0LmFwcGVuZENoaWxkKGUpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZ2LnB1c2goIm5hbWUiK00rIipbKl4kfCF%2BXT89IiksMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxkLmFwcGVuZENoaWxkKHQpLmRpc2FibGVkPSEwLDIhPT10LnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLHQucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLHYucHVzaCgiLC4qOiIpfSkpLChuLm1hdGNoZXNTZWxlY3Rvcj1RLnRlc3QobT1kLm1hdGNoZXN8fGQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxkLm1vek1hdGNoZXNTZWxlY3Rvcnx8ZC5vTWF0Y2hlc1NlbGVjdG9yfHxkLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmx0KGZ1bmN0aW9uKHQpe24uZGlzY29ubmVjdGVkTWF0Y2g9bS5jYWxsKHQsIioiKSxtLmNhbGwodCwiW3MhPScnXTp4IikseS5wdXNoKCIhPSIscSl9KSx2PXYubGVuZ3RoJiZuZXcgUmVnRXhwKHYuam9pbigifCIpKSx5PXkubGVuZ3RoJiZuZXcgUmVnRXhwKHkuam9pbigifCIpKSxlPVEudGVzdChkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSxiPWV8fFEudGVzdChkLmNvbnRhaW5zKT9mdW5jdGlvbih0LGUpe3ZhciBuPTk9PT10Lm5vZGVUeXBlP3QuZG9jdW1lbnRFbGVtZW50OnQscj1lJiZlLnBhcmVudE5vZGU7cmV0dXJuIHQ9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbih0LGUpe2lmKGUpZm9yKDtlPWUucGFyZW50Tm9kZTspaWYoZT09PXQpcmV0dXJuITA7cmV0dXJuITF9LEM9ZT9mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiBmPSEwLDA7dmFyIHI9IXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWUuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIHJ8fCgxJihyPSh0Lm93bmVyRG9jdW1lbnR8fHQpPT09KGUub3duZXJEb2N1bWVudHx8ZSk%2FdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKToxKXx8IW4uc29ydERldGFjaGVkJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpPT09cj90PT09aHx8dC5vd25lckRvY3VtZW50PT09dyYmYih3LHQpPy0xOmU9PT1ofHxlLm93bmVyRG9jdW1lbnQ9PT13JiZiKHcsZSk%2FMTpsP0QobCx0KS1EKGwsZSk6MDo0JnI%2FLTE6MSl9OmZ1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGY9ITAsMDt2YXIgbixyPTAsbz10LnBhcmVudE5vZGUsaT1lLnBhcmVudE5vZGUsYT1bdF0scz1bZV07aWYoIW98fCFpKXJldHVybiB0PT09aD8tMTplPT09aD8xOm8%2FLTE6aT8xOmw%2FRChsLHQpLUQobCxlKTowO2lmKG89PT1pKXJldHVybiBwdCh0LGUpO2ZvcihuPXQ7bj1uLnBhcmVudE5vZGU7KWEudW5zaGlmdChuKTtmb3Iobj1lO249bi5wYXJlbnROb2RlOylzLnVuc2hpZnQobik7Zm9yKDthW3JdPT09c1tyXTspcisrO3JldHVybiByP3B0KGFbcl0sc1tyXSk6YVtyXT09PXc%2FLTE6c1tyXT09PXc%2FMTowfSxoKTpofSxzdC5tYXRjaGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHN0KHQsbnVsbCxudWxsLGUpfSxzdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtpZigodC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFPW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSYmKCF2fHwhdi50ZXN0KGUpKSl0cnl7dmFyIHI9bS5jYWxsKHQsZSk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8dC5kb2N1bWVudCYmMTEhPT10LmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKHQpe08oZSwhMCl9cmV0dXJuIHN0KGUsaCxudWxsLFt0XSkubGVuZ3RoPjB9LHN0LmNvbnRhaW5zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpLGIodCxlKX0sc3QuYXR0cj1mdW5jdGlvbih0LGUpeyh0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KTt2YXIgbz1yLmF0dHJIYW5kbGVbZS50b0xvd2VyQ2FzZSgpXSxpPW8mJmouY2FsbChyLmF0dHJIYW5kbGUsZS50b0xvd2VyQ2FzZSgpKT9vKHQsZSwhZyk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1pP2k6bi5hdHRyaWJ1dGVzfHwhZz90LmdldEF0dHJpYnV0ZShlKTooaT10LmdldEF0dHJpYnV0ZU5vZGUoZSkpJiZpLnNwZWNpZmllZD9pLnZhbHVlOm51bGx9LHN0LmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odCsiIikucmVwbGFjZShydCxvdCl9LHN0LmVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIit0KX0sc3QudW5pcXVlU29ydD1mdW5jdGlvbih0KXt2YXIgZSxyPVtdLG89MCxpPTA7aWYoZj0hbi5kZXRlY3REdXBsaWNhdGVzLGw9IW4uc29ydFN0YWJsZSYmdC5zbGljZSgwKSx0LnNvcnQoQyksZil7Zm9yKDtlPXRbaSsrXTspZT09PXRbaV0mJihvPXIucHVzaChpKSk7Zm9yKDtvLS07KXQuc3BsaWNlKHJbb10sMSl9cmV0dXJuIGw9bnVsbCx0fSxvPXN0LmdldFRleHQ9ZnVuY3Rpb24odCl7dmFyIGUsbj0iIixyPTAsaT10Lm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIHQudGV4dENvbnRlbnQpcmV0dXJuIHQudGV4dENvbnRlbnQ7Zm9yKHQ9dC5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKW4rPW8odCl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIHQubm9kZVZhbHVlfWVsc2UgZm9yKDtlPXRbcisrXTspbis9byhlKTtyZXR1cm4gbn0sKHI9c3Quc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86Y3QsbWF0Y2g6RyxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI%2BIjp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMV09dFsxXS5yZXBsYWNlKGV0LG50KSx0WzNdPSh0WzNdfHx0WzRdfHx0WzVdfHwiIikucmVwbGFjZShldCxudCksIn49Ij09PXRbMl0mJih0WzNdPSIgIit0WzNdKyIgIiksdC5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbih0KXtyZXR1cm4gdFsxXT10WzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT10WzFdLnNsaWNlKDAsMyk%2FKHRbM118fHN0LmVycm9yKHRbMF0pLHRbNF09Kyh0WzRdP3RbNV0rKHRbNl18fDEpOjIqKCJldmVuIj09PXRbM118fCJvZGQiPT09dFszXSkpLHRbNV09Kyh0WzddK3RbOF18fCJvZGQiPT09dFszXSkpOnRbM10mJnN0LmVycm9yKHRbMF0pLHR9LFBTRVVETzpmdW5jdGlvbih0KXt2YXIgZSxuPSF0WzZdJiZ0WzJdO3JldHVybiBHLkNISUxELnRlc3QodFswXSk%2FbnVsbDoodFszXT90WzJdPXRbNF18fHRbNV18fCIiOm4mJlYudGVzdChuKSYmKGU9YShuLCEwKSkmJihlPW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtZSktbi5sZW5ndGgpJiYodFswXT10WzBdLnNsaWNlKDAsZSksdFsyXT1uLnNsaWNlKDAsZSkpLHQuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09dD9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZX19LENMQVNTOmZ1bmN0aW9uKHQpe3ZhciBlPUVbdCsiICJdO3JldHVybiBlfHwoZT1uZXcgUmVnRXhwKCIoXnwiK00rIikiK3QrIigiK00rInwkKSIpKSYmRSh0LGZ1bmN0aW9uKHQpe3JldHVybiBlLnRlc3QoInN0cmluZyI9PXR5cGVvZiB0LmNsYXNzTmFtZSYmdC5jbGFzc05hbWV8fHZvaWQgMCE9PXQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbz1zdC5hdHRyKHIsdCk7cmV0dXJuIG51bGw9PW8%2FIiE9Ij09PWU6IWV8fChvKz0iIiwiPSI9PT1lP289PT1uOiIhPSI9PT1lP28hPT1uOiJePSI9PT1lP24mJjA9PT1vLmluZGV4T2Yobik6Iio9Ij09PWU%2FbiYmby5pbmRleE9mKG4pPi0xOiIkPSI9PT1lP24mJm8uc2xpY2UoLW4ubGVuZ3RoKT09PW46In49Ij09PWU%2FKCIgIitvLnJlcGxhY2UoRiwiICIpKyIgIikuaW5kZXhPZihuKT4tMToifD0iPT09ZSYmKG89PT1ufHxvLnNsaWNlKDAsbi5sZW5ndGgrMSk9PT1uKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT0ibnRoIiE9PXQuc2xpY2UoMCwzKSxhPSJsYXN0IiE9PXQuc2xpY2UoLTQpLHM9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PXImJjA9PT1vP2Z1bmN0aW9uKHQpe3JldHVybiEhdC5wYXJlbnROb2RlfTpmdW5jdGlvbihlLG4sdSl7dmFyIGMsbCxmLHAsaCxkLGc9aSE9PWE%2FIm5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIix2PWUucGFyZW50Tm9kZSx5PXMmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxtPSF1JiYhcyxiPSExO2lmKHYpe2lmKGkpe2Zvcig7Zzspe2ZvcihwPWU7cD1wW2ddOylpZihzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpcmV0dXJuITE7ZD1nPSJvbmx5Ij09PXQmJiFkJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGQ9W2E%2Fdi5maXJzdENoaWxkOnYubGFzdENoaWxkXSxhJiZtKXtmb3IoYj0oaD0oYz0obD0oZj0ocD12KVt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XXx8W10pWzBdPT09ayYmY1sxXSkmJmNbMl0scD1oJiZ2LmNoaWxkTm9kZXNbaF07cD0rK2gmJnAmJnBbZ118fChiPWg9MCl8fGQucG9wKCk7KWlmKDE9PT1wLm5vZGVUeXBlJiYrK2ImJnA9PT1lKXtsW3RdPVtrLGgsYl07YnJlYWt9fWVsc2UgaWYobSYmKGI9aD0oYz0obD0oZj0ocD1lKVt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XXx8W10pWzBdPT09ayYmY1sxXSksITE9PT1iKWZvcig7KHA9KytoJiZwJiZwW2ddfHwoYj1oPTApfHxkLnBvcCgpKSYmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PXk6MSE9PXAubm9kZVR5cGUpfHwhKytifHwobSYmKChsPShmPXBbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF09W2ssYl0pLHAhPT1lKSk7KTtyZXR1cm4oYi09byk9PT1yfHxiJXI9PTAmJmIvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24odCxlKXt2YXIgbixvPXIucHNldWRvc1t0XXx8ci5zZXRGaWx0ZXJzW3QudG9Mb3dlckNhc2UoKV18fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrdCk7cmV0dXJuIG9beF0%2FbyhlKTpvLmxlbmd0aD4xPyhuPVt0LHQsIiIsZV0sci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KHQudG9Mb3dlckNhc2UoKSk%2FY3QoZnVuY3Rpb24odCxuKXtmb3IodmFyIHIsaT1vKHQsZSksYT1pLmxlbmd0aDthLS07KXRbcj1EKHQsaVthXSldPSEobltyXT1pW2FdKX0pOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCxuKX0pOm99fSxwc2V1ZG9zOntub3Q6Y3QoZnVuY3Rpb24odCl7dmFyIGU9W10sbj1bXSxyPXModC5yZXBsYWNlKEgsIiQxIikpO3JldHVybiByW3hdP2N0KGZ1bmN0aW9uKHQsZSxuLG8pe2Zvcih2YXIgaSxhPXIodCxudWxsLG8sW10pLHM9dC5sZW5ndGg7cy0tOykoaT1hW3NdKSYmKHRbc109IShlW3NdPWkpKX0pOmZ1bmN0aW9uKHQsbyxpKXtyZXR1cm4gZVswXT10LHIoZSxudWxsLGksbiksZVswXT1udWxsLCFuLnBvcCgpfX0pLGhhczpjdChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHN0KHQsZSkubGVuZ3RoPjB9fSksY29udGFpbnM6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKGV0LG50KSxmdW5jdGlvbihlKXtyZXR1cm4oZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KT4tMX19KSxsYW5nOmN0KGZ1bmN0aW9uKHQpe3JldHVybiBZLnRlc3QodHx8IiIpfHxzdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIit0KSx0PXQucmVwbGFjZShldCxudCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgbjtkb3tpZihuPWc%2FZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT10fHwwPT09bi5pbmRleE9mKHQrIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciBuPXQubG9jYXRpb24mJnQubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1kfSxmb2N1czpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWguYWN0aXZlRWxlbWVudCYmKCFoLmhhc0ZvY3VzfHxoLmhhc0ZvY3VzKCkpJiYhISh0LnR5cGV8fHQuaHJlZnx8fnQudGFiSW5kZXgpfSxlbmFibGVkOmd0KCExKSxkaXNhYmxlZDpndCghMCksY2hlY2tlZDpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiEhdC5jaGVja2VkfHwib3B0aW9uIj09PWUmJiEhdC5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT10LnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbih0KXtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpaWYodC5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIXIucHNldWRvcy5lbXB0eSh0KX0saGVhZGVyOmZ1bmN0aW9uKHQpe3JldHVybiBKLnRlc3QodC5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBYLnRlc3QodC5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiJidXR0b24iPT09dC50eXBlfHwiYnV0dG9uIj09PWV9LHRleHQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09dC50eXBlJiYobnVsbD09KGU9dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWUudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZ0KGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2dChmdW5jdGlvbih0LGUpe3JldHVybltlLTFdfSksZXE6dnQoZnVuY3Rpb24odCxlLG4pe3JldHVybltuPDA%2FbitlOm5dfSksZXZlbjp2dChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLG9kZDp2dChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0xO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLGx0OnZ0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjwwP24rZTpuPmU%2FZTpuOy0tcj49MDspdC5wdXNoKHIpO3JldHVybiB0fSksZ3Q6dnQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uPDA%2FbitlOm47KytyPGU7KXQucHVzaChyKTtyZXR1cm4gdH0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pci5wc2V1ZG9zW2VdPWh0KGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pci5wc2V1ZG9zW2VdPWR0KGUpO2Z1bmN0aW9uIG10KCl7fWZ1bmN0aW9uIGJ0KHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGgscj0iIjtlPG47ZSsrKXIrPXRbZV0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24geHQodCxlLG4pe3ZhciByPWUuZGlyLG89ZS5uZXh0LGk9b3x8cixhPW4mJiJwYXJlbnROb2RlIj09PWkscz1TKys7cmV0dXJuIGUuZmlyc3Q%2FZnVuY3Rpb24oZSxuLG8pe2Zvcig7ZT1lW3JdOylpZigxPT09ZS5ub2RlVHlwZXx8YSlyZXR1cm4gdChlLG4sbyk7cmV0dXJuITF9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxsLGYscD1bayxzXTtpZih1KXtmb3IoO2U9ZVtyXTspaWYoKDE9PT1lLm5vZGVUeXBlfHxhKSYmdChlLG4sdSkpcmV0dXJuITB9ZWxzZSBmb3IoO2U9ZVtyXTspaWYoMT09PWUubm9kZVR5cGV8fGEpaWYobD0oZj1lW3hdfHwoZVt4XT17fSkpW2UudW5pcXVlSURdfHwoZltlLnVuaXF1ZUlEXT17fSksbyYmbz09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbcl18fGU7ZWxzZXtpZigoYz1sW2ldKSYmY1swXT09PWsmJmNbMV09PT1zKXJldHVybiBwWzJdPWNbMl07aWYobFtpXT1wLHBbMl09dChlLG4sdSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHd0KHQpe3JldHVybiB0Lmxlbmd0aD4xP2Z1bmN0aW9uKGUsbixyKXtmb3IodmFyIG89dC5sZW5ndGg7by0tOylpZighdFtvXShlLG4scikpcmV0dXJuITE7cmV0dXJuITB9OnRbMF19ZnVuY3Rpb24ga3QodCxlLG4scixvKXtmb3IodmFyIGksYT1bXSxzPTAsdT10Lmxlbmd0aCxjPW51bGwhPWU7czx1O3MrKykoaT10W3NdKSYmKG4mJiFuKGkscixvKXx8KGEucHVzaChpKSxjJiZlLnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBTdCh0LGUsbixyLG8saSl7cmV0dXJuIHImJiFyW3hdJiYocj1TdChyKSksbyYmIW9beF0mJihvPVN0KG8saSkpLGN0KGZ1bmN0aW9uKGksYSxzLHUpe3ZhciBjLGwsZixwPVtdLGg9W10sZD1hLmxlbmd0aCxnPWl8fGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MCxvPWUubGVuZ3RoO3I8bztyKyspc3QodCxlW3JdLG4pO3JldHVybiBufShlfHwiKiIscy5ub2RlVHlwZT9bc106cyxbXSksdj0hdHx8IWkmJmU%2FZzprdChnLHAsdCxzLHUpLHk9bj9vfHwoaT90OmR8fHIpP1tdOmE6djtpZihuJiZuKHYseSxzLHUpLHIpZm9yKGM9a3QoeSxoKSxyKGMsW10scyx1KSxsPWMubGVuZ3RoO2wtLTspKGY9Y1tsXSkmJih5W2hbbF1dPSEodltoW2xdXT1mKSk7aWYoaSl7aWYob3x8dCl7aWYobyl7Zm9yKGM9W10sbD15Lmxlbmd0aDtsLS07KShmPXlbbF0pJiZjLnB1c2godltsXT1mKTtvKG51bGwseT1bXSxjLHUpfWZvcihsPXkubGVuZ3RoO2wtLTspKGY9eVtsXSkmJihjPW8%2FRChpLGYpOnBbbF0pPi0xJiYoaVtjXT0hKGFbY109ZikpfX1lbHNlIHk9a3QoeT09PWE%2FeS5zcGxpY2UoZCx5Lmxlbmd0aCk6eSksbz9vKG51bGwsYSx5LHUpOk4uYXBwbHkoYSx5KX0pfWZ1bmN0aW9uIEV0KHQpe2Zvcih2YXIgZSxuLG8saT10Lmxlbmd0aCxhPXIucmVsYXRpdmVbdFswXS50eXBlXSxzPWF8fHIucmVsYXRpdmVbIiAiXSx1PWE%2FMTowLGw9eHQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lfSxzLCEwKSxmPXh0KGZ1bmN0aW9uKHQpe3JldHVybiBEKGUsdCk%2BLTF9LHMsITApLHA9W2Z1bmN0aW9uKHQsbixyKXt2YXIgbz0hYSYmKHJ8fG4hPT1jKXx8KChlPW4pLm5vZGVUeXBlP2wodCxuLHIpOmYodCxuLHIpKTtyZXR1cm4gZT1udWxsLG99XTt1PGk7dSsrKWlmKG49ci5yZWxhdGl2ZVt0W3VdLnR5cGVdKXA9W3h0KHd0KHApLG4pXTtlbHNle2lmKChuPXIuZmlsdGVyW3RbdV0udHlwZV0uYXBwbHkobnVsbCx0W3VdLm1hdGNoZXMpKVt4XSl7Zm9yKG89Kyt1O288aSYmIXIucmVsYXRpdmVbdFtvXS50eXBlXTtvKyspO3JldHVybiBTdCh1PjEmJnd0KHApLHU%2BMSYmYnQodC5zbGljZSgwLHUtMSkuY29uY2F0KHt2YWx1ZToiICI9PT10W3UtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShILCIkMSIpLG4sdTxvJiZFdCh0LnNsaWNlKHUsbykpLG88aSYmRXQodD10LnNsaWNlKG8pKSxvPGkmJmJ0KHQpKX1wLnB1c2gobil9cmV0dXJuIHd0KHApfXJldHVybiBtdC5wcm90b3R5cGU9ci5maWx0ZXJzPXIucHNldWRvcyxyLnNldEZpbHRlcnM9bmV3IG10LGE9c3QudG9rZW5pemU9ZnVuY3Rpb24odCxlKXt2YXIgbixvLGksYSxzLHUsYyxsPVRbdCsiICJdO2lmKGwpcmV0dXJuIGU%2FMDpsLnNsaWNlKDApO2ZvcihzPXQsdT1bXSxjPXIucHJlRmlsdGVyO3M7KXtmb3IoYSBpbiBuJiYhKG89ei5leGVjKHMpKXx8KG8mJihzPXMuc2xpY2Uob1swXS5sZW5ndGgpfHxzKSx1LnB1c2goaT1bXSkpLG49ITEsKG89Vy5leGVjKHMpKSYmKG49by5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOm9bMF0ucmVwbGFjZShILCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKSxyLmZpbHRlcikhKG89R1thXS5leGVjKHMpKXx8Y1thXSYmIShvPWNbYV0obykpfHwobj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6YSxtYXRjaGVzOm99KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gZT9zLmxlbmd0aDpzP3N0LmVycm9yKHQpOlQodCx1KS5zbGljZSgwKX0scz1zdC5jb21waWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1bXSxpPVtdLHM9QVt0KyIgIl07aWYoIXMpe2ZvcihlfHwoZT1hKHQpKSxuPWUubGVuZ3RoO24tLTspKHM9RXQoZVtuXSkpW3hdP28ucHVzaChzKTppLnB1c2gocyk7KHM9QSh0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg%2BMCxvPXQubGVuZ3RoPjAsaT1mdW5jdGlvbihpLGEscyx1LGwpe3ZhciBmLGQsdix5PTAsbT0iMCIsYj1pJiZbXSx4PVtdLHc9YyxTPWl8fG8mJnIuZmluZC5UQUcoIioiLGwpLEU9ays9bnVsbD09dz8xOk1hdGgucmFuZG9tKCl8fC4xLFQ9Uy5sZW5ndGg7Zm9yKGwmJihjPWE9PT1ofHxhfHxsKTttIT09VCYmbnVsbCE9KGY9U1ttXSk7bSsrKXtpZihvJiZmKXtmb3IoZD0wLGF8fGYub3duZXJEb2N1bWVudD09PWh8fChwKGYpLHM9IWcpO3Y9dFtkKytdOylpZih2KGYsYXx8aCxzKSl7dS5wdXNoKGYpO2JyZWFrfWwmJihrPUUpfW4mJigoZj0hdiYmZikmJnktLSxpJiZiLnB1c2goZikpfWlmKHkrPW0sbiYmbSE9PXkpe2ZvcihkPTA7dj1lW2QrK107KXYoYix4LGEscyk7aWYoaSl7aWYoeT4wKWZvcig7bS0tOyliW21dfHx4W21dfHwoeFttXT1QLmNhbGwodSkpO3g9a3QoeCl9Ti5hcHBseSh1LHgpLGwmJiFpJiZ4Lmxlbmd0aD4wJiZ5K2UubGVuZ3RoPjEmJnN0LnVuaXF1ZVNvcnQodSl9cmV0dXJuIGwmJihrPUUsYz13KSxifTtyZXR1cm4gbj9jdChpKTppfShpLG8pKSkuc2VsZWN0b3I9dH1yZXR1cm4gc30sdT1zdC5zZWxlY3Q9ZnVuY3Rpb24odCxlLG4sbyl7dmFyIGksdSxjLGwsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LGg9IW8mJmEodD1wLnNlbGVjdG9yfHx0KTtpZihuPW58fFtdLDE9PT1oLmxlbmd0aCl7aWYoKHU9aFswXT1oWzBdLnNsaWNlKDApKS5sZW5ndGg%2BMiYmIklEIj09PShjPXVbMF0pLnR5cGUmJjk9PT1lLm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEoZT0oci5maW5kLklEKGMubWF0Y2hlc1swXS5yZXBsYWNlKGV0LG50KSxlKXx8W10pWzBdKSlyZXR1cm4gbjtwJiYoZT1lLnBhcmVudE5vZGUpLHQ9dC5zbGljZSh1LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoaT1HLm5lZWRzQ29udGV4dC50ZXN0KHQpPzA6dS5sZW5ndGg7aS0tJiYoYz11W2ldLCFyLnJlbGF0aXZlW2w9Yy50eXBlXSk7KWlmKChmPXIuZmluZFtsXSkmJihvPWYoYy5tYXRjaGVzWzBdLnJlcGxhY2UoZXQsbnQpLHR0LnRlc3QodVswXS50eXBlKSYmeXQoZS5wYXJlbnROb2RlKXx8ZSkpKXtpZih1LnNwbGljZShpLDEpLCEodD1vLmxlbmd0aCYmYnQodSkpKXJldHVybiBOLmFwcGx5KG4sbyksbjticmVha319cmV0dXJuKHB8fHModCxoKSkobyxlLCFnLG4sIWV8fHR0LnRlc3QodCkmJnl0KGUucGFyZW50Tm9kZSl8fGUpLG59LG4uc29ydFN0YWJsZT14LnNwbGl0KCIiKS5zb3J0KEMpLmpvaW4oIiIpPT09eCxuLmRldGVjdER1cGxpY2F0ZXM9ISFmLHAoKSxuLnNvcnREZXRhY2hlZD1sdChmdW5jdGlvbih0KXtyZXR1cm4gMSZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGguY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxsdChmdW5jdGlvbih0KXtyZXR1cm4gdC5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PXQuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmdCgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24odCxlLG4pe2lmKCFuKXJldHVybiB0LmdldEF0dHJpYnV0ZShlLCJ0eXBlIj09PWUudG9Mb3dlckNhc2UoKT8xOjIpfSksbi5hdHRyaWJ1dGVzJiZsdChmdW5jdGlvbih0KXtyZXR1cm4gdC5pbm5lckhUTUw9IjxpbnB1dC8%2BIix0LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmdCgidmFsdWUiLGZ1bmN0aW9uKHQsZSxuKXtpZighbiYmImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gdC5kZWZhdWx0VmFsdWV9KSxsdChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZnQoXyxmdW5jdGlvbih0LGUsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT10W2VdP2UudG9Mb3dlckNhc2UoKToocj10LmdldEF0dHJpYnV0ZU5vZGUoZSkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzdH0obik7Uy5maW5kPUEsUy5leHByPUEuc2VsZWN0b3JzLFMuZXhwclsiOiJdPVMuZXhwci5wc2V1ZG9zLFMudW5pcXVlU29ydD1TLnVuaXF1ZT1BLnVuaXF1ZVNvcnQsUy50ZXh0PUEuZ2V0VGV4dCxTLmlzWE1MRG9jPUEuaXNYTUwsUy5jb250YWlucz1BLmNvbnRhaW5zLFMuZXNjYXBlU2VsZWN0b3I9QS5lc2NhcGU7dmFyIE89ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxvPXZvaWQgMCE9PW47KHQ9dFtlXSkmJjkhPT10Lm5vZGVUeXBlOylpZigxPT09dC5ub2RlVHlwZSl7aWYobyYmUyh0KS5pcyhuKSlicmVhaztyLnB1c2godCl9cmV0dXJuIHJ9LEM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W107dDt0PXQubmV4dFNpYmxpbmcpMT09PXQubm9kZVR5cGUmJnQhPT1lJiZuLnB1c2godCk7cmV0dXJuIG59LGo9Uy5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBMKHQsZSl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWUudG9Mb3dlckNhc2UoKX12YXIgUD0vXjwoW2Etel1bXlwvXDA%2BOlx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBSKHQsZSxuKXtyZXR1cm4gbShlKT9TLmdyZXAodCxmdW5jdGlvbih0LHIpe3JldHVybiEhZS5jYWxsKHQscix0KSE9PW59KTplLm5vZGVUeXBlP1MuZ3JlcCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZSE9PW59KToic3RyaW5nIiE9dHlwZW9mIGU%2FUy5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIGYuY2FsbChlLHQpPi0xIT09bn0pOlMuZmlsdGVyKGUsdCxuKX1TLmZpbHRlcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXTtyZXR1cm4gbiYmKHQ9Ijpub3QoIit0KyIpIiksMT09PWUubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9TLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsdCk%2FW3JdOltdOlMuZmluZC5tYXRjaGVzKHQsUy5ncmVwKGUsZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfSkpfSxTLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbih0KXt2YXIgZSxuLHI9dGhpcy5sZW5ndGgsbz10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyh0KS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoZT0wO2U8cjtlKyspaWYoUy5jb250YWlucyhvW2VdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSxlPTA7ZTxyO2UrKylTLmZpbmQodCxvW2VdLG4pO3JldHVybiByPjE%2FUy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUih0aGlzLHR8fFtdLCExKSl9LG5vdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUih0aGlzLHR8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKHQpe3JldHVybiEhUih0aGlzLCJzdHJpbmciPT10eXBlb2YgdCYmai50ZXN0KHQpP1ModCk6dHx8W10sITEpLmxlbmd0aH19KTt2YXIgTixJPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KFMuZm4uaW5pdD1mdW5jdGlvbih0LGUsbil7dmFyIHIsbztpZighdClyZXR1cm4gdGhpcztpZihuPW58fE4sInN0cmluZyI9PXR5cGVvZiB0KXtpZighKHI9IjwiPT09dFswXSYmIj4iPT09dFt0Lmxlbmd0aC0xXSYmdC5sZW5ndGg%2BPTM%2FW251bGwsdCxudWxsXTpJLmV4ZWModCkpfHwhclsxXSYmZSlyZXR1cm4hZXx8ZS5qcXVlcnk%2FKGV8fG4pLmZpbmQodCk6dGhpcy5jb25zdHJ1Y3RvcihlKS5maW5kKHQpO2lmKHJbMV0pe2lmKGU9ZSBpbnN0YW5jZW9mIFM%2FZVswXTplLFMubWVyZ2UodGhpcyxTLnBhcnNlSFRNTChyWzFdLGUmJmUubm9kZVR5cGU%2FZS5vd25lckRvY3VtZW50fHxlOmEsITApKSxQLnRlc3QoclsxXSkmJlMuaXNQbGFpbk9iamVjdChlKSlmb3IociBpbiBlKW0odGhpc1tyXSk%2FdGhpc1tyXShlW3JdKTp0aGlzLmF0dHIocixlW3JdKTtyZXR1cm4gdGhpc31yZXR1cm4obz1hLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09byx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiB0Lm5vZGVUeXBlPyh0aGlzWzBdPXQsdGhpcy5sZW5ndGg9MSx0aGlzKTptKHQpP3ZvaWQgMCE9PW4ucmVhZHk%2Fbi5yZWFkeSh0KTp0KFMpOlMubWFrZUFycmF5KHQsdGhpcyl9KS5wcm90b3R5cGU9Uy5mbixOPVMoYSk7dmFyIEQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBNKHQsZSl7Zm9yKDsodD10W2VdKSYmMSE9PXQubm9kZVR5cGU7KTtyZXR1cm4gdH1TLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKHQpe3ZhciBlPVModCx0aGlzKSxuPWUubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8bjt0KyspaWYoUy5jb250YWlucyh0aGlzLGVbdF0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTAsbz10aGlzLmxlbmd0aCxpPVtdLGE9InN0cmluZyIhPXR5cGVvZiB0JiZTKHQpO2lmKCFqLnRlc3QodCkpZm9yKDtyPG87cisrKWZvcihuPXRoaXNbcl07biYmbiE9PWU7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE%2FYS5pbmRleChuKT4tMToxPT09bi5ub2RlVHlwZSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLHQpKSl7aS5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhpLmxlbmd0aD4xP1MudW5pcXVlU29ydChpKTppKX0saW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHQ%2FInN0cmluZyI9PXR5cGVvZiB0P2YuY2FsbChTKHQpLHRoaXNbMF0pOmYuY2FsbCh0aGlzLHQuanF1ZXJ5P3RbMF06dCk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy51bmlxdWVTb3J0KFMubWVyZ2UodGhpcy5nZXQoKSxTKHQsZSkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PXQ%2FdGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIodCkpfX0pLFMuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtyZXR1cm4gZSYmMTEhPT1lLm5vZGVUeXBlP2U6bnVsbH0scGFyZW50czpmdW5jdGlvbih0KXtyZXR1cm4gTyh0LCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE8odCwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24odCl7cmV0dXJuIE0odCwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbih0KXtyZXR1cm4gTSh0LCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbih0KXtyZXR1cm4gTyh0LCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPKHQsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTyh0LCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbih0KXtyZXR1cm4gQygodC5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCx0KX0sY2hpbGRyZW46ZnVuY3Rpb24odCl7cmV0dXJuIEModC5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQuY29udGVudERvY3VtZW50P3QuY29udGVudERvY3VtZW50OihMKHQsInRlbXBsYXRlIikmJih0PXQuY29udGVudHx8dCksUy5tZXJnZShbXSx0LmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbihuLHIpe3ZhciBvPVMubWFwKHRoaXMsZSxuKTtyZXR1cm4iVW50aWwiIT09dC5zbGljZSgtNSkmJihyPW4pLHImJiJzdHJpbmciPT10eXBlb2YgciYmKG89Uy5maWx0ZXIocixvKSksdGhpcy5sZW5ndGg%2BMSYmKF9bdF18fFMudW5pcXVlU29ydChvKSxELnRlc3QodCkmJm8ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhvKX19KTt2YXIgVT0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIEIodCl7cmV0dXJuIHR9ZnVuY3Rpb24gcSh0KXt0aHJvdyB0fWZ1bmN0aW9uIEYodCxlLG4scil7dmFyIG87dHJ5e3QmJm0obz10LnByb21pc2UpP28uY2FsbCh0KS5kb25lKGUpLmZhaWwobik6dCYmbShvPXQudGhlbik%2Fby5jYWxsKHQsZSxuKTplLmFwcGx5KHZvaWQgMCxbdF0uc2xpY2UocikpfWNhdGNoKHQpe24uYXBwbHkodm9pZCAwLFt0XSl9fVMuQ2FsbGJhY2tzPWZ1bmN0aW9uKHQpe3Q9InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiBTLmVhY2godC5tYXRjaChVKXx8W10sZnVuY3Rpb24odCxuKXtlW25dPSEwfSksZX0odCk6Uy5leHRlbmQoe30sdCk7dmFyIGUsbixyLG8saT1bXSxhPVtdLHM9LTEsdT1mdW5jdGlvbigpe2ZvcihvPW98fHQub25jZSxyPWU9ITA7YS5sZW5ndGg7cz0tMSlmb3Iobj1hLnNoaWZ0KCk7KytzPGkubGVuZ3RoOykhMT09PWlbc10uYXBwbHkoblswXSxuWzFdKSYmdC5zdG9wT25GYWxzZSYmKHM9aS5sZW5ndGgsbj0hMSk7dC5tZW1vcnl8fChuPSExKSxlPSExLG8mJihpPW4%2FW106IiIpfSxjPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKG4mJiFlJiYocz1pLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gZShuKXtTLmVhY2gobixmdW5jdGlvbihuLHIpe20ocik%2FdC51bmlxdWUmJmMuaGFzKHIpfHxpLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09ayhyKSYmZShyKX0pfShhcmd1bWVudHMpLG4mJiFlJiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBTLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuOyhuPVMuaW5BcnJheShlLGksbikpPi0xOylpLnNwbGljZShuLDEpLG48PXMmJnMtLX0pLHRoaXN9LGhhczpmdW5jdGlvbih0KXtyZXR1cm4gdD9TLmluQXJyYXkodCxpKT4tMTppLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBpJiYoaT1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBvPWE9W10saT1uPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWl9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gbz1hPVtdLG58fGV8fChpPW49IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhb30sZmlyZVdpdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gb3x8KG49W3QsKG49bnx8W10pLnNsaWNlP24uc2xpY2UoKTpuXSxhLnB1c2gobiksZXx8dSgpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFyfX07cmV0dXJuIGN9LFMuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbih0KXt2YXIgZT1bWyJub3RpZnkiLCJwcm9ncmVzcyIsUy5DYWxsYmFja3MoIm1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0scj0icGVuZGluZyIsbz17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gby50aGVuKG51bGwsdCl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHM7cmV0dXJuIFMuRGVmZXJyZWQoZnVuY3Rpb24obil7Uy5lYWNoKGUsZnVuY3Rpb24oZSxyKXt2YXIgbz1tKHRbcls0XV0pJiZ0W3JbNF1dO2lbclsxXV0oZnVuY3Rpb24oKXt2YXIgdD1vJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0JiZtKHQucHJvbWlzZSk%2FdC5wcm9taXNlKCkucHJvZ3Jlc3Mobi5ub3RpZnkpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KTpuW3JbMF0rIldpdGgiXSh0aGlzLG8%2FW3RdOmFyZ3VtZW50cyl9KX0pLHQ9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsbyl7dmFyIGk9MDtmdW5jdGlvbiBhKHQsZSxyLG8pe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsYz1mdW5jdGlvbigpe3ZhciBuLGM7aWYoISh0PGkpKXtpZigobj1yLmFwcGx5KHMsdSkpPT09ZS5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7Yz1uJiYoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJm4udGhlbixtKGMpP28%2FYy5jYWxsKG4sYShpLGUsQixvKSxhKGksZSxxLG8pKTooaSsrLGMuY2FsbChuLGEoaSxlLEIsbyksYShpLGUscSxvKSxhKGksZSxCLGUubm90aWZ5V2l0aCkpKToociE9PUImJihzPXZvaWQgMCx1PVtuXSksKG98fGUucmVzb2x2ZVdpdGgpKHMsdSkpfX0sbD1vP2M6ZnVuY3Rpb24oKXt0cnl7YygpfWNhdGNoKG4pe1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmUy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKG4sbC5zdGFja1RyYWNlKSx0KzE%2BPWkmJihyIT09cSYmKHM9dm9pZCAwLHU9W25dKSxlLnJlamVjdFdpdGgocyx1KSl9fTt0P2woKTooUy5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihsLnN0YWNrVHJhY2U9Uy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksbi5zZXRUaW1lb3V0KGwpKX19cmV0dXJuIFMuRGVmZXJyZWQoZnVuY3Rpb24obil7ZVswXVszXS5hZGQoYSgwLG4sbShvKT9vOkIsbi5ub3RpZnlXaXRoKSksZVsxXVszXS5hZGQoYSgwLG4sbSh0KT90OkIpKSxlWzJdWzNdLmFkZChhKDAsbixtKHIpP3I6cSkpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10P1MuZXh0ZW5kKHQsbyk6b319LGk9e307cmV0dXJuIFMuZWFjaChlLGZ1bmN0aW9uKHQsbil7dmFyIGE9blsyXSxzPW5bNV07b1tuWzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sZVszLXRdWzJdLmRpc2FibGUsZVszLXRdWzNdLmRpc2FibGUsZVswXVsyXS5sb2NrLGVbMF1bM10ubG9jayksYS5hZGQoblszXS5maXJlKSxpW25bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGlbblswXSsiV2l0aCJdKHRoaXM9PT1pP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30saVtuWzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLG8ucHJvbWlzZShpKSx0JiZ0LmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1lLHI9QXJyYXkobiksbz11LmNhbGwoYXJndW1lbnRzKSxpPVMuRGVmZXJyZWQoKSxhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyW3RdPXRoaXMsb1t0XT1hcmd1bWVudHMubGVuZ3RoPjE%2FdS5jYWxsKGFyZ3VtZW50cyk6biwtLWV8fGkucmVzb2x2ZVdpdGgocixvKX19O2lmKGU8PTEmJihGKHQsaS5kb25lKGEobikpLnJlc29sdmUsaS5yZWplY3QsIWUpLCJwZW5kaW5nIj09PWkuc3RhdGUoKXx8bShvW25dJiZvW25dLnRoZW4pKSlyZXR1cm4gaS50aGVuKCk7Zm9yKDtuLS07KUYob1tuXSxhKG4pLGkucmVqZWN0KTtyZXR1cm4gaS5wcm9taXNlKCl9fSk7dmFyIEg9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsZSl7bi5jb25zb2xlJiZuLmNvbnNvbGUud2FybiYmdCYmSC50ZXN0KHQubmFtZSkmJm4uY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLGUpfSxTLnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe24uc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIHo9Uy5EZWZlcnJlZCgpO2Z1bmN0aW9uIFcoKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFcpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsVyksUy5yZWFkeSgpfVMuZm4ucmVhZHk9ZnVuY3Rpb24odCl7cmV0dXJuIHoudGhlbih0KS5jYXRjaChmdW5jdGlvbih0KXtTLnJlYWR5RXhjZXB0aW9uKHQpfSksdGhpc30sUy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24odCl7KCEwPT09dD8tLVMucmVhZHlXYWl0OlMuaXNSZWFkeSl8fChTLmlzUmVhZHk9ITAsITAhPT10JiYtLVMucmVhZHlXYWl0PjB8fHoucmVzb2x2ZVdpdGgoYSxbU10pKX19KSxTLnJlYWR5LnRoZW49ei50aGVuLCJjb21wbGV0ZSI9PT1hLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWEucmVhZHlTdGF0ZSYmIWEuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP24uc2V0VGltZW91dChTLnJlYWR5KTooYS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixXKSxuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFcpKTt2YXIgJD1mdW5jdGlvbih0LGUsbixyLG8saSxhKXt2YXIgcz0wLHU9dC5sZW5ndGgsYz1udWxsPT1uO2lmKCJvYmplY3QiPT09ayhuKSlmb3IocyBpbiBvPSEwLG4pJCh0LGUscyxuW3NdLCEwLGksYSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYobz0hMCxtKHIpfHwoYT0hMCksYyYmKGE%2FKGUuY2FsbCh0LHIpLGU9bnVsbCk6KGM9ZSxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYy5jYWxsKFModCksbil9KSksZSkpZm9yKDtzPHU7cysrKWUodFtzXSxuLGE%2FcjpyLmNhbGwodFtzXSxzLGUodFtzXSxuKSkpO3JldHVybiBvP3Q6Yz9lLmNhbGwodCk6dT9lKHRbMF0sbik6aX0sVj0vXi1tcy0vLFk9Ly0oW2Etel0pL2c7ZnVuY3Rpb24gRyh0LGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gSyh0KXtyZXR1cm4gdC5yZXBsYWNlKFYsIm1zLSIpLnJlcGxhY2UoWSxHKX12YXIgWD1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV8fDk9PT10Lm5vZGVUeXBlfHwhK3Qubm9kZVR5cGV9O2Z1bmN0aW9uIEooKXt0aGlzLmV4cGFuZG89Uy5leHBhbmRvK0oudWlkKyt9Si51aWQ9MSxKLnByb3RvdHlwZT17Y2FjaGU6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmV4cGFuZG9dO3JldHVybiBlfHwoZT17fSxYKHQpJiYodC5ub2RlVHlwZT90W3RoaXMuZXhwYW5kb109ZTpPYmplY3QuZGVmaW5lUHJvcGVydHkodCx0aGlzLmV4cGFuZG8se3ZhbHVlOmUsY29uZmlndXJhYmxlOiEwfSkpKSxlfSxzZXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG89dGhpcy5jYWNoZSh0KTtpZigic3RyaW5nIj09dHlwZW9mIGUpb1tLKGUpXT1uO2Vsc2UgZm9yKHIgaW4gZSlvW0socildPWVbcl07cmV0dXJuIG99LGdldDpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuY2FjaGUodCk6dFt0aGlzLmV4cGFuZG9dJiZ0W3RoaXMuZXhwYW5kb11bSyhlKV19LGFjY2VzczpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWV8fGUmJiJzdHJpbmciPT10eXBlb2YgZSYmdm9pZCAwPT09bj90aGlzLmdldCh0LGUpOih0aGlzLnNldCh0LGUsbiksdm9pZCAwIT09bj9uOmUpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRbdGhpcy5leHBhbmRvXTtpZih2b2lkIDAhPT1yKXtpZih2b2lkIDAhPT1lKXtuPShlPUFycmF5LmlzQXJyYXkoZSk%2FZS5tYXAoSyk6KGU9SyhlKSlpbiByP1tlXTplLm1hdGNoKFUpfHxbXSkubGVuZ3RoO2Zvcig7bi0tOylkZWxldGUgcltlW25dXX0odm9pZCAwPT09ZXx8Uy5pc0VtcHR5T2JqZWN0KHIpKSYmKHQubm9kZVR5cGU%2FdFt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgdFt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT1lJiYhUy5pc0VtcHR5T2JqZWN0KGUpfX07dmFyIFE9bmV3IEosWj1uZXcgSix0dD0vXig%2FOlx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGV0PS9bQS1aXS9nO2Z1bmN0aW9uIG50KHQsZSxuKXt2YXIgcjtpZih2b2lkIDA9PT1uJiYxPT09dC5ub2RlVHlwZSlpZihyPSJkYXRhLSIrZS5yZXBsYWNlKGV0LCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj10LmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPWZ1bmN0aW9uKHQpe3JldHVybiJ0cnVlIj09PXR8fCJmYWxzZSIhPT10JiYoIm51bGwiPT09dD9udWxsOnQ9PT0rdCsiIj8rdDp0dC50ZXN0KHQpP0pTT04ucGFyc2UodCk6dCl9KG4pfWNhdGNoKHQpe31aLnNldCh0LGUsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1TLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gWi5oYXNEYXRhKHQpfHxRLmhhc0RhdGEodCl9LGRhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBaLmFjY2Vzcyh0LGUsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24odCxlKXtaLnJlbW92ZSh0LGUpfSxfZGF0YTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFEuYWNjZXNzKHQsZSxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24odCxlKXtRLnJlbW92ZSh0LGUpfX0pLFMuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGk9dGhpc1swXSxhPWkmJmkuYXR0cmlidXRlcztpZih2b2lkIDA9PT10KXtpZih0aGlzLmxlbmd0aCYmKG89Wi5nZXQoaSksMT09PWkubm9kZVR5cGUmJiFRLmdldChpLCJoYXNEYXRhQXR0cnMiKSkpe2ZvcihuPWEubGVuZ3RoO24tLTspYVtuXSYmMD09PShyPWFbbl0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9SyhyLnNsaWNlKDUpKSxudChpLHIsb1tyXSkpO1Euc2V0KGksImhhc0RhdGFBdHRycyIsITApfXJldHVybiBvfXJldHVybiJvYmplY3QiPT10eXBlb2YgdD90aGlzLmVhY2goZnVuY3Rpb24oKXtaLnNldCh0aGlzLHQpfSk6JCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBuO2lmKGkmJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PShuPVouZ2V0KGksdCkpP246dm9pZCAwIT09KG49bnQoaSx0KSk%2Fbjp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5zZXQodGhpcyx0LGUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1oucmVtb3ZlKHRoaXMsdCl9KX19KSxTLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKHQpcmV0dXJuIGU9KGV8fCJmeCIpKyJxdWV1ZSIscj1RLmdldCh0LGUpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPVEuYWNjZXNzKHQsZSxTLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbih0LGUpe2U9ZXx8ImZ4Ijt2YXIgbj1TLnF1ZXVlKHQsZSkscj1uLmxlbmd0aCxvPW4uc2hpZnQoKSxpPVMuX3F1ZXVlSG9va3ModCxlKTsiaW5wcm9ncmVzcyI9PT1vJiYobz1uLnNoaWZ0KCksci0tKSxvJiYoImZ4Ij09PWUmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBpLnN0b3Asby5jYWxsKHQsZnVuY3Rpb24oKXtTLmRlcXVldWUodCxlKX0saSkpLCFyJiZpJiZpLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24odCxlKXt2YXIgbj1lKyJxdWV1ZUhvb2tzIjtyZXR1cm4gUS5nZXQodCxuKXx8US5hY2Nlc3ModCxuLHtlbXB0eTpTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtRLnJlbW92ZSh0LFtlKyJxdWV1ZSIsbl0pfSl9KX19KSxTLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxlKXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKGU9dCx0PSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4%2FUy5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PWU%2FdGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1TLnF1ZXVlKHRoaXMsdCxlKTtTLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PW5bMF0mJlMuZGVxdWV1ZSh0aGlzLHQpfSl9LGRlcXVldWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZGVxdWV1ZSh0aGlzLHQpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVldWUodHx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTEsbz1TLkRlZmVycmVkKCksaT10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8by5yZXNvbHZlV2l0aChpLFtpXSl9O2Zvcigic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLHQ9dHx8ImZ4IjthLS07KShuPVEuZ2V0KGlbYV0sdCsicXVldWVIb29rcyIpKSYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxvLnByb21pc2UoZSl9fSk7dmFyIHJ0PS9bKy1dPyg%2FOlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLG90PW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitydCsiKShbYS16JV0qKSQiLCJpIiksaXQ9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxhdD1hLmRvY3VtZW50RWxlbWVudCxzdD1mdW5jdGlvbih0KXtyZXR1cm4gUy5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCl9LHV0PXtjb21wb3NlZDohMH07YXQuZ2V0Um9vdE5vZGUmJihzdD1mdW5jdGlvbih0KXtyZXR1cm4gUy5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCl8fHQuZ2V0Um9vdE5vZGUodXQpPT09dC5vd25lckRvY3VtZW50fSk7dmFyIGN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIm5vbmUiPT09KHQ9ZXx8dCkuc3R5bGUuZGlzcGxheXx8IiI9PT10LnN0eWxlLmRpc3BsYXkmJnN0KHQpJiYibm9uZSI9PT1TLmNzcyh0LCJkaXNwbGF5Iil9LGx0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYT17fTtmb3IoaSBpbiBlKWFbaV09dC5zdHlsZVtpXSx0LnN0eWxlW2ldPWVbaV07Zm9yKGkgaW4gbz1uLmFwcGx5KHQscnx8W10pLGUpdC5zdHlsZVtpXT1hW2ldO3JldHVybiBvfTtmdW5jdGlvbiBmdCh0LGUsbixyKXt2YXIgbyxpLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIFMuY3NzKHQsZSwiIil9LHU9cygpLGM9biYmblszXXx8KFMuY3NzTnVtYmVyW2VdPyIiOiJweCIpLGw9dC5ub2RlVHlwZSYmKFMuY3NzTnVtYmVyW2VdfHwicHgiIT09YyYmK3UpJiZvdC5leGVjKFMuY3NzKHQsZSkpO2lmKGwmJmxbM10hPT1jKXtmb3IodS89MixjPWN8fGxbM10sbD0rdXx8MTthLS07KVMuc3R5bGUodCxlLGwrYyksKDEtaSkqKDEtKGk9cygpL3V8fC41KSk8PTAmJihhPTApLGwvPWk7bCo9MixTLnN0eWxlKHQsZSxsK2MpLG49bnx8W119cmV0dXJuIG4mJihsPStsfHwrdXx8MCxvPW5bMV0%2FbCsoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9YyxyLnN0YXJ0PWwsci5lbmQ9bykpLG99dmFyIHB0PXt9O2Z1bmN0aW9uIGh0KHQpe3ZhciBlLG49dC5vd25lckRvY3VtZW50LHI9dC5ub2RlTmFtZSxvPXB0W3JdO3JldHVybiBvfHwoZT1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxvPVMuY3NzKGUsImRpc3BsYXkiKSxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksIm5vbmUiPT09byYmKG89ImJsb2NrIikscHRbcl09byxvKX1mdW5jdGlvbiBkdCh0LGUpe2Zvcih2YXIgbixyLG89W10saT0wLGE9dC5sZW5ndGg7aTxhO2krKykocj10W2ldKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LGU%2FKCJub25lIj09PW4mJihvW2ldPVEuZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxvW2ldfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmN0KHIpJiYob1tpXT1odChyKSkpOiJub25lIiE9PW4mJihvW2ldPSJub25lIixRLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihpPTA7aTxhO2krKyludWxsIT1vW2ldJiYodFtpXS5zdHlsZS5kaXNwbGF5PW9baV0pO3JldHVybiB0fVMuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGR0KHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGR0KHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdD90P3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2N0KHRoaXMpP1ModGhpcykuc2hvdygpOlModGhpcykuaGlkZSgpfSl9fSk7dmFyIGd0PS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHZ0PS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLHl0PS9eJHxebW9kdWxlJHxcLyg%2FOmphdmF8ZWNtYSlzY3JpcHQvaSxtdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc%2BIiwiPC9zZWxlY3Q%2BIl0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU%2BIl0sdHI6WzIsIjx0YWJsZT48dGJvZHk%2BIiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU%2BPHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk%2BPC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2Z1bmN0aW9uIGJ0KHQsZSl7dmFyIG47cmV0dXJuIG49dm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGV8fCIqIik6dm9pZCAwIT09dC5xdWVyeVNlbGVjdG9yQWxsP3QucXVlcnlTZWxlY3RvckFsbChlfHwiKiIpOltdLHZvaWQgMD09PWV8fGUmJkwodCxlKT9TLm1lcmdlKFt0XSxuKTpufWZ1bmN0aW9uIHh0KHQsZSl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKVEuc2V0KHRbbl0sImdsb2JhbEV2YWwiLCFlfHxRLmdldChlW25dLCJnbG9iYWxFdmFsIikpfW10Lm9wdGdyb3VwPW10Lm9wdGlvbixtdC50Ym9keT1tdC50Zm9vdD1tdC5jb2xncm91cD1tdC5jYXB0aW9uPW10LnRoZWFkLG10LnRoPW10LnRkO3ZhciB3dCxrdCxTdD0vPHwmIz9cdys7LztmdW5jdGlvbiBFdCh0LGUsbixyLG8pe2Zvcih2YXIgaSxhLHMsdSxjLGwsZj1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxwPVtdLGg9MCxkPXQubGVuZ3RoO2g8ZDtoKyspaWYoKGk9dFtoXSl8fDA9PT1pKWlmKCJvYmplY3QiPT09ayhpKSlTLm1lcmdlKHAsaS5ub2RlVHlwZT9baV06aSk7ZWxzZSBpZihTdC50ZXN0KGkpKXtmb3IoYT1hfHxmLmFwcGVuZENoaWxkKGUuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KHZ0LmV4ZWMoaSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1tdFtzXXx8bXQuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStTLmh0bWxQcmVmaWx0ZXIoaSkrdVsyXSxsPXVbMF07bC0tOylhPWEubGFzdENoaWxkO1MubWVyZ2UocCxhLmNoaWxkTm9kZXMpLChhPWYuZmlyc3RDaGlsZCkudGV4dENvbnRlbnQ9IiJ9ZWxzZSBwLnB1c2goZS5jcmVhdGVUZXh0Tm9kZShpKSk7Zm9yKGYudGV4dENvbnRlbnQ9IiIsaD0wO2k9cFtoKytdOylpZihyJiZTLmluQXJyYXkoaSxyKT4tMSlvJiZvLnB1c2goaSk7ZWxzZSBpZihjPXN0KGkpLGE9YnQoZi5hcHBlbmRDaGlsZChpKSwic2NyaXB0IiksYyYmeHQoYSksbilmb3IobD0wO2k9YVtsKytdOyl5dC50ZXN0KGkudHlwZXx8IiIpJiZuLnB1c2goaSk7cmV0dXJuIGZ9d3Q9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGt0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksa3Quc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLHd0LmFwcGVuZENoaWxkKGt0KSx5LmNoZWNrQ2xvbmU9d3QuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLHd0LmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIXd0LmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTt2YXIgVHQ9L15rZXkvLEF0PS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxPdD0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gQ3QoKXtyZXR1cm4hMH1mdW5jdGlvbiBqdCgpe3JldHVybiExfWZ1bmN0aW9uIEx0KHQsZSl7cmV0dXJuIHQ9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fWNhdGNoKHQpe319KCk9PSgiZm9jdXMiPT09ZSl9ZnVuY3Rpb24gUHQodCxlLG4scixvLGkpe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IocyBpbiJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCksZSlQdCh0LHMsbixyLGVbc10saSk7cmV0dXJuIHR9aWYobnVsbD09ciYmbnVsbD09bz8obz1uLHI9bj12b2lkIDApOm51bGw9PW8mJigic3RyaW5nIj09dHlwZW9mIG4%2FKG89cixyPXZvaWQgMCk6KG89cixyPW4sbj12b2lkIDApKSwhMT09PW8pbz1qdDtlbHNlIGlmKCFvKXJldHVybiB0O3JldHVybiAxPT09aSYmKGE9bywobz1mdW5jdGlvbih0KXtyZXR1cm4gUygpLm9mZih0KSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPVMuZ3VpZCsrKSksdC5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5hZGQodGhpcyxlLG8scixuKX0pfWZ1bmN0aW9uIFJ0KHQsZSxuKXtuPyhRLnNldCh0LGUsITEpLFMuZXZlbnQuYWRkKHQsZSx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIHIsbyxpPVEuZ2V0KHRoaXMsZSk7aWYoMSZ0LmlzVHJpZ2dlciYmdGhpc1tlXSl7aWYoaS5sZW5ndGgpKFMuZXZlbnQuc3BlY2lhbFtlXXx8e30pLmRlbGVnYXRlVHlwZSYmdC5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKGk9dS5jYWxsKGFyZ3VtZW50cyksUS5zZXQodGhpcyxlLGkpLHI9bih0aGlzLGUpLHRoaXNbZV0oKSxpIT09KG89US5nZXQodGhpcyxlKSl8fHI%2FUS5zZXQodGhpcyxlLCExKTpvPXt9LGkhPT1vKXJldHVybiB0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSxvLnZhbHVlfWVsc2UgaS5sZW5ndGgmJihRLnNldCh0aGlzLGUse3ZhbHVlOlMuZXZlbnQudHJpZ2dlcihTLmV4dGVuZChpWzBdLFMuRXZlbnQucHJvdG90eXBlKSxpLnNsaWNlKDEpLHRoaXMpfSksdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PVEuZ2V0KHQsZSkmJlMuZXZlbnQuYWRkKHQsZSxDdCl9Uy5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsaCxkLGcsdj1RLmdldCh0KTtpZih2KWZvcihuLmhhbmRsZXImJihuPShpPW4pLmhhbmRsZXIsbz1pLnNlbGVjdG9yKSxvJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGF0LG8pLG4uZ3VpZHx8KG4uZ3VpZD1TLmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz17fSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09UyYmUy5ldmVudC50cmlnZ2VyZWQhPT1lLnR5cGU%2FUy5ldmVudC5kaXNwYXRjaC5hcHBseSh0LGFyZ3VtZW50cyk6dm9pZCAwfSksYz0oZT0oZXx8IiIpLm1hdGNoKFUpfHxbIiJdKS5sZW5ndGg7Yy0tOyloPWc9KHM9T3QuZXhlYyhlW2NdKXx8W10pWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoJiYoZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LGg9KG8%2FZi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGgsZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LGw9Uy5leHRlbmQoe3R5cGU6aCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6byxuZWVkc0NvbnRleHQ6byYmUy5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KG8pLG5hbWVzcGFjZTpkLmpvaW4oIi4iKX0saSksKHA9dVtoXSl8fCgocD11W2hdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwodCxyLGQsYSl8fHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKGgsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbCh0LGwpLGwuaGFuZGxlci5ndWlkfHwobC5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksbz9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGwpOnAucHVzaChsKSxTLmV2ZW50Lmdsb2JhbFtoXT0hMCl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsaCxkLGcsdj1RLmhhc0RhdGEodCkmJlEuZ2V0KHQpO2lmKHYmJih1PXYuZXZlbnRzKSl7Zm9yKGM9KGU9KGV8fCIiKS5tYXRjaChVKXx8WyIiXSkubGVuZ3RoO2MtLTspaWYoaD1nPShzPU90LmV4ZWMoZVtjXSl8fFtdKVsxXSxkPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksaCl7Zm9yKGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxwPXVbaD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8aF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrZC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPWk9cC5sZW5ndGg7aS0tOylsPXBbaV0sIW8mJmchPT1sLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1sLmd1aWR8fHMmJiFzLnRlc3QobC5uYW1lc3BhY2UpfHxyJiZyIT09bC5zZWxlY3RvciYmKCIqKiIhPT1yfHwhbC5zZWxlY3Rvcil8fChwLnNwbGljZShpLDEpLGwuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKHQsbCkpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKHQsZCx2LmhhbmRsZSl8fFMucmVtb3ZlRXZlbnQodCxoLHYuaGFuZGxlKSxkZWxldGUgdVtoXSl9ZWxzZSBmb3IoaCBpbiB1KVMuZXZlbnQucmVtb3ZlKHQsaCtlW2NdLG4sciwhMCk7Uy5pc0VtcHR5T2JqZWN0KHUpJiZRLnJlbW92ZSh0LCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscz1TLmV2ZW50LmZpeCh0KSx1PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxjPShRLmdldCh0aGlzLCJldmVudHMiKXx8e30pW3MudHlwZV18fFtdLGw9Uy5ldmVudC5zcGVjaWFsW3MudHlwZV18fHt9O2Zvcih1WzBdPXMsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdVtlXT1hcmd1bWVudHNbZV07aWYocy5kZWxlZ2F0ZVRhcmdldD10aGlzLCFsLnByZURpc3BhdGNofHwhMSE9PWwucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHMpKXtmb3IoYT1TLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxzLGMpLGU9MDsobz1hW2UrK10pJiYhcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOylmb3Iocy5jdXJyZW50VGFyZ2V0PW8uZWxlbSxuPTA7KGk9by5oYW5kbGVyc1tuKytdKSYmIXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTspcy5ybmFtZXNwYWNlJiYhMSE9PWkubmFtZXNwYWNlJiYhcy5ybmFtZXNwYWNlLnRlc3QoaS5uYW1lc3BhY2UpfHwocy5oYW5kbGVPYmo9aSxzLmRhdGE9aS5kYXRhLHZvaWQgMCE9PShyPSgoUy5ldmVudC5zcGVjaWFsW2kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxpLmhhbmRsZXIpLmFwcGx5KG8uZWxlbSx1KSkmJiExPT09KHMucmVzdWx0PXIpJiYocy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCkpKTtyZXR1cm4gbC5wb3N0RGlzcGF0Y2gmJmwucG9zdERpc3BhdGNoLmNhbGwodGhpcyxzKSxzLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGksYSxzPVtdLHU9ZS5kZWxlZ2F0ZUNvdW50LGM9dC50YXJnZXQ7aWYodSYmYy5ub2RlVHlwZSYmISgiY2xpY2siPT09dC50eXBlJiZ0LmJ1dHRvbj49MSkpZm9yKDtjIT09dGhpcztjPWMucGFyZW50Tm9kZXx8dGhpcylpZigxPT09Yy5ub2RlVHlwZSYmKCJjbGljayIhPT10LnR5cGV8fCEwIT09Yy5kaXNhYmxlZCkpe2ZvcihpPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtvPShyPWVbbl0pLnNlbGVjdG9yKyIgIl0mJihhW29dPXIubmVlZHNDb250ZXh0P1Mobyx0aGlzKS5pbmRleChjKT4tMTpTLmZpbmQobyx0aGlzLG51bGwsW2NdKS5sZW5ndGgpLGFbb10mJmkucHVzaChyKTtpLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmMsaGFuZGxlcnM6aX0pfXJldHVybiBjPXRoaXMsdTxlLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmMsaGFuZGxlcnM6ZS5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoUy5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk%2FZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKHQpe3JldHVybiB0W1MuZXhwYW5kb10%2FdDpuZXcgUy5FdmVudCh0KX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzfHx0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUnQoZSwiY2xpY2siLEN0KSwhMX0sdHJpZ2dlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzfHx0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUnQoZSwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZRLmdldChlLCJjbGljayIpfHxMKGUsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQucmVzdWx0JiZ0Lm9yaWdpbmFsRXZlbnQmJih0Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9dC5yZXN1bHQpfX19fSxTLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKHQsZSxuKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXImJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4pfSxTLkV2ZW50PWZ1bmN0aW9uKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgUy5FdmVudCkpcmV0dXJuIG5ldyBTLkV2ZW50KHQsZSk7dCYmdC50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9dCx0aGlzLnR5cGU9dC50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPXQuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09dC5kZWZhdWx0UHJldmVudGVkJiYhMT09PXQucmV0dXJuVmFsdWU%2FQ3Q6anQsdGhpcy50YXJnZXQ9dC50YXJnZXQmJjM9PT10LnRhcmdldC5ub2RlVHlwZT90LnRhcmdldC5wYXJlbnROb2RlOnQudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD10LmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PXQucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPXQsZSYmUy5leHRlbmQodGhpcyxlKSx0aGlzLnRpbWVTdGFtcD10JiZ0LnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW1MuZXhwYW5kb109ITB9LFMuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpqdCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpqdCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpqdCxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1DdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1DdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Q3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LFMuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxjaGFyOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24odCl7dmFyIGU9dC5idXR0b247cmV0dXJuIG51bGw9PXQud2hpY2gmJlR0LnRlc3QodC50eXBlKT9udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlOiF0LndoaWNoJiZ2b2lkIDAhPT1lJiZBdC50ZXN0KHQudHlwZSk%2FMSZlPzE6MiZlPzM6NCZlPzI6MDp0LndoaWNofX0sUy5ldmVudC5hZGRQcm9wKSxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7Uy5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBSdCh0aGlzLHQsTHQpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIFJ0KHRoaXMsdCksITB9LGRlbGVnYXRlVHlwZTplfX0pLFMuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24odCxlKXtTLmV2ZW50LnNwZWNpYWxbdF09e2RlbGVnYXRlVHlwZTplLGJpbmRUeXBlOmUsaGFuZGxlOmZ1bmN0aW9uKHQpe3ZhciBuLHI9dGhpcyxvPXQucmVsYXRlZFRhcmdldCxpPXQuaGFuZGxlT2JqO3JldHVybiBvJiYobz09PXJ8fFMuY29udGFpbnMocixvKSl8fCh0LnR5cGU9aS5vcmlnVHlwZSxuPWkuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC50eXBlPWUpLG59fX0pLFMuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gUHQodGhpcyx0LGUsbixyKX0sb25lOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBQdCh0aGlzLHQsZSxuLHIsMSl9LG9mZjpmdW5jdGlvbih0LGUsbil7dmFyIHIsbztpZih0JiZ0LnByZXZlbnREZWZhdWx0JiZ0LmhhbmRsZU9iailyZXR1cm4gcj10LmhhbmRsZU9iaixTKHQuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlKyIuIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKG8gaW4gdCl0aGlzLm9mZihvLGUsdFtvXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZXx8KG49ZSxlPXZvaWQgMCksITE9PT1uJiYobj1qdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5yZW1vdmUodGhpcyx0LG4sZSl9KX19KTt2YXIgTnQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW2Etel1bXlwvXDA%2BXHgyMFx0XHJcblxmXSopW14%2BXSopXC8%2BL2dpLEl0PS88c2NyaXB0fDxzdHlsZXw8bGluay9pLER0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLF90PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg%2FOlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBNdCh0LGUpe3JldHVybiBMKHQsInRhYmxlIikmJkwoMTEhPT1lLm5vZGVUeXBlP2U6ZS5maXJzdENoaWxkLCJ0ciIpJiZTKHQpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHx0fWZ1bmN0aW9uIFV0KHQpe3JldHVybiB0LnR5cGU9KG51bGwhPT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrdC50eXBlLHR9ZnVuY3Rpb24gQnQodCl7cmV0dXJuInRydWUvIj09PSh0LnR5cGV8fCIiKS5zbGljZSgwLDUpP3QudHlwZT10LnR5cGUuc2xpY2UoNSk6dC5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSx0fWZ1bmN0aW9uIHF0KHQsZSl7dmFyIG4scixvLGksYSxzLHUsYztpZigxPT09ZS5ub2RlVHlwZSl7aWYoUS5oYXNEYXRhKHQpJiYoaT1RLmFjY2Vzcyh0KSxhPVEuc2V0KGUsaSksYz1pLmV2ZW50cykpZm9yKG8gaW4gZGVsZXRlIGEuaGFuZGxlLGEuZXZlbnRzPXt9LGMpZm9yKG49MCxyPWNbb10ubGVuZ3RoO248cjtuKyspUy5ldmVudC5hZGQoZSxvLGNbb11bbl0pO1ouaGFzRGF0YSh0KSYmKHM9Wi5hY2Nlc3ModCksdT1TLmV4dGVuZCh7fSxzKSxaLnNldChlLHUpKX19ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PW4mJmd0LnRlc3QodC50eXBlKT9lLmNoZWNrZWQ9dC5jaGVja2VkOiJpbnB1dCIhPT1uJiYidGV4dGFyZWEiIT09bnx8KGUuZGVmYXVsdFZhbHVlPXQuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBIdCh0LGUsbixyKXtlPWMuYXBwbHkoW10sZSk7dmFyIG8saSxhLHMsdSxsLGY9MCxwPXQubGVuZ3RoLGg9cC0xLGQ9ZVswXSxnPW0oZCk7aWYoZ3x8cD4xJiYic3RyaW5nIj09dHlwZW9mIGQmJiF5LmNoZWNrQ2xvbmUmJkR0LnRlc3QoZCkpcmV0dXJuIHQuZWFjaChmdW5jdGlvbihvKXt2YXIgaT10LmVxKG8pO2cmJihlWzBdPWQuY2FsbCh0aGlzLG8saS5odG1sKCkpKSxIdChpLGUsbixyKX0pO2lmKHAmJihpPShvPUV0KGUsdFswXS5vd25lckRvY3VtZW50LCExLHQscikpLmZpcnN0Q2hpbGQsMT09PW8uY2hpbGROb2Rlcy5sZW5ndGgmJihvPWkpLGl8fHIpKXtmb3Iocz0oYT1TLm1hcChidChvLCJzY3JpcHQiKSxVdCkpLmxlbmd0aDtmPHA7ZisrKXU9byxmIT09aCYmKHU9Uy5jbG9uZSh1LCEwLCEwKSxzJiZTLm1lcmdlKGEsYnQodSwic2NyaXB0IikpKSxuLmNhbGwodFtmXSx1LGYpO2lmKHMpZm9yKGw9YVthLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LFMubWFwKGEsQnQpLGY9MDtmPHM7ZisrKXU9YVtmXSx5dC50ZXN0KHUudHlwZXx8IiIpJiYhUS5hY2Nlc3ModSwiZ2xvYmFsRXZhbCIpJiZTLmNvbnRhaW5zKGwsdSkmJih1LnNyYyYmIm1vZHVsZSIhPT0odS50eXBlfHwiIikudG9Mb3dlckNhc2UoKT9TLl9ldmFsVXJsJiYhdS5ub01vZHVsZSYmUy5fZXZhbFVybCh1LnNyYyx7bm9uY2U6dS5ub25jZXx8dS5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9KTp3KHUudGV4dENvbnRlbnQucmVwbGFjZShfdCwiIiksdSxsKSl9cmV0dXJuIHR9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgcixvPWU%2FUy5maWx0ZXIoZSx0KTp0LGk9MDtudWxsIT0ocj1vW2ldKTtpKyspbnx8MSE9PXIubm9kZVR5cGV8fFMuY2xlYW5EYXRhKGJ0KHIpKSxyLnBhcmVudE5vZGUmJihuJiZzdChyKSYmeHQoYnQociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIHR9Uy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZShOdCwiPCQxPjwvJDI%2BIil9LGNsb25lOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzPXQuY2xvbmVOb2RlKCEwKSx1PXN0KHQpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PXQubm9kZVR5cGUmJjExIT09dC5ub2RlVHlwZXx8Uy5pc1hNTERvYyh0KSkpZm9yKGE9YnQocykscj0wLG89KGk9YnQodCkpLmxlbmd0aDtyPG87cisrKUZ0KGlbcl0sYVtyXSk7aWYoZSlpZihuKWZvcihpPWl8fGJ0KHQpLGE9YXx8YnQocykscj0wLG89aS5sZW5ndGg7cjxvO3IrKylxdChpW3JdLGFbcl0pO2Vsc2UgcXQodCxzKTtyZXR1cm4oYT1idChzLCJzY3JpcHQiKSkubGVuZ3RoPjAmJnh0KGEsIXUmJmJ0KHQsInNjcmlwdCIpKSxzfSxjbGVhbkRhdGE6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4scixvPVMuZXZlbnQuc3BlY2lhbCxpPTA7dm9pZCAwIT09KG49dFtpXSk7aSsrKWlmKFgobikpe2lmKGU9bltRLmV4cGFuZG9dKXtpZihlLmV2ZW50cylmb3IociBpbiBlLmV2ZW50cylvW3JdP1MuZXZlbnQucmVtb3ZlKG4scik6Uy5yZW1vdmVFdmVudChuLHIsZS5oYW5kbGUpO25bUS5leHBhbmRvXT12b2lkIDB9bltaLmV4cGFuZG9dJiYobltaLmV4cGFuZG9dPXZvaWQgMCl9fX0pLFMuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHRoaXMsdCwhMCl9LHJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4genQodGhpcyx0KX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P1MudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD10KX0pfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8TXQodGhpcyx0KS5hcHBlbmRDaGlsZCh0KX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgZT1NdCh0aGlzLHQpO2UuaW5zZXJ0QmVmb3JlKHQsZS5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9MDtudWxsIT0odD10aGlzW2VdKTtlKyspMT09PXQubm9kZVR5cGUmJihTLmNsZWFuRGF0YShidCh0LCExKSksdC50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9bnVsbCE9dCYmdCxlPW51bGw9PWU%2FdDplLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIFMuY2xvbmUodGhpcyx0LGUpfSl9LGh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0KXt2YXIgZT10aGlzWzBdfHx7fSxuPTAscj10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT10JiYxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZS5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYhSXQudGVzdCh0KSYmIW10Wyh2dC5leGVjKHQpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7dD1TLmh0bWxQcmVmaWx0ZXIodCk7dHJ5e2Zvcig7bjxyO24rKykxPT09KGU9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEoYnQoZSwhMSkpLGUuaW5uZXJIVE1MPXQpO2U9MH1jYXRjaCh0KXt9fWUmJnRoaXMuZW1wdHkoKS5hcHBlbmQodCl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5wYXJlbnROb2RlO1MuaW5BcnJheSh0aGlzLHQpPDAmJihTLmNsZWFuRGF0YShidCh0aGlzKSksbiYmbi5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LHQpfX0pLFMuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbih0KXtmb3IodmFyIG4scj1bXSxvPVModCksaT1vLmxlbmd0aC0xLGE9MDthPD1pO2ErKyluPWE9PT1pP3RoaXM6dGhpcy5jbG9uZSghMCksUyhvW2FdKVtlXShuKSxsLmFwcGx5KHIsbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpfX0pO3ZhciBXdD1uZXcgUmVnRXhwKCJeKCIrcnQrIikoPyFweClbYS16JV0rJCIsImkiKSwkdD1mdW5jdGlvbih0KXt2YXIgZT10Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGUmJmUub3BlbmVyfHwoZT1uKSxlLmdldENvbXB1dGVkU3R5bGUodCl9LFZ0PW5ldyBSZWdFeHAoaXQuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gWXQodCxlLG4pe3ZhciByLG8saSxhLHM9dC5zdHlsZTtyZXR1cm4obj1ufHwkdCh0KSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZShlKXx8bltlXSl8fHN0KHQpfHwoYT1TLnN0eWxlKHQsZSkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJld0LnRlc3QoYSkmJlZ0LnRlc3QoZSkmJihyPXMud2lkdGgsbz1zLm1pbldpZHRoLGk9cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1vLHMubWF4V2lkdGg9aSkpLHZvaWQgMCE9PWE%2FYSsiIjphfWZ1bmN0aW9uIEd0KHQsZSl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCF0KCkpcmV0dXJuKHRoaXMuZ2V0PWUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7aWYobCl7Yy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLGF0LmFwcGVuZENoaWxkKGMpLmFwcGVuZENoaWxkKGwpO3ZhciB0PW4uZ2V0Q29tcHV0ZWRTdHlsZShsKTtyPSIxJSIhPT10LnRvcCx1PTEyPT09ZSh0Lm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9IjYwJSIscz0zNj09PWUodC5yaWdodCksbz0zNj09PWUodC53aWR0aCksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT1lKGwub2Zmc2V0V2lkdGgvMyksYXQucmVtb3ZlQ2hpbGQoYyksbD1udWxsfX1mdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQodCkpfXZhciByLG8saSxzLHUsYz1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGw9YS5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLnN0eWxlJiYobC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGwuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09bC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxTLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHJ9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksaX19KSl9KCk7dmFyIEt0PVsiV2Via2l0IiwiTW96IiwibXMiXSxYdD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLEp0PXt9O2Z1bmN0aW9uIFF0KHQpe3ZhciBlPVMuY3NzUHJvcHNbdF18fEp0W3RdO3JldHVybiBlfHwodCBpbiBYdD90Okp0W3RdPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxuPUt0Lmxlbmd0aDtuLS07KWlmKCh0PUt0W25dK2UpaW4gWHQpcmV0dXJuIHR9KHQpfHx0KX12YXIgWnQ9L14obm9uZXx0YWJsZSg%2FIS1jW2VhXSkuKykvLHRlPS9eLS0vLGVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxuZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gcmUodCxlLG4pe3ZhciByPW90LmV4ZWMoZSk7cmV0dXJuIHI%2FTWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOmV9ZnVuY3Rpb24gb2UodCxlLG4scixvLGkpe3ZhciBhPSJ3aWR0aCI9PT1lPzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9Uy5jc3ModCxuK2l0W2FdLCEwLG8pKSxyPygiY29udGVudCI9PT1uJiYodS09Uy5jc3ModCwicGFkZGluZyIraXRbYV0sITAsbykpLCJtYXJnaW4iIT09biYmKHUtPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKSkpOih1Kz1TLmNzcyh0LCJwYWRkaW5nIitpdFthXSwhMCxvKSwicGFkZGluZyIhPT1uP3UrPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKTpzKz1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbykpO3JldHVybiFyJiZpPj0wJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0taS11LXMtLjUpKXx8MCksdX1mdW5jdGlvbiBpZSh0LGUsbil7dmFyIHI9JHQodCksbz0oIXkuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsciksaT1vLGE9WXQodCxlLHIpLHM9Im9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7aWYoV3QudGVzdChhKSl7aWYoIW4pcmV0dXJuIGE7YT0iYXV0byJ9cmV0dXJuKCF5LmJveFNpemluZ1JlbGlhYmxlKCkmJm98fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PVMuY3NzKHQsImRpc3BsYXkiLCExLHIpKSYmdC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKG89ImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxyKSwoaT1zIGluIHQpJiYoYT10W3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrb2UodCxlLG58fChvPyJib3JkZXIiOiJjb250ZW50IiksaSxyLGEpKyJweCJ9ZnVuY3Rpb24gYWUodCxlLG4scixvKXtyZXR1cm4gbmV3IGFlLnByb3RvdHlwZS5pbml0KHQsZSxuLHIsbyl9Uy5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24odCxlKXtpZihlKXt2YXIgbj1ZdCh0LCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbih0LGUsbixyKXtpZih0JiYzIT09dC5ub2RlVHlwZSYmOCE9PXQubm9kZVR5cGUmJnQuc3R5bGUpe3ZhciBvLGksYSxzPUsoZSksdT10ZS50ZXN0KGUpLGM9dC5zdHlsZTtpZih1fHwoZT1RdChzKSksYT1TLmNzc0hvb2tzW2VdfHxTLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KG89YS5nZXQodCwhMSxyKSk%2FbzpjW2VdOyJzdHJpbmciPT09KGk9dHlwZW9mIG4pJiYobz1vdC5leGVjKG4pKSYmb1sxXSYmKG49ZnQodCxlLG8pLGk9Im51bWJlciIpLG51bGwhPW4mJm49PW4mJigibnVtYmVyIiE9PWl8fHV8fChuKz1vJiZvWzNdfHwoUy5jc3NOdW1iZXJbc10%2FIiI6InB4IikpLHkuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT1lLmluZGV4T2YoImJhY2tncm91bmQiKXx8KGNbZV09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KHQsbixyKSl8fCh1P2Muc2V0UHJvcGVydHkoZSxuKTpjW2VdPW4pKX19LGNzczpmdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGEscz1LKGUpO3JldHVybiB0ZS50ZXN0KGUpfHwoZT1RdChzKSksKGE9Uy5jc3NIb29rc1tlXXx8Uy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKG89YS5nZXQodCwhMCxuKSksdm9pZCAwPT09byYmKG89WXQodCxlLHIpKSwibm9ybWFsIj09PW8mJmUgaW4gbmUmJihvPW5lW2VdKSwiIj09PW58fG4%2FKGk9cGFyc2VGbG9hdChvKSwhMD09PW58fGlzRmluaXRlKGkpP2l8fDA6byk6b319KSxTLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1tlXT17Z2V0OmZ1bmN0aW9uKHQsbixyKXtpZihuKXJldHVybiFadC50ZXN0KFMuY3NzKHQsImRpc3BsYXkiKSl8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg%2FaWUodCxlLHIpOmx0KHQsZWUsZnVuY3Rpb24oKXtyZXR1cm4gaWUodCxlLHIpfSl9LHNldDpmdW5jdGlvbih0LG4scil7dmFyIG8saT0kdCh0KSxhPSF5LnNjcm9sbGJveFNpemUoKSYmImFic29sdXRlIj09PWkucG9zaXRpb24scz0oYXx8cikmJiJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsaSksdT1yP29lKHQsZSxyLHMsaSk6MDtyZXR1cm4gcyYmYSYmKHUtPU1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbZV0pLW9lKHQsZSwiYm9yZGVyIiwhMSxpKS0uNSkpLHUmJihvPW90LmV4ZWMobikpJiYicHgiIT09KG9bM118fCJweCIpJiYodC5zdHlsZVtlXT1uLG49Uy5jc3ModCxlKSkscmUoMCxuLHUpfX19KSxTLmNzc0hvb2tzLm1hcmdpbkxlZnQ9R3QoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24odCxlKXtpZihlKXJldHVybihwYXJzZUZsb2F0KFl0KHQsIm1hcmdpbkxlZnQiKSl8fHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1sdCh0LHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksUy5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW3QrZV09e2V4cGFuZDpmdW5jdGlvbihuKXtmb3IodmFyIHI9MCxvPXt9LGk9InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07cjw0O3IrKylvW3QraXRbcl0rZV09aVtyXXx8aVtyLTJdfHxpWzBdO3JldHVybiBvfX0sIm1hcmdpbiIhPT10JiYoUy5jc3NIb29rc1t0K2VdLnNldD1yZSl9KSxTLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KGUpKXtmb3Iocj0kdCh0KSxvPWUubGVuZ3RoO2E8bzthKyspaVtlW2FdXT1TLmNzcyh0LGVbYV0sITEscik7cmV0dXJuIGl9cmV0dXJuIHZvaWQgMCE9PW4%2FUy5zdHlsZSh0LGUsbik6Uy5jc3ModCxlKX0sdCxlLGFyZ3VtZW50cy5sZW5ndGg%2BMSl9fSksUy5Ud2Vlbj1hZSxhZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmFlLGluaXQ6ZnVuY3Rpb24odCxlLG4scixvLGkpe3RoaXMuZWxlbT10LHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPW98fFMuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1lLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1pfHwoUy5jc3NOdW1iZXJbbl0%2FIiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciB0PWFlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0JiZ0LmdldD90LmdldCh0aGlzKTphZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24odCl7dmFyIGUsbj1hZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWU9Uy5lYXNpbmdbdGhpcy5lYXNpbmddKHQsdGhpcy5vcHRpb25zLmR1cmF0aW9uKnQsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9ZT10LHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSplK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOmFlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGFlLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1hZS5wcm90b3R5cGUsYWUucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiAxIT09dC5lbGVtLm5vZGVUeXBlfHxudWxsIT10LmVsZW1bdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW3QucHJvcF0%2FdC5lbGVtW3QucHJvcF06KGU9Uy5jc3ModC5lbGVtLHQucHJvcCwiIikpJiYiYXV0byIhPT1lP2U6MH0sc2V0OmZ1bmN0aW9uKHQpe1MuZnguc3RlcFt0LnByb3BdP1MuZnguc3RlcFt0LnByb3BdKHQpOjEhPT10LmVsZW0ubm9kZVR5cGV8fCFTLmNzc0hvb2tzW3QucHJvcF0mJm51bGw9PXQuZWxlbS5zdHlsZVtRdCh0LnByb3ApXT90LmVsZW1bdC5wcm9wXT10Lm5vdzpTLnN0eWxlKHQuZWxlbSx0LnByb3AsdC5ub3crdC51bml0KX19fSxhZS5wcm9wSG9va3Muc2Nyb2xsVG9wPWFlLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24odCl7dC5lbGVtLm5vZGVUeXBlJiZ0LmVsZW0ucGFyZW50Tm9kZSYmKHQuZWxlbVt0LnByb3BdPXQubm93KX19LFMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHN3aW5nOmZ1bmN0aW9uKHQpe3JldHVybi41LU1hdGguY29zKHQqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sUy5meD1hZS5wcm90b3R5cGUuaW5pdCxTLmZ4LnN0ZXA9e307dmFyIHNlLHVlLGNlPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxsZT0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGZlKCl7dWUmJighMT09PWEuaGlkZGVuJiZuLnJlcXVlc3RBbmltYXRpb25GcmFtZT9uLnJlcXVlc3RBbmltYXRpb25GcmFtZShmZSk6bi5zZXRUaW1lb3V0KGZlLFMuZnguaW50ZXJ2YWwpLFMuZngudGljaygpKX1mdW5jdGlvbiBwZSgpe3JldHVybiBuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZT12b2lkIDB9KSxzZT1EYXRlLm5vdygpfWZ1bmN0aW9uIGhlKHQsZSl7dmFyIG4scj0wLG89e2hlaWdodDp0fTtmb3IoZT1lPzE6MDtyPDQ7cis9Mi1lKW9bIm1hcmdpbiIrKG49aXRbcl0pXT1vWyJwYWRkaW5nIituXT10O3JldHVybiBlJiYoby5vcGFjaXR5PW8ud2lkdGg9dCksb31mdW5jdGlvbiBkZSh0LGUsbil7Zm9yKHZhciByLG89KGdlLnR3ZWVuZXJzW2VdfHxbXSkuY29uY2F0KGdlLnR3ZWVuZXJzWyIqIl0pLGk9MCxhPW8ubGVuZ3RoO2k8YTtpKyspaWYocj1vW2ldLmNhbGwobixlLHQpKXJldHVybiByfWZ1bmN0aW9uIGdlKHQsZSxuKXt2YXIgcixvLGk9MCxhPWdlLnByZWZpbHRlcnMubGVuZ3RoLHM9Uy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYobylyZXR1cm4hMTtmb3IodmFyIGU9c2V8fHBlKCksbj1NYXRoLm1heCgwLGMuc3RhcnRUaW1lK2MuZHVyYXRpb24tZSkscj0xLShuL2MuZHVyYXRpb258fDApLGk9MCxhPWMudHdlZW5zLmxlbmd0aDtpPGE7aSsrKWMudHdlZW5zW2ldLnJ1bihyKTtyZXR1cm4gcy5ub3RpZnlXaXRoKHQsW2MscixuXSkscjwxJiZhP246KGF8fHMubm90aWZ5V2l0aCh0LFtjLDEsMF0pLHMucmVzb2x2ZVdpdGgodCxbY10pLCExKX0sYz1zLnByb21pc2Uoe2VsZW06dCxwcm9wczpTLmV4dGVuZCh7fSxlKSxvcHRzOlMuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpTLmVhc2luZy5fZGVmYXVsdH0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOnNlfHxwZSgpLGR1cmF0aW9uOm4uZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsbil7dmFyIHI9Uy5Ud2Vlbih0LGMub3B0cyxlLG4sYy5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGMub3B0cy5lYXNpbmcpO3JldHVybiBjLnR3ZWVucy5wdXNoKHIpLHJ9LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIG49MCxyPWU%2FYy50d2VlbnMubGVuZ3RoOjA7aWYobylyZXR1cm4gdGhpcztmb3Iobz0hMDtuPHI7bisrKWMudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKHQsW2MsMSwwXSkscy5yZXNvbHZlV2l0aCh0LFtjLGVdKSk6cy5yZWplY3RXaXRoKHQsW2MsZV0pLHRoaXN9fSksbD1jLnByb3BzO2ZvcighZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saSxhO2ZvcihuIGluIHQpaWYobz1lW3I9SyhuKV0saT10W25dLEFycmF5LmlzQXJyYXkoaSkmJihvPWlbMV0saT10W25dPWlbMF0pLG4hPT1yJiYodFtyXT1pLGRlbGV0ZSB0W25dKSwoYT1TLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIGk9YS5leHBhbmQoaSksZGVsZXRlIHRbcl0saSluIGluIHR8fCh0W25dPWlbbl0sZVtuXT1vKTtlbHNlIGVbcl09b30obCxjLm9wdHMuc3BlY2lhbEVhc2luZyk7aTxhO2krKylpZihyPWdlLnByZWZpbHRlcnNbaV0uY2FsbChjLHQsbCxjLm9wdHMpKXJldHVybiBtKHIuc3RvcCkmJihTLl9xdWV1ZUhvb2tzKGMuZWxlbSxjLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIFMubWFwKGwsZGUsYyksbShjLm9wdHMuc3RhcnQpJiZjLm9wdHMuc3RhcnQuY2FsbCh0LGMpLGMucHJvZ3Jlc3MoYy5vcHRzLnByb2dyZXNzKS5kb25lKGMub3B0cy5kb25lLGMub3B0cy5jb21wbGV0ZSkuZmFpbChjLm9wdHMuZmFpbCkuYWx3YXlzKGMub3B0cy5hbHdheXMpLFMuZngudGltZXIoUy5leHRlbmQodSx7ZWxlbTp0LGFuaW06YyxxdWV1ZTpjLm9wdHMucXVldWV9KSksY31TLkFuaW1hdGlvbj1TLmV4dGVuZChnZSx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKHQsZSk7cmV0dXJuIGZ0KG4uZWxlbSx0LG90LmV4ZWMoZSksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKHQsZSl7bSh0KT8oZT10LHQ9WyIqIl0pOnQ9dC5tYXRjaChVKTtmb3IodmFyIG4scj0wLG89dC5sZW5ndGg7cjxvO3IrKyluPXRbcl0sZ2UudHdlZW5lcnNbbl09Z2UudHdlZW5lcnNbbl18fFtdLGdlLnR3ZWVuZXJzW25dLnVuc2hpZnQoZSl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYyxsLGY9IndpZHRoImluIGV8fCJoZWlnaHQiaW4gZSxwPXRoaXMsaD17fSxkPXQuc3R5bGUsZz10Lm5vZGVUeXBlJiZjdCh0KSx2PVEuZ2V0KHQsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1TLl9xdWV1ZUhvb2tzKHQsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFMucXVldWUodCwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksZSlpZihvPWVbcl0sY2UudGVzdChvKSl7aWYoZGVsZXRlIGVbcl0saT1pfHwidG9nZ2xlIj09PW8sbz09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1vfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWhbcl09diYmdltyXXx8Uy5zdHlsZSh0LHIpfWlmKCh1PSFTLmlzRW1wdHlPYmplY3QoZSkpfHwhUy5pc0VtcHR5T2JqZWN0KGgpKWZvcihyIGluIGYmJjE9PT10Lm5vZGVUeXBlJiYobi5vdmVyZmxvdz1bZC5vdmVyZmxvdyxkLm92ZXJmbG93WCxkLm92ZXJmbG93WV0sbnVsbD09KGM9diYmdi5kaXNwbGF5KSYmKGM9US5nZXQodCwiZGlzcGxheSIpKSwibm9uZSI9PT0obD1TLmNzcyh0LCJkaXNwbGF5IikpJiYoYz9sPWM6KGR0KFt0XSwhMCksYz10LnN0eWxlLmRpc3BsYXl8fGMsbD1TLmNzcyh0LCJkaXNwbGF5IiksZHQoW3RdKSkpLCgiaW5saW5lIj09PWx8fCJpbmxpbmUtYmxvY2siPT09bCYmbnVsbCE9YykmJiJub25lIj09PVMuY3NzKHQsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7ZC5kaXNwbGF5PWN9KSxudWxsPT1jJiYobD1kLmRpc3BsYXksYz0ibm9uZSI9PT1sPyIiOmwpKSxkLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoZC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2Qub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxkLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGQub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxoKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9US5hY2Nlc3ModCwiZnhzaG93Iix7ZGlzcGxheTpjfSksaSYmKHYuaGlkZGVuPSFnKSxnJiZkdChbdF0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGR0KFt0XSksUS5yZW1vdmUodCwiZnhzaG93IiksaClTLnN0eWxlKHQscixoW3JdKX0pKSx1PWRlKGc%2FdltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKHQsZSl7ZT9nZS5wcmVmaWx0ZXJzLnVuc2hpZnQodCk6Z2UucHJlZmlsdGVycy5wdXNoKHQpfX0pLFMuc3BlZWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQmJiJvYmplY3QiPT10eXBlb2YgdD9TLmV4dGVuZCh7fSx0KTp7Y29tcGxldGU6bnx8IW4mJmV8fG0odCkmJnQsZHVyYXRpb246dCxlYXNpbmc6biYmZXx8ZSYmIW0oZSkmJmV9O3JldHVybiBTLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBTLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVMuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249Uy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmUy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LFMuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGN0KS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmV9LHQsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1TLmlzRW1wdHlPYmplY3QodCksaT1TLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9Z2UodGhpcyxTLmV4dGVuZCh7fSx0KSxpKTsob3x8US5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxvfHwhMT09PWkucXVldWU%2FdGhpcy5lYWNoKGEpOnRoaXMucXVldWUoaS5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbih0LGUsbil7dmFyIHI9ZnVuY3Rpb24odCl7dmFyIGU9dC5zdG9wO2RlbGV0ZSB0LnN0b3AsZShuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYobj1lLGU9dCx0PXZvaWQgMCksZSYmITEhPT10JiZ0aGlzLnF1ZXVlKHR8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPSEwLG89bnVsbCE9dCYmdCsicXVldWVIb29rcyIsaT1TLnRpbWVycyxhPVEuZ2V0KHRoaXMpO2lmKG8pYVtvXSYmYVtvXS5zdG9wJiZyKGFbb10pO2Vsc2UgZm9yKG8gaW4gYSlhW29dJiZhW29dLnN0b3AmJmxlLnRlc3QobykmJnIoYVtvXSk7Zm9yKG89aS5sZW5ndGg7by0tOylpW29dLmVsZW0hPT10aGlzfHxudWxsIT10JiZpW29dLnF1ZXVlIT09dHx8KGlbb10uYW5pbS5zdG9wKG4pLGU9ITEsaS5zcGxpY2UobywxKSk7IWUmJm58fFMuZGVxdWV1ZSh0aGlzLHQpfSl9LGZpbmlzaDpmdW5jdGlvbih0KXtyZXR1cm4hMSE9PXQmJih0PXR8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLG49US5nZXQodGhpcykscj1uW3QrInF1ZXVlIl0sbz1uW3QrInF1ZXVlSG9va3MiXSxpPVMudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCxTLnF1ZXVlKHRoaXMsdCxbXSksbyYmby5zdG9wJiZvLnN0b3AuY2FsbCh0aGlzLCEwKSxlPWkubGVuZ3RoO2UtLTspaVtlXS5lbGVtPT09dGhpcyYmaVtlXS5xdWV1ZT09PXQmJihpW2VdLmFuaW0uc3RvcCghMCksaS5zcGxpY2UoZSwxKSk7Zm9yKGU9MDtlPGE7ZSsrKXJbZV0mJnJbZV0uZmluaXNoJiZyW2VdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pLFMuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24odCxlKXt2YXIgbj1TLmZuW2VdO1MuZm5bZV09ZnVuY3Rpb24odCxyLG8pe3JldHVybiBudWxsPT10fHwiYm9vbGVhbiI9PXR5cGVvZiB0P24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShoZShlLCEwKSx0LHIsbyl9fSksUy5lYWNoKHtzbGlkZURvd246aGUoInNob3ciKSxzbGlkZVVwOmhlKCJoaWRlIiksc2xpZGVUb2dnbGU6aGUoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKGUsdCxuLHIpfX0pLFMudGltZXJzPVtdLFMuZngudGljaz1mdW5jdGlvbigpe3ZhciB0LGU9MCxuPVMudGltZXJzO2ZvcihzZT1EYXRlLm5vdygpO2U8bi5sZW5ndGg7ZSsrKSh0PW5bZV0pKCl8fG5bZV0hPT10fHxuLnNwbGljZShlLS0sMSk7bi5sZW5ndGh8fFMuZnguc3RvcCgpLHNlPXZvaWQgMH0sUy5meC50aW1lcj1mdW5jdGlvbih0KXtTLnRpbWVycy5wdXNoKHQpLFMuZnguc3RhcnQoKX0sUy5meC5pbnRlcnZhbD0xMyxTLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7dWV8fCh1ZT0hMCxmZSgpKX0sUy5meC5zdG9wPWZ1bmN0aW9uKCl7dWU9bnVsbH0sUy5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sUy5mbi5kZWxheT1mdW5jdGlvbih0LGUpe3JldHVybiB0PVMuZngmJlMuZnguc3BlZWRzW3RdfHx0LGU9ZXx8ImZ4Iix0aGlzLnF1ZXVlKGUsZnVuY3Rpb24oZSxyKXt2YXIgbz1uLnNldFRpbWVvdXQoZSx0KTtyLnN0b3A9ZnVuY3Rpb24oKXtuLmNsZWFyVGltZW91dChvKX19KX0sZnVuY3Rpb24oKXt2YXIgdD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksZT1hLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO3QudHlwZT0iY2hlY2tib3giLHkuY2hlY2tPbj0iIiE9PXQudmFsdWUseS5vcHRTZWxlY3RlZD1lLnNlbGVjdGVkLCh0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLHQudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT10LnZhbHVlfSgpO3ZhciB2ZSx5ZT1TLmV4cHIuYXR0ckhhbmRsZTtTLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsUy5hdHRyLHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLnJlbW92ZUF0dHIodGhpcyx0KX0pfX0pLFMuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9dC5ub2RlVHlwZTtpZigzIT09aSYmOCE9PWkmJjIhPT1pKXJldHVybiB2b2lkIDA9PT10LmdldEF0dHJpYnV0ZT9TLnByb3AodCxlLG4pOigxPT09aSYmUy5pc1hNTERvYyh0KXx8KG89Uy5hdHRySG9va3NbZS50b0xvd2VyQ2FzZSgpXXx8KFMuZXhwci5tYXRjaC5ib29sLnRlc3QoZSk%2FdmU6dm9pZCAwKSksdm9pZCAwIT09bj9udWxsPT09bj92b2lkIFMucmVtb3ZlQXR0cih0LGUpOm8mJiJzZXQiaW4gbyYmdm9pZCAwIT09KHI9by5zZXQodCxuLGUpKT9yOih0LnNldEF0dHJpYnV0ZShlLG4rIiIpLG4pOm8mJiJnZXQiaW4gbyYmbnVsbCE9PShyPW8uZ2V0KHQsZSkpP3I6bnVsbD09KHI9Uy5maW5kLmF0dHIodCxlKSk%2Fdm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbih0LGUpe2lmKCF5LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1lJiZMKHQsImlucHV0Iikpe3ZhciBuPXQudmFsdWU7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJ0eXBlIixlKSxuJiYodC52YWx1ZT1uKSxlfX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLG89ZSYmZS5tYXRjaChVKTtpZihvJiYxPT09dC5ub2RlVHlwZSlmb3IoO249b1tyKytdOyl0LnJlbW92ZUF0dHJpYnV0ZShuKX19KSx2ZT17c2V0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hMT09PWU%2FUy5yZW1vdmVBdHRyKHQsbik6dC5zZXRBdHRyaWJ1dGUobixuKSxufX0sUy5lYWNoKFMuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKHQsZSl7dmFyIG49eWVbZV18fFMuZmluZC5hdHRyO3llW2VdPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGE9ZS50b0xvd2VyQ2FzZSgpO3JldHVybiByfHwoaT15ZVthXSx5ZVthXT1vLG89bnVsbCE9bih0LGUscik%2FYTpudWxsLHllW2FdPWkpLG99fSk7dmFyIG1lPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksYmU9L14oPzphfGFyZWEpJC9pO2Z1bmN0aW9uIHhlKHQpe3JldHVybih0Lm1hdGNoKFUpfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIHdlKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIGtlKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3Q6InN0cmluZyI9PXR5cGVvZiB0JiZ0Lm1hdGNoKFUpfHxbXX1TLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsUy5wcm9wLHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tTLnByb3BGaXhbdF18fHRdfSl9fSksUy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT10Lm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIDE9PT1pJiZTLmlzWE1MRG9jKHQpfHwoZT1TLnByb3BGaXhbZV18fGUsbz1TLnByb3BIb29rc1tlXSksdm9pZCAwIT09bj9vJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KHQsbixlKSk%2Fcjp0W2VdPW46byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQodCxlKSk%2Fcjp0W2VdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9Uy5maW5kLmF0dHIodCwidGFiaW5kZXgiKTtyZXR1cm4gZT9wYXJzZUludChlLDEwKTptZS50ZXN0KHQubm9kZU5hbWUpfHxiZS50ZXN0KHQubm9kZU5hbWUpJiZ0LmhyZWY%2FMDotMX19fSxwcm9wRml4Ontmb3I6Imh0bWxGb3IiLGNsYXNzOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChTLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtyZXR1cm4gZSYmZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO2UmJihlLnNlbGVjdGVkSW5kZXgsZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksUy5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtTLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksUy5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLHdlKHRoaXMpKSl9KTtpZigoZT1rZSh0KSkubGVuZ3RoKWZvcig7bj10aGlzW3UrK107KWlmKG89d2Uobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3hlKG8pKyIgIil7Zm9yKGE9MDtpPWVbYSsrXTspci5pbmRleE9mKCIgIitpKyIgIik8MCYmKHIrPWkrIiAiKTtvIT09KHM9eGUocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSx3ZSh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigoZT1rZSh0KSkubGVuZ3RoKWZvcig7bj10aGlzW3UrK107KWlmKG89d2Uobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3hlKG8pKyIgIil7Zm9yKGE9MDtpPWVbYSsrXTspZm9yKDtyLmluZGV4T2YoIiAiK2krIiAiKT4tMTspcj1yLnJlcGxhY2UoIiAiK2krIiAiLCIgIik7byE9PShzPXhlKHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdCxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheSh0KTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlJiZyP2U%2FdGhpcy5hZGRDbGFzcyh0KTp0aGlzLnJlbW92ZUNsYXNzKHQpOm0odCk%2FdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe1ModGhpcykudG9nZ2xlQ2xhc3ModC5jYWxsKHRoaXMsbix3ZSh0aGlzKSxlKSxlKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLG8saSxhO2lmKHIpZm9yKG89MCxpPVModGhpcyksYT1rZSh0KTtlPWFbbysrXTspaS5oYXNDbGFzcyhlKT9pLnJlbW92ZUNsYXNzKGUpOmkuYWRkQ2xhc3MoZSk7ZWxzZSB2b2lkIDAhPT10JiYiYm9vbGVhbiIhPT1ufHwoKGU9d2UodGhpcykpJiZRLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixlKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixlfHwhMT09PXQ%2FIiI6US5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj0wO2ZvcihlPSIgIit0KyIgIjtuPXRoaXNbcisrXTspaWYoMT09PW4ubm9kZVR5cGUmJigiICIreGUod2UobikpKyIgIikuaW5kZXhPZihlKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgU2U9L1xyL2c7Uy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbz10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW0odCksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBvOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KG89cj90LmNhbGwodGhpcyxuLFModGhpcykudmFsKCkpOnQpP289IiI6Im51bWJlciI9PXR5cGVvZiBvP28rPSIiOkFycmF5LmlzQXJyYXkobykmJihvPVMubWFwKG8sZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ%2FIiI6dCsiIn0pKSwoZT1TLnZhbEhvb2tzW3RoaXMudHlwZV18fFMudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gZSYmdm9pZCAwIT09ZS5zZXQodGhpcyxvLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1vKSl9KSk6bz8oZT1TLnZhbEhvb2tzW28udHlwZV18fFMudmFsSG9va3Nbby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJnZXQiaW4gZSYmdm9pZCAwIT09KG49ZS5nZXQobywidmFsdWUiKSk%2Fbjoic3RyaW5nIj09dHlwZW9mKG49by52YWx1ZSk%2Fbi5yZXBsYWNlKFNlLCIiKTpudWxsPT1uPyIiOm46dm9pZCAwfX0pLFMuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9Uy5maW5kLmF0dHIodCwidmFsdWUiKTtyZXR1cm4gbnVsbCE9ZT9lOnhlKFMudGV4dCh0KSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbz10Lm9wdGlvbnMsaT10LnNlbGVjdGVkSW5kZXgsYT0ic2VsZWN0LW9uZSI9PT10LnR5cGUscz1hP251bGw6W10sdT1hP2krMTpvLmxlbmd0aDtmb3Iocj1pPDA%2FdTphP2k6MDtyPHU7cisrKWlmKCgobj1vW3JdKS5zZWxlY3RlZHx8cj09PWkpJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFMKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGU9UyhuKS52YWwoKSxhKXJldHVybiBlO3MucHVzaChlKX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHIsbz10Lm9wdGlvbnMsaT1TLm1ha2VBcnJheShlKSxhPW8ubGVuZ3RoO2EtLTspKChyPW9bYV0pLnNlbGVjdGVkPVMuaW5BcnJheShTLnZhbEhvb2tzLm9wdGlvbi5nZXQociksaSk%2BLTEpJiYobj0hMCk7cmV0dXJuIG58fCh0LnNlbGVjdGVkSW5kZXg9LTEpLGl9fX19KSxTLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtTLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24odCxlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiB0LmNoZWNrZWQ9Uy5pbkFycmF5KFModCkudmFsKCksZSk%2BLTF9fSx5LmNoZWNrT258fChTLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6dC52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gbjt2YXIgRWU9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFRlPWZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9O1MuZXh0ZW5kKFMuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxlLHIsbyl7dmFyIGkscyx1LGMsbCxmLHAsaCxnPVtyfHxhXSx2PWQuY2FsbCh0LCJ0eXBlIik%2FdC50eXBlOnQseT1kLmNhbGwodCwibmFtZXNwYWNlIik%2FdC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1yPXJ8fGEsMyE9PXIubm9kZVR5cGUmJjghPT1yLm5vZGVUeXBlJiYhRWUudGVzdCh2K1MuZXZlbnQudHJpZ2dlcmVkKSYmKHYuaW5kZXhPZigiLiIpPi0xJiYoeT12LnNwbGl0KCIuIiksdj15LnNoaWZ0KCkseS5zb3J0KCkpLGw9di5pbmRleE9mKCI6Iik8MCYmIm9uIit2LCh0PXRbUy5leHBhbmRvXT90Om5ldyBTLkV2ZW50KHYsIm9iamVjdCI9PXR5cGVvZiB0JiZ0KSkuaXNUcmlnZ2VyPW8%2FMjozLHQubmFtZXNwYWNlPXkuam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit5LmpvaW4oIlxcLig%2FOi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9ciksZT1udWxsPT1lP1t0XTpTLm1ha2VBcnJheShlLFt0XSkscD1TLmV2ZW50LnNwZWNpYWxbdl18fHt9LG98fCFwLnRyaWdnZXJ8fCExIT09cC50cmlnZ2VyLmFwcGx5KHIsZSkpKXtpZighbyYmIXAubm9CdWJibGUmJiFiKHIpKXtmb3IoYz1wLmRlbGVnYXRlVHlwZXx8dixFZS50ZXN0KGMrdil8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSlnLnB1c2gocyksdT1zO3U9PT0oci5vd25lckRvY3VtZW50fHxhKSYmZy5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxuKX1mb3IoaT0wOyhzPWdbaSsrXSkmJiF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWg9cyx0LnR5cGU9aT4xP2M6cC5iaW5kVHlwZXx8diwoZj0oUS5nZXQocywiZXZlbnRzIil8fHt9KVt0LnR5cGVdJiZRLmdldChzLCJoYW5kbGUiKSkmJmYuYXBwbHkocyxlKSwoZj1sJiZzW2xdKSYmZi5hcHBseSYmWChzKSYmKHQucmVzdWx0PWYuYXBwbHkocyxlKSwhMT09PXQucmVzdWx0JiZ0LnByZXZlbnREZWZhdWx0KCkpO3JldHVybiB0LnR5cGU9dixvfHx0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHxwLl9kZWZhdWx0JiYhMSE9PXAuX2RlZmF1bHQuYXBwbHkoZy5wb3AoKSxlKXx8IVgocil8fGwmJm0oclt2XSkmJiFiKHIpJiYoKHU9cltsXSkmJihyW2xdPW51bGwpLFMuZXZlbnQudHJpZ2dlcmVkPXYsdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLmFkZEV2ZW50TGlzdGVuZXIodixUZSksclt2XSgpLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5yZW1vdmVFdmVudExpc3RlbmVyKHYsVGUpLFMuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCx1JiYocltsXT11KSksdC5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9Uy5leHRlbmQobmV3IFMuRXZlbnQsbix7dHlwZTp0LGlzU2ltdWxhdGVkOiEwfSk7Uy5ldmVudC50cmlnZ2VyKHIsbnVsbCxlKX19KSxTLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnRyaWdnZXIodCxlLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBTLmV2ZW50LnRyaWdnZXIodCxlLG4sITApfX0pLHkuZm9jdXNpbnx8Uy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe1MuZXZlbnQuc2ltdWxhdGUoZSx0LnRhcmdldCxTLmV2ZW50LmZpeCh0KSl9O1MuZXZlbnQuc3BlY2lhbFtlXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsbz1RLmFjY2VzcyhyLGUpO298fHIuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITApLFEuYWNjZXNzKHIsZSwob3x8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89US5hY2Nlc3MocixlKS0xO28%2FUS5hY2Nlc3MocixlLG8pOihyLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCEwKSxRLnJlbW92ZShyLGUpKX19fSk7dmFyIEFlPW4ubG9jYXRpb24sT2U9RGF0ZS5ub3coKSxDZT0vXD8vO1MucGFyc2VYTUw9ZnVuY3Rpb24odCl7dmFyIGU7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gbnVsbDt0cnl7ZT0obmV3IG4uRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC94bWwiKX1jYXRjaCh0KXtlPXZvaWQgMH1yZXR1cm4gZSYmIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxTLmVycm9yKCJJbnZhbGlkIFhNTDogIit0KSxlfTt2YXIgamU9L1xbXF0kLyxMZT0vXHI%2FXG4vZyxQZT0vXig%2FOnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksUmU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIE5lKHQsZSxuLHIpe3ZhciBvO2lmKEFycmF5LmlzQXJyYXkoZSkpUy5lYWNoKGUsZnVuY3Rpb24oZSxvKXtufHxqZS50ZXN0KHQpP3IodCxvKTpOZSh0KyJbIisoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT1vP2U6IiIpKyJdIixvLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09ayhlKSlyKHQsZSk7ZWxzZSBmb3IobyBpbiBlKU5lKHQrIlsiK28rIl0iLGVbb10sbixyKX1TLnBhcmFtPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXSxvPWZ1bmN0aW9uKHQsZSl7dmFyIG49bShlKT9lKCk6ZTtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQodCkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihudWxsPT10KXJldHVybiIiO2lmKEFycmF5LmlzQXJyYXkodCl8fHQuanF1ZXJ5JiYhUy5pc1BsYWluT2JqZWN0KHQpKVMuZWFjaCh0LGZ1bmN0aW9uKCl7byh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIHQpTmUobix0W25dLGUsbyk7cmV0dXJuIHIuam9pbigiJiIpfSxTLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIFMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgdD1TLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gdD9TLm1ha2VBcnJheSh0KTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFTKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmUmUudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVBlLnRlc3QodCkmJih0aGlzLmNoZWNrZWR8fCFndC50ZXN0KHQpKX0pLm1hcChmdW5jdGlvbih0LGUpe3ZhciBuPVModGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4%2FbnVsbDpBcnJheS5pc0FycmF5KG4pP1MubWFwKG4sZnVuY3Rpb24odCl7cmV0dXJue25hbWU6ZS5uYW1lLHZhbHVlOnQucmVwbGFjZShMZSwiXHJcbiIpfX0pOntuYW1lOmUubmFtZSx2YWx1ZTpuLnJlcGxhY2UoTGUsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIgSWU9LyUyMC9nLERlPS8jLiokLyxfZT0vKFs%2FJl0pXz1bXiZdKi8sTWU9L14oLio%2FKTpbIFx0XSooW15cclxuXSopJC9nbSxVZT0vXig%2FOkdFVHxIRUFEKSQvLEJlPS9eXC9cLy8scWU9e30sRmU9e30sSGU9IiovIi5jb25jYXQoIioiKSx6ZT1hLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBXZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXsic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT0iKiIpO3ZhciByLG89MCxpPWUudG9Mb3dlckNhc2UoKS5tYXRjaChVKXx8W107aWYobShuKSlmb3IoO3I9aVtvKytdOykiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwodFtyXT10W3JdfHxbXSkudW5zaGlmdChuKSk6KHRbcl09dFtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uICRlKHQsZSxuLHIpe3ZhciBvPXt9LGk9dD09PUZlO2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIG9bc109ITAsUy5lYWNoKHRbc118fFtdLGZ1bmN0aW9uKHQscyl7dmFyIGM9cyhlLG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxpfHxvW2NdP2k%2FISh1PWMpOnZvaWQgMDooZS5kYXRhVHlwZXMudW5zaGlmdChjKSxhKGMpLCExKX0pLHV9cmV0dXJuIGEoZS5kYXRhVHlwZXNbMF0pfHwhb1siKiJdJiZhKCIqIil9ZnVuY3Rpb24gVmUodCxlKXt2YXIgbixyLG89Uy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIGUpdm9pZCAwIT09ZVtuXSYmKChvW25dP3Q6cnx8KHI9e30pKVtuXT1lW25dKTtyZXR1cm4gciYmUy5leHRlbmQoITAsdCxyKSx0fXplLmhyZWY9QWUuaHJlZixTLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6QWUuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChBZS5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpIZSx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Uy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU%2FVmUoVmUodCxTLmFqYXhTZXR0aW5ncyksZSk6VmUoUy5hamF4U2V0dGluZ3MsdCl9LGFqYXhQcmVmaWx0ZXI6V2UocWUpLGFqYXhUcmFuc3BvcnQ6V2UoRmUpLGFqYXg6ZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLGU9ZXx8e307dmFyIHIsbyxpLHMsdSxjLGwsZixwLGgsZD1TLmFqYXhTZXR1cCh7fSxlKSxnPWQuY29udGV4dHx8ZCx2PWQuY29udGV4dCYmKGcubm9kZVR5cGV8fGcuanF1ZXJ5KT9TKGcpOlMuZXZlbnQseT1TLkRlZmVycmVkKCksbT1TLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxiPWQuc3RhdHVzQ29kZXx8e30seD17fSx3PXt9LGs9ImNhbmNlbGVkIixFPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24odCl7dmFyIGU7aWYobCl7aWYoIXMpZm9yKHM9e307ZT1NZS5leGVjKGkpOylzW2VbMV0udG9Mb3dlckNhc2UoKSsiICJdPShzW2VbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KGVbMl0pO2U9c1t0LnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09ZT9udWxsOmUuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGw%2FaTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWwmJih0PXdbdC50b0xvd2VyQ2FzZSgpXT13W3QudG9Mb3dlckNhc2UoKV18fHQseFt0XT1lKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT1sJiYoZC5taW1lVHlwZT10KSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHQpaWYobClFLmFsd2F5cyh0W0Uuc3RhdHVzXSk7ZWxzZSBmb3IoZSBpbiB0KWJbZV09W2JbZV0sdFtlXV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKHQpe3ZhciBlPXR8fGs7cmV0dXJuIHImJnIuYWJvcnQoZSksVCgwLGUpLHRoaXN9fTtpZih5LnByb21pc2UoRSksZC51cmw9KCh0fHxkLnVybHx8QWUuaHJlZikrIiIpLnJlcGxhY2UoQmUsQWUucHJvdG9jb2wrIi8vIiksZC50eXBlPWUubWV0aG9kfHxlLnR5cGV8fGQubWV0aG9kfHxkLnR5cGUsZC5kYXRhVHlwZXM9KGQuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChVKXx8WyIiXSxudWxsPT1kLmNyb3NzRG9tYWluKXtjPWEuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtjLmhyZWY9ZC51cmwsYy5ocmVmPWMuaHJlZixkLmNyb3NzRG9tYWluPXplLnByb3RvY29sKyIvLyIremUuaG9zdCE9Yy5wcm90b2NvbCsiLy8iK2MuaG9zdH1jYXRjaCh0KXtkLmNyb3NzRG9tYWluPSEwfX1pZihkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgZC5kYXRhJiYoZC5kYXRhPVMucGFyYW0oZC5kYXRhLGQudHJhZGl0aW9uYWwpKSwkZShxZSxkLGUsRSksbClyZXR1cm4gRTtmb3IocCBpbihmPVMuZXZlbnQmJmQuZ2xvYmFsKSYmMD09Uy5hY3RpdmUrKyYmUy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxkLnR5cGU9ZC50eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFVZS50ZXN0KGQudHlwZSksbz1kLnVybC5yZXBsYWNlKERlLCIiKSxkLmhhc0NvbnRlbnQ%2FZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiYwPT09KGQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKGQuZGF0YT1kLmRhdGEucmVwbGFjZShJZSwiKyIpKTooaD1kLnVybC5zbGljZShvLmxlbmd0aCksZC5kYXRhJiYoZC5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiBkLmRhdGEpJiYobys9KENlLnRlc3Qobyk%2FIiYiOiI%2FIikrZC5kYXRhLGRlbGV0ZSBkLmRhdGEpLCExPT09ZC5jYWNoZSYmKG89by5yZXBsYWNlKF9lLCIkMSIpLGg9KENlLnRlc3Qobyk%2FIiYiOiI%2FIikrIl89IitPZSsrK2gpLGQudXJsPW8raCksZC5pZk1vZGlmaWVkJiYoUy5sYXN0TW9kaWZpZWRbb10mJkUuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLFMubGFzdE1vZGlmaWVkW29dKSxTLmV0YWdbb10mJkUuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsUy5ldGFnW29dKSksKGQuZGF0YSYmZC5oYXNDb250ZW50JiYhMSE9PWQuY29udGVudFR5cGV8fGUuY29udGVudFR5cGUpJiZFLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksRS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGQuZGF0YVR5cGVzWzBdJiZkLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dP2QuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0rKCIqIiE9PWQuZGF0YVR5cGVzWzBdPyIsICIrSGUrIjsgcT0wLjAxIjoiIik6ZC5hY2NlcHRzWyIqIl0pLGQuaGVhZGVycylFLnNldFJlcXVlc3RIZWFkZXIocCxkLmhlYWRlcnNbcF0pO2lmKGQuYmVmb3JlU2VuZCYmKCExPT09ZC5iZWZvcmVTZW5kLmNhbGwoZyxFLGQpfHxsKSlyZXR1cm4gRS5hYm9ydCgpO2lmKGs9ImFib3J0IixtLmFkZChkLmNvbXBsZXRlKSxFLmRvbmUoZC5zdWNjZXNzKSxFLmZhaWwoZC5lcnJvcikscj0kZShGZSxkLGUsRSkpe2lmKEUucmVhZHlTdGF0ZT0xLGYmJnYudHJpZ2dlcigiYWpheFNlbmQiLFtFLGRdKSxsKXJldHVybiBFO2QuYXN5bmMmJmQudGltZW91dD4wJiYodT1uLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtFLmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtsPSExLHIuc2VuZCh4LFQpfWNhdGNoKHQpe2lmKGwpdGhyb3cgdDtUKC0xLHQpfX1lbHNlIFQoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIFQodCxlLGEscyl7dmFyIGMscCxoLHgsdyxrPWU7bHx8KGw9ITAsdSYmbi5jbGVhclRpbWVvdXQodSkscj12b2lkIDAsaT1zfHwiIixFLnJlYWR5U3RhdGU9dD4wPzQ6MCxjPXQ%2BPTIwMCYmdDwzMDB8fDMwND09PXQsYSYmKHg9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixvLGksYSxzPXQuY29udGVudHMsdT10LmRhdGFUeXBlczsiKiI9PT11WzBdOyl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9dC5taW1lVHlwZXx8ZS5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKG8gaW4gcylpZihzW29dJiZzW29dLnRlc3Qocikpe3UudW5zaGlmdChvKTticmVha31pZih1WzBdaW4gbilpPXVbMF07ZWxzZXtmb3IobyBpbiBuKXtpZighdVswXXx8dC5jb252ZXJ0ZXJzW28rIiAiK3VbMF1dKXtpPW87YnJlYWt9YXx8KGE9byl9aT1pfHxhfWlmKGkpcmV0dXJuIGkhPT11WzBdJiZ1LnVuc2hpZnQoaSksbltpXX0oZCxFLGEpKSx4PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzLHUsYz17fSxsPXQuZGF0YVR5cGVzLnNsaWNlKCk7aWYobFsxXSlmb3IoYSBpbiB0LmNvbnZlcnRlcnMpY1thLnRvTG93ZXJDYXNlKCldPXQuY29udmVydGVyc1thXTtmb3IoaT1sLnNoaWZ0KCk7aTspaWYodC5yZXNwb25zZUZpZWxkc1tpXSYmKG5bdC5yZXNwb25zZUZpZWxkc1tpXV09ZSksIXUmJnImJnQuZGF0YUZpbHRlciYmKGU9dC5kYXRhRmlsdGVyKGUsdC5kYXRhVHlwZSkpLHU9aSxpPWwuc2hpZnQoKSlpZigiKiI9PT1pKWk9dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1pKXtpZighKGE9Y1t1KyIgIitpXXx8Y1siKiAiK2ldKSlmb3IobyBpbiBjKWlmKChzPW8uc3BsaXQoIiAiKSlbMV09PT1pJiYoYT1jW3UrIiAiK3NbMF1dfHxjWyIqICIrc1swXV0pKXshMD09PWE%2FYT1jW29dOiEwIT09Y1tvXSYmKGk9c1swXSxsLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKCEwIT09YSlpZihhJiZ0LnRocm93cyllPWEoZSk7ZWxzZSB0cnl7ZT1hKGUpfWNhdGNoKHQpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE%2FdDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIraX19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTplfX0oZCx4LEUsYyksYz8oZC5pZk1vZGlmaWVkJiYoKHc9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKFMubGFzdE1vZGlmaWVkW29dPXcpLCh3PUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihTLmV0YWdbb109dykpLDIwND09PXR8fCJIRUFEIj09PWQudHlwZT9rPSJub2NvbnRlbnQiOjMwND09PXQ%2Faz0ibm90bW9kaWZpZWQiOihrPXguc3RhdGUscD14LmRhdGEsYz0hKGg9eC5lcnJvcikpKTooaD1rLCF0JiZrfHwoaz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0oZXx8aykrIiIsYz95LnJlc29sdmVXaXRoKGcsW3AsayxFXSk6eS5yZWplY3RXaXRoKGcsW0UsayxoXSksRS5zdGF0dXNDb2RlKGIpLGI9dm9pZCAwLGYmJnYudHJpZ2dlcihjPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsZCxjP3A6aF0pLG0uZmlyZVdpdGgoZyxbRSxrXSksZiYmKHYudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxkXSksLS1TLmFjdGl2ZXx8Uy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24odCxlLG4pe3JldHVybiBTLmdldCh0LGUsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUy5nZXQodCx2b2lkIDAsZSwic2NyaXB0Iil9fSksUy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKHQsZSl7U1tlXT1mdW5jdGlvbih0LG4scixvKXtyZXR1cm4gbShuKSYmKG89b3x8cixyPW4sbj12b2lkIDApLFMuYWpheChTLmV4dGVuZCh7dXJsOnQsdHlwZTplLGRhdGFUeXBlOm8sZGF0YTpuLHN1Y2Nlc3M6cn0sUy5pc1BsYWluT2JqZWN0KHQpJiZ0KSl9fSksUy5fZXZhbFVybD1mdW5jdGlvbih0LGUpe3JldHVybiBTLmFqYXgoe3VybDp0LHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKHQpe1MuZ2xvYmFsRXZhbCh0LGUpfX0pfSxTLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdGhpc1swXSYmKG0odCkmJih0PXQuY2FsbCh0aGlzWzBdKSksZT1TKHQsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZlLmluc2VydEJlZm9yZSh0aGlzWzBdKSxlLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzO3QuZmlyc3RFbGVtZW50Q2hpbGQ7KXQ9dC5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gdH0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKHQpe3JldHVybiBtKHQpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBJbm5lcih0LmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TKHRoaXMpLG49ZS5jb250ZW50cygpO24ubGVuZ3RoP24ud3JhcEFsbCh0KTplLmFwcGVuZCh0KX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBlPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXtTKHRoaXMpLndyYXBBbGwoZT90LmNhbGwodGhpcyxuKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucGFyZW50KHQpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLFMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4hUy5leHByLnBzZXVkb3MudmlzaWJsZSh0KX0sUy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4hISh0Lm9mZnNldFdpZHRofHx0Lm9mZnNldEhlaWdodHx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LFMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IG4uWE1MSHR0cFJlcXVlc3R9Y2F0Y2godCl7fX07dmFyIFllPXswOjIwMCwxMjIzOjIwNH0sR2U9Uy5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhR2UmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gR2UseS5hamF4PUdlPSEhR2UsUy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoeS5jb3JzfHxHZSYmIXQuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24obyxpKXt2YXIgYSxzPXQueGhyKCk7aWYocy5vcGVuKHQudHlwZSx0LnVybCx0LmFzeW5jLHQudXNlcm5hbWUsdC5wYXNzd29yZCksdC54aHJGaWVsZHMpZm9yKGEgaW4gdC54aHJGaWVsZHMpc1thXT10LnhockZpZWxkc1thXTtmb3IoYSBpbiB0Lm1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSh0Lm1pbWVUeXBlKSx0LmNyb3NzRG9tYWlufHxvWyJYLVJlcXVlc3RlZC1XaXRoIl18fChvWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksbylzLnNldFJlcXVlc3RIZWFkZXIoYSxvW2FdKTtlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2UmJihlPXI9cy5vbmxvYWQ9cy5vbmVycm9yPXMub25hYm9ydD1zLm9udGltZW91dD1zLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT10P3MuYWJvcnQoKToiZXJyb3IiPT09dD8ibnVtYmVyIiE9dHlwZW9mIHMuc3RhdHVzP2koMCwiZXJyb3IiKTppKHMuc3RhdHVzLHMuc3RhdHVzVGV4dCk6aShZZVtzLnN0YXR1c118fHMuc3RhdHVzLHMuc3RhdHVzVGV4dCwidGV4dCIhPT0ocy5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygcy5yZXNwb25zZVRleHQ%2Fe2JpbmFyeTpzLnJlc3BvbnNlfTp7dGV4dDpzLnJlc3BvbnNlVGV4dH0scy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0scy5vbmxvYWQ9ZSgpLHI9cy5vbmVycm9yPXMub250aW1lb3V0PWUoImVycm9yIiksdm9pZCAwIT09cy5vbmFib3J0P3Mub25hYm9ydD1yOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXMucmVhZHlTdGF0ZSYmbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSYmcigpfSl9LGU9ZSgiYWJvcnQiKTt0cnl7cy5zZW5kKHQuaGFzQ29udGVudCYmdC5kYXRhfHxudWxsKX1jYXRjaCh0KXtpZihlKXRocm93IHR9fSxhYm9ydDpmdW5jdGlvbigpe2UmJmUoKX19fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKHQpe3QuY3Jvc3NEb21haW4mJih0LmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbih0KXtyZXR1cm4gUy5nbG9iYWxFdmFsKHQpLHR9fX0pLFMuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbih0KXt2b2lkIDA9PT10LmNhY2hlJiYodC5jYWNoZT0hMSksdC5jcm9zc0RvbWFpbiYmKHQudHlwZT0iR0VUIil9KSxTLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24odCl7dmFyIGUsbjtpZih0LmNyb3NzRG9tYWlufHx0LnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKHIsbyl7ZT1TKCI8c2NyaXB0PiIpLmF0dHIodC5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6dC5zY3JpcHRDaGFyc2V0LHNyYzp0LnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKHQpe2UucmVtb3ZlKCksbj1udWxsLHQmJm8oImVycm9yIj09PXQudHlwZT80MDQ6MjAwLHQudHlwZSl9KSxhLmhlYWQuYXBwZW5kQ2hpbGQoZVswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19KTt2YXIgS2UsWGU9W10sSmU9Lyg9KVw%2FKD89JnwkKXxcP1w%2FLztTLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIHQ9WGUucG9wKCl8fFMuZXhwYW5kbysiXyIrT2UrKztyZXR1cm4gdGhpc1t0XT0hMCx0fX0pLFMuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYSxzPSExIT09dC5qc29ucCYmKEplLnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmSmUudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gbz10Lmpzb25wQ2FsbGJhY2s9bSh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKEplLCIkMSIrbyk6ITEhPT10Lmpzb25wJiYodC51cmwrPShDZS50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitvKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8Uy5lcnJvcihvKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsaT1uW29dLG5bb109ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP1MobikucmVtb3ZlUHJvcChvKTpuW29dPWksdFtvXSYmKHQuanNvbnBDYWxsYmFjaz1lLmpzb25wQ2FsbGJhY2ssWGUucHVzaChvKSksYSYmbShpKSYmaShhWzBdKSxhPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKEtlPWEuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0%2BIiwyPT09S2UuY2hpbGROb2Rlcy5sZW5ndGgpLFMucGFyc2VIVE1MPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQ%2FW106KCJib29sZWFuIj09dHlwZW9mIGUmJihuPWUsZT0hMSksZXx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0oZT1hLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1hLmxvY2F0aW9uLmhyZWYsZS5oZWFkLmFwcGVuZENoaWxkKHIpKTplPWEpLGk9IW4mJltdLChvPVAuZXhlYyh0KSk%2FW2UuY3JlYXRlRWxlbWVudChvWzFdKV06KG89RXQoW3RdLGUsaSksaSYmaS5sZW5ndGgmJlMoaSkucmVtb3ZlKCksUy5tZXJnZShbXSxvLmNoaWxkTm9kZXMpKSk7dmFyIHIsbyxpfSxTLmZuLmxvYWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPXRoaXMscz10LmluZGV4T2YoIiAiKTtyZXR1cm4gcz4tMSYmKHI9eGUodC5zbGljZShzKSksdD10LnNsaWNlKDAscykpLG0oZSk%2FKG49ZSxlPXZvaWQgMCk6ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYobz0iUE9TVCIpLGEubGVuZ3RoPjAmJlMuYWpheCh7dXJsOnQsdHlwZTpvfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTplfSkuZG9uZShmdW5jdGlvbih0KXtpPWFyZ3VtZW50cyxhLmh0bWwocj9TKCI8ZGl2PiIpLmFwcGVuZChTLnBhcnNlSFRNTCh0KSkuZmluZChyKTp0KX0pLmFsd2F5cyhuJiZmdW5jdGlvbih0LGUpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxpfHxbdC5yZXNwb25zZVRleHQsZSx0XSl9KX0pLHRoaXN9LFMuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKHQsZSl7Uy5mbltlXT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vbihlLHQpfX0pLFMuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKHQpe3JldHVybiBTLmdyZXAoUy50aW1lcnMsZnVuY3Rpb24oZSl7cmV0dXJuIHQ9PT1lLmVsZW19KS5sZW5ndGh9LFMub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjPVMuY3NzKHQsInBvc2l0aW9uIiksbD1TKHQpLGY9e307InN0YXRpYyI9PT1jJiYodC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxzPWwub2Zmc2V0KCksaT1TLmNzcyh0LCJ0b3AiKSx1PVMuY3NzKHQsImxlZnQiKSwoImFic29sdXRlIj09PWN8fCJmaXhlZCI9PT1jKSYmKGkrdSkuaW5kZXhPZigiYXV0byIpPi0xPyhhPShyPWwucG9zaXRpb24oKSkudG9wLG89ci5sZWZ0KTooYT1wYXJzZUZsb2F0KGkpfHwwLG89cGFyc2VGbG9hdCh1KXx8MCksbShlKSYmKGU9ZS5jYWxsKHQsbixTLmV4dGVuZCh7fSxzKSkpLG51bGwhPWUudG9wJiYoZi50b3A9ZS50b3Atcy50b3ArYSksbnVsbCE9ZS5sZWZ0JiYoZi5sZWZ0PWUubGVmdC1zLmxlZnQrbyksInVzaW5nImluIGU%2FZS51c2luZy5jYWxsKHQsZik6bC5jc3MoZil9fSxTLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXQ%2FdGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsdCxlKX0pO3ZhciBlLG4scj10aGlzWzBdO3JldHVybiByP3IuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg%2FKGU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOmUudG9wK24ucGFnZVlPZmZzZXQsbGVmdDplLmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9OnZvaWQgMH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgdCxlLG4scj10aGlzWzBdLG89e3RvcDowLGxlZnQ6MH07aWYoImZpeGVkIj09PVMuY3NzKHIsInBvc2l0aW9uIikpZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7Zm9yKGU9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCx0PXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt0JiYodD09PW4uYm9keXx8dD09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TLmNzcyh0LCJwb3NpdGlvbiIpOyl0PXQucGFyZW50Tm9kZTt0JiZ0IT09ciYmMT09PXQubm9kZVR5cGUmJigobz1TKHQpLm9mZnNldCgpKS50b3ArPVMuY3NzKHQsImJvcmRlclRvcFdpZHRoIiwhMCksby5sZWZ0Kz1TLmNzcyh0LCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDplLnRvcC1vLnRvcC1TLmNzcyhyLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmUubGVmdC1vLmxlZnQtUy5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLm9mZnNldFBhcmVudDt0JiYic3RhdGljIj09PVMuY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5vZmZzZXRQYXJlbnQ7cmV0dXJuIHR8fGF0fSl9fSksUy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PWU7Uy5mblt0XT1mdW5jdGlvbihyKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQscixvKXt2YXIgaTtpZihiKHQpP2k9dDo5PT09dC5ub2RlVHlwZSYmKGk9dC5kZWZhdWx0Vmlldyksdm9pZCAwPT09bylyZXR1cm4gaT9pW2VdOnRbcl07aT9pLnNjcm9sbFRvKG4%2FaS5wYWdlWE9mZnNldDpvLG4%2FbzppLnBhZ2VZT2Zmc2V0KTp0W3JdPW99LHQscixhcmd1bWVudHMubGVuZ3RoKX19KSxTLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW2VdPUd0KHkucGl4ZWxQb3NpdGlvbixmdW5jdGlvbih0LG4pe2lmKG4pcmV0dXJuIG49WXQodCxlKSxXdC50ZXN0KG4pP1ModCkucG9zaXRpb24oKVtlXSsicHgiOm59KX0pLFMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrdCxjb250ZW50OmUsIiI6Im91dGVyIit0fSxmdW5jdGlvbihuLHIpe1MuZm5bcl09ZnVuY3Rpb24obyxpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2Ygbykscz1ufHwoITA9PT1vfHwhMD09PWk%2FIm1hcmdpbiI6ImJvcmRlciIpO3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSxuLG8pe3ZhciBpO3JldHVybiBiKGUpPzA9PT1yLmluZGV4T2YoIm91dGVyIik%2FZVsiaW5uZXIiK3RdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK3RdOjk9PT1lLm5vZGVUeXBlPyhpPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIit0XSxpWyJzY3JvbGwiK3RdLGUuYm9keVsib2Zmc2V0Iit0XSxpWyJvZmZzZXQiK3RdLGlbImNsaWVudCIrdF0pKTp2b2lkIDA9PT1vP1MuY3NzKGUsbixzKTpTLnN0eWxlKGUsbixvLHMpfSxlLGE%2Fbzp2b2lkIDAsYSl9fSl9KSxTLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtTLmZuW2VdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg%2BMD90aGlzLm9uKGUsbnVsbCx0LG4pOnRoaXMudHJpZ2dlcihlKX19KSxTLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKHQpLm1vdXNlbGVhdmUoZXx8dCl9fSksUy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLm9uKHQsbnVsbCxlLG4pfSx1bmJpbmQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vZmYodCxudWxsLGUpfSxkZWxlZ2F0ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdGhpcy5vbihlLHQsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKHQsIioqIik6dGhpcy5vZmYoZSx0fHwiKioiLG4pfX0pLFMucHJveHk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLG87aWYoInN0cmluZyI9PXR5cGVvZiBlJiYobj10W2VdLGU9dCx0PW4pLG0odCkpcmV0dXJuIHI9dS5jYWxsKGFyZ3VtZW50cywyKSwobz1mdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGV8fHRoaXMsci5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKX0pLmd1aWQ9dC5ndWlkPXQuZ3VpZHx8Uy5ndWlkKyssb30sUy5ob2xkUmVhZHk9ZnVuY3Rpb24odCl7dD9TLnJlYWR5V2FpdCsrOlMucmVhZHkoITApfSxTLmlzQXJyYXk9QXJyYXkuaXNBcnJheSxTLnBhcnNlSlNPTj1KU09OLnBhcnNlLFMubm9kZU5hbWU9TCxTLmlzRnVuY3Rpb249bSxTLmlzV2luZG93PWIsUy5jYW1lbENhc2U9SyxTLnR5cGU9ayxTLm5vdz1EYXRlLm5vdyxTLmlzTnVtZXJpYz1mdW5jdGlvbih0KXt2YXIgZT1TLnR5cGUodCk7cmV0dXJuKCJudW1iZXIiPT09ZXx8InN0cmluZyI9PT1lKSYmIWlzTmFOKHQtcGFyc2VGbG9hdCh0KSl9LHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJuIFN9LmFwcGx5KGUsW10pKXx8KHQuZXhwb3J0cz1yKTt2YXIgUWU9bi5qUXVlcnksWmU9bi4kO3JldHVybiBTLm5vQ29uZmxpY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG4uJD09PVMmJihuLiQ9WmUpLHQmJm4ualF1ZXJ5PT09UyYmKG4ualF1ZXJ5PVFlKSxTfSxvfHwobi5qUXVlcnk9bi4kPVMpLFN9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyOCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3OSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX1yLnByb3RvPWZ1bmN0aW9uKCl7cmV0dXJuIFJlZ0V4cC5lc2NhcGU9cixyfSx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Myl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4OCkuZGVmYXVsdDt0LmV4cG9ydHM9cix0LmV4cG9ydHMuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM1KX0sZnVuY3Rpb24odCxlLG4pe24oMTM2KTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLlJlZmxlY3QuY29uc3RydWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMzApLGk9bigxOSksYT1uKDkpLHM9big2KSx1PW4oNDcpLGM9big5MCksbD1uKDUpLGY9bygiUmVmbGVjdCIsImNvbnN0cnVjdCIpLHA9bChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShmKGZ1bmN0aW9uKCl7fSxbXSx0KWluc3RhbmNlb2YgdCl9KSxoPSFsKGZ1bmN0aW9uKCl7ZihmdW5jdGlvbigpe30pfSksZD1wfHxoO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxmb3JjZWQ6ZCxzaGFtOmR9LHtjb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlKXtpKHQpLGEoZSk7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3Q6aShhcmd1bWVudHNbMl0pO2lmKGgmJiFwKXJldHVybiBmKHQsZSxuKTtpZih0PT1uKXtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKX12YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGUpLG5ldyhjLmFwcGx5KHQscikpfXZhciBvPW4ucHJvdG90eXBlLGw9dShzKG8pP286T2JqZWN0LnByb3RvdHlwZSksZD1GdW5jdGlvbi5hcHBseS5jYWxsKHQsbCxlKTtyZXR1cm4gcyhkKT9kOmx9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjApLGk9big5KSxhPW4oNjQpO3QuZXhwb3J0cz1yP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7aSh0KTtmb3IodmFyIG4scj1hKGUpLHM9ci5sZW5ndGgsdT0wO3M%2BdTspby5mKHQsbj1yW3UrK10sZVtuXSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3RyeXtvKHIsdCxlKX1jYXRjaChuKXtyW3RdPWV9cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9ZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlLG49T2JqZWN0LnByb3RvdHlwZSxyPW4uaGFzT3duUHJvcGVydHksbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxpPW8uaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixhPW8uYXN5bmNJdGVyYXRvcnx8IkBAYXN5bmNJdGVyYXRvciIscz1vLnRvU3RyaW5nVGFnfHwiQEB0b1N0cmluZ1RhZyI7ZnVuY3Rpb24gdSh0LGUsbil7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSx0W2VdfXRyeXt1KHt9LCIiKX1jYXRjaCh0KXt1PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1ufX1mdW5jdGlvbiBjKHQsZSxuLHIpe3ZhciBvPWUmJmUucHJvdG90eXBlIGluc3RhbmNlb2Ygdj9lOnYsaT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSxhPW5ldyBDKHJ8fFtdKTtyZXR1cm4gaS5faW52b2tlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mO3JldHVybiBmdW5jdGlvbihvLGkpe2lmKHI9PT1oKXRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2lmKHI9PT1kKXtpZigidGhyb3ciPT09byl0aHJvdyBpO3JldHVybiBMKCl9Zm9yKG4ubWV0aG9kPW8sbi5hcmc9aTs7KXt2YXIgYT1uLmRlbGVnYXRlO2lmKGEpe3ZhciBzPVQoYSxuKTtpZihzKXtpZihzPT09Zyljb250aW51ZTtyZXR1cm4gc319aWYoIm5leHQiPT09bi5tZXRob2Qpbi5zZW50PW4uX3NlbnQ9bi5hcmc7ZWxzZSBpZigidGhyb3ciPT09bi5tZXRob2Qpe2lmKHI9PT1mKXRocm93IHI9ZCxuLmFyZztuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKX1lbHNlInJldHVybiI9PT1uLm1ldGhvZCYmbi5hYnJ1cHQoInJldHVybiIsbi5hcmcpO3I9aDt2YXIgdT1sKHQsZSxuKTtpZigibm9ybWFsIj09PXUudHlwZSl7aWYocj1uLmRvbmU%2FZDpwLHUuYXJnPT09Zyljb250aW51ZTtyZXR1cm57dmFsdWU6dS5hcmcsZG9uZTpuLmRvbmV9fSJ0aHJvdyI9PT11LnR5cGUmJihyPWQsbi5tZXRob2Q9InRocm93IixuLmFyZz11LmFyZyl9fX0odCxuLGEpLGl9ZnVuY3Rpb24gbCh0LGUsbil7dHJ5e3JldHVybnt0eXBlOiJub3JtYWwiLGFyZzp0LmNhbGwoZSxuKX19Y2F0Y2godCl7cmV0dXJue3R5cGU6InRocm93Iixhcmc6dH19fXQud3JhcD1jO3ZhciBmPSJzdXNwZW5kZWRTdGFydCIscD0ic3VzcGVuZGVkWWllbGQiLGg9ImV4ZWN1dGluZyIsZD0iY29tcGxldGVkIixnPXt9O2Z1bmN0aW9uIHYoKXt9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiBtKCl7fXZhciBiPXt9O2JbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dmFyIHg9T2JqZWN0LmdldFByb3RvdHlwZU9mLHc9eCYmeCh4KGooW10pKSk7dyYmdyE9PW4mJnIuY2FsbCh3LGkpJiYoYj13KTt2YXIgaz1tLnByb3RvdHlwZT12LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIpO2Z1bmN0aW9uIFModCl7WyJuZXh0IiwidGhyb3ciLCJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UodCxlLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbnZva2UoZSx0KX0pfSl9ZnVuY3Rpb24gRSh0LGUpe3ZhciBuO3RoaXMuX2ludm9rZT1mdW5jdGlvbihvLGkpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gbmV3IGUoZnVuY3Rpb24obixhKXshZnVuY3Rpb24gbihvLGksYSxzKXt2YXIgdT1sKHRbb10sdCxpKTtpZigidGhyb3ciIT09dS50eXBlKXt2YXIgYz11LmFyZyxmPWMudmFsdWU7cmV0dXJuIGYmJiJvYmplY3QiPT10eXBlb2YgZiYmci5jYWxsKGYsIl9fYXdhaXQiKT9lLnJlc29sdmUoZi5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHQpe24oIm5leHQiLHQsYSxzKX0sZnVuY3Rpb24odCl7bigidGhyb3ciLHQsYSxzKX0pOmUucmVzb2x2ZShmKS50aGVuKGZ1bmN0aW9uKHQpe2MudmFsdWU9dCxhKGMpfSxmdW5jdGlvbih0KXtyZXR1cm4gbigidGhyb3ciLHQsYSxzKX0pfXModS5hcmcpfShvLGksbixhKX0pfXJldHVybiBuPW4%2Fbi50aGVuKGEsYSk6YSgpfX1mdW5jdGlvbiBUKHQsbil7dmFyIHI9dC5pdGVyYXRvcltuLm1ldGhvZF07aWYocj09PWUpe2lmKG4uZGVsZWdhdGU9bnVsbCwidGhyb3ciPT09bi5tZXRob2Qpe2lmKHQuaXRlcmF0b3IucmV0dXJuJiYobi5tZXRob2Q9InJldHVybiIsbi5hcmc9ZSxUKHQsbiksInRocm93Ij09PW4ubWV0aG9kKSlyZXR1cm4gZztuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2QiKX1yZXR1cm4gZ312YXIgbz1sKHIsdC5pdGVyYXRvcixuLmFyZyk7aWYoInRocm93Ij09PW8udHlwZSlyZXR1cm4gbi5tZXRob2Q9InRocm93IixuLmFyZz1vLmFyZyxuLmRlbGVnYXRlPW51bGwsZzt2YXIgaT1vLmFyZztyZXR1cm4gaT9pLmRvbmU%2FKG5bdC5yZXN1bHROYW1lXT1pLnZhbHVlLG4ubmV4dD10Lm5leHRMb2MsInJldHVybiIhPT1uLm1ldGhvZCYmKG4ubWV0aG9kPSJuZXh0IixuLmFyZz1lKSxuLmRlbGVnYXRlPW51bGwsZyk6aToobi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLG4uZGVsZWdhdGU9bnVsbCxnKX1mdW5jdGlvbiBBKHQpe3ZhciBlPXt0cnlMb2M6dFswXX07MSBpbiB0JiYoZS5jYXRjaExvYz10WzFdKSwyIGluIHQmJihlLmZpbmFsbHlMb2M9dFsyXSxlLmFmdGVyTG9jPXRbM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKGUpfWZ1bmN0aW9uIE8odCl7dmFyIGU9dC5jb21wbGV0aW9ufHx7fTtlLnR5cGU9Im5vcm1hbCIsZGVsZXRlIGUuYXJnLHQuY29tcGxldGlvbj1lfWZ1bmN0aW9uIEModCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLHQuZm9yRWFjaChBLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIGoodCl7aWYodCl7dmFyIG49dFtpXTtpZihuKXJldHVybiBuLmNhbGwodCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQubmV4dClyZXR1cm4gdDtpZighaXNOYU4odC5sZW5ndGgpKXt2YXIgbz0tMSxhPWZ1bmN0aW9uIG4oKXtmb3IoOysrbzx0Lmxlbmd0aDspaWYoci5jYWxsKHQsbykpcmV0dXJuIG4udmFsdWU9dFtvXSxuLmRvbmU9ITEsbjtyZXR1cm4gbi52YWx1ZT1lLG4uZG9uZT0hMCxufTtyZXR1cm4gYS5uZXh0PWF9fXJldHVybntuZXh0Okx9fWZ1bmN0aW9uIEwoKXtyZXR1cm57dmFsdWU6ZSxkb25lOiEwfX1yZXR1cm4geS5wcm90b3R5cGU9ay5jb25zdHJ1Y3Rvcj1tLG0uY29uc3RydWN0b3I9eSx5LmRpc3BsYXlOYW1lPXUobSxzLCJHZW5lcmF0b3JGdW5jdGlvbiIpLHQuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4hIWUmJihlPT09eXx8IkdlbmVyYXRvckZ1bmN0aW9uIj09PShlLmRpc3BsYXlOYW1lfHxlLm5hbWUpKX0sdC5tYXJrPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y%2FT2JqZWN0LnNldFByb3RvdHlwZU9mKHQsbSk6KHQuX19wcm90b19fPW0sdSh0LHMsIkdlbmVyYXRvckZ1bmN0aW9uIikpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoayksdH0sdC5hd3JhcD1mdW5jdGlvbih0KXtyZXR1cm57X19hd2FpdDp0fX0sUyhFLnByb3RvdHlwZSksRS5wcm90b3R5cGVbYV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5Bc3luY0l0ZXJhdG9yPUUsdC5hc3luYz1mdW5jdGlvbihlLG4scixvLGkpe3ZvaWQgMD09PWkmJihpPVByb21pc2UpO3ZhciBhPW5ldyBFKGMoZSxuLHIsbyksaSk7cmV0dXJuIHQuaXNHZW5lcmF0b3JGdW5jdGlvbihuKT9hOmEubmV4dCgpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIHQuZG9uZT90LnZhbHVlOmEubmV4dCgpfSl9LFMoayksdShrLHMsIkdlbmVyYXRvciIpLGtbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30say50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSx0LmtleXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlLnJldmVyc2UoKSxmdW5jdGlvbiBuKCl7Zm9yKDtlLmxlbmd0aDspe3ZhciByPWUucG9wKCk7aWYociBpbiB0KXJldHVybiBuLnZhbHVlPXIsbi5kb25lPSExLG59cmV0dXJuIG4uZG9uZT0hMCxufX0sdC52YWx1ZXM9aixDLnByb3RvdHlwZT17Y29uc3RydWN0b3I6QyxyZXNldDpmdW5jdGlvbih0KXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD1lLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPWUsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goTyksIXQpZm9yKHZhciBuIGluIHRoaXMpInQiPT09bi5jaGFyQXQoMCkmJnIuY2FsbCh0aGlzLG4pJiYhaXNOYU4oK24uc2xpY2UoMSkpJiYodGhpc1tuXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgdD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKHQpe2lmKHRoaXMuZG9uZSl0aHJvdyB0O3ZhciBuPXRoaXM7ZnVuY3Rpb24gbyhyLG8pe3JldHVybiBzLnR5cGU9InRocm93IixzLmFyZz10LG4ubmV4dD1yLG8mJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksISFvfWZvcih2YXIgaT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7aT49MDstLWkpe3ZhciBhPXRoaXMudHJ5RW50cmllc1tpXSxzPWEuY29tcGxldGlvbjtpZigicm9vdCI9PT1hLnRyeUxvYylyZXR1cm4gbygiZW5kIik7aWYoYS50cnlMb2M8PXRoaXMucHJldil7dmFyIHU9ci5jYWxsKGEsImNhdGNoTG9jIiksYz1yLmNhbGwoYSwiZmluYWxseUxvYyIpO2lmKHUmJmMpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiBvKGEuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIG8oYS5maW5hbGx5TG9jKX1lbHNlIGlmKHUpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiBvKGEuY2F0Y2hMb2MsITApfWVsc2V7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIG8oYS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIG89dGhpcy50cnlFbnRyaWVzW25dO2lmKG8udHJ5TG9jPD10aGlzLnByZXYmJnIuY2FsbChvLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxvLmZpbmFsbHlMb2Mpe3ZhciBpPW87YnJlYWt9fWkmJigiYnJlYWsiPT09dHx8ImNvbnRpbnVlIj09PXQpJiZpLnRyeUxvYzw9ZSYmZTw9aS5maW5hbGx5TG9jJiYoaT1udWxsKTt2YXIgYT1pP2kuY29tcGxldGlvbjp7fTtyZXR1cm4gYS50eXBlPXQsYS5hcmc9ZSxpPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PWkuZmluYWxseUxvYyxnKTp0aGlzLmNvbXBsZXRlKGEpfSxjb21wbGV0ZTpmdW5jdGlvbih0LGUpe2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuImJyZWFrIj09PXQudHlwZXx8ImNvbnRpbnVlIj09PXQudHlwZT90aGlzLm5leHQ9dC5hcmc6InJldHVybiI9PT10LnR5cGU%2FKHRoaXMucnZhbD10aGlzLmFyZz10LmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09dC50eXBlJiZlJiYodGhpcy5uZXh0PWUpLGd9LGZpbmlzaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U%2BPTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi5maW5hbGx5TG9jPT09dClyZXR1cm4gdGhpcy5jb21wbGV0ZShuLmNvbXBsZXRpb24sbi5hZnRlckxvYyksTyhuKSxnfX0sY2F0Y2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4udHJ5TG9jPT09dCl7dmFyIHI9bi5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1yLnR5cGUpe3ZhciBvPXIuYXJnO08obil9cmV0dXJuIG99fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpqKHQpLHJlc3VsdE5hbWU6bixuZXh0TG9jOnJ9LCJuZXh0Ij09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9ZSksZ319LHR9KHQuZXhwb3J0cyk7dHJ5e3JlZ2VuZXJhdG9yUnVudGltZT1yfWNhdGNoKHQpe0Z1bmN0aW9uKCJyIiwicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9big5MSksbigxNTMpLG4oMTU0KSxuKDE1NSksbigxNTYpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2Niksbz1uKDQ2KSxpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpLGEscz1TdHJpbmcobyhlKSksdT1yKG4pLGM9cy5sZW5ndGg7cmV0dXJuIHU8MHx8dT49Yz90PyIiOnZvaWQgMDooaT1zLmNoYXJDb2RlQXQodSkpPDU1Mjk2fHxpPjU2MzE5fHx1KzE9PT1jfHwoYT1zLmNoYXJDb2RlQXQodSsxKSk8NTYzMjB8fGE%2BNTczNDM%2FdD9zLmNoYXJBdCh1KTppOnQ%2Fcy5zbGljZSh1LHUrMik6YS01NjMyMCsoaS01NTI5Njw8MTApKzY1NTM2fX07dC5leHBvcnRzPXtjb2RlQXQ6aSghMSksY2hhckF0OmkoITApfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDE0NCksaT1yLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBpJiYvbmF0aXZlIGNvZGUvLnRlc3Qoby5jYWxsKGkpKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTcpO3QuZXhwb3J0cz1yKCJuYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nIixGdW5jdGlvbi50b1N0cmluZyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2OSksbz17fTtvW24oMSkoInRvU3RyaW5nVGFnIildPSJ6Iix0LmV4cG9ydHM9IltvYmplY3Qgel0iIT09U3RyaW5nKG8pP2Z1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIityKHRoaXMpKyJdIn06by50b1N0cmluZ30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpJiZudWxsIT09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IHNldCAiK1N0cmluZyh0KSsiIGFzIGEgcHJvdG90eXBlIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGEscz1uKDApLHU9bigyMiksYz1uKDQpLGw9bigyKSxmPW4oOTkpLHA9bigzMyksaD1uKDEwMCksZD1uKDI0KSxnPW4oMTQ5KSx2PW4oNikseT1uKDE5KSxtPW4oMTAxKSxiPW4oMjEpLHg9big1OCksdz1uKDEwNCksaz1uKDEwNSksUz1uKDEwNikuc2V0LEU9bigxNTApLFQ9bigxMDcpLEE9bigxNTEpLE89big1MiksQz1uKDU5KSxqPW4oNzIpLEw9big0OCksUD1uKDg2KSxSPW4oMSkoInNwZWNpZXMiKSxOPSJQcm9taXNlIixJPUwuZ2V0LEQ9TC5zZXQsXz1MLmdldHRlckZvcihOKSxNPWYsVT1jLlR5cGVFcnJvcixCPWMuZG9jdW1lbnQscT1jLnByb2Nlc3MsRj1jLmZldGNoLEg9cSYmcS52ZXJzaW9ucyx6PUgmJkgudjh8fCIiLFc9Ty5mLCQ9VyxWPSJwcm9jZXNzIj09YihxKSxZPSEhKEImJkIuY3JlYXRlRXZlbnQmJmMuZGlzcGF0Y2hFdmVudCksRz1QKE4sZnVuY3Rpb24oKXt2YXIgdD1NLnJlc29sdmUoMSksZT1mdW5jdGlvbigpe30sbj0odC5jb25zdHJ1Y3Rvcj17fSlbUl09ZnVuY3Rpb24odCl7dChlLGUpfTtyZXR1cm4hKChWfHwiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSYmKCF1fHx0LmZpbmFsbHkpJiZ0LnRoZW4oZSlpbnN0YW5jZW9mIG4mJjAhPT16LmluZGV4T2YoIjYuNiIpJiYtMT09PWouaW5kZXhPZigiQ2hyb21lLzY2IikpfSksSz1HfHwhdyhmdW5jdGlvbih0KXtNLmFsbCh0KS5jYXRjaChmdW5jdGlvbigpe30pfSksWD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4hKCF2KHQpfHwiZnVuY3Rpb24iIT10eXBlb2YoZT10LnRoZW4pKSYmZX0sSj1mdW5jdGlvbih0LGUsbil7aWYoIWUubm90aWZpZWQpe2Uubm90aWZpZWQ9ITA7dmFyIHI9ZS5yZWFjdGlvbnM7RShmdW5jdGlvbigpe2Zvcih2YXIgbz1lLnZhbHVlLGk9MT09ZS5zdGF0ZSxhPTA7ci5sZW5ndGg%2BYTspe3ZhciBzLHUsYyxsPXJbYSsrXSxmPWk%2FbC5vazpsLmZhaWwscD1sLnJlc29sdmUsaD1sLnJlamVjdCxkPWwuZG9tYWluO3RyeXtmPyhpfHwoMj09PWUucmVqZWN0aW9uJiZldCh0LGUpLGUucmVqZWN0aW9uPTEpLCEwPT09Zj9zPW86KGQmJmQuZW50ZXIoKSxzPWYobyksZCYmKGQuZXhpdCgpLGM9ITApKSxzPT09bC5wcm9taXNlP2goVSgiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToodT1YKHMpKT91LmNhbGwocyxwLGgpOnAocykpOmgobyl9Y2F0Y2godCl7ZCYmIWMmJmQuZXhpdCgpLGgodCl9fWUucmVhY3Rpb25zPVtdLGUubm90aWZpZWQ9ITEsbiYmIWUucmVqZWN0aW9uJiZaKHQsZSl9KX19LFE9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87WT8oKHI9Qi5jcmVhdGVFdmVudCgiRXZlbnQiKSkucHJvbWlzZT1lLHIucmVhc29uPW4sci5pbml0RXZlbnQodCwhMSwhMCksYy5kaXNwYXRjaEV2ZW50KHIpKTpyPXtwcm9taXNlOmUscmVhc29uOm59LChvPWNbIm9uIit0XSk%2FbyhyKToidW5oYW5kbGVkcmVqZWN0aW9uIj09PXQmJkEoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIsbil9LFo9ZnVuY3Rpb24odCxlKXtTLmNhbGwoYyxmdW5jdGlvbigpe3ZhciBuLHI9ZS52YWx1ZTtpZih0dChlKSYmKG49QyhmdW5jdGlvbigpe1Y%2FcS5lbWl0KCJ1bmhhbmRsZWRSZWplY3Rpb24iLHIsdCk6USgidW5oYW5kbGVkcmVqZWN0aW9uIix0LHIpfSksZS5yZWplY3Rpb249Vnx8dHQoZSk%2FMjoxLG4uZXJyb3IpKXRocm93IG4udmFsdWV9KX0sdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEhPT10LnJlamVjdGlvbiYmIXQucGFyZW50fSxldD1mdW5jdGlvbih0LGUpe1MuY2FsbChjLGZ1bmN0aW9uKCl7Vj9xLmVtaXQoInJlamVjdGlvbkhhbmRsZWQiLHQpOlEoInJlamVjdGlvbmhhbmRsZWQiLHQsZS52YWx1ZSl9KX0sbnQ9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGZ1bmN0aW9uKG8pe3QoZSxuLG8scil9fSxydD1mdW5jdGlvbih0LGUsbixyKXtlLmRvbmV8fChlLmRvbmU9ITAsciYmKGU9ciksZS52YWx1ZT1uLGUuc3RhdGU9MixKKHQsZSwhMCkpfSxvdD1mdW5jdGlvbih0LGUsbixyKXtpZighZS5kb25lKXtlLmRvbmU9ITAsciYmKGU9cik7dHJ5e2lmKHQ9PT1uKXRocm93IFUoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7dmFyIG89WChuKTtvP0UoZnVuY3Rpb24oKXt2YXIgcj17ZG9uZTohMX07dHJ5e28uY2FsbChuLG50KG90LHQscixlKSxudChydCx0LHIsZSkpfWNhdGNoKG4pe3J0KHQscixuLGUpfX0pOihlLnZhbHVlPW4sZS5zdGF0ZT0xLEoodCxlLCExKSl9Y2F0Y2gobil7cnQodCx7ZG9uZTohMX0sbixlKX19fTtHJiYoTT1mdW5jdGlvbih0KXttKHRoaXMsTSxOKSx5KHQpLHIuY2FsbCh0aGlzKTt2YXIgZT1JKHRoaXMpO3RyeXt0KG50KG90LHRoaXMsZSksbnQocnQsdGhpcyxlKSl9Y2F0Y2godCl7cnQodGhpcyxlLHQpfX0sKHI9ZnVuY3Rpb24odCl7RCh0aGlzLHt0eXBlOk4sZG9uZTohMSxub3RpZmllZDohMSxwYXJlbnQ6ITEscmVhY3Rpb25zOltdLHJlamVjdGlvbjohMSxzdGF0ZTowLHZhbHVlOnZvaWQgMH0pfSkucHJvdG90eXBlPWgoTS5wcm90b3R5cGUse3RoZW46ZnVuY3Rpb24odCxlKXt2YXIgbj1fKHRoaXMpLHI9VyhrKHRoaXMsTSkpO3JldHVybiByLm9rPSJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0LHIuZmFpbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxyLmRvbWFpbj1WP3EuZG9tYWluOnZvaWQgMCxuLnBhcmVudD0hMCxuLnJlYWN0aW9ucy5wdXNoKHIpLDAhPW4uc3RhdGUmJkoodGhpcyxuLCExKSxyLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfX0pLG89ZnVuY3Rpb24oKXt2YXIgdD1uZXcgcixlPUkodCk7dGhpcy5wcm9taXNlPXQsdGhpcy5yZXNvbHZlPW50KG90LHQsZSksdGhpcy5yZWplY3Q9bnQocnQsdCxlKX0sTy5mPVc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1NfHx0PT09aT9uZXcgbyh0KTokKHQpfSx1fHwiZnVuY3Rpb24iIT10eXBlb2YgZnx8KGE9Zi5wcm90b3R5cGUudGhlbixwKGYucHJvdG90eXBlLCJ0aGVuIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBNKGZ1bmN0aW9uKHQsZSl7YS5jYWxsKG4sdCxlKX0pLnRoZW4odCxlKX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBGJiZzKHtnbG9iYWw6ITAsZW51bWVyYWJsZTohMCxmb3JjZWQ6ITB9LHtmZXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gVChNLEYuYXBwbHkoYyxhcmd1bWVudHMpKX19KSkpLHMoe2dsb2JhbDohMCx3cmFwOiEwLGZvcmNlZDpHfSx7UHJvbWlzZTpNfSksZChNLE4sITEsITApLGcoTiksaT1sLlByb21pc2Uscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6R30se3JlamVjdDpmdW5jdGlvbih0KXt2YXIgZT1XKHRoaXMpO3JldHVybiBlLnJlamVjdC5jYWxsKHZvaWQgMCx0KSxlLnByb21pc2V9fSkscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6dXx8R30se3Jlc29sdmU6ZnVuY3Rpb24odCl7cmV0dXJuIFQodSYmdGhpcz09PWk%2FTTp0aGlzLHQpfX0pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOkt9LHthbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPVcoZSkscj1uLnJlc29sdmUsbz1uLnJlamVjdCxpPUMoZnVuY3Rpb24oKXt2YXIgbj15KGUucmVzb2x2ZSksaT1bXSxhPTAscz0xO3godCxmdW5jdGlvbih0KXt2YXIgdT1hKyssYz0hMTtpLnB1c2godm9pZCAwKSxzKyssbi5jYWxsKGUsdCkudGhlbihmdW5jdGlvbih0KXtjfHwoYz0hMCxpW3VdPXQsLS1zfHxyKGkpKX0sbyl9KSwtLXN8fHIoaSl9KTtyZXR1cm4gaS5lcnJvciYmbyhpLnZhbHVlKSxuLnByb21pc2V9LHJhY2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPVcoZSkscj1uLnJlamVjdCxvPUMoZnVuY3Rpb24oKXt2YXIgbz15KGUucmVzb2x2ZSk7eCh0LGZ1bmN0aW9uKHQpe28uY2FsbChlLHQpLnRoZW4obi5yZXNvbHZlLHIpfSl9KTtyZXR1cm4gby5lcnJvciYmcihvLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDIwKSxpPW4oMSksYT1uKDE0KSxzPWkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9cih0KSxuPW8uZjthJiZlJiYhZVtzXSYmbihlLHMse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYyxsPW4oNCksZj1uKDQ1KS5mLHA9bigyMSksaD1uKDEwNikuc2V0LGQ9big3MiksZz1sLk11dGF0aW9uT2JzZXJ2ZXJ8fGwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcix2PWwucHJvY2Vzcyx5PWwuUHJvbWlzZSxtPSJwcm9jZXNzIj09cCh2KSxiPWYobCwicXVldWVNaWNyb3Rhc2siKSx4PWImJmIudmFsdWU7eHx8KHI9ZnVuY3Rpb24oKXt2YXIgdCxlO2ZvcihtJiYodD12LmRvbWFpbikmJnQuZXhpdCgpO287KXtlPW8uZm4sbz1vLm5leHQ7dHJ5e2UoKX1jYXRjaCh0KXt0aHJvdyBvP2EoKTppPXZvaWQgMCx0fX1pPXZvaWQgMCx0JiZ0LmVudGVyKCl9LG0%2FYT1mdW5jdGlvbigpe3YubmV4dFRpY2socil9OmcmJiEvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QoZCk%2FKHM9ITAsdT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksbmV3IGcocikub2JzZXJ2ZSh1LHtjaGFyYWN0ZXJEYXRhOiEwfSksYT1mdW5jdGlvbigpe3UuZGF0YT1zPSFzfSk6eSYmeS5yZXNvbHZlPyhjPXkucmVzb2x2ZSh2b2lkIDApLGE9ZnVuY3Rpb24oKXtjLnRoZW4ocil9KTphPWZ1bmN0aW9uKCl7aC5jYWxsKGwscil9KSx0LmV4cG9ydHM9eHx8ZnVuY3Rpb24odCl7dmFyIGU9e2ZuOnQsbmV4dDp2b2lkIDB9O2kmJihpLm5leHQ9ZSksb3x8KG89ZSxhKCkpLGk9ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIuY29uc29sZTtuJiZuLmVycm9yJiYoMT09PWFyZ3VtZW50cy5sZW5ndGg%2Fbi5lcnJvcih0KTpuLmVycm9yKHQsZSkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyMiksaT1uKDk5KSxhPW4oMzApLHM9bigxMDUpLHU9bigxMDcpLGM9bigzMyk7cih7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsYSgiUHJvbWlzZSIpKSxuPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4obj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBufSl9OnQsbj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IG59KX06dCl9fSksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fGkucHJvdG90eXBlLmZpbmFsbHl8fGMoaS5wcm90b3R5cGUsImZpbmFsbHkiLGEoIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0OSksaT1uKDcwKSxhPW4oNDcpLHM9bigyOCksdT1uKDU4KSxjPW4oMTUpLGw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCEobiBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0LGUpO2kmJihuPWkobmV3IEVycm9yKGUpLG8obikpKTt2YXIgcj1bXTtyZXR1cm4gdSh0LHIucHVzaCxyKSxjKG4sImVycm9ycyIsciksdm9pZCAwIT09ZSYmYyhuLCJtZXNzYWdlIixTdHJpbmcoZSkpLG59O2wucHJvdG90eXBlPWEoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpzKDUsbCksbmFtZTpzKDUsIkFnZ3JlZ2F0ZUVycm9yIil9KSxyKHtnbG9iYWw6ITB9LHtBZ2dyZWdhdGVFcnJvcjpsfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEwOCl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNTIpLGk9big1OSk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7dHJ5OmZ1bmN0aW9uKHQpe3ZhciBlPW8uZih0aGlzKSxuPWkodCk7cmV0dXJuKG4uZXJyb3I%2FZS5yZWplY3Q6ZS5yZXNvbHZlKShuLnZhbHVlKSxlLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMTkpLGk9bigzMCksYT1uKDUyKSxzPW4oNTkpLHU9big1OCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hLmYoZSkscj1uLnJlc29sdmUsYz1uLnJlamVjdCxsPXMoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksYT1bXSxzPTAsbD0xLGY9ITE7dSh0LGZ1bmN0aW9uKHQpe3ZhciBvPXMrKyx1PSExO2EucHVzaCh2b2lkIDApLGwrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3V8fGZ8fChmPSEwLHIodCkpfSxmdW5jdGlvbih0KXt1fHxmfHwodT0hMCxhW29dPXQsLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKSl9KX0pLC0tbHx8YyhuZXcoaSgiQWdncmVnYXRlRXJyb3IiKSkoYSwiTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiKSl9KTtyZXR1cm4gbC5lcnJvciYmYyhsLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTgpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTkpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTYwKTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3MSksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2Myksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY29uY2F0O3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09by5jb25jYXQ%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTEwKTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5jb25jYXR9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjUpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNjYpLG89U3RyaW5nLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC50cmltO3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8dD09PW98fHQgaW5zdGFuY2VvZiBTdHJpbmcmJmU9PT1vLnRyaW0%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTY3KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiU3RyaW5nIikudHJpbX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxMTEpLnRyaW07cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpuKDE2OCkoInRyaW0iKX0se3RyaW06ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDc2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIoZnVuY3Rpb24oKXtyZXR1cm4hIW9bdF0oKXx8IuKAi8KF4aCOIiE9IuKAi8KF4aCOIlt0XSgpfHxvW3RdLm5hbWUhPT10fSl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTcwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3MSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE3Mik7dmFyIHI9bigyKS5PYmplY3Qsbz10LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiByLmRlZmluZVByb3BlcnR5KHQsZSxuKX07ci5kZWZpbmVQcm9wZXJ0eS5zaGFtJiYoby5zaGFtPSEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDE0KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IW8sc2hhbTohb30se2RlZmluZVByb3BlcnR5Om4oMjApLmZ9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3NCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzUpfSxmdW5jdGlvbih0LGUsbil7bigxNzYpO3ZhciByPW4oMikuT2JqZWN0LG89dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSl9O3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNSksaT1uKDE4KSxhPW4oNDUpLmYscz1uKDE0KSx1PW8oZnVuY3Rpb24oKXthKDEpfSk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFzfHx1LHNoYW06IXN9LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYShpKHQpLGUpfX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE4MCk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5SZWZsZWN0LmdldH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDYpLGk9big5KSxhPW4oMTIpLHM9big0NSksdT1uKDQ5KTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtnZXQ6ZnVuY3Rpb24gdChlLG4pe3ZhciByLGMsbD1hcmd1bWVudHMubGVuZ3RoPDM%2FZTphcmd1bWVudHNbMl07cmV0dXJuIGkoZSk9PT1sP2Vbbl06KHI9cy5mKGUsbikpP2EociwidmFsdWUiKT9yLnZhbHVlOnZvaWQgMD09PXIuZ2V0P3ZvaWQgMDpyLmdldC5jYWxsKGwpOm8oYz11KGUpKT90KGMsbixsKTp2b2lkIDB9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmbnVsbCE9PSh0PXIodCkpOyk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTgzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4NCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE4NSk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5PYmplY3QuZ2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big1KSxpPW4oMjMpLGE9big0OSkscz1uKDk2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6byhmdW5jdGlvbigpe2EoMSl9KSxzaGFtOiFzfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxODcpfSxmdW5jdGlvbih0LGUsbil7bigxODgpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpuKDcwKX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTkwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE5MSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE5Mik7dmFyIHI9bigyKS5PYmplY3Q7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY3JlYXRlKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsc2hhbTohbigxNCl9LHtjcmVhdGU6big0Nyl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEyKTtmdW5jdGlvbiBvKGUsbil7cmV0dXJuIHQuZXhwb3J0cz1vPXJ8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0sbyhlLG4pfXQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTUpLG89bigxMTQpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPSJmdW5jdGlvbiI9PXR5cGVvZiBvJiYic3ltYm9sIj09dHlwZW9mIHI%2FZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuY29uc3RydWN0b3I9PT1vJiZ0IT09by5wcm90b3R5cGU%2FInN5bWJvbCI6dHlwZW9mIHR9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxOTYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTk3KX0sZnVuY3Rpb24odCxlLG4pe24oMTEzKSxuKDMyKSxuKDUwKTt2YXIgcj1uKDc3KTt0LmV4cG9ydHM9ci5mKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE1KSxuKDIxNyksbigyMTgpLG4oMjE5KSxuKDIyMCksbigyMjEpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDQpLGk9bigyMiksYT1uKDE0KSxzPW4oOTcpLHU9big1KSxjPW4oMTIpLGw9big1MyksZj1uKDYpLHA9big5KSxoPW4oMjMpLGQ9bigxOCksZz1uKDU0KSx2PW4oMjgpLHk9big0NyksbT1uKDY0KSxiPW4oMTE2KSx4PW4oMjAwKSx3PW4oMjAxKSxrPW4oNDUpLFM9bigyMCksRT1uKDgzKSxUPW4oMTUpLEE9bigzMyksTz1uKDU3KSxDPW4oNTYpLGo9big1NSksTD1uKDY4KSxQPW4oMSksUj1uKDc3KSxOPW4oMyksST1uKDI0KSxEPW4oNDgpLF89big3MykuZm9yRWFjaCxNPUMoImhpZGRlbiIpLFU9UCgidG9QcmltaXRpdmUiKSxCPUQuc2V0LHE9RC5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsVj1TLmYsWT14LmYsRz1FLmYsSz1PKCJzeW1ib2xzIiksWD1PKCJvcC1zeW1ib2xzIiksSj1PKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1PKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1PKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoVih7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBWKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sVih0LGUsbiksciYmdCE9PUYmJlYoRixlLHIpfTpWLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I%2FZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU%2FKGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8Vih0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpWKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIF8ocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1ZKGQodCkpLG49W107cmV0dXJuIF8oZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoaix0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1ZKGU%2FWDpkKHQpKSxyPVtdO3JldHVybiBfKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KEEoKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoVihILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8QShGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxSLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFAodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksXyhtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxUKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxqW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOCksbz1uKDExNikuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM%2FT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7bigzKSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oMykoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyNCkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTtuKDI0KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oMykoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMjUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2Y7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmluZGV4T2Y%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjI2KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5pbmRleE9mfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDY1KS5pbmRleE9mLGk9bigyMjcpLGE9W10uaW5kZXhPZixzPSEhYSYmMS9bMV0uaW5kZXhPZigxLC0wKTwwLHU9aSgiaW5kZXhPZiIpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpzfHx1fSx7aW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gcz9hLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MDpvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXVt0XTtyZXR1cm4hbnx8IXIoZnVuY3Rpb24oKXtuLmNhbGwobnVsbCxlfHxmdW5jdGlvbigpe3Rocm93IDF9LDEpfSl9fSxmdW5jdGlvbih0LGUsbil7bigxMTcpLHQuZXhwb3J0cz1uKDIpLnNldFRpbWVvdXR9LGZ1bmN0aW9uKHQsZSxuKXtuKDExNyksdC5leHBvcnRzPW4oMikuc2V0SW50ZXJ2YWx9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzEpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSxvPXIuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmluZ2lmeS5hcHBseShvLGFyZ3VtZW50cyl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMzKX0sZnVuY3Rpb24odCxlLG4pe24oMjM0KTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLnBhcnNlSW50fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMjM1KTtyKHtnbG9iYWw6ITAsZm9yY2VkOnBhcnNlSW50IT1vfSx7cGFyc2VJbnQ6b30pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTExKS50cmltLGk9big3NiksYT1yLnBhcnNlSW50LHM9L15bKy1dPzBbWHhdLyx1PTghPT1hKGkrIjA4Iil8fDIyIT09YShpKyIweDE2Iik7dC5leHBvcnRzPXU%2FZnVuY3Rpb24odCxlKXt2YXIgbj1vKFN0cmluZyh0KSk7cmV0dXJuIGEobixlPj4%2BMHx8KHMudGVzdChuKT8xNjoxMCkpfTphfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oMTE4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExOSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6IkFycmF5IixzdGF0OiEwfSx7aXNBcnJheTpuKDUzKX0pfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oNTEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEyMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyNDMpO3Ioe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITAsZm9yY2VkOiFuKDEwNCkoZnVuY3Rpb24odCl7QXJyYXkuZnJvbSh0KX0pfSx7ZnJvbTpvfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyOSksbz1uKDIzKSxpPW4oMTAzKSxhPW4oMTAyKSxzPW4oMzEpLHU9big3NCksYz1uKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsbixsLGYscD1vKHQpLGg9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXM%2FdGhpczpBcnJheSxkPWFyZ3VtZW50cy5sZW5ndGgsZz1kPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCx2PXZvaWQgMCE9PWcseT0wLG09YyhwKTtpZih2JiYoZz1yKGcsZD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsMikpLG51bGw9PW18fGg9PUFycmF5JiZhKG0pKWZvcihuPW5ldyBoKGU9cyhwLmxlbmd0aCkpO2U%2BeTt5KyspdShuLHksdj9nKHBbeV0seSk6cFt5XSk7ZWxzZSBmb3IoZj1tLmNhbGwocCksbj1uZXcgaDshKGw9Zi5uZXh0KCkpLmRvbmU7eSsrKXUobix5LHY%2FaShmLGcsW2wudmFsdWUseV0sITApOmwudmFsdWUpO3JldHVybiBuLmxlbmd0aD15LG59fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTIxKX0sZnVuY3Rpb24odCxlLG4pe24oMjQ2KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5zbGljZX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big2KSxpPW4oNTMpLGE9big4OCkscz1uKDMxKSx1PW4oMTgpLGM9big3NCksbD1uKDc1KSxmPW4oMSkoInNwZWNpZXMiKSxwPVtdLnNsaWNlLGg9TWF0aC5tYXg7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFsKCJzbGljZSIpfSx7c2xpY2U6ZnVuY3Rpb24odCxlKXt2YXIgbixyLGwsZD11KHRoaXMpLGc9cyhkLmxlbmd0aCksdj1hKHQsZykseT1hKHZvaWQgMD09PWU%2FZzplLGcpO2lmKGkoZCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj1kLmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhaShuLnByb3RvdHlwZSk%2FbyhuKSYmbnVsbD09PShuPW5bZl0pJiYobj12b2lkIDApOm49dm9pZCAwLG49PT1BcnJheXx8dm9pZCAwPT09bikpcmV0dXJuIHAuY2FsbChkLHYseSk7Zm9yKHI9bmV3KHZvaWQgMD09PW4%2FQXJyYXk6bikoaCh5LXYsMCkpLGw9MDt2PHk7disrLGwrKyl2IGluIGQmJmMocixsLGRbdl0pO3JldHVybiByLmxlbmd0aD1sLHJ9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDgpfSxmdW5jdGlvbih0LGUsbil7bigyNDkpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuT2JqZWN0LmtleXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMyksaT1uKDY0KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6big1KShmdW5jdGlvbigpe2koMSl9KX0se2tleXM6ZnVuY3Rpb24odCl7cmV0dXJuIGkobyh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTEpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTIpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8ubWFwP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI1Myk7dmFyIHI9bigxNik7dC5leHBvcnRzPXIoIkFycmF5IikubWFwfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5tYXA7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDc1KSgibWFwIil9LHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjU1KSxvPW4oMTIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYocih0KSlyZXR1cm4gbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTIzKSxvPW4oMjU5KSxpPW4oMTE0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09aSYmbyhPYmplY3QodCkpKXJldHVybiByKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEyMCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjApfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oMjYxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjkpLG89bigxKSxpPW4oMjUpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0KHQpO3JldHVybiB2b2lkIDAhPT1lW2FdfHwiQEBpdGVyYXRvciJpbiBlfHxpLmhhc093blByb3BlcnR5KHIoZSkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTIzKSxvPW4oMjYzKSxpPW4oMTIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGkodCxlKTt2YXIgYT1vKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7cmV0dXJuIk9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpLCJNYXAiPT09YXx8IlNldCI9PT1hP3IodCk6IkFyZ3VtZW50cyI9PT1hfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChhKT9pKHQsZSk6dm9pZCAwfX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTIxKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNjgpLG89bigyNzApLGk9QXJyYXkucHJvdG90eXBlLGE9U3RyaW5nLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5pbmNsdWRlcztyZXR1cm4gdD09PWl8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PWkuaW5jbHVkZXM%2Fcjoic3RyaW5nIj09dHlwZW9mIHR8fHQ9PT1hfHx0IGluc3RhbmNlb2YgU3RyaW5nJiZlPT09YS5pbmNsdWRlcz9vOmV9fSxmdW5jdGlvbih0LGUsbil7bigyNjkpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluY2x1ZGVzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDY1KS5pbmNsdWRlcyxpPW4oNzEpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxpKCJpbmNsdWRlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyNzEpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS5pbmNsdWRlc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyNzIpLGk9big0Nik7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohbigyNzQpKCJpbmNsdWRlcyIpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuISF%2BU3RyaW5nKGkodGhpcykpLmluZGV4T2Yobyh0KSxhcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89bigyMSksaT1uKDEpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gcih0KSYmKHZvaWQgMCE9PShlPXRbaV0pPyEhZToiUmVnRXhwIj09byh0KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9Ly4vO3RyeXsiLy4vIlt0XShlKX1jYXRjaChuKXt0cnl7cmV0dXJuIGVbcl09ITEsIi8uLyJbdF0oZSl9Y2F0Y2godCl7fX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpewovKiEKICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuCiAqCiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPgogKiBAbGljZW5zZSAgTUlUCiAqLwp2YXIgcj1uKDI3Niksbz1uKDI3NyksaT1uKDI3OCk7ZnVuY3Rpb24gYSgpe3JldHVybiB1LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FMjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHModCxlKXtpZihhKCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpKS5fX3Byb3RvX189dS5wcm90b3R5cGU6KG51bGw9PT10JiYodD1uZXcgdShlKSksdC5sZW5ndGg9ZSksdH1mdW5jdGlvbiB1KHQsZSxuKXtpZighKHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIHUpKXJldHVybiBuZXcgdSh0LGUsbik7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBmKHRoaXMsdCl9cmV0dXJuIGModGhpcyx0LGUsbil9ZnVuY3Rpb24gYyh0LGUsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbih0LGUsbixyKXtpZihlLmJ5dGVMZW5ndGgsbjwwfHxlLmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO2U9dm9pZCAwPT09biYmdm9pZCAwPT09cj9uZXcgVWludDhBcnJheShlKTp2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KGUsbik6bmV3IFVpbnQ4QXJyYXkoZSxuLHIpO3UuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1lKS5fX3Byb3RvX189dS5wcm90b3R5cGU6dD1wKHQsZSk7cmV0dXJuIHR9KHQsZSxuLHIpOiJzdHJpbmciPT10eXBlb2YgZT9mdW5jdGlvbih0LGUsbil7InN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4Iik7aWYoIXUuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGQoZSxuKSxvPSh0PXModCxyKSkud3JpdGUoZSxuKTtvIT09ciYmKHQ9dC5zbGljZSgwLG8pKTtyZXR1cm4gdH0odCxlLG4pOmZ1bmN0aW9uKHQsZSl7aWYodS5pc0J1ZmZlcihlKSl7dmFyIG49MHxoKGUubGVuZ3RoKTtyZXR1cm4gMD09PSh0PXModCxuKSkubGVuZ3RoP3Q6KGUuY29weSh0LDAsMCxuKSx0KX1pZihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIGUpcmV0dXJuIm51bWJlciIhPXR5cGVvZiBlLmxlbmd0aHx8KHI9ZS5sZW5ndGgpIT1yP3ModCwwKTpwKHQsZSk7aWYoIkJ1ZmZlciI9PT1lLnR5cGUmJmkoZS5kYXRhKSlyZXR1cm4gcCh0LGUuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfSh0LGUpfWZ1bmN0aW9uIGwodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBmKHQsZSl7aWYobChlKSx0PXModCxlPDA%2FMDowfGgoZSkpLCF1LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjxlOysrbil0W25dPTA7cmV0dXJuIHR9ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPWUubGVuZ3RoPDA%2FMDowfGgoZS5sZW5ndGgpO3Q9cyh0LG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKXRbcl09MjU1JmVbcl07cmV0dXJuIHR9ZnVuY3Rpb24gaCh0KXtpZih0Pj1hKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2EoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gZCh0LGUpe2lmKHUuaXNCdWZmZXIodCkpcmV0dXJuIHQubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciBuPXQubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEYodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipuO2Nhc2UiaGV4IjpyZXR1cm4gbj4%2BPjE7Y2FzZSJiYXNlNjQiOnJldHVybiBIKHQpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEYodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZyh0LGUsbil7dmFyIHI9ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU%2BdGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PW58fG4%2BdGhpcy5sZW5ndGgpJiYobj10aGlzLmxlbmd0aCksbjw9MClyZXR1cm4iIjtpZigobj4%2BPj0wKTw9KGU%2BPj49MCkpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBMKHRoaXMsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBBKHRoaXMsZSxuKTtjYXNlImFzY2lpIjpyZXR1cm4gQyh0aGlzLGUsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gaih0aGlzLGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsZSxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFAodGhpcyxlLG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gdih0LGUsbil7dmFyIHI9dFtlXTt0W2VdPXRbbl0sdFtuXT1yfWZ1bmN0aW9uIHkodCxlLG4scixvKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc%2Fbj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1vPzA6dC5sZW5ndGgtMSksbjwwJiYobj10Lmxlbmd0aCtuKSxuPj10Lmxlbmd0aCl7aWYobylyZXR1cm4tMTtuPXQubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFvKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIGUmJihlPXUuZnJvbShlLHIpKSx1LmlzQnVmZmVyKGUpKXJldHVybiAwPT09ZS5sZW5ndGg%2FLTE6bSh0LGUsbixyLG8pO2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZSY9MjU1LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y%2Fbz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLG4pOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLG4pOm0odCxbZV0sbixyLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIG0odCxlLG4scixvKXt2YXIgaSxhPTEscz10Lmxlbmd0aCx1PWUubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKHQubGVuZ3RoPDJ8fGUubGVuZ3RoPDIpcmV0dXJuLTE7YT0yLHMvPTIsdS89MixuLz0yfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gMT09PWE%2FdFtlXTp0LnJlYWRVSW50MTZCRShlKmEpfWlmKG8pe3ZhciBsPS0xO2ZvcihpPW47aTxzO2krKylpZihjKHQsaSk9PT1jKGUsLTE9PT1sPzA6aS1sKSl7aWYoLTE9PT1sJiYobD1pKSxpLWwrMT09PXUpcmV0dXJuIGwqYX1lbHNlLTEhPT1sJiYoaS09aS1sKSxsPS0xfWVsc2UgZm9yKG4rdT5zJiYobj1zLXUpLGk9bjtpPj0wO2ktLSl7Zm9yKHZhciBmPSEwLHA9MDtwPHU7cCsrKWlmKGModCxpK3ApIT09YyhlLHApKXtmPSExO2JyZWFrfWlmKGYpcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gYih0LGUsbixyKXtuPU51bWJlcihuKXx8MDt2YXIgbz10Lmxlbmd0aC1uO3I%2FKHI9TnVtYmVyKHIpKT5vJiYocj1vKTpyPW87dmFyIGk9ZS5sZW5ndGg7aWYoaSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I%2BaS8yJiYocj1pLzIpO2Zvcih2YXIgYT0wO2E8cjsrK2Epe3ZhciBzPXBhcnNlSW50KGUuc3Vic3RyKDIqYSwyKSwxNik7aWYoaXNOYU4ocykpcmV0dXJuIGE7dFtuK2FdPXN9cmV0dXJuIGF9ZnVuY3Rpb24geCh0LGUsbixyKXtyZXR1cm4geihGKGUsdC5sZW5ndGgtbiksdCxuLHIpfWZ1bmN0aW9uIHcodCxlLG4scil7cmV0dXJuIHooZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbillLnB1c2goMjU1JnQuY2hhckNvZGVBdChuKSk7cmV0dXJuIGV9KGUpLHQsbixyKX1mdW5jdGlvbiBrKHQsZSxuLHIpe3JldHVybiB3KHQsZSxuLHIpfWZ1bmN0aW9uIFModCxlLG4scil7cmV0dXJuIHooSChlKSx0LG4scil9ZnVuY3Rpb24gRSh0LGUsbixyKXtyZXR1cm4geihmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLG8saT1bXSxhPTA7YTx0Lmxlbmd0aCYmISgoZS09Mik8MCk7KythKW49dC5jaGFyQ29kZUF0KGEpLHI9bj4%2BOCxvPW4lMjU2LGkucHVzaChvKSxpLnB1c2gocik7cmV0dXJuIGl9KGUsdC5sZW5ndGgtbiksdCxuLHIpfWZ1bmN0aW9uIFQodCxlLG4pe3JldHVybiAwPT09ZSYmbj09PXQubGVuZ3RoP3IuZnJvbUJ5dGVBcnJheSh0KTpyLmZyb21CeXRlQXJyYXkodC5zbGljZShlLG4pKX1mdW5jdGlvbiBBKHQsZSxuKXtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxvPWU7bzxuOyl7dmFyIGksYSxzLHUsYz10W29dLGw9bnVsbCxmPWM%2BMjM5PzQ6Yz4yMjM%2FMzpjPjE5MT8yOjE7aWYobytmPD1uKXN3aXRjaChmKXtjYXNlIDE6YzwxMjgmJihsPWMpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGk9dFtvKzFdKSkmJih1PSgzMSZjKTw8Nnw2MyZpKT4xMjcmJihsPXUpO2JyZWFrO2Nhc2UgMzppPXRbbysxXSxhPXRbbysyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmMpPDwxMnwoNjMmaSk8PDZ8NjMmYSk%2BMjA0NyYmKHU8NTUyOTZ8fHU%2BNTczNDMpJiYobD11KTticmVhaztjYXNlIDQ6aT10W28rMV0sYT10W28rMl0scz10W28rM10sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImYSkmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmMpPDwxOHwoNjMmaSk8PDEyfCg2MyZhKTw8Nnw2MyZzKT42NTUzNSYmdTwxMTE0MTEyJiYobD11KX1udWxsPT09bD8obD02NTUzMyxmPTEpOmw%2BNjU1MzUmJihsLT02NTUzNixyLnB1c2gobD4%2BPjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxyLnB1c2gobCksbys9Zn1yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9TylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIG49IiIscj0wO2Zvcig7cjxlOyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKHIscis9TykpO3JldHVybiBufShyKX1lLkJ1ZmZlcj11LGUuU2xvd0J1ZmZlcj1mdW5jdGlvbih0KXsrdCE9dCYmKHQ9MCk7cmV0dXJuIHUuYWxsb2MoK3QpfSxlLklOU1BFQ1RfTUFYX0JZVEVTPTUwLHUuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDAhPT10LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FdC5UWVBFRF9BUlJBWV9TVVBQT1JUOmZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0Ll9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09dC5mb28oKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc3ViYXJyYXkmJjA9PT10LnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaCh0KXtyZXR1cm4hMX19KCksZS5rTWF4TGVuZ3RoPWEoKSx1LnBvb2xTaXplPTgxOTIsdS5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189dS5wcm90b3R5cGUsdH0sdS5mcm9tPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYyhudWxsLHQsZSxuKX0sdS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYodS5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLHUuX19wcm90b19fPVVpbnQ4QXJyYXksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5zcGVjaWVzJiZ1W1N5bWJvbC5zcGVjaWVzXT09PXUmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH0pKSx1LmFsbG9jPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGwoZSksZTw9MD9zKHQsZSk6dm9pZCAwIT09bj8ic3RyaW5nIj09dHlwZW9mIHI%2Fcyh0LGUpLmZpbGwobixyKTpzKHQsZSkuZmlsbChuKTpzKHQsZSl9KG51bGwsdCxlLG4pfSx1LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBmKG51bGwsdCl9LHUuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBmKG51bGwsdCl9LHUuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfSx1LmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighdS5pc0J1ZmZlcih0KXx8IXUuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgbj10Lmxlbmd0aCxyPWUubGVuZ3RoLG89MCxpPU1hdGgubWluKG4scik7bzxpOysrbylpZih0W29dIT09ZVtvXSl7bj10W29dLHI9ZVtvXTticmVha31yZXR1cm4gbjxyPy0xOnI8bj8xOjB9LHUuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sdS5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighaSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB1LmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxuPTA7bjx0Lmxlbmd0aDsrK24pZSs9dFtuXS5sZW5ndGg7dmFyIHI9dS5hbGxvY1Vuc2FmZShlKSxvPTA7Zm9yKG49MDtuPHQubGVuZ3RoOysrbil7dmFyIGE9dFtuXTtpZighdS5pc0J1ZmZlcihhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7YS5jb3B5KHIsbyksbys9YS5sZW5ndGh9cmV0dXJuIHJ9LHUuYnl0ZUxlbmd0aD1kLHUucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCx1LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpdih0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KXYodGhpcyxlLGUrMyksdih0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpdih0aGlzLGUsZSs3KSx2KHRoaXMsZSsxLGUrNiksdih0aGlzLGUrMixlKzUpLHYodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9BKHRoaXMsMCx0KTpnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT11LmNvbXBhcmUodGhpcyx0KX0sdS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiLG49ZS5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg%2BMCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLG4pLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD5uJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LHUucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLG4scixvKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1vJiYobz10aGlzLmxlbmd0aCksZTwwfHxuPnQubGVuZ3RofHxyPDB8fG8%2BdGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI%2BPW8mJmU%2BPW4pcmV0dXJuIDA7aWYocj49bylyZXR1cm4tMTtpZihlPj1uKXJldHVybiAxO2lmKHRoaXM9PT10KXJldHVybiAwO2Zvcih2YXIgaT0obz4%2BPj0wKS0ocj4%2BPj0wKSxhPShuPj4%2BPTApLShlPj4%2BPTApLHM9TWF0aC5taW4oaSxhKSxjPXRoaXMuc2xpY2UocixvKSxsPXQuc2xpY2UoZSxuKSxmPTA7ZjxzOysrZilpZihjW2ZdIT09bFtmXSl7aT1jW2ZdLGE9bFtmXTticmVha31yZXR1cm4gaTxhPy0xOmE8aT8xOjB9LHUucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUsbil9LHUucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5KHRoaXMsdCxlLG4sITApfSx1LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkodGhpcyx0LGUsbiwhMSl9LHUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHZvaWQgMD09PWUpcj0idXRmOCIsbj10aGlzLmxlbmd0aCxlPTA7ZWxzZSBpZih2b2lkIDA9PT1uJiYic3RyaW5nIj09dHlwZW9mIGUpcj1lLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTtlfD0wLGlzRmluaXRlKG4pPyhufD0wLHZvaWQgMD09PXImJihyPSJ1dGY4IikpOihyPW4sbj12b2lkIDApfXZhciBvPXRoaXMubGVuZ3RoLWU7aWYoKHZvaWQgMD09PW58fG4%2BbykmJihuPW8pLHQubGVuZ3RoPjAmJihuPDB8fGU8MCl8fGU%2BdGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cnx8KHI9InV0ZjgiKTtmb3IodmFyIGk9ITE7Oylzd2l0Y2gocil7Y2FzZSJoZXgiOnJldHVybiBiKHRoaXMsdCxlLG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIHgodGhpcyx0LGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIHcodGhpcyx0LGUsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gayh0aGlzLHQsZSxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFModGhpcyx0LGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBFKHRoaXMsdCxlLG4pO2RlZmF1bHQ6aWYoaSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksaT0hMH19LHUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIE89NDA5NjtmdW5jdGlvbiBDKHQsZSxuKXt2YXIgcj0iIjtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgbz1lO288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmdFtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gaih0LGUsbil7dmFyIHI9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIG89ZTtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUodFtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTCh0LGUsbil7dmFyIHI9dC5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIW58fG48MHx8bj5yKSYmKG49cik7Zm9yKHZhciBvPSIiLGk9ZTtpPG47KytpKW8rPXEodFtpXSk7cmV0dXJuIG99ZnVuY3Rpb24gUCh0LGUsbil7Zm9yKHZhciByPXQuc2xpY2UoZSxuKSxvPSIiLGk9MDtpPHIubGVuZ3RoO2krPTIpbys9U3RyaW5nLmZyb21DaGFyQ29kZShyW2ldKzI1NipyW2krMV0pO3JldHVybiBvfWZ1bmN0aW9uIFIodCxlLG4pe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U%2Bbil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE4odCxlLG4scixvLGkpe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPm98fGU8aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYobityPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBJKHQsZSxuLHIpe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKHQubGVuZ3RoLW4sMik7bzxpOysrbyl0W24rb109KGUmMjU1PDw4KihyP286MS1vKSk%2BPj44KihyP286MS1vKX1mdW5jdGlvbiBEKHQsZSxuLHIpe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4odC5sZW5ndGgtbiw0KTtvPGk7KytvKXRbbitvXT1lPj4%2BOCoocj9vOjMtbykmMjU1fWZ1bmN0aW9uIF8odCxlLG4scixvLGkpe2lmKG4rcj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBNKHQsZSxuLHIsaSl7cmV0dXJuIGl8fF8odCwwLG4sNCksby53cml0ZSh0LGUsbixyLDIzLDQpLG4rNH1mdW5jdGlvbiBVKHQsZSxuLHIsaSl7cmV0dXJuIGl8fF8odCwwLG4sOCksby53cml0ZSh0LGUsbixyLDUyLDgpLG4rOH11LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcy5sZW5ndGg7aWYoKHQ9fn50KTwwPyh0Kz1yKTwwJiYodD0wKTp0PnImJih0PXIpLChlPXZvaWQgMD09PWU%2Fcjp%2BfmUpPDA%2FKGUrPXIpPDAmJihlPTApOmU%2BciYmKGU9ciksZTx0JiYoZT10KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQpKG49dGhpcy5zdWJhcnJheSh0LGUpKS5fX3Byb3RvX189dS5wcm90b3R5cGU7ZWxzZXt2YXIgbz1lLXQ7bj1uZXcgdShvLHZvaWQgMCk7Zm9yKHZhciBpPTA7aTxvOysraSluW2ldPXRoaXNbaSt0XX1yZXR1cm4gbn0sdS5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFIodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0XSxvPTEsaT0wOysraTxlJiYobyo9MjU2KTspcis9dGhpc1t0K2ldKm87cmV0dXJuIHJ9LHUucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxSKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdCstLWVdLG89MTtlPjAmJihvKj0yNTYpOylyKz10aGlzW3QrLS1lXSpvO3JldHVybiByfSx1LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LHUucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LHUucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LHUucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sdS5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSx1LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxSKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdF0sbz0xLGk9MDsrK2k8ZSYmKG8qPTI1Nik7KXIrPXRoaXNbdCtpXSpvO3JldHVybiByPj0obyo9MTI4KSYmKHItPU1hdGgucG93KDIsOCplKSkscn0sdS5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8Uih0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj1lLG89MSxpPXRoaXNbdCstLXJdO3I%2BMCYmKG8qPTI1Nik7KWkrPXRoaXNbdCstLXJdKm87cmV0dXJuIGk%2BPShvKj0xMjgpJiYoaS09TWF0aC5wb3coMiw4KmUpKSxpfSx1LnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0%2FLTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LHUucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Uih0LDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSx1LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fFIodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sdS5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sdS5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITAsMjMsNCl9LHUucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCExLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITAsNTIsOCl9LHUucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMSw1Miw4KX0sdS5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLG4scil7KHQ9K3QsZXw9MCxufD0wLHIpfHxOKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89MSxpPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytpPG4mJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUsbixyKXsodD0rdCxlfD0wLG58PTAscil8fE4odGhpcyx0LGUsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz1uLTEsaT0xO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYoaSo9MjU2KTspdGhpc1tlK29dPXQvaSYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDEsMjU1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4%2BPjgpOkkodGhpcyx0LGUsITApLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsNjU1MzUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ%2BPj44LHRoaXNbZSsxXT0yNTUmdCk6SSh0aGlzLHQsZSwhMSksZSsyfSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ%2BPj4yNCx0aGlzW2UrMl09dD4%2BPjE2LHRoaXNbZSsxXT10Pj4%2BOCx0aGlzW2VdPTI1NSZ0KTpEKHRoaXMsdCxlLCEwKSxlKzR9LHUucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ%2BPj4yNCx0aGlzW2UrMV09dD4%2BPjE2LHRoaXNbZSsyXT10Pj4%2BOCx0aGlzW2UrM109MjU1JnQpOkQodGhpcyx0LGUsITEpLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUsbixyKXtpZih0PSt0LGV8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO04odGhpcyx0LGUsbixvLTEsLW8pfXZhciBpPTAsYT0xLHM9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2k8biYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UraS0xXSYmKHM9MSksdGhpc1tlK2ldPSh0L2E%2BPjApLXMmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLG4scil7aWYodD0rdCxlfD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtOKHRoaXMsdCxlLG4sby0xLC1vKX12YXIgaT1uLTEsYT0xLHM9MDtmb3IodGhpc1tlK2ldPTI1NSZ0Oy0taT49MCYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UraSsxXSYmKHM9MSksdGhpc1tlK2ldPSh0L2E%2BPjApLXMmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDEsMTI3LC0xMjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sdS5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4%2BPjgpOkkodGhpcyx0LGUsITApLGUrMn0sdS5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4%2BOCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FKHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ%2BPj44LHRoaXNbZSsyXT10Pj4%2BMTYsdGhpc1tlKzNdPXQ%2BPj4yNCk6RCh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4%2BMjQsdGhpc1tlKzFdPXQ%2BPj4xNix0aGlzW2UrMl09dD4%2BPjgsdGhpc1tlKzNdPTI1NSZ0KTpEKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE0odGhpcyx0LGUsITAsbil9LHUucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE0odGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVSh0aGlzLHQsZSwhMSxuKX0sdS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUsbixyKXtpZihufHwobj0wKSxyfHwwPT09cnx8KHI9dGhpcy5sZW5ndGgpLGU%2BPXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCkscj4wJiZyPG4mJihyPW4pLHI9PT1uKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7cj50aGlzLmxlbmd0aCYmKHI9dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8ci1uJiYocj10Lmxlbmd0aC1lK24pO3ZhciBvLGk9ci1uO2lmKHRoaXM9PT10JiZuPGUmJmU8cilmb3Iobz1pLTE7bz49MDstLW8pdFtvK2VdPXRoaXNbbytuXTtlbHNlIGlmKGk8MWUzfHwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihvPTA7bzxpOysrbyl0W28rZV09dGhpc1tvK25dO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KG4sbitpKSxlKTtyZXR1cm4gaX0sdS5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8ocj1lLGU9MCxuPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIG4mJihyPW4sbj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgbz10LmNoYXJDb2RlQXQoMCk7bzwyNTYmJih0PW8pfWlmKHZvaWQgMCE9PXImJiJzdHJpbmciIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiByJiYhdS5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPD1lKXJldHVybiB0aGlzO3ZhciBpO2lmKGU%2BPj49MCxuPXZvaWQgMD09PW4%2FdGhpcy5sZW5ndGg6bj4%2BPjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihpPWU7aTxuOysraSl0aGlzW2ldPXQ7ZWxzZXt2YXIgYT11LmlzQnVmZmVyKHQpP3Q6RihuZXcgdSh0LHIpLnRvU3RyaW5nKCkpLHM9YS5sZW5ndGg7Zm9yKGk9MDtpPG4tZTsrK2kpdGhpc1tpK2VdPWFbaSVzXX1yZXR1cm4gdGhpc307dmFyIEI9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gRih0LGUpe3ZhciBuO2U9ZXx8MS8wO2Zvcih2YXIgcj10Lmxlbmd0aCxvPW51bGwsaT1bXSxhPTA7YTxyOysrYSl7aWYoKG49dC5jaGFyQ29kZUF0KGEpKT41NTI5NSYmbjw1NzM0NCl7aWYoIW8pe2lmKG4%2BNTYzMTkpeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihhKzE9PT1yKXsoZS09Myk%2BLTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bz1uO2NvbnRpbnVlfWlmKG48NTYzMjApeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxvPW47Y29udGludWV9bj02NTUzNisoby01NTI5Njw8MTB8bi01NjMyMCl9ZWxzZSBvJiYoZS09Myk%2BLTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYobz1udWxsLG48MTI4KXtpZigoZS09MSk8MClicmVhaztpLnB1c2gobil9ZWxzZSBpZihuPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO2kucHVzaChuPj42fDE5Miw2MyZufDEyOCl9ZWxzZSBpZihuPDY1NTM2KXtpZigoZS09Myk8MClicmVhaztpLnB1c2gobj4%2BMTJ8MjI0LG4%2BPjYmNjN8MTI4LDYzJm58MTI4KX1lbHNle2lmKCEobjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO2kucHVzaChuPj4xOHwyNDAsbj4%2BMTImNjN8MTI4LG4%2BPjYmNjN8MTI4LDYzJm58MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gSCh0KXtyZXR1cm4gci50b0J5dGVBcnJheShmdW5jdGlvbih0KXtpZigodD1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSh0KS5yZXBsYWNlKEIsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIHoodCxlLG4scil7Zm9yKHZhciBvPTA7bzxyJiYhKG8rbj49ZS5sZW5ndGh8fG8%2BPXQubGVuZ3RoKTsrK28pZVtvK25dPXRbb107cmV0dXJuIG99fSkuY2FsbCh0aGlzLG4oODIpKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmJ5dGVMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9Yyh0KSxuPWVbMF0scj1lWzFdO3JldHVybiAzKihuK3IpLzQtcn0sZS50b0J5dGVBcnJheT1mdW5jdGlvbih0KXt2YXIgZSxuLHI9Yyh0KSxhPXJbMF0scz1yWzFdLHU9bmV3IGkoZnVuY3Rpb24odCxlLG4pe3JldHVybiAzKihlK24pLzQtbn0oMCxhLHMpKSxsPTAsZj1zPjA%2FYS00OmE7Zm9yKG49MDtuPGY7bis9NCllPW9bdC5jaGFyQ29kZUF0KG4pXTw8MTh8b1t0LmNoYXJDb2RlQXQobisxKV08PDEyfG9bdC5jaGFyQ29kZUF0KG4rMildPDw2fG9bdC5jaGFyQ29kZUF0KG4rMyldLHVbbCsrXT1lPj4xNiYyNTUsdVtsKytdPWU%2BPjgmMjU1LHVbbCsrXT0yNTUmZTsyPT09cyYmKGU9b1t0LmNoYXJDb2RlQXQobildPDwyfG9bdC5jaGFyQ29kZUF0KG4rMSldPj40LHVbbCsrXT0yNTUmZSk7MT09PXMmJihlPW9bdC5jaGFyQ29kZUF0KG4pXTw8MTB8b1t0LmNoYXJDb2RlQXQobisxKV08PDR8b1t0LmNoYXJDb2RlQXQobisyKV0%2BPjIsdVtsKytdPWU%2BPjgmMjU1LHVbbCsrXT0yNTUmZSk7cmV0dXJuIHV9LGUuZnJvbUJ5dGVBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj10Lmxlbmd0aCxvPW4lMyxpPVtdLGE9MCxzPW4tbzthPHM7YSs9MTYzODMpaS5wdXNoKGwodCxhLGErMTYzODM%2Bcz9zOmErMTYzODMpKTsxPT09bz8oZT10W24tMV0saS5wdXNoKHJbZT4%2BMl0rcltlPDw0JjYzXSsiPT0iKSk6Mj09PW8mJihlPSh0W24tMl08PDgpK3Rbbi0xXSxpLnB1c2gocltlPj4xMF0rcltlPj40JjYzXStyW2U8PDImNjNdKyI9IikpO3JldHVybiBpLmpvaW4oIiIpfTtmb3IodmFyIHI9W10sbz1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGE9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHM9MCx1PWEubGVuZ3RoO3M8dTsrK3MpcltzXT1hW3NdLG9bYS5jaGFyQ29kZUF0KHMpXT1zO2Z1bmN0aW9uIGModCl7dmFyIGU9dC5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49dC5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj1lKSxbbixuPT09ZT8wOjQtbiU0XX1mdW5jdGlvbiBsKHQsZSxuKXtmb3IodmFyIG8saSxhPVtdLHM9ZTtzPG47cys9MylvPSh0W3NdPDwxNiYxNjcxMTY4MCkrKHRbcysxXTw8OCY2NTI4MCkrKDI1NSZ0W3MrMl0pLGEucHVzaChyWyhpPW8pPj4xOCY2M10rcltpPj4xMiY2M10rcltpPj42JjYzXStyWzYzJmldKTtyZXR1cm4gYS5qb2luKCIiKX1vWyItIi5jaGFyQ29kZUF0KDApXT02MixvWyJfIi5jaGFyQ29kZUF0KDApXT02M30sZnVuY3Rpb24odCxlKXtlLnJlYWQ9ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHM9OCpvLXItMSx1PSgxPDxzKS0xLGM9dT4%2BMSxsPS03LGY9bj9vLTE6MCxwPW4%2FLTE6MSxoPXRbZStmXTtmb3IoZis9cCxpPWgmKDE8PC1sKS0xLGg%2BPj0tbCxsKz1zO2w%2BMDtpPTI1NippK3RbZStmXSxmKz1wLGwtPTgpO2ZvcihhPWkmKDE8PC1sKS0xLGk%2BPj0tbCxsKz1yO2w%2BMDthPTI1NiphK3RbZStmXSxmKz1wLGwtPTgpO2lmKDA9PT1pKWk9MS1jO2Vsc2V7aWYoaT09PXUpcmV0dXJuIGE%2FTmFOOjEvMCooaD8tMToxKTthKz1NYXRoLnBvdygyLHIpLGktPWN9cmV0dXJuKGg%2FLTE6MSkqYSpNYXRoLnBvdygyLGktcil9LGUud3JpdGU9ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhLHMsdSxjPTgqaS1vLTEsbD0oMTw8YyktMSxmPWw%2BPjEscD0yMz09PW8%2FTWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGg9cj8wOmktMSxkPXI%2FMTotMSxnPWU8MHx8MD09PWUmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8ocz1pc05hTihlKT8xOjAsYT1sKTooYT1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKih1PU1hdGgucG93KDIsLWEpKTwxJiYoYS0tLHUqPTIpLChlKz1hK2Y%2BPTE%2FcC91OnAqTWF0aC5wb3coMiwxLWYpKSp1Pj0yJiYoYSsrLHUvPTIpLGErZj49bD8ocz0wLGE9bCk6YStmPj0xPyhzPShlKnUtMSkqTWF0aC5wb3coMixvKSxhKz1mKToocz1lKk1hdGgucG93KDIsZi0xKSpNYXRoLnBvdygyLG8pLGE9MCkpO28%2BPTg7dFtuK2hdPTI1NSZzLGgrPWQscy89MjU2LG8tPTgpO2ZvcihhPWE8PG98cyxjKz1vO2M%2BMDt0W24raF09MjU1JmEsaCs9ZCxhLz0yNTYsYy09OCk7dFtuK2gtZF18PTEyOCpnfX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09bi5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4MCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDI4MSk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5VUkxTZWFyY2hQYXJhbXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7big5OCk7dmFyIHI9bigwKSxvPW4oMjgyKSxpPW4oMzMpLGE9bigxMDApLHM9bigyNCksdT1uKDk0KSxjPW4oNDgpLGw9bigxMDEpLGY9bigxMikscD1uKDI5KSxoPW4oOSksZD1uKDYpLGc9bigxMTgpLHY9big1MSkseT1uKDEpKCJpdGVyYXRvciIpLG09Yy5zZXQsYj1jLmdldHRlckZvcigiVVJMU2VhcmNoUGFyYW1zIikseD1jLmdldHRlckZvcigiVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IiKSx3PS9cKy9nLGs9QXJyYXkoNCksUz1mdW5jdGlvbih0KXtyZXR1cm4ga1t0LTFdfHwoa1t0LTFdPVJlZ0V4cCgiKCg%2FOiVbXFxkYS1mXXsyfSl7Iit0KyJ9KSIsImdpIikpfSxFPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQpfWNhdGNoKGUpe3JldHVybiB0fX0sVD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UodywiICIpLG49NDt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaCh0KXtmb3IoO247KWU9ZS5yZXBsYWNlKFMobi0tKSxFKTtyZXR1cm4gZX19LEE9L1shJygpfl18JTIwL2csTz17IiEiOiIlMjEiLCInIjoiJTI3IiwiKCI6IiUyOCIsIikiOiIlMjkiLCJ%2BIjoiJTdFIiwiJTIwIjoiKyJ9LEM9ZnVuY3Rpb24odCl7cmV0dXJuIE9bdF19LGo9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKEEsQyl9LEw9ZnVuY3Rpb24odCxlKXtpZihlKWZvcih2YXIgbixyLG89ZS5zcGxpdCgiJiIpLGk9MDtpPG8ubGVuZ3RoOykobj1vW2krK10pLmxlbmd0aCYmKHI9bi5zcGxpdCgiPSIpLHQucHVzaCh7a2V5OlQoci5zaGlmdCgpKSx2YWx1ZTpUKHIuam9pbigiPSIpKX0pKX0sUD1mdW5jdGlvbih0KXt0aGlzLmVudHJpZXMubGVuZ3RoPTAsTCh0aGlzLmVudHJpZXMsdCl9LFI9ZnVuY3Rpb24odCxlKXtpZih0PGUpdGhyb3cgVHlwZUVycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpfSxOPXUoZnVuY3Rpb24odCxlKXttKHRoaXMse3R5cGU6IlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIixpdGVyYXRvcjpnKGIodCkuZW50cmllcyksa2luZDplfSl9LCJJdGVyYXRvciIsZnVuY3Rpb24oKXt2YXIgdD14KHRoaXMpLGU9dC5raW5kLG49dC5pdGVyYXRvci5uZXh0KCkscj1uLnZhbHVlO3JldHVybiBuLmRvbmV8fChuLnZhbHVlPSJrZXlzIj09PWU%2Fci5rZXk6InZhbHVlcyI9PT1lP3IudmFsdWU6W3Iua2V5LHIudmFsdWVdKSxufSksST1mdW5jdGlvbigpe2wodGhpcyxJLCJVUkxTZWFyY2hQYXJhbXMiKTt2YXIgdCxlLG4scixvLGksYSxzPWFyZ3VtZW50cy5sZW5ndGg%2BMD9hcmd1bWVudHNbMF06dm9pZCAwLHU9dGhpcyxjPVtdO2lmKG0odSx7dHlwZToiVVJMU2VhcmNoUGFyYW1zIixlbnRyaWVzOmMsdXBkYXRlVVJMOmZ1bmN0aW9uKCl7fSx1cGRhdGVTZWFyY2hQYXJhbXM6UH0pLHZvaWQgMCE9PXMpaWYoZChzKSlpZigiZnVuY3Rpb24iPT10eXBlb2YodD12KHMpKSlmb3IoZT10LmNhbGwocyk7IShuPWUubmV4dCgpKS5kb25lOyl7aWYoKG89KHI9ZyhoKG4udmFsdWUpKSkubmV4dCgpKS5kb25lfHwoaT1yLm5leHQoKSkuZG9uZXx8IXIubmV4dCgpLmRvbmUpdGhyb3cgVHlwZUVycm9yKCJFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyIik7Yy5wdXNoKHtrZXk6by52YWx1ZSsiIix2YWx1ZTppLnZhbHVlKyIifSl9ZWxzZSBmb3IoYSBpbiBzKWYocyxhKSYmYy5wdXNoKHtrZXk6YSx2YWx1ZTpzW2FdKyIifSk7ZWxzZSBMKGMsInN0cmluZyI9PXR5cGVvZiBzPyI%2FIj09PXMuY2hhckF0KDApP3Muc2xpY2UoMSk6czpzKyIiKX0sRD1JLnByb3RvdHlwZTthKEQse2FwcGVuZDpmdW5jdGlvbih0LGUpe1IoYXJndW1lbnRzLmxlbmd0aCwyKTt2YXIgbj1iKHRoaXMpO24uZW50cmllcy5wdXNoKHtrZXk6dCsiIix2YWx1ZTplKyIifSksbi51cGRhdGVVUkwoKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe1IoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKSxuPWUuZW50cmllcyxyPXQrIiIsbz0wO288bi5sZW5ndGg7KW5bb10ua2V5PT09cj9uLnNwbGljZShvLDEpOm8rKztlLnVwZGF0ZVVSTCgpfSxnZXQ6ZnVuY3Rpb24odCl7Uihhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdLmtleT09PW4pcmV0dXJuIGVbcl0udmFsdWU7cmV0dXJuIG51bGx9LGdldEFsbDpmdW5jdGlvbih0KXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcykuZW50cmllcyxuPXQrIiIscj1bXSxvPTA7bzxlLmxlbmd0aDtvKyspZVtvXS5rZXk9PT1uJiZyLnB1c2goZVtvXS52YWx1ZSk7cmV0dXJuIHJ9LGhhczpmdW5jdGlvbih0KXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcykuZW50cmllcyxuPXQrIiIscj0wO3I8ZS5sZW5ndGg7KWlmKGVbcisrXS5rZXk9PT1uKXJldHVybiEwO3JldHVybiExfSxzZXQ6ZnVuY3Rpb24odCxlKXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBuLHI9Yih0aGlzKSxvPXIuZW50cmllcyxpPSExLGE9dCsiIixzPWUrIiIsdT0wO3U8by5sZW5ndGg7dSsrKShuPW9bdV0pLmtleT09PWEmJihpP28uc3BsaWNlKHUtLSwxKTooaT0hMCxuLnZhbHVlPXMpKTtpfHxvLnB1c2goe2tleTphLHZhbHVlOnN9KSxyLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9Yih0aGlzKSxvPXIuZW50cmllcyxpPW8uc2xpY2UoKTtmb3Ioby5sZW5ndGg9MCxuPTA7bjxpLmxlbmd0aDtuKyspe2Zvcih0PWlbbl0sZT0wO2U8bjtlKyspaWYob1tlXS5rZXk%2BdC5rZXkpe28uc3BsaWNlKGUsMCx0KTticmVha31lPT09biYmby5wdXNoKHQpfXIudXBkYXRlVVJMKCl9LGZvckVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49Yih0aGlzKS5lbnRyaWVzLHI9cCh0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89MDtvPG4ubGVuZ3RoOylyKChlPW5bbysrXSkudmFsdWUsZS5rZXksdGhpcyl9LGtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywia2V5cyIpfSx2YWx1ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywidmFsdWVzIil9LGVudHJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywiZW50cmllcyIpfX0se2VudW1lcmFibGU6ITB9KSxpKEQseSxELmVudHJpZXMpLGkoRCwidG9TdHJpbmciLGZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9Yih0aGlzKS5lbnRyaWVzLG49W10scj0wO3I8ZS5sZW5ndGg7KXQ9ZVtyKytdLG4ucHVzaChqKHQua2V5KSsiPSIraih0LnZhbHVlKSk7cmV0dXJuIG4uam9pbigiJiIpfSx7ZW51bWVyYWJsZTohMH0pLHMoSSwiVVJMU2VhcmNoUGFyYW1zIikscih7Z2xvYmFsOiEwLGZvcmNlZDohb30se1VSTFNlYXJjaFBhcmFtczpJfSksdC5leHBvcnRzPXtVUkxTZWFyY2hQYXJhbXM6SSxnZXRTdGF0ZTpifX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDEpLGk9bigyMiksYT1vKCJpdGVyYXRvciIpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3ZhciB0PW5ldyBVUkwoImI%2FZT0xIiwiaHR0cDovL2EiKSxlPXQuc2VhcmNoUGFyYW1zO3JldHVybiB0LnBhdGhuYW1lPSJjJTIwZCIsaSYmIXQudG9KU09OfHwhZS5zb3J0fHwiaHR0cDovL2EvYyUyMGQ%2FZT0xIiE9PXQuaHJlZnx8IjEiIT09ZS5nZXQoImUiKXx8ImE9MSIhPT1TdHJpbmcobmV3IFVSTFNlYXJjaFBhcmFtcygiP2E9MSIpKXx8IWVbYV18fCJhIiE9PW5ldyBVUkwoImh0dHBzOi8vYUBiIikudXNlcm5hbWV8fCJiIiE9PW5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygiYT1iIikpLmdldCgiYSIpfHwieG4tLWUxYXliYyIhPT1uZXcgVVJMKCJodHRwOi8v0YLQtdGB0YIiKS5ob3N0fHwiIyVEMCVCMSIhPT1uZXcgVVJMKCJodHRwOi8vYSPQsSIpLmhhc2h9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4NCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4NSksbz1GdW5jdGlvbi5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuYmluZDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBGdW5jdGlvbiYmZT09PW8uYmluZD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyODYpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJGdW5jdGlvbiIpLmJpbmR9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6IkZ1bmN0aW9uIixwcm90bzohMH0se2JpbmQ6big5MCl9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDkxKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbiYmdChlLnByb3RvdHlwZSxuKSxyJiZ0KGUsciksZX19KCksbz1mdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9KG4oMjg5KSksaT1wKG4oMjkwKSksYT1wKG4oMjkxKSkscz1wKG4oMjkyKSksdT1wKG4oMjkzKSksYz1wKG4oMjk0KSksbD1wKG4oMjk1KSksZj1wKG4oMjk2KSk7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19dmFyIGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSx0aGlzLnR5cGU9Imxhbmd1YWdlRGV0ZWN0b3IiLHRoaXMuZGV0ZWN0b3JzPXt9LHRoaXMuaW5pdChlLG4pfXJldHVybiByKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg%2BMiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTt0aGlzLnNlcnZpY2VzPXQsdGhpcy5vcHRpb25zPW8uZGVmYXVsdHMoZSx0aGlzLm9wdGlvbnN8fHt9LHtvcmRlcjpbInF1ZXJ5c3RyaW5nIiwiY29va2llIiwibG9jYWxTdG9yYWdlIiwibmF2aWdhdG9yIiwiaHRtbFRhZyJdLGxvb2t1cFF1ZXJ5c3RyaW5nOiJsbmciLGxvb2t1cENvb2tpZToiaTE4bmV4dCIsbG9va3VwTG9jYWxTdG9yYWdlOiJpMThuZXh0TG5nIixjYWNoZXM6WyJsb2NhbFN0b3JhZ2UiXSxleGNsdWRlQ2FjaGVGb3I6WyJjaW1vZGUiXX0pLHRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXgmJih0aGlzLm9wdGlvbnMubG9va3VwRnJvbVBhdGhJbmRleD10aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4KSx0aGlzLmkxOG5PcHRpb25zPW4sdGhpcy5hZGREZXRlY3RvcihpLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoYS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKHMuZGVmYXVsdCksdGhpcy5hZGREZXRlY3Rvcih1LmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoYy5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGwuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihmLmRlZmF1bHQpfX0se2tleToiYWRkRGV0ZWN0b3IiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuZGV0ZWN0b3JzW3QubmFtZV09dH19LHtrZXk6ImRldGVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0fHwodD10aGlzLm9wdGlvbnMub3JkZXIpO3ZhciBuPVtdO3QuZm9yRWFjaChmdW5jdGlvbih0KXtpZihlLmRldGVjdG9yc1t0XSl7dmFyIHI9ZS5kZXRlY3RvcnNbdF0ubG9va3VwKGUub3B0aW9ucyk7ciYmInN0cmluZyI9PXR5cGVvZiByJiYocj1bcl0pLHImJihuPW4uY29uY2F0KHIpKX19KTt2YXIgcj12b2lkIDA7aWYobi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFyKXt2YXIgbj1lLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO2Uuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5pc1doaXRlbGlzdGVkKG4pJiYocj1uKX19KSwhcil7dmFyIG89dGhpcy5pMThuT3B0aW9ucy5mYWxsYmFja0xuZzsic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSksb3x8KG89W10pLHI9IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobyk%2Fb1swXTpvWzBdfHxvLmRlZmF1bHQmJm8uZGVmYXVsdFswXX1yZXR1cm4gcn19LHtrZXk6ImNhY2hlVXNlckxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7ZXx8KGU9dGhpcy5vcHRpb25zLmNhY2hlcyksZSYmKHRoaXMub3B0aW9ucy5leGNsdWRlQ2FjaGVGb3ImJnRoaXMub3B0aW9ucy5leGNsdWRlQ2FjaGVGb3IuaW5kZXhPZih0KT4tMXx8ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24uZGV0ZWN0b3JzW2VdJiZuLmRldGVjdG9yc1tlXS5jYWNoZVVzZXJMYW5ndWFnZSh0LG4ub3B0aW9ucyl9KSl9fV0pLHR9KCk7aC50eXBlPSJsYW5ndWFnZURldGVjdG9yIixlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0cz1mdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKGkuY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIG4gaW4gZSl2b2lkIDA9PT10W25dJiYodFtuXT1lW25dKX0pLHR9LGUuZXh0ZW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNhbGwoaS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbihlKXtpZihlKWZvcih2YXIgbiBpbiBlKXRbbl09ZVtuXX0pLHR9O3ZhciByPVtdLG89ci5mb3JFYWNoLGk9ci5zbGljZX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24odCxlLG4scil7dmFyIG89dm9pZCAwO2lmKG4pe3ZhciBpPW5ldyBEYXRlO2kuc2V0VGltZShpLmdldFRpbWUoKSs2MCpuKjFlMyksbz0iOyBleHBpcmVzPSIraS50b0dNVFN0cmluZygpfWVsc2Ugbz0iIjtyPXI%2FImRvbWFpbj0iK3IrIjsiOiIiLGRvY3VtZW50LmNvb2tpZT10KyI9IitlK28rIjsiK3IrInBhdGg9LyJ9LG89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQrIj0iLG49ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7Iikscj0wO3I8bi5sZW5ndGg7cisrKXtmb3IodmFyIG89bltyXTsiICI9PT1vLmNoYXJBdCgwKTspbz1vLnN1YnN0cmluZygxLG8ubGVuZ3RoKTtpZigwPT09by5pbmRleE9mKGUpKXJldHVybiBvLnN1YnN0cmluZyhlLmxlbmd0aCxvLmxlbmd0aCl9cmV0dXJuIG51bGx9O2UuZGVmYXVsdD17bmFtZToiY29va2llIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKHQubG9va3VwQ29va2llJiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgbj1vKHQubG9va3VwQ29va2llKTtuJiYoZT1uKX1yZXR1cm4gZX0sY2FjaGVVc2VyTGFuZ3VhZ2U6ZnVuY3Rpb24odCxlKXtlLmxvb2t1cENvb2tpZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmcihlLmxvb2t1cENvb2tpZSx0LGUuY29va2llTWludXRlcyxlLmNvb2tpZURvbWFpbil9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJxdWVyeXN0cmluZyIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdylmb3IodmFyIG49d2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoIiYiKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl0uaW5kZXhPZigiPSIpO2lmKG8%2BMCluW3JdLnN1YnN0cmluZygwLG8pPT09dC5sb29rdXBRdWVyeXN0cmluZyYmKGU9bltyXS5zdWJzdHJpbmcobysxKSl9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9dm9pZCAwO3RyeXtyPSJ1bmRlZmluZWQiIT09d2luZG93JiZudWxsIT09d2luZG93LmxvY2FsU3RvcmFnZTt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oImkxOG5leHQudHJhbnNsYXRlLmJvbyIsImZvbyIpLHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgiaTE4bmV4dC50cmFuc2xhdGUuYm9vIil9Y2F0Y2godCl7cj0hMX1lLmRlZmF1bHQ9e25hbWU6ImxvY2FsU3RvcmFnZSIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZih0Lmxvb2t1cExvY2FsU3RvcmFnZSYmcil7dmFyIG49d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHQubG9va3VwTG9jYWxTdG9yYWdlKTtuJiYoZT1uKX1yZXR1cm4gZX0sY2FjaGVVc2VyTGFuZ3VhZ2U6ZnVuY3Rpb24odCxlKXtlLmxvb2t1cExvY2FsU3RvcmFnZSYmciYmd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGUubG9va3VwTG9jYWxTdG9yYWdlLHQpfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToibmF2aWdhdG9yIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9W107aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3Ipe2lmKG5hdmlnYXRvci5sYW5ndWFnZXMpZm9yKHZhciBuPTA7bjxuYXZpZ2F0b3IubGFuZ3VhZ2VzLmxlbmd0aDtuKyspZS5wdXNoKG5hdmlnYXRvci5sYW5ndWFnZXNbbl0pO25hdmlnYXRvci51c2VyTGFuZ3VhZ2UmJmUucHVzaChuYXZpZ2F0b3IudXNlckxhbmd1YWdlKSxuYXZpZ2F0b3IubGFuZ3VhZ2UmJmUucHVzaChuYXZpZ2F0b3IubGFuZ3VhZ2UpfXJldHVybiBlLmxlbmd0aD4wP2U6dm9pZCAwfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToiaHRtbFRhZyIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMCxuPXQuaHRtbFRhZ3x8KCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ%2FZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Om51bGwpO3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5nZXRBdHRyaWJ1dGUmJihlPW4uZ2V0QXR0cmlidXRlKCJsYW5nIikpLGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJwYXRoIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUubWF0Y2goL1wvKFthLXpBLVotXSopL2cpO2lmKG4gaW5zdGFuY2VvZiBBcnJheSlpZigibnVtYmVyIj09dHlwZW9mIHQubG9va3VwRnJvbVBhdGhJbmRleCl7aWYoInN0cmluZyIhPXR5cGVvZiBuW3QubG9va3VwRnJvbVBhdGhJbmRleF0pcmV0dXJuO2U9blt0Lmxvb2t1cEZyb21QYXRoSW5kZXhdLnJlcGxhY2UoIi8iLCIiKX1lbHNlIGU9blswXS5yZXBsYWNlKCIvIiwiIil9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJzdWJkb21haW4iLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBuPXdpbmRvdy5sb2NhdGlvbi5ocmVmLm1hdGNoKC8oPzpodHRwW3NdKlw6XC9cLykqKC4qPylcLig%2FPVteXC9dKlwuLnsyLDV9KS9naSk7biBpbnN0YW5jZW9mIEFycmF5JiYoZT0ibnVtYmVyIj09dHlwZW9mIHQubG9va3VwRnJvbVN1YmRvbWFpbkluZGV4P25bdC5sb29rdXBGcm9tU3ViZG9tYWluSW5kZXhdLnJlcGxhY2UoImh0dHA6Ly8iLCIiKS5yZXBsYWNlKCJodHRwczovLyIsIiIpLnJlcGxhY2UoIi4iLCIiKTpuWzBdLnJlcGxhY2UoImh0dHA6Ly8iLCIiKS5yZXBsYWNlKCJodHRwczovLyIsIiIpLnJlcGxhY2UoIi4iLCIiKSl9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLnIoZSk7dmFyIHI9big4KSxvPW4ubihyKSxpPW4oNDIpLGE9bi5uKGkpLHM9big2MCksdT1uLm4ocyksYz1uKDI3KSxsPW4ubihjKSxmPW4oMTcpLHA9bi5uKGYpLGg9big3KSxkPW4ubihoKSxnPW4oMTApLHY9bi5uKGcpLHk9bigxMSksbT1uLm4oeSksYj1uKDEyNCkseD1uLm4oYiksdz1uKDI2KSxrPW4ubih3KSxTPW4oMzQpLEU9bi5uKFMpLFQ9bigxMyksQT1uLm4oVCksTz1uKDEyNSksQz1uLm4oTyksaj1uKDEyNik7ZnVuY3Rpb24gTCgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgUD1uKDEyNyksUj1uLm4oUCksTj1uKDEyOCksST1uLm4oTiksRD0iemlnemFnIjt2YXIgXz1uKDM1KSxNPSJ1c2FnZSIsVT0iemlnemFnLWZsb3ctY29udHJvbGxlZCI7ZnVuY3Rpb24gQih0LGUpe3dpbmRvdy4kJiZmdW5jdGlvbihuKXt2YXIgcj1uKHQpO2lmKHImJnIubGVuZ3RoPjApZm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKz0xKXt2YXIgaT1yLmdldChvKTtpLmhhc0F0dHJpYnV0ZShVKXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBxPXtwcmVzZXJ2ZU9yaWdpbmFsRXZlbnQ6ITEsZGlzYWJsZVBvaW50ZXJFdmVudDohMX07ZnVuY3Rpb24gRih0KXt2YXIgZT1JKCkoZnVuY3Rpb24oKXt2YXIgbixyLG89d2luZG93LnppZ3phZzsiZGVhY3RpdmF0ZWQiPT09KG49TSxyPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShEKSxKU09OLnBhcnNlKHI%2FZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBIKHQsZSl7dmFyIG49d2luZG93LnppZ3phZztSKCkoZnVuY3Rpb24oKXsvQ2hyb21lLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSYmMD09PXQoZSkubGVuZ3RoJiZuJiYiaXRlbSI9PT1uLmRpc2NvdmVyeVN0YXR1cyYmXy5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp%2BipsuW9k%2BOBmeOCi%2BODleODreODvOWItuW%2BoeeUqOOBruimgee0oOOBjOimi%2BOBpOOBi%2BOCiuOBvuOBm%2BOCkyIpKX0sNWUzKX12YXIgej17b25DaGFuZ2VzUmVhZHk6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOlsiamEiXTtCb29sZWFuKGwoKShlKS5jYWxsKGUsZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuLTEhPT1DKCkoZT1MKCkpLmNhbGwoZSx0KX0pKXx8RihmdW5jdGlvbigpe3Qoail9KX0sb3ZlcnJpZGVDbGlja0V2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106cTtpZihIKHQsZSksci5kaXNhYmxlUG9pbnRlckV2ZW50KXtpZih3aW5kb3cuZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoVSkpcmV0dXJuO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7by5pbm5lckhUTUw9IlxuICAgICIuY29uY2F0KGUsIiB7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9Iik7dmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0Iik7cmV0dXJuIGkmJmkucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvLGkpLHQoZG9jdW1lbnQpLm9uKCJjbGljayIsZnVuY3Rpb24ocil7ci50YXJnZXQmJnQoci50YXJnZXQpLmNsb3Nlc3QodChlKS5wYXJlbnQoKSkubGVuZ3RoPjAmJm4ocil9KSx2b2lkIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZShVLCIxIil9ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fEIoZSwiY2xpY2siKTtmb3IodmFyIGE9dChlKSxzPTA7czxhLmxlbmd0aDtzKz0xKXt2YXIgdT1hLmdldChzKTt1Lmhhc0F0dHJpYnV0ZShVKXx8KHUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKHQpe3IucHJlc2VydmVPcmlnaW5hbEV2ZW50fHwodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpLG4odCl9LCEwKSx1LnNldEF0dHJpYnV0ZShVLCIxIikpfX0sb3ZlcnJpZGVTdWJtaXRFdmVudDpmdW5jdGlvbih0LGUsbil7SCh0LGUpLEIoZSwic3VibWl0Iik7dmFyIHI9dChlKTtpZihyJiZyLmxlbmd0aD4wKWZvcih2YXIgbz0wO288ci5sZW5ndGg7bys9MSl7dmFyIGk9ci5nZXQobyk7aS5oYXNBdHRyaWJ1dGUoVSl8fCh0KGkpLm9uKCJzdWJtaXQiLG4pLGkuc2V0QXR0cmlidXRlKFUsIjEiKSl9fSx1bmJpbmRPcmlnaW5hbEpRdWVyeUV2ZW50czpCfSxXPW4oNzgpLCQ9bi5uKFcpO2Z1bmN0aW9uIFYodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOjAsbj0kKCkodC5yZXBsYWNlKC9bXjAtOV0vZ2ksIiIpLDEwKTtyZXR1cm4gbnx8ZX1mdW5jdGlvbiBZKHQpe3ZhciBlPSIiLG49dC5jb250ZW50cygpO2lmKG4ubGVuZ3RoPjApZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKz0xKXt2YXIgbz1uLmdldChyKTszPT09by5ub2RlVHlwZSYmby5kYXRhJiYoZSs9by5kYXRhKX1yZXR1cm4gZX1mdW5jdGlvbiBHKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3JldHVybiB0KGUpLmxlbmd0aD4wJiYiaW1nIj09PXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk%2FdChlKS5hdHRyKCJhbHQiKXx8IiI6dChlKS50ZXh0KCkucmVwbGFjZSgvXG4vLCIiKX1mdW5jdGlvbiBLKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3ZhciBuPSIiO2lmKHQoZSkubGVuZ3RoPjApe3ZhciByPXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk7bj0iaW5wdXQiPT09cj90KGUpLnZhbCgpOiJtZXRhIj09PXI%2FdChlKS5hdHRyKCJjb250ZW50Iil8fCIiOlkodChlKSl9cmV0dXJuIG49bi5yZXBsYWNlKC9bXjAtOV0vZywiIiksJCgpKG4sMTApfXZhciBYPW4oMzYpLEo9bi5uKFgpLFE9bigzNyksWj1uLm4oUSksdHQ9bigzOCksZXQ9bi5uKHR0KSxudD1uKDM5KSxydD1uLm4obnQpLG90PW4oNDApLGl0PW4ubihvdCksYXQ9big0MSksc3Q9bi5uKGF0KSx1dD1uKDYxKSxjdD1uLm4odXQpO2Z1bmN0aW9uIGx0KHQsZSl7dmFyIG47aWYodm9pZCAwPT09cnQuYXx8bnVsbD09ZXQoKSh0KSl7aWYoWigpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGZ0KHQsZSk7dmFyIHI9c3QoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gaXQoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg%2FOjh8MTZ8MzIpKD86Q2xhbXBlZCk%2FQXJyYXkkLy50ZXN0KHIpKXJldHVybiBmdCh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI%2BPXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLGE9ITAscz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249SigpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IGl9fX19ZnVuY3Rpb24gZnQodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBwdCh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNLVeOBjOS4jeato%2BOBp%2BOBmSIpO2lmKDA9PT1jdCgpKHQpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNLVemgheebruaVsOOBjOS4jeato%2BOBp%2BOBmSIpfXZhciBodD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49ZS4kLHI9ZS5uYW1lLG89ZS5wcmljZTt2KCkodGhpcyx0KSx0aGlzLiQ9bix0aGlzLm5hbWVTZWxlY3Rvcj1yfHwiIix0aGlzLnByaWNlU2VsZWN0b3I9b3x8IiJ9cmV0dXJuIG0oKSh0LFt7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuITB9fSx7a2V5OiJleGVjdXRlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGUsbixyPSEwO3RyeXtyZXR1cm4gdD10aGlzLmdldEl0ZW0oKSxlPXRoaXMuZ2V0U2t1Um93cyh0KSxyPXRoaXMuZ2V0UHVyY2hhc2FibGUoe2l0ZW06dCxza3VSb3dzOmV9KSxmdW5jdGlvbih0KXt2YXIgZT10Lml0ZW0sbj10LnNrdVJvd3M7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6DjgYzkuI3mraPjgafjgZkiKTtpZighZS5uYW1lKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og5ZCN5YmN44GM5LiN5q2j44Gn44GZIik7aWYoIShuJiYwIT09bi5sZW5ndGh8fGUucHJpY2UpKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og6YeR6aGN44GM5LiN5q2j44Gn44GZIik7aWYobil7dmFyIHIsbz1sdChuKTt0cnl7Zm9yKG8ucygpOyEocj1vLm4oKSkuZG9uZTspe3B0KHIudmFsdWUpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX19fSh7aXRlbTp0LHNrdVJvd3M6ZX0pLHtpdGVtOnQsc2t1Um93czplLHB1cmNoYXNhYmxlOnJ9fWNhdGNoKHQpe249dH12YXIgbz17cHVyY2hhc2FibGU6cn07cmV0dXJuIHQmJihvLml0ZW09dCksZSYmKG8uc2t1Um93cz1lKSxuJiYoby5lcnJvcj1uKSxvfX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17bmFtZToiIixwcmljZTowfTt0aGlzLm5hbWVTZWxlY3Rvcj90Lm5hbWU9dGhpcy5nZXRJdGVtTmFtZShHKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3RvcikpOnQubmFtZT10aGlzLmdldEl0ZW1OYW1lKCksdGhpcy5wcmljZVNlbGVjdG9yP3QucHJpY2U9dGhpcy5nZXRJdGVtUHJpY2UoSyh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKSk6dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZSgpO3ZhciBlPXRoaXMuZ2V0SXRlbUNvZGUoKTtyZXR1cm4gZSYmKHQuY29kZT1lKSx0fX0se2tleToiZ2V0SXRlbU5hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOiIiO3JldHVybiB0aGlzLm5hbWVTZWxlY3Rvcj9HKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MDtyZXR1cm4gdGhpcy5wcmljZVNlbGVjdG9yP0sodGhpcy4kLHRoaXMucHJpY2VTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIifX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuW119fV0pLHR9KCksZHQ9big0NCksZ3Q9bi5uKGR0KSx2dD1uKDc5KSx5dD1uLm4odnQpLG10PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1lLmRhdGE7digpKHRoaXMsdCksdGhpcy5kYXRhPW59cmV0dXJuIG0oKSh0LG51bGwsW3trZXk6ImNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9MTtyPGUubGVuZ3RoO3IrPTEpe2Zvcih2YXIgbz17fSxpPTA7aTx0Lmxlbmd0aDtpKz0xKW9bdFtpXV09ZVtyXVtpXTtuLnB1c2gobyl9cmV0dXJuIG59fSx7a2V5OiJzcGxpdENvdW50cmllcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ%2FIiI9PT10fHwiLCI9PT10P1tdOnQuc3BsaXQoIiwiKTpbXX19LHtrZXk6Im5vcm1hbGl6ZVJhd0RhdGEiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9MCxvPWN0KCkodCk7cjxvLmxlbmd0aDtyKyspe3ZhciBpLGE9dFtvW3JdXTthLnNoaWZ0KCksbj1wKCkoaT1bXSkuY2FsbChpLHl0KCkobikseXQoKShhKSl9cmV0dXJuIG4udW5zaGlmdChlKSx7ZGF0YTpufX19XSksdH0oKTtmdW5jdGlvbiBidCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IW8uYSlyZXR1cm4hMTtpZihvLmEuc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8oKShEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUEoKSh0KTtpZihlKXt2YXIgaT1BKCkodGhpcykuY29uc3RydWN0b3I7bj1vKCkocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBFKCkodGhpcyxuKX19dmFyIHh0PXtieVVybDp7bmFtZToiYnlVcmwiLGNvbHVtbnM6WyJ1cmwiLCJjb3VudHJpZXMiXX0sYnlJdGVtTmFtZTp7bmFtZToiYnlJdGVtTmFtZSIsY29sdW1uczpbIml0ZW1OYW1lIiwiY291bnRyaWVzIl19LGJ5SXRlbUNvZGU6e25hbWU6ImJ5SXRlbUNvZGUiLGNvbHVtbnM6WyJpdGVtQ29kZSIsImNvdW50cmllcyJdfSxieUNhdGVnb3J5OntuYW1lOiJieUNhdGVnb3J5Iixjb2x1bW5zOlsiY2F0ZWdvcnkiLCJjb3VudHJpZXMiXX0sYnlJdGVtRGVzY3JpcHRpb246e25hbWU6ImJ5SXRlbURlc2NyaXB0aW9uIixjb2x1bW5zOlsidGV4dCIsImNvdW50cmllcyJdfX0sd3Q9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9YnQobik7ZnVuY3Rpb24gbih0KXt2YXIgcjtyZXR1cm4gdigpKHRoaXMsbiksKHI9ZS5jYWxsKHRoaXMsdCkpLmRhdGE9dC5kYXRhLHIuc2hlZXRUeXBlPXQuc2hlZXRUeXBlfHx4dCxyfXJldHVybiBtKCkobixbe2tleToiYnlVcmwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5VXJsKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5VXJsO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6bXQuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbU5hbWU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczptdC5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUl0ZW1Db2RlKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGU7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPW10LmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gZ3QoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtQ29kZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOm10LnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5Q2F0ZWdvcnkiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnkpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlDYXRlZ29yeTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9bXQuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBndCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6bXQuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dGV4dDplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOm10LnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImV4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2V4Y2x1c2lvbjp7YnlVcmw6dGhpcy5ieVVybCgpLGJ5SXRlbU5hbWU6dGhpcy5ieUl0ZW1OYW1lKCksYnlJdGVtQ29kZTp0aGlzLmJ5SXRlbUNvZGUoKSxieUNhdGVnb3J5OnRoaXMuYnlDYXRlZ29yeSgpLGJ5SXRlbURlc2NyaXB0aW9uOnRoaXMuYnlJdGVtRGVzY3JpcHRpb24oKX19fX1dKSxufShtdCksa3Q9big2MiksU3Q9bi5uKGt0KSxFdD1uKDgwKTtmdW5jdGlvbiBUdCh0LGUpe3ZhciBuO2lmKHZvaWQgMD09PXJ0LmF8fG51bGw9PWV0KCkodCkpe2lmKFooKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBBdCh0LGUpO3ZhciByPXN0KCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIGl0KCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gQXQodCxlKX0odCkpfHxlJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXtuJiYodD1uKTt2YXIgcj0wLG89ZnVuY3Rpb24oKXt9O3JldHVybntzOm8sbjpmdW5jdGlvbigpe3JldHVybiByPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtyKytdfX0sZTpmdW5jdGlvbih0KXt0aHJvdyB0fSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgaSxhPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPUooKSh0KX0sbjpmdW5jdGlvbigpe3ZhciB0PW4ubmV4dCgpO3JldHVybiBhPXQuZG9uZSx0fSxlOmZ1bmN0aW9uKHQpe3M9ITAsaT10fSxmOmZ1bmN0aW9uKCl7dHJ5e2F8fG51bGw9PW4ucmV0dXJufHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBpfX19fWZ1bmN0aW9uIEF0KHQsZSl7KG51bGw9PWV8fGU%2BdC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gT3QodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1BKCkodCk7aWYoZSl7dmFyIGk9QSgpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gRSgpKHRoaXMsbil9fXZhciBDdD1mdW5jdGlvbih0KXtrKCkobix0KTt2YXIgZT1PdChuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIHYoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBtKCkobixbe2tleToiZXhjbHVkZSIsdmFsdWU6ZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYSxzPSExLHU9dGhpcy5sb2NhdGlvbi5jb3VudHJ5LGM9VHQodCk7dHJ5e2ZvcihjLnMoKTshKG89Yy5uKCkpLmRvbmU7KXt2YXIgbD1vLnZhbHVlO2lmKHIobCkpe3M9bi5tYXRjaENvdW50cnkobCx1KTticmVha319fWNhdGNoKHQpe2MuZSh0KX1maW5hbGx5e2MuZigpfXJldHVybiBzPyhfLmEuZGVidWcocCgpKGk9IkVYQ0xVREVEIEJZIFNQUkVBRFNIRUVUOiAiLmNvbmNhdChlLCIsICIpKS5jYWxsKGksdSkpLHtjb2RlOiJFWENMVURFRF9CWV9CTEFDS0xJU1QiLG1lc3NhZ2U6cCgpKGE9IiIuY29uY2F0KGUsIiwgIikpLmNhbGwoYSx1LCIg44Gr6Kmy5b2T44GX44Gf44Gf44KB6Zmk5aSWIikscGFyYW1zOnt2YWx1ZTplLGNvdW50cnk6dX19KTpFdC5hfX1dLFt7a2V5OiJtYXRjaENvdW50cnkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuISghdC5pc0FsbCYmMCE9PXQuY291bnRyaWVzLmxlbmd0aCl8fFN0KCkobj10LmNvdW50cmllcykuY2FsbChuLGUpfX1dKSxufShFdC5iKTt2YXIganQ9bigxMzIpLEx0PW4ubihqdCksUHQ9big4MSksUnQ9bi5uKFB0KTtmdW5jdGlvbiBOdCh0KXtyZXR1cm4oTnQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I%2FZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU%2FInN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBJdCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9ZnVuY3Rpb24gRHQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP09iamVjdChhcmd1bWVudHNbZV0pOnt9LHI9T2JqZWN0LmtleXMobik7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihyPXIuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkuZW51bWVyYWJsZX0pKSksci5mb3JFYWNoKGZ1bmN0aW9uKGUpe0l0KHQsZSxuW2VdKX0pfXJldHVybiB0fWZ1bmN0aW9uIF90KHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gTXQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIGUmJk10KHQucHJvdG90eXBlLGUpLG4mJk10KHQsbiksdH1mdW5jdGlvbiBCdCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gcXQodCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPT1OdChlKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU%2FQnQodCk6ZX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4oRnQ9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIEh0KHQsZSl7cmV0dXJuKEh0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiB6dCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZIdCh0LGUpfXZhciBXdD17dHlwZToibG9nZ2VyIixsb2c6ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoImxvZyIsdCl9LHdhcm46ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoIndhcm4iLHQpfSxlcnJvcjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgiZXJyb3IiLHQpfSxvdXRwdXQ6ZnVuY3Rpb24odCxlKXtjb25zb2xlJiZjb25zb2xlW3RdJiZjb25zb2xlW3RdLmFwcGx5KGNvbnNvbGUsZSl9fSwkdD1uZXcoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtfdCh0aGlzLHQpLHRoaXMuaW5pdChlLG4pfXJldHVybiBVdCh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5wcmVmaXg9ZS5wcmVmaXh8fCJpMThuZXh0OiIsdGhpcy5sb2dnZXI9dHx8V3QsdGhpcy5vcHRpb25zPWUsdGhpcy5kZWJ1Zz1lLmRlYnVnfX0se2tleToic2V0RGVidWciLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuZGVidWc9dH19LHtrZXk6ImxvZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsImxvZyIsIiIsITApfX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsIndhcm4iLCIiLCEwKX19LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwiZXJyb3IiLCIiKX19LHtrZXk6ImRlcHJlY2F0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsIndhcm4iLCJXQVJOSU5HIERFUFJFQ0FURUQ6ICIsITApfX0se2tleToiZm9yd2FyZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHImJiF0aGlzLmRlYnVnP251bGw6KCJzdHJpbmciPT10eXBlb2YgdFswXSYmKHRbMF09IiIuY29uY2F0KG4pLmNvbmNhdCh0aGlzLnByZWZpeCwiICIpLmNvbmNhdCh0WzBdKSksdGhpcy5sb2dnZXJbZV0odCkpfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQodGhpcy5sb2dnZXIsRHQoe30se3ByZWZpeDoiIi5jb25jYXQodGhpcy5wcmVmaXgsIjoiKS5jb25jYXQoZSwiOiIpfSx0aGlzLm9wdGlvbnMpKX19XSksdH0oKSksVnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7X3QodGhpcyx0KSx0aGlzLm9ic2VydmVycz17fX1yZXR1cm4gVXQodCxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdC5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7bi5vYnNlcnZlcnNbdF09bi5vYnNlcnZlcnNbdF18fFtdLG4ub2JzZXJ2ZXJzW3RdLnB1c2goZSl9KSx0aGlzfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMub2JzZXJ2ZXJzW3RdJiYoZT90aGlzLm9ic2VydmVyc1t0XT10aGlzLm9ic2VydmVyc1t0XS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1lfSk6ZGVsZXRlIHRoaXMub2JzZXJ2ZXJzW3RdKX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KGU%2BMT9lLTE6MCkscj0xO3I8ZTtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtpZih0aGlzLm9ic2VydmVyc1t0XSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW3RdKTtvLmZvckVhY2goZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsbil9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgaT1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7aS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYXBwbHkoZSxbdF0uY29uY2F0KG4pKX0pfX19XSksdH0oKTtmdW5jdGlvbiBZdCgpe3ZhciB0LGUsbj1uZXcgUHJvbWlzZShmdW5jdGlvbihuLHIpe3Q9bixlPXJ9KTtyZXR1cm4gbi5yZXNvbHZlPXQsbi5yZWplY3Q9ZSxufWZ1bmN0aW9uIEd0KHQpe3JldHVybiBudWxsPT10PyIiOiIiK3R9ZnVuY3Rpb24gS3QodCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuaW5kZXhPZigiIyMjIik%2BLTE%2FdC5yZXBsYWNlKC8jIyMvZywiLiIpOnR9ZnVuY3Rpb24gbygpe3JldHVybiF0fHwic3RyaW5nIj09dHlwZW9mIHR9Zm9yKHZhciBpPSJzdHJpbmciIT10eXBlb2YgZT9bXS5jb25jYXQoZSk6ZS5zcGxpdCgiLiIpO2kubGVuZ3RoPjE7KXtpZihvKCkpcmV0dXJue307dmFyIGE9cihpLnNoaWZ0KCkpOyF0W2FdJiZuJiYodFthXT1uZXcgbiksdD10W2FdfXJldHVybiBvKCk%2Fe306e29iajp0LGs6cihpLnNoaWZ0KCkpfX1mdW5jdGlvbiBYdCh0LGUsbil7dmFyIHI9S3QodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIEp0KHQsZSl7dmFyIG49S3QodCxlKSxyPW4ub2JqLG89bi5rO2lmKHIpcmV0dXJuIHJbb119ZnVuY3Rpb24gUXQodCxlLG4pe3ZhciByPUp0KHQsbik7cmV0dXJuIHZvaWQgMCE9PXI%2FcjpKdChlLG4pfWZ1bmN0aW9uIFp0KHQsZSxuKXtmb3IodmFyIHIgaW4gZSkiX19wcm90b19fIiE9PXImJiJjb25zdHJ1Y3RvciIhPT1yJiYociBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFtyXXx8dFtyXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIGVbcl18fGVbcl1pbnN0YW5jZW9mIFN0cmluZz9uJiYodFtyXT1lW3JdKTpadCh0W3JdLGVbcl0sbik6dFtyXT1lW3JdKTtyZXR1cm4gdH1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgZWU9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBuZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ%2FdC5yZXBsYWNlKC9bJjw%2BIidcL10vZyxmdW5jdGlvbih0KXtyZXR1cm4gZWVbdF19KTp0fXZhciByZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm5hdmlnYXRvciYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKT4tMSxvZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOntuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOiJ0cmFuc2xhdGlvbiJ9O3JldHVybiBfdCh0aGlzLGUpLG49cXQodGhpcyxGdChlKS5jYWxsKHRoaXMpKSxyZSYmVnQuY2FsbChCdChuKSksbi5kYXRhPXR8fHt9LG4ub3B0aW9ucz1yLHZvaWQgMD09PW4ub3B0aW9ucy5rZXlTZXBhcmF0b3ImJihuLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksbn1yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToiYWRkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmdGhpcy5vcHRpb25zLm5zLnB1c2godCl9fSx7a2V5OiJyZW1vdmVOYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGUsMSl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg%2BMyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxvPXZvaWQgMCE9PXIua2V5U2VwYXJhdG9yP3Iua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT1bdCxlXTtyZXR1cm4gbiYmInN0cmluZyIhPXR5cGVvZiBuJiYoaT1pLmNvbmNhdChuKSksbiYmInN0cmluZyI9PXR5cGVvZiBuJiYoaT1pLmNvbmNhdChvP24uc3BsaXQobyk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYoaT10LnNwbGl0KCIuIikpLEp0KHRoaXMuZGF0YSxpKX19LHtrZXk6ImFkZFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06e3NpbGVudDohMX0saT10aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO3ZvaWQgMD09PWkmJihpPSIuIik7dmFyIGE9W3QsZV07biYmKGE9YS5jb25jYXQoaT9uLnNwbGl0KGkpOm4pKSx0LmluZGV4T2YoIi4iKT4tMSYmKHI9ZSxlPShhPXQuc3BsaXQoIi4iKSlbMV0pLHRoaXMuYWRkTmFtZXNwYWNlcyhlKSxYdCh0aGlzLmRhdGEsYSxyKSxvLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4scil9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciBvIGluIG4pInN0cmluZyIhPXR5cGVvZiBuW29dJiYiW29iamVjdCBBcnJheV0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuW29dKXx8dGhpcy5hZGRSZXNvdXJjZSh0LGUsbyxuW29dLHtzaWxlbnQ6ITB9KTtyLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4pfX0se2tleToiYWRkUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0%2FYXJndW1lbnRzWzVdOntzaWxlbnQ6ITF9LGE9W3QsZV07dC5pbmRleE9mKCIuIik%2BLTEmJihyPW4sbj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpO3ZhciBzPUp0KHRoaXMuZGF0YSxhKXx8e307cj9adChzLG4sbyk6cz1EdCh7fSxzLG4pLFh0KHRoaXMuZGF0YSxhLHMpLGkuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHQsZSkmJmRlbGV0ZSB0aGlzLmRhdGFbdF1bZV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGUpLHRoaXMuZW1pdCgicmVtb3ZlZCIsdCxlKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT10aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8KGU9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksInYxIj09PXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJP0R0KHt9LHt9LHRoaXMuZ2V0UmVzb3VyY2UodCxlKSk6dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0RGF0YUJ5TGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdF19fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX19XSksZX0oKSxpZT17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPXRoaXM7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtpLnByb2Nlc3NvcnNbdF0mJihlPWkucHJvY2Vzc29yc1t0XS5wcm9jZXNzKGUsbixyLG8pKX0pLGV9fSxhZT17fSxzZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOnt9O3JldHVybiBfdCh0aGlzLGUpLG49cXQodGhpcyxGdChlKS5jYWxsKHRoaXMpKSxyZSYmVnQuY2FsbChCdChuKSksZnVuY3Rpb24odCxlLG4pe3QuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdJiYoblt0XT1lW3RdKX0pfShbInJlc291cmNlU3RvcmUiLCJsYW5ndWFnZVV0aWxzIiwicGx1cmFsUmVzb2x2ZXIiLCJpbnRlcnBvbGF0b3IiLCJiYWNrZW5kQ29ubmVjdG9yIiwiaTE4bkZvcm1hdCIsInV0aWxzIl0sdCxCdChuKSksbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxuLmxvZ2dlcj0kdC5jcmVhdGUoInRyYW5zbGF0b3IiKSxufXJldHVybiB6dChlLFZ0KSxVdChlLFt7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7dCYmKHRoaXMubGFuZ3VhZ2U9dCl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7aW50ZXJwb2xhdGlvbjp7fX0sbj10aGlzLnJlc29sdmUodCxlKTtyZXR1cm4gbiYmdm9pZCAwIT09bi5yZXN9fSx7a2V5OiJleHRyYWN0RnJvbUtleSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj12b2lkIDAhPT1lLm5zU2VwYXJhdG9yP2UubnNTZXBhcmF0b3I6dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3ZvaWQgMD09PW4mJihuPSI6Iik7dmFyIHI9dm9pZCAwIT09ZS5rZXlTZXBhcmF0b3I%2FZS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixvPWUubnN8fHRoaXMub3B0aW9ucy5kZWZhdWx0TlM7aWYobiYmdC5pbmRleE9mKG4pPi0xKXt2YXIgaT10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2lmKGkmJmkubGVuZ3RoPjApcmV0dXJue2tleTp0LG5hbWVzcGFjZXM6b307dmFyIGE9dC5zcGxpdChuKTsobiE9PXJ8fG49PT1yJiZ0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihhWzBdKT4tMSkmJihvPWEuc2hpZnQoKSksdD1hLmpvaW4ocil9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBvJiYobz1bb10pLHtrZXk6dCxuYW1lc3BhY2VzOm99fX0se2tleToidHJhbnNsYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztpZigib2JqZWN0IiE9PU50KGUpJiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJihlPXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSxlfHwoZT17fSksbnVsbD09dClyZXR1cm4iIjtBcnJheS5pc0FycmF5KHQpfHwodD1bU3RyaW5nKHQpXSk7dmFyIG89dm9pZCAwIT09ZS5rZXlTZXBhcmF0b3I%2FZS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPXRoaXMuZXh0cmFjdEZyb21LZXkodFt0Lmxlbmd0aC0xXSxlKSxhPWkua2V5LHM9aS5uYW1lc3BhY2VzLHU9c1tzLmxlbmd0aC0xXSxjPWUubG5nfHx0aGlzLmxhbmd1YWdlLGw9ZS5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZXx8dGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO2lmKGMmJiJjaW1vZGUiPT09Yy50b0xvd2VyQ2FzZSgpKXtpZihsKXt2YXIgZj1lLm5zU2VwYXJhdG9yfHx0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7cmV0dXJuIHUrZithfXJldHVybiBhfXZhciBwPXRoaXMucmVzb2x2ZSh0LGUpLGg9cCYmcC5yZXMsZD1wJiZwLnVzZWRLZXl8fGEsZz1wJiZwLmV4YWN0VXNlZEtleXx8YSx2PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoaCkseT1bIltvYmplY3QgTnVtYmVyXSIsIltvYmplY3QgRnVuY3Rpb25dIiwiW29iamVjdCBSZWdFeHBdIl0sbT12b2lkIDAhPT1lLmpvaW5BcnJheXM%2FZS5qb2luQXJyYXlzOnRoaXMub3B0aW9ucy5qb2luQXJyYXlzLGI9IXRoaXMuaTE4bkZvcm1hdHx8dGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0LHg9InN0cmluZyIhPXR5cGVvZiBoJiYiYm9vbGVhbiIhPXR5cGVvZiBoJiYibnVtYmVyIiE9dHlwZW9mIGg7aWYoYiYmaCYmeCYmeS5pbmRleE9mKHYpPDAmJigic3RyaW5nIiE9dHlwZW9mIG18fCJbb2JqZWN0IEFycmF5XSIhPT12KSl7aWYoIWUucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKSx0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIoZCxoLGUpOiJrZXkgJyIuY29uY2F0KGEsIiAoIikuY29uY2F0KHRoaXMubGFuZ3VhZ2UsIiknIHJldHVybmVkIGFuIG9iamVjdCBpbnN0ZWFkIG9mIHN0cmluZy4iKTtpZihvKXt2YXIgdz0iW29iamVjdCBBcnJheV0iPT09dixrPXc%2FW106e30sUz13P2c6ZDtmb3IodmFyIEUgaW4gaClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaCxFKSl7dmFyIFQ9IiIuY29uY2F0KFMpLmNvbmNhdChvKS5jb25jYXQoRSk7a1tFXT10aGlzLnRyYW5zbGF0ZShULER0KHt9LGUse2pvaW5BcnJheXM6ITEsbnM6c30pKSxrW0VdPT09VCYmKGtbRV09aFtFXSl9aD1rfX1lbHNlIGlmKGImJiJzdHJpbmciPT10eXBlb2YgbSYmIltvYmplY3QgQXJyYXldIj09PXYpKGg9aC5qb2luKG0pKSYmKGg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLHQsZSxuKSk7ZWxzZXt2YXIgQT0hMSxPPSExO2lmKCF0aGlzLmlzVmFsaWRMb29rdXAoaCkmJnZvaWQgMCE9PWUuZGVmYXVsdFZhbHVlKXtpZihBPSEwLHZvaWQgMCE9PWUuY291bnQpe3ZhciBDPXRoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KGMsZS5jb3VudCk7aD1lWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChDKV19aHx8KGg9ZS5kZWZhdWx0VmFsdWUpfXRoaXMuaXNWYWxpZExvb2t1cChoKXx8KE89ITAsaD1hKTt2YXIgaj1lLmRlZmF1bHRWYWx1ZSYmZS5kZWZhdWx0VmFsdWUhPT1oJiZ0aGlzLm9wdGlvbnMudXBkYXRlTWlzc2luZztpZihPfHxBfHxqKXtpZih0aGlzLmxvZ2dlci5sb2coaj8idXBkYXRlS2V5IjoibWlzc2luZ0tleSIsYyx1LGEsaj9lLmRlZmF1bHRWYWx1ZTpoKSxvKXt2YXIgTD10aGlzLnJlc29sdmUoYSxEdCh7fSxlLHtrZXlTZXBhcmF0b3I6ITF9KSk7TCYmTC5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgUD1bXSxSPXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxlLmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZSJiZSWzBdKWZvcih2YXIgTj0wO048Ui5sZW5ndGg7TisrKVAucHVzaChSW05dKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9QPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZS5sbmd8fHRoaXMubGFuZ3VhZ2UpOlAucHVzaChlLmxuZ3x8dGhpcy5sYW5ndWFnZSk7dmFyIEk9ZnVuY3Rpb24odCxuKXtyLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI%2Fci5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKHQsdSxuLGo%2FZS5kZWZhdWx0VmFsdWU6aCxqLGUpOnIuYmFja2VuZENvbm5lY3RvciYmci5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcodCx1LG4saj9lLmRlZmF1bHRWYWx1ZTpoLGosZSksci5lbWl0KCJtaXNzaW5nS2V5Iix0LHUsbixoKX07aWYodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nKXt2YXIgRD12b2lkIDAhPT1lLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIGUuY291bnQ7dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nUGx1cmFscyYmRD9QLmZvckVhY2goZnVuY3Rpb24odCl7ci5wbHVyYWxSZXNvbHZlci5nZXRQbHVyYWxGb3Jtc09mS2V5KHQsYSkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gSShbdF0sZSl9KX0pOkkoUCxhKX19aD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLHAsbiksTyYmaD09PWEmJnRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXkmJihoPSIiLmNvbmNhdCh1LCI6IikuY29uY2F0KGEpKSxPJiZ0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlciYmKGg9dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoaCkpfXJldHVybiBofX0se2tleToiZXh0ZW5kVHJhbnNsYXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztpZih0aGlzLmkxOG5Gb3JtYXQmJnRoaXMuaTE4bkZvcm1hdC5wYXJzZSl0PXRoaXMuaTE4bkZvcm1hdC5wYXJzZSh0LG4sci51c2VkTG5nLHIudXNlZE5TLHIudXNlZEtleSx7cmVzb2x2ZWQ6cn0pO2Vsc2UgaWYoIW4uc2tpcEludGVycG9sYXRpb24pe24uaW50ZXJwb2xhdGlvbiYmdGhpcy5pbnRlcnBvbGF0b3IuaW5pdChEdCh7fSxuLHtpbnRlcnBvbGF0aW9uOkR0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLG4uaW50ZXJwb2xhdGlvbil9KSk7dmFyIGEscz1uLmludGVycG9sYXRpb24mJm4uaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztpZihzKXt2YXIgdT10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2E9dSYmdS5sZW5ndGh9dmFyIGM9bi5yZXBsYWNlJiYic3RyaW5nIiE9dHlwZW9mIG4ucmVwbGFjZT9uLnJlcGxhY2U6bjtpZih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzJiYoYz1EdCh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzLGMpKSx0PXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHQsYyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSxuKSxzKXt2YXIgbD10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2E8KGwmJmwubGVuZ3RoKSYmKG4ubmVzdD0hMSl9ITEhPT1uLm5lc3QmJih0PXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QodCxmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KHQpLGE9MDthPHQ7YSsrKXJbYV09YXJndW1lbnRzW2FdO3JldHVybiBvJiZvWzBdPT09clswXSYmIW4uY29udGV4dD8oaS5sb2dnZXIud2FybigiSXQgc2VlbXMgeW91IGFyZSBuZXN0aW5nIHJlY3Vyc2l2ZWx5IGtleTogIi5jb25jYXQoclswXSwiIGluIGtleTogIikuY29uY2F0KGVbMF0pKSxudWxsKTppLnRyYW5zbGF0ZS5hcHBseShpLHIuY29uY2F0KFtlXSkpfSxuKSksbi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5yZXNldCgpfXZhciBmPW4ucG9zdFByb2Nlc3N8fHRoaXMub3B0aW9ucy5wb3N0UHJvY2VzcyxwPSJzdHJpbmciPT10eXBlb2YgZj9bZl06ZjtyZXR1cm4gbnVsbCE9dCYmcCYmcC5sZW5ndGgmJiExIT09bi5hcHBseVBvc3RQcm9jZXNzb3ImJih0PWllLmhhbmRsZShwLHQsZSx0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5wb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZD9EdCh7aTE4blJlc29sdmVkOnJ9LG4pOm4sdGhpcykpLHR9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGE9dGhpcyxzPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe3ZhciB1PWEuZXh0cmFjdEZyb21LZXkodCxzKSxjPXUua2V5O249Yzt2YXIgbD11Lm5hbWVzcGFjZXM7YS5vcHRpb25zLmZhbGxiYWNrTlMmJihsPWwuY29uY2F0KGEub3B0aW9ucy5mYWxsYmFja05TKSk7dmFyIGY9dm9pZCAwIT09cy5jb3VudCYmInN0cmluZyIhPXR5cGVvZiBzLmNvdW50LHA9dm9pZCAwIT09cy5jb250ZXh0JiYic3RyaW5nIj09dHlwZW9mIHMuY29udGV4dCYmIiIhPT1zLmNvbnRleHQsaD1zLmxuZ3M%2Fcy5sbmdzOmEubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkocy5sbmd8fGEubGFuZ3VhZ2Uscy5mYWxsYmFja0xuZyk7bC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EuaXNWYWxpZExvb2t1cChlKXx8KGk9dCwhYWVbIiIuY29uY2F0KGhbMF0sIi0iKS5jb25jYXQodCldJiZhLnV0aWxzJiZhLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIWEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGkpJiYoYWVbIiIuY29uY2F0KGhbMF0sIi0iKS5jb25jYXQodCldPSEwLGEubG9nZ2VyLndhcm4oJ2tleSAiJy5jb25jYXQobiwnIiBmb3IgbGFuZ3VhZ2VzICInKS5jb25jYXQoaC5qb2luKCIsICIpLCciIHdvblwndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICInKS5jb25jYXQoaSwnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLGguZm9yRWFjaChmdW5jdGlvbihuKXtpZighYS5pc1ZhbGlkTG9va3VwKGUpKXtvPW47dmFyIGksdSxsPWMsaD1bbF07aWYoYS5pMThuRm9ybWF0JiZhLmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cylhLmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cyhoLGMsbix0LHMpO2Vsc2UgZiYmKGk9YS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgobixzLmNvdW50KSksZiYmcCYmaC5wdXNoKGwraSkscCYmaC5wdXNoKGwrPSIiLmNvbmNhdChhLm9wdGlvbnMuY29udGV4dFNlcGFyYXRvcikuY29uY2F0KHMuY29udGV4dCkpLGYmJmgucHVzaChsKz1pKTtmb3IoO3U9aC5wb3AoKTspYS5pc1ZhbGlkTG9va3VwKGUpfHwocj11LGU9YS5nZXRSZXNvdXJjZShuLHQsdSxzKSl9fSkpfSl9fSkse3JlczplLHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOm8sdXNlZE5TOml9fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISh2b2lkIDA9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybk51bGwmJm51bGw9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiYiIj09PXQpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSh0LGUsbixyKTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UodCxlLG4scil9fV0pLGV9KCk7ZnVuY3Rpb24gdWUodCl7cmV0dXJuIHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX12YXIgY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe190KHRoaXMsdCksdGhpcy5vcHRpb25zPWUsdGhpcy53aGl0ZWxpc3Q9dGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3N8fCExLHRoaXMuc3VwcG9ydGVkTG5ncz10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5sb2dnZXI9JHQuY3JlYXRlKCJsYW5ndWFnZVV0aWxzIil9cmV0dXJuIFV0KHQsW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiAyPT09ZS5sZW5ndGg%2FbnVsbDooZS5wb3AoKSwieCI9PT1lW2UubGVuZ3RoLTFdLnRvTG93ZXJDYXNlKCk%2FbnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlLmpvaW4oIi0iKSkpfX0se2tleToiZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0fHx0LmluZGV4T2YoIi0iKTwwKXJldHVybiB0O3ZhciBlPXQuc3BsaXQoIi0iKTtyZXR1cm4gdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoZVswXSl9fSx7a2V5OiJmb3JtYXRMYW5ndWFnZUNvZGUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmdC5pbmRleE9mKCItIik%2BLTEpe3ZhciBlPVsiaGFucyIsImhhbnQiLCJsYXRuIiwiY3lybCIsImNhbnMiLCJtb25nIiwiYXJhYiJdLG49dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP249bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX0pOjI9PT1uLmxlbmd0aD8oblswXT1uWzBdLnRvTG93ZXJDYXNlKCksblsxXT1uWzFdLnRvVXBwZXJDYXNlKCksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk%2BLTEmJihuWzFdPXVlKG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk%2BLTEmJihuWzFdPXVlKG5bMV0udG9Mb3dlckNhc2UoKSkpLGUuaW5kZXhPZihuWzJdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsyXT11ZShuWzJdLnRvTG93ZXJDYXNlKCkpKSksbi5qb2luKCItIil9cmV0dXJuIHRoaXMub3B0aW9ucy5jbGVhbkNvZGV8fHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc%2FdC50b0xvd2VyQ2FzZSgpOnR9fSx7a2V5OiJpc1doaXRlbGlzdGVkIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJsYW5ndWFnZVV0aWxzLmlzV2hpdGVsaXN0ZWQiLCdmdW5jdGlvbiAiaXNXaGl0ZWxpc3RlZCIgd2lsbCBiZSByZW5hbWVkIHRvICJpc1N1cHBvcnRlZENvZGUiIGluIHRoZSBuZXh0IG1ham9yIC0gcGxlYXNlIG1ha2Ugc3VyZSB0byByZW5hbWUgaXRcJ3MgdXNhZ2UgYXNhcC4nKSx0aGlzLmlzU3VwcG9ydGVkQ29kZSh0KX19LHtrZXk6ImlzU3VwcG9ydGVkQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuKCJsYW5ndWFnZU9ubHkiPT09dGhpcy5vcHRpb25zLmxvYWR8fHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpJiYodD10aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSwhdGhpcy5zdXBwb3J0ZWRMbmdzfHwhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aHx8dGhpcy5zdXBwb3J0ZWRMbmdzLmluZGV4T2YodCk%2BLTF9fSx7a2V5OiJnZXRCZXN0TWF0Y2hGcm9tQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcztyZXR1cm4gdD8odC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmZvcm1hdExhbmd1YWdlQ29kZSh0KTtuLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmIW4uaXNTdXBwb3J0ZWRDb2RlKHIpfHwoZT1yKX19KSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJnQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighZSl7dmFyIHI9bi5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KTtpZihuLmlzU3VwcG9ydGVkQ29kZShyKSlyZXR1cm4gZT1yO2U9bi5vcHRpb25zLnN1cHBvcnRlZExuZ3MuZmluZChmdW5jdGlvbih0KXtpZigwPT09dC5pbmRleE9mKHIpKXJldHVybiB0fSl9fSksZXx8KGU9dGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF0pLGUpOm51bGx9fSx7a2V5OiJnZXRGYWxsYmFja0NvZGVzIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybltdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD10KGUpKSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodCkpcmV0dXJuIHQ7aWYoIWUpcmV0dXJuIHQuZGVmYXVsdHx8W107dmFyIG49dFtlXTtyZXR1cm4gbnx8KG49dFt0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShlKV0pLG58fChuPXRbdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoZSldKSxufHwobj10W3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoZSldKSxufHwobj10LmRlZmF1bHQpLG58fFtdfX0se2tleToidG9SZXNvbHZlSGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldEZhbGxiYWNrQ29kZXMoZXx8dGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nfHxbXSx0KSxvPVtdLGk9ZnVuY3Rpb24odCl7dCYmKG4uaXNTdXBwb3J0ZWRDb2RlKHQpP28ucHVzaCh0KTpuLmxvZ2dlci53YXJuKCJyZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogIi5jb25jYXQodCkpKX07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMT8oImxhbmd1YWdlT25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksImxhbmd1YWdlT25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmImN1cnJlbnRPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKHQpKSwiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KSkpOiJzdHJpbmciPT10eXBlb2YgdCYmaSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksci5mb3JFYWNoKGZ1bmN0aW9uKHQpe28uaW5kZXhPZih0KTwwJiZpKG4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKX0pLG99fV0pLHR9KCksbGU9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0aSIsInRyIiwidXoiLCJ3YSJdLG5yOlsxLDJdLGZjOjF9LHtsbmdzOlsiYWYiLCJhbiIsImFzdCIsImF6IiwiYmciLCJibiIsImNhIiwiZGEiLCJkZSIsImRldiIsImVsIiwiZW4iLCJlbyIsImVzIiwiZXQiLCJldSIsImZpIiwiZm8iLCJmdXIiLCJmeSIsImdsIiwiZ3UiLCJoYSIsImhpIiwiaHUiLCJoeSIsImlhIiwiaXQiLCJrbiIsImt1IiwibGIiLCJtYWkiLCJtbCIsIm1uIiwibXIiLCJuYWgiLCJuYXAiLCJuYiIsIm5lIiwibmwiLCJubiIsIm5vIiwibnNvIiwicGEiLCJwYXAiLCJwbXMiLCJwcyIsInB0LVBUIiwicm0iLCJzY28iLCJzZSIsInNpIiwic28iLCJzb24iLCJzcSIsInN2Iiwic3ciLCJ0YSIsInRlIiwidGsiLCJ1ciIsInlvIl0sbnI6WzEsMl0sZmM6Mn0se2xuZ3M6WyJheSIsImJvIiwiY2dnIiwiZmEiLCJodCIsImlkIiwiamEiLCJqYm8iLCJrYSIsImtrIiwia20iLCJrbyIsImt5IiwibG8iLCJtcyIsInNhaCIsInN1IiwidGgiLCJ0dCIsInVnIiwidmkiLCJ3byIsInpoIl0sbnI6WzFdLGZjOjN9LHtsbmdzOlsiYmUiLCJicyIsImNuciIsImR6IiwiaHIiLCJydSIsInNyIiwidWsiXSxucjpbMSwyLDVdLGZjOjR9LHtsbmdzOlsiYXIiXSxucjpbMCwxLDIsMywxMSwxMDBdLGZjOjV9LHtsbmdzOlsiY3MiLCJzayJdLG5yOlsxLDIsNV0sZmM6Nn0se2xuZ3M6WyJjc2IiLCJwbCJdLG5yOlsxLDIsNV0sZmM6N30se2xuZ3M6WyJjeSJdLG5yOlsxLDIsMyw4XSxmYzo4fSx7bG5nczpbImZyIl0sbnI6WzEsMl0sZmM6OX0se2xuZ3M6WyJnYSJdLG5yOlsxLDIsMyw3LDExXSxmYzoxMH0se2xuZ3M6WyJnZCJdLG5yOlsxLDIsMywyMF0sZmM6MTF9LHtsbmdzOlsiaXMiXSxucjpbMSwyXSxmYzoxMn0se2xuZ3M6WyJqdiJdLG5yOlswLDFdLGZjOjEzfSx7bG5nczpbImt3Il0sbnI6WzEsMiwzLDRdLGZjOjE0fSx7bG5nczpbImx0Il0sbnI6WzEsMiwxMF0sZmM6MTV9LHtsbmdzOlsibHYiXSxucjpbMSwyLDBdLGZjOjE2fSx7bG5nczpbIm1rIl0sbnI6WzEsMl0sZmM6MTd9LHtsbmdzOlsibW5rIl0sbnI6WzAsMSwyXSxmYzoxOH0se2xuZ3M6WyJtdCJdLG5yOlsxLDIsMTEsMjBdLGZjOjE5fSx7bG5nczpbIm9yIl0sbnI6WzIsMV0sZmM6Mn0se2xuZ3M6WyJybyJdLG5yOlsxLDIsMjBdLGZjOjIwfSx7bG5nczpbInNsIl0sbnI6WzUsMSwyLDNdLGZjOjIxfSx7bG5nczpbImhlIiwiaXciXSxucjpbMSwyLDIwLDIxXSxmYzoyMn1dLGZlPXsxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD4xKX0sMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDEhPXQpfSwzOmZ1bmN0aW9uKHQpe3JldHVybiAwfSw0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjI9PXQ%2FMjp0JTEwMD49MyYmdCUxMDA8PTEwPzM6dCUxMDA%2BPTExPzQ6NSl9LDY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dD49MiYmdDw9ND8xOjIpfSw3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOnQlMTA%2BPTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA%2BPTIwKT8xOjIpfSw4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMTo4IT10JiYxMSE9dD8yOjMpfSw5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD49Mil9LDEwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMTp0PDc%2FMjp0PDExPzM6NCl9LDExOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dHx8MTE9PXQ%2FMDoyPT10fHwxMj09dD8xOnQ%2BMiYmdDwyMD8yOjMpfSwxMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAhPTF8fHQlMTAwPT0xMSl9LDEzOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMCE9PXQpfSwxNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ%2FMDoyPT10PzE6Mz09dD8yOjMpfSwxNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA%2BPTImJih0JTEwMDwxMHx8dCUxMDA%2BPTIwKT8xOjIpfSwxNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOjAhPT10PzE6Mil9LDE3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dHx8dCUxMD09MSYmdCUxMDAhPTExPzA6MSl9LDE4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMD09dD8wOjE9PXQ%2FMToyKX0sMTk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6MD09dHx8dCUxMDA%2BMSYmdCUxMDA8MTE%2FMTp0JTEwMD4xMCYmdCUxMDA8MjA%2FMjozKX0sMjA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6MD09dHx8dCUxMDA%2BMCYmdCUxMDA8MjA%2FMToyKX0sMjE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwMD09MT8xOnQlMTAwPT0yPzI6dCUxMDA9PTN8fHQlMTAwPT00PzM6MCl9LDIyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMToodDwwfHx0PjEwKSYmdCUxMD09MD8yOjMpfX07dmFyIHBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbixyPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtfdCh0aGlzLHQpLHRoaXMubGFuZ3VhZ2VVdGlscz1lLHRoaXMub3B0aW9ucz1yLHRoaXMubG9nZ2VyPSR0LmNyZWF0ZSgicGx1cmFsUmVzb2x2ZXIiKSx0aGlzLnJ1bGVzPShuPXt9LGxlLmZvckVhY2goZnVuY3Rpb24odCl7dC5sbmdzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlXT17bnVtYmVyczp0Lm5yLHBsdXJhbHM6ZmVbdC5mY119fSl9KSxuKX1yZXR1cm4gVXQodCxbe2tleToiYWRkUnVsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLnJ1bGVzW3RdPWV9fSx7a2V5OiJnZXRSdWxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ydWxlc1t0XXx8dGhpcy5ydWxlc1t0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCldfX0se2tleToibmVlZHNQbHVyYWwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gZSYmZS5udW1iZXJzLmxlbmd0aD4xfX0se2tleToiZ2V0UGx1cmFsRm9ybXNPZktleSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9W10sbz10aGlzLmdldFJ1bGUodCk7cmV0dXJuIG8%2FKG8ubnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPW4uZ2V0U3VmZml4KHQsbyk7ci5wdXNoKCIiLmNvbmNhdChlKS5jb25jYXQoaSkpfSkscik6cn19LHtrZXk6ImdldFN1ZmZpeCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5nZXRSdWxlKHQpO2lmKHIpe3ZhciBvPXIubm9BYnM%2Fci5wbHVyYWxzKGUpOnIucGx1cmFscyhNYXRoLmFicyhlKSksaT1yLm51bWJlcnNbb107dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4JiYyPT09ci5udW1iZXJzLmxlbmd0aCYmMT09PXIubnVtYmVyc1swXSYmKDI9PT1pP2k9InBsdXJhbCI6MT09PWkmJihpPSIiKSk7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gbi5vcHRpb25zLnByZXBlbmQmJmkudG9TdHJpbmcoKT9uLm9wdGlvbnMucHJlcGVuZCtpLnRvU3RyaW5nKCk6aS50b1N0cmluZygpfTtyZXR1cm4idjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPzE9PT1pPyIiOiJudW1iZXIiPT10eXBlb2YgaT8iX3BsdXJhbF8iLmNvbmNhdChpLnRvU3RyaW5nKCkpOmEoKToidjIiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OP2EoKTp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdP2EoKTp0aGlzLm9wdGlvbnMucHJlcGVuZCYmby50b1N0cmluZygpP3RoaXMub3B0aW9ucy5wcmVwZW5kK28udG9TdHJpbmcoKTpvLnRvU3RyaW5nKCl9cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIm5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogIi5jb25jYXQodCkpLCIifX1dKSx0fSgpLGhlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtfdCh0aGlzLHQpLHRoaXMubG9nZ2VyPSR0LmNyZWF0ZSgiaW50ZXJwb2xhdG9yIiksdGhpcy5vcHRpb25zPWUsdGhpcy5mb3JtYXQ9ZS5pbnRlcnBvbGF0aW9uJiZlLmludGVycG9sYXRpb24uZm9ybWF0fHxmdW5jdGlvbih0KXtyZXR1cm4gdH0sdGhpcy5pbml0KGUpfXJldHVybiBVdCh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0LmludGVycG9sYXRpb258fCh0LmludGVycG9sYXRpb249e2VzY2FwZVZhbHVlOiEwfSk7dmFyIGU9dC5pbnRlcnBvbGF0aW9uO3RoaXMuZXNjYXBlPXZvaWQgMCE9PWUuZXNjYXBlP2UuZXNjYXBlOm5lLHRoaXMuZXNjYXBlVmFsdWU9dm9pZCAwPT09ZS5lc2NhcGVWYWx1ZXx8ZS5lc2NhcGVWYWx1ZSx0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGU9dm9pZCAwIT09ZS51c2VSYXdWYWx1ZVRvRXNjYXBlJiZlLnVzZVJhd1ZhbHVlVG9Fc2NhcGUsdGhpcy5wcmVmaXg9ZS5wcmVmaXg%2FdGUoZS5wcmVmaXgpOmUucHJlZml4RXNjYXBlZHx8Int7Iix0aGlzLnN1ZmZpeD1lLnN1ZmZpeD90ZShlLnN1ZmZpeCk6ZS5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1lLnVuZXNjYXBlU3VmZml4PyIiOmUudW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg%2FIiI6ZS51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PWUubmVzdGluZ1ByZWZpeD90ZShlLm5lc3RpbmdQcmVmaXgpOmUubmVzdGluZ1ByZWZpeEVzY2FwZWR8fHRlKCIkdCgiKSx0aGlzLm5lc3RpbmdTdWZmaXg9ZS5uZXN0aW5nU3VmZml4P3RlKGUubmVzdGluZ1N1ZmZpeCk6ZS5uZXN0aW5nU3VmZml4RXNjYXBlZHx8dGUoIikiKSx0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yPWUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I%2FZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjplLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yfHwiLCIsdGhpcy5tYXhSZXBsYWNlcz1lLm1heFJlcGxhY2VzP2UubWF4UmVwbGFjZXM6MWUzLHRoaXMuYWx3YXlzRm9ybWF0PXZvaWQgMCE9PWUuYWx3YXlzRm9ybWF0JiZlLmFsd2F5c0Zvcm1hdCx0aGlzLnJlc2V0UmVnRXhwKCl9fSx7a2V5OiJyZXNldCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMmJnRoaXMuaW5pdCh0aGlzLm9wdGlvbnMpfX0se2tleToicmVzZXRSZWdFeHAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9IiIuY29uY2F0KHRoaXMucHJlZml4LCIoLis%2FKSIpLmNvbmNhdCh0aGlzLnN1ZmZpeCk7dGhpcy5yZWdleHA9bmV3IFJlZ0V4cCh0LCJnIik7dmFyIGU9IiIuY29uY2F0KHRoaXMucHJlZml4KS5jb25jYXQodGhpcy51bmVzY2FwZVByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy51bmVzY2FwZVN1ZmZpeCkuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cFVuZXNjYXBlPW5ldyBSZWdFeHAoZSwiZyIpO3ZhciBuPSIiLmNvbmNhdCh0aGlzLm5lc3RpbmdQcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMubmVzdGluZ1N1ZmZpeCk7dGhpcy5uZXN0aW5nUmVnZXhwPW5ldyBSZWdFeHAobiwiZyIpfX0se2tleToiaW50ZXJwb2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzPXRoaXMsdT10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uJiZ0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzfHx7fTtmdW5jdGlvbiBjKHQpe3JldHVybiB0LnJlcGxhY2UoL1wkL2csIiQkJCQiKX12YXIgbD1mdW5jdGlvbih0KXtpZih0LmluZGV4T2Yocy5mb3JtYXRTZXBhcmF0b3IpPDApe3ZhciBvPVF0KGUsdSx0KTtyZXR1cm4gcy5hbHdheXNGb3JtYXQ%2Fcy5mb3JtYXQobyx2b2lkIDAsbik6b312YXIgaT10LnNwbGl0KHMuZm9ybWF0U2VwYXJhdG9yKSxhPWkuc2hpZnQoKS50cmltKCksYz1pLmpvaW4ocy5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtyZXR1cm4gcy5mb3JtYXQoUXQoZSx1LGEpLGMsbixyKX07dGhpcy5yZXNldFJlZ0V4cCgpO3ZhciBmPXImJnIubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyfHx0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyLHA9ciYmci5pbnRlcnBvbGF0aW9uJiZyLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzfHx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM7cmV0dXJuW3tyZWdleDp0aGlzLnJlZ2V4cFVuZXNjYXBlLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gYyh0KX19LHtyZWdleDp0aGlzLnJlZ2V4cCxzYWZlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHMuZXNjYXBlVmFsdWU%2FYyhzLmVzY2FwZSh0KSk6Yyh0KX19XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihhPTA7bz1lLnJlZ2V4LmV4ZWModCk7KXtpZih2b2lkIDA9PT0oaT1sKG9bMV0udHJpbSgpKSkpaWYoImZ1bmN0aW9uIj09dHlwZW9mIGYpe3ZhciBuPWYodCxvLHIpO2k9InN0cmluZyI9PXR5cGVvZiBuP246IiJ9ZWxzZXtpZihwKXtpPW9bMF07Y29udGludWV9cy5sb2dnZXIud2FybigibWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgIi5jb25jYXQob1sxXSwiIGZvciBpbnRlcnBvbGF0aW5nICIpLmNvbmNhdCh0KSksaT0iIn1lbHNlInN0cmluZyI9PXR5cGVvZiBpfHxzLnVzZVJhd1ZhbHVlVG9Fc2NhcGV8fChpPUd0KGkpKTtpZih0PXQucmVwbGFjZShvWzBdLGUuc2FmZVZhbHVlKGkpKSxlLnJlZ2V4Lmxhc3RJbmRleD0wLCsrYT49cy5tYXhSZXBsYWNlcylicmVha319KSx0fX0se2tleToibmVzdCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG89dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg%2BMiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxhPUR0KHt9LGkpO2Z1bmN0aW9uIHModCxlKXt2YXIgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHQuaW5kZXhPZihuKTwwKXJldHVybiB0O3ZhciByPXQuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQobiwiWyBdKnsiKSkpLG89InsiLmNvbmNhdChyWzFdKTt0PXJbMF0sbz0obz10aGlzLmludGVycG9sYXRlKG8sYSkpLnJlcGxhY2UoLycvZywnIicpO3RyeXthPUpTT04ucGFyc2UobyksZSYmKGE9RHQoe30sZSxhKSl9Y2F0Y2goZSl7cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImZhaWxlZCBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nIGluIG5lc3RpbmcgZm9yIGtleSAiLmNvbmNhdCh0KSxlKSwiIi5jb25jYXQodCkuY29uY2F0KG4pLmNvbmNhdChvKX1yZXR1cm4gZGVsZXRlIGEuZGVmYXVsdFZhbHVlLHR9Zm9yKGEuYXBwbHlQb3N0UHJvY2Vzc29yPSExLGRlbGV0ZSBhLmRlZmF1bHRWYWx1ZTtuPXRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKHQpOyl7dmFyIHU9W10sYz0hMTtpZihuWzBdLmluY2x1ZGVzKHRoaXMuZm9ybWF0U2VwYXJhdG9yKSYmIS97Lip9Ly50ZXN0KG5bMV0pKXt2YXIgbD1uWzFdLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSk7blsxXT1sLnNoaWZ0KCksdT1sLGM9ITB9aWYoKHI9ZShzLmNhbGwodGhpcyxuWzFdLnRyaW0oKSxhKSxhKSkmJm5bMF09PT10JiYic3RyaW5nIiE9dHlwZW9mIHIpcmV0dXJuIHI7InN0cmluZyIhPXR5cGVvZiByJiYocj1HdChyKSkscnx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG5bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHI9IiIpLGMmJihyPXUucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uZm9ybWF0KHQsZSxpLmxuZyxpKX0sci50cmltKCkpKSx0PXQucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiB0fX1dKSx0fSgpO3ZhciBkZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsbixyKXt2YXIgbyxpPWFyZ3VtZW50cy5sZW5ndGg%2BMyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gX3QodGhpcyxlKSxvPXF0KHRoaXMsRnQoZSkuY2FsbCh0aGlzKSkscmUmJlZ0LmNhbGwoQnQobykpLG8uYmFja2VuZD10LG8uc3RvcmU9bixvLnNlcnZpY2VzPXIsby5sYW5ndWFnZVV0aWxzPXIubGFuZ3VhZ2VVdGlscyxvLm9wdGlvbnM9aSxvLmxvZ2dlcj0kdC5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSxvLnN0YXRlPXt9LG8ucXVldWU9W10sby5iYWNrZW5kJiZvLmJhY2tlbmQuaW5pdCYmby5iYWNrZW5kLmluaXQocixpLmJhY2tlbmQsaSksb31yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToicXVldWVMb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz10aGlzLGk9W10sYT1bXSxzPVtdLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj0hMDtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHM9IiIuY29uY2F0KHQsInwiKS5jb25jYXQoZSk7IW4ucmVsb2FkJiZvLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHQsZSk%2Fby5zdGF0ZVtzXT0yOm8uc3RhdGVbc108MHx8KDE9PT1vLnN0YXRlW3NdP2EuaW5kZXhPZihzKTwwJiZhLnB1c2gocyk6KG8uc3RhdGVbc109MSxyPSExLGEuaW5kZXhPZihzKTwwJiZhLnB1c2gocyksaS5pbmRleE9mKHMpPDAmJmkucHVzaChzKSx1LmluZGV4T2YoZSk8MCYmdS5wdXNoKGUpKSl9KSxyfHxzLnB1c2godCl9KSwoaS5sZW5ndGh8fGEubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOmEsbG9hZGVkOnt9LGVycm9yczpbXSxjYWxsYmFjazpyfSkse3RvTG9hZDppLHBlbmRpbmc6YSx0b0xvYWRMYW5ndWFnZXM6cyx0b0xvYWROYW1lc3BhY2VzOnV9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5zcGxpdCgifCIpLG89clswXSxpPXJbMV07ZSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixvLGksZSksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShvLGksbiksdGhpcy5zdGF0ZVt0XT1lPy0xOjI7dmFyIGE9e307dGhpcy5xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKG4peyFmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1LdCh0LGUsT2JqZWN0KSxpPW8ub2JqLGE9by5rO2lbYV09aVthXXx8W10sciYmKGlbYV09aVthXS5jb25jYXQobikpLHJ8fGlbYV0ucHVzaChuKX0obi5sb2FkZWQsW29dLGkpLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuaW5kZXhPZihlKTstMSE9PW47KXQuc3BsaWNlKG4sMSksbj10LmluZGV4T2YoZSl9KG4ucGVuZGluZyx0KSxlJiZuLmVycm9ycy5wdXNoKGUpLDAhPT1uLnBlbmRpbmcubGVuZ3RofHxuLmRvbmV8fChPYmplY3Qua2V5cyhuLmxvYWRlZCkuZm9yRWFjaChmdW5jdGlvbih0KXthW3RdfHwoYVt0XT1bXSksbi5sb2FkZWRbdF0ubGVuZ3RoJiZuLmxvYWRlZFt0XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2FbdF0uaW5kZXhPZihlKTwwJiZhW3RdLnB1c2goZSl9KX0pLG4uZG9uZT0hMCxuLmVycm9ycy5sZW5ndGg%2Fbi5jYWxsYmFjayhuLmVycm9ycyk6bi5jYWxsYmFjaygpKX0pLHRoaXMuZW1pdCgibG9hZGVkIixhKSx0aGlzLnF1ZXVlPXRoaXMucXVldWUuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRvbmV9KX19LHtrZXk6InJlYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10%2FYXJndW1lbnRzWzNdOjAsaT1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MzUwLGE9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7cmV0dXJuIHQubGVuZ3RoP3RoaXMuYmFja2VuZFtuXSh0LGUsZnVuY3Rpb24ocyx1KXtzJiZ1JiZvPDU%2Fc2V0VGltZW91dChmdW5jdGlvbigpe3IucmVhZC5jYWxsKHIsdCxlLG4sbysxLDIqaSxhKX0saSk6YShzLHUpfSk6YShudWxsLHt9KX19LHtrZXk6InByZXBhcmVMb2FkaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30sbz1hcmd1bWVudHMubGVuZ3RoPjM%2FYXJndW1lbnRzWzNdOnZvaWQgMDtpZighdGhpcy5iYWNrZW5kKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLiIpLG8mJm8oKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkpLCJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKTt2YXIgaT10aGlzLnF1ZXVlTG9hZCh0LGUscixvKTtpZighaS50b0xvYWQubGVuZ3RoKXJldHVybiBpLnBlbmRpbmcubGVuZ3RofHxvKCksbnVsbDtpLnRvTG9hZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ubG9hZE9uZSh0KX0pfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMucHJlcGFyZUxvYWRpbmcodCxlLHt9LG4pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse3JlbG9hZDohMH0sbil9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOiIiLHI9dC5zcGxpdCgifCIpLG89clswXSxpPXJbMV07dGhpcy5yZWFkKG8saSwicmVhZCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihyLGEpe3ImJmUubG9nZ2VyLndhcm4oIiIuY29uY2F0KG4sImxvYWRpbmcgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvLCIgZmFpbGVkIiksciksIXImJmEmJmUubG9nZ2VyLmxvZygiIi5jb25jYXQobiwibG9hZGVkIG5hbWVzcGFjZSAiKS5jb25jYXQoaSwiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQobyksYSksZS5sb2FkZWQodCxyLGEpfSl9fSx7a2V5OiJzYXZlTWlzc2luZyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e307dGhpcy5zZXJ2aWNlcy51dGlscyYmdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShlKT90aGlzLmxvZ2dlci53YXJuKCdkaWQgbm90IHNhdmUga2V5ICInLmNvbmNhdChuLCciIGFzIHRoZSBuYW1lc3BhY2UgIicpLmNvbmNhdChlLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKTpudWxsIT1uJiYiIiE9PW4mJih0aGlzLmJhY2tlbmQmJnRoaXMuYmFja2VuZC5jcmVhdGUmJnRoaXMuYmFja2VuZC5jcmVhdGUodCxlLG4scixudWxsLER0KHt9LGkse2lzVXBkYXRlOm99KSksdCYmdFswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZSh0WzBdLGUsbixyKSl9fV0pLGV9KCk7ZnVuY3Rpb24gZ2UoKXtyZXR1cm57ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsd2hpdGVsaXN0OiExLG5vbkV4cGxpY2l0V2hpdGVsaXN0OiExLHN1cHBvcnRlZExuZ3M6ITEsbm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzOiExLGxvYWQ6ImFsbCIscHJlbG9hZDohMSxzaW1wbGlmeVBsdXJhbFN1ZmZpeDohMCxrZXlTZXBhcmF0b3I6Ii4iLG5zU2VwYXJhdG9yOiI6IixwbHVyYWxTZXBhcmF0b3I6Il8iLGNvbnRleHRTZXBhcmF0b3I6Il8iLHBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzOiExLHNhdmVNaXNzaW5nOiExLHVwZGF0ZU1pc3Npbmc6ITEsc2F2ZU1pc3NpbmdUbzoiZmFsbGJhY2siLHNhdmVNaXNzaW5nUGx1cmFsczohMCxtaXNzaW5nS2V5SGFuZGxlcjohMSxtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXI6ITEscG9zdFByb2Nlc3M6ITEscG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ6ITEscmV0dXJuTnVsbDohMCxyZXR1cm5FbXB0eVN0cmluZzohMCxyZXR1cm5PYmplY3RzOiExLGpvaW5BcnJheXM6ITEscmV0dXJuZWRPYmplY3RIYW5kbGVyOiExLHBhcnNlTWlzc2luZ0tleUhhbmRsZXI6ITEsYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5OiExLGFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlOiExLG92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXt9O2lmKCJvYmplY3QiPT09TnQodFsxXSkmJihlPXRbMV0pLCJzdHJpbmciPT10eXBlb2YgdFsxXSYmKGUuZGVmYXVsdFZhbHVlPXRbMV0pLCJzdHJpbmciPT10eXBlb2YgdFsyXSYmKGUudERlc2NyaXB0aW9uPXRbMl0pLCJvYmplY3QiPT09TnQodFsyXSl8fCJvYmplY3QiPT09TnQodFszXSkpe3ZhciBuPXRbM118fHRbMl07T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW5bdF19KX1yZXR1cm4gZX0saW50ZXJwb2xhdGlvbjp7ZXNjYXBlVmFsdWU6ITAsZm9ybWF0OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0fSxwcmVmaXg6Int7IixzdWZmaXg6In19Iixmb3JtYXRTZXBhcmF0b3I6IiwiLHVuZXNjYXBlUHJlZml4OiItIixuZXN0aW5nUHJlZml4OiIkdCgiLG5lc3RpbmdTdWZmaXg6IikiLG5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOiIsIixtYXhSZXBsYWNlczoxZTMsc2tpcE9uVmFyaWFibGVzOiExfX19ZnVuY3Rpb24gdmUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0Lm5zJiYodC5ucz1bdC5uc10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja0xuZyYmKHQuZmFsbGJhY2tMbmc9W3QuZmFsbGJhY2tMbmddKSwic3RyaW5nIj09dHlwZW9mIHQuZmFsbGJhY2tOUyYmKHQuZmFsbGJhY2tOUz1bdC5mYWxsYmFja05TXSksdC53aGl0ZWxpc3QmJih0LndoaXRlbGlzdCYmdC53aGl0ZWxpc3QuaW5kZXhPZigiY2ltb2RlIik8MCYmKHQud2hpdGVsaXN0PXQud2hpdGVsaXN0LmNvbmNhdChbImNpbW9kZSJdKSksdC5zdXBwb3J0ZWRMbmdzPXQud2hpdGVsaXN0KSx0Lm5vbkV4cGxpY2l0V2hpdGVsaXN0JiYodC5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M9dC5ub25FeHBsaWNpdFdoaXRlbGlzdCksdC5zdXBwb3J0ZWRMbmdzJiZ0LnN1cHBvcnRlZExuZ3MuaW5kZXhPZigiY2ltb2RlIik8MCYmKHQuc3VwcG9ydGVkTG5ncz10LnN1cHBvcnRlZExuZ3MuY29uY2F0KFsiY2ltb2RlIl0pKSx0fWZ1bmN0aW9uIHllKCl7fXZhciBtZT1uZXcoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciB0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoX3QodGhpcyxlKSx0PXF0KHRoaXMsRnQoZSkuY2FsbCh0aGlzKSkscmUmJlZ0LmNhbGwoQnQodCkpLHQub3B0aW9ucz12ZShuKSx0LnNlcnZpY2VzPXt9LHQubG9nZ2VyPSR0LHQubW9kdWxlcz17ZXh0ZXJuYWw6W119LHImJiF0LmlzSW5pdGlhbGl6ZWQmJiFuLmlzQ2xvbmUpe2lmKCF0Lm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gdC5pbml0KG4scikscXQodCxCdCh0KSk7c2V0VGltZW91dChmdW5jdGlvbigpe3QuaW5pdChuLHIpfSwwKX1yZXR1cm4gdH1yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdD9uZXcgdDp0Om51bGx9aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUmJihuPWUsZT17fSksZS53aGl0ZWxpc3QmJiFlLnN1cHBvcnRlZExuZ3MmJnRoaXMubG9nZ2VyLmRlcHJlY2F0ZSgid2hpdGVsaXN0Iiwnb3B0aW9uICJ3aGl0ZWxpc3QiIHdpbGwgYmUgcmVuYW1lZCB0byAic3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLGUubm9uRXhwbGljaXRXaGl0ZWxpc3QmJiFlLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb25zICJub25FeHBsaWNpdFdoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MiIGluIHRoZSBuZXh0IG1ham9yIC0gcGxlYXNlIG1ha2Ugc3VyZSB0byByZW5hbWUgdGhpcyBvcHRpb24gYXNhcC4nKSx0aGlzLm9wdGlvbnM9RHQoe30sZ2UoKSx0aGlzLm9wdGlvbnMsdmUoZSkpLHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxufHwobj15ZSksIXRoaXMub3B0aW9ucy5pc0Nsb25lKXt0aGlzLm1vZHVsZXMubG9nZ2VyPyR0LmluaXQocih0aGlzLm1vZHVsZXMubG9nZ2VyKSx0aGlzLm9wdGlvbnMpOiR0LmluaXQobnVsbCx0aGlzLm9wdGlvbnMpO3ZhciBvPW5ldyBjZSh0aGlzLm9wdGlvbnMpO3RoaXMuc3RvcmU9bmV3IG9lKHRoaXMub3B0aW9ucy5yZXNvdXJjZXMsdGhpcy5vcHRpb25zKTt2YXIgaT10aGlzLnNlcnZpY2VzO2kubG9nZ2VyPSR0LGkucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLGkubGFuZ3VhZ2VVdGlscz1vLGkucGx1cmFsUmVzb2x2ZXI9bmV3IHBlKG8se3ByZXBlbmQ6dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcixjb21wYXRpYmlsaXR5SlNPTjp0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04sc2ltcGxpZnlQbHVyYWxTdWZmaXg6dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4fSksaS5pbnRlcnBvbGF0b3I9bmV3IGhlKHRoaXMub3B0aW9ucyksaS51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LGkuYmFja2VuZENvbm5lY3Rvcj1uZXcgZGUocih0aGlzLm1vZHVsZXMuYmFja2VuZCksaS5yZXNvdXJjZVN0b3JlLGksdGhpcy5vcHRpb25zKSxpLmJhY2tlbmRDb25uZWN0b3Iub24oIioiLGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4%2BMT9uLTE6MCksbz0xO288bjtvKyspcltvLTFdPWFyZ3VtZW50c1tvXTt0LmVtaXQuYXBwbHkodCxbZV0uY29uY2F0KHIpKX0pLHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yJiYoaS5sYW5ndWFnZURldGVjdG9yPXIodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpLGkubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KGksdGhpcy5vcHRpb25zLmRldGVjdGlvbix0aGlzLm9wdGlvbnMpKSx0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCYmKGkuaTE4bkZvcm1hdD1yKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSxpLmkxOG5Gb3JtYXQuaW5pdCYmaS5pMThuRm9ybWF0LmluaXQodGhpcykpLHRoaXMudHJhbnNsYXRvcj1uZXcgc2UodGhpcy5zZXJ2aWNlcyx0aGlzLm9wdGlvbnMpLHRoaXMudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pbml0JiZlLmluaXQodCl9KX10aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3J8fHRoaXMub3B0aW9ucy5sbmd8fHRoaXMubG9nZ2VyLndhcm4oImluaXQ6IG5vIGxhbmd1YWdlRGV0ZWN0b3IgaXMgdXNlZCBhbmQgbm8gbG5nIGlzIGRlZmluZWQiKTt2YXIgYT1bImdldFJlc291cmNlIiwiaGFzUmVzb3VyY2VCdW5kbGUiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsImdldERhdGFCeUxhbmd1YWdlIl07YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4obj10LnN0b3JlKVtlXS5hcHBseShuLGFyZ3VtZW50cyl9fSk7dmFyIHM9WyJhZGRSZXNvdXJjZSIsImFkZFJlc291cmNlcyIsImFkZFJlc291cmNlQnVuZGxlIiwicmVtb3ZlUmVzb3VyY2VCdW5kbGUiXTtzLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKSx0fX0pO3ZhciB1PVl0KCksYz1mdW5jdGlvbigpe3QuY2hhbmdlTGFuZ3VhZ2UodC5vcHRpb25zLmxuZyxmdW5jdGlvbihlLHIpe3QuaXNJbml0aWFsaXplZD0hMCx0Lm9wdGlvbnMuaXNDbG9uZXx8dC5sb2dnZXIubG9nKCJpbml0aWFsaXplZCIsdC5vcHRpb25zKSx0LmVtaXQoImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHUucmVzb2x2ZShyKSxuKGUscil9KX07cmV0dXJuIHRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fCF0aGlzLm9wdGlvbnMuaW5pdEltbWVkaWF0ZT9jKCk6c2V0VGltZW91dChjLDApLHV9fSx7a2V5OiJsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOnllLHI9bixvPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMubGFuZ3VhZ2U7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihyPXQpLCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHx0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpe2lmKG8mJiJjaW1vZGUiPT09by50b0xvd2VyQ2FzZSgpKXJldHVybiByKCk7dmFyIGk9W10sYT1mdW5jdGlvbih0KXt0JiZlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2goZnVuY3Rpb24odCl7aS5pbmRleE9mKHQpPDAmJmkucHVzaCh0KX0pfTtpZihvKWEobyk7ZWxzZXt2YXIgcz10aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpO3MuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gYSh0KX0pfXRoaXMub3B0aW9ucy5wcmVsb2FkJiZ0aGlzLm9wdGlvbnMucHJlbG9hZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmxvYWQoaSx0aGlzLm9wdGlvbnMubnMscil9ZWxzZSByKG51bGwpfX0se2tleToicmVsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9WXQoKTtyZXR1cm4gdHx8KHQ9dGhpcy5sYW5ndWFnZXMpLGV8fChlPXRoaXMub3B0aW9ucy5ucyksbnx8KG49eWUpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5yZWxvYWQodCxlLGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLG4odCl9KSxyfX0se2tleToidXNlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhbiB1bmRlZmluZWQgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO2lmKCF0LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYSB3cm9uZyBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7cmV0dXJuImJhY2tlbmQiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmJhY2tlbmQ9dCksKCJsb2dnZXIiPT09dC50eXBlfHx0LmxvZyYmdC53YXJuJiZ0LmVycm9yKSYmKHRoaXMubW9kdWxlcy5sb2dnZXI9dCksImxhbmd1YWdlRGV0ZWN0b3IiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3I9dCksImkxOG5Gb3JtYXQiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQ9dCksInBvc3RQcm9jZXNzb3IiPT09dC50eXBlJiZpZS5hZGRQb3N0UHJvY2Vzc29yKHQpLCIzcmRQYXJ0eSI9PT10LnR5cGUmJnRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKHQpLHRoaXN9fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89dDt2YXIgcj1ZdCgpO3RoaXMuZW1pdCgibGFuZ3VhZ2VDaGFuZ2luZyIsdCk7dmFyIG89ZnVuY3Rpb24odCl7dmFyIG89InN0cmluZyI9PXR5cGVvZiB0P3Q6bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEJlc3RNYXRjaEZyb21Db2Rlcyh0KTtvJiYobi5sYW5ndWFnZXx8KG4ubGFuZ3VhZ2U9byxuLmxhbmd1YWdlcz1uLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KG8pKSxuLnRyYW5zbGF0b3IubGFuZ3VhZ2V8fG4udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShvKSxuLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJm4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5jYWNoZVVzZXJMYW5ndWFnZShvKSksbi5sb2FkUmVzb3VyY2VzKG8sZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsbyl7bz8obi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobyksbi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLG4uZW1pdCgibGFuZ3VhZ2VDaGFuZ2VkIixvKSxuLmxvZ2dlci5sb2coImxhbmd1YWdlQ2hhbmdlZCIsbykpOm4uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLHIucmVzb2x2ZShmdW5jdGlvbigpe3JldHVybiBuLnQuYXBwbHkobixhcmd1bWVudHMpfSksZSYmZSh0LGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KX0odCxvKX0pfTtyZXR1cm4gdHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyF0JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz90aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KG8pOm8odCk6byh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpLHJ9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWZ1bmN0aW9uIHQoZSxyKXt2YXIgbztpZigib2JqZWN0IiE9PU50KHIpKXtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShpPjI%2FaS0yOjApLHM9MjtzPGk7cysrKWFbcy0yXT1hcmd1bWVudHNbc107bz1uLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoW2Uscl0uY29uY2F0KGEpKX1lbHNlIG89RHQoe30scik7cmV0dXJuIG8ubG5nPW8ubG5nfHx0LmxuZyxvLmxuZ3M9by5sbmdzfHx0LmxuZ3Msby5ucz1vLm5zfHx0Lm5zLG4udChlLG8pfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ%2Fci5sbmc9dDpyLmxuZ3M9dCxyLm5zPWUscn19LHtrZXk6InQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS50cmFuc2xhdGUuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJih0PXRoaXMudHJhbnNsYXRvcikuZXhpc3RzLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6InNldERlZmF1bHROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5kZWZhdWx0TlM9dH19LHtrZXk6Imhhc0xvYWRlZE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighdGhpcy5pc0luaXRpYWxpemVkKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG5leHQgd2FzIG5vdCBpbml0aWFsaXplZCIsdGhpcy5sYW5ndWFnZXMpLCExO2lmKCF0aGlzLmxhbmd1YWdlc3x8IXRoaXMubGFuZ3VhZ2VzLmxlbmd0aClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuLmxhbmd1YWdlcyB3ZXJlIHVuZGVmaW5lZCBvciBlbXB0eSIsdGhpcy5sYW5ndWFnZXMpLCExO3ZhciByPXRoaXMubGFuZ3VhZ2VzWzBdLG89ISF0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxpPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZigiY2ltb2RlIj09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDt2YXIgYT1mdW5jdGlvbih0LG4pe3ZhciByPWUuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQodCwifCIpLmNvbmNhdChuKV07cmV0dXJuLTE9PT1yfHwyPT09cn07aWYobi5wcmVjaGVjayl7dmFyIHM9bi5wcmVjaGVjayh0aGlzLGEpO2lmKHZvaWQgMCE9PXMpcmV0dXJuIHN9cmV0dXJuISF0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHIsdCl8fCghdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmR8fCEoIWEocix0KXx8byYmIWEoaSx0KSkpfX0se2tleToibG9hZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPVl0KCk7cmV0dXJuIHRoaXMub3B0aW9ucy5ucz8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZuLm9wdGlvbnMubnMucHVzaCh0KX0pLHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbih0KXtyLnJlc29sdmUoKSxlJiZlKHQpfSkscik6KGUmJmUoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJsb2FkTGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPVl0KCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pO3ZhciByPXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxvPXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiByLmluZGV4T2YodCk8MH0pO3JldHVybiBvLmxlbmd0aD8odGhpcy5vcHRpb25zLnByZWxvYWQ9ci5jb25jYXQobyksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe24ucmVzb2x2ZSgpLGUmJmUodCl9KSxuKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImRpciIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodHx8KHQ9dGhpcy5sYW5ndWFnZXMmJnRoaXMubGFuZ3VhZ2VzLmxlbmd0aD4wP3RoaXMubGFuZ3VhZ2VzWzBdOnRoaXMubGFuZ3VhZ2UpLCF0KXJldHVybiJydGwiO3JldHVyblsiYXIiLCJzaHUiLCJzcXIiLCJzc2giLCJ4YWEiLCJ5aGQiLCJ5dWQiLCJhYW8iLCJhYmgiLCJhYnYiLCJhY20iLCJhY3EiLCJhY3ciLCJhY3giLCJhY3kiLCJhZGYiLCJhZHMiLCJhZWIiLCJhZWMiLCJhZmIiLCJhanAiLCJhcGMiLCJhcGQiLCJhcmIiLCJhcnEiLCJhcnMiLCJhcnkiLCJhcnoiLCJhdXoiLCJhdmwiLCJheWgiLCJheWwiLCJheW4iLCJheXAiLCJiYnoiLCJwZ2EiLCJoZSIsIml3IiwicHMiLCJwYnQiLCJwYnUiLCJwc3QiLCJwcnAiLCJwcmQiLCJ1ZyIsInVyIiwieWRkIiwieWRzIiwieWloIiwiamkiLCJ5aSIsImhibyIsIm1lbiIsInhtbiIsImZhIiwianByIiwicGVvIiwicGVzIiwicHJzIiwiZHYiLCJzYW0iXS5pbmRleE9mKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KSk%2BPTA%2FInJ0bCI6Imx0ciJ9fSx7a2V5OiJjcmVhdGVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMDtyZXR1cm4gbmV3IGUodCxuKX19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp5ZSxvPUR0KHt9LHRoaXMub3B0aW9ucyxuLHtpc0Nsb25lOiEwfSksaT1uZXcgZShvKSxhPVsic3RvcmUiLCJzZXJ2aWNlcyIsImxhbmd1YWdlIl07cmV0dXJuIGEuZm9yRWFjaChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSxpLnNlcnZpY2VzPUR0KHt9LHRoaXMuc2VydmljZXMpLGkuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTppLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKGkpfSxpLnRyYW5zbGF0b3I9bmV3IHNlKGkuc2VydmljZXMsaS5vcHRpb25zKSxpLnRyYW5zbGF0b3Iub24oIioiLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KGU%2BMT9lLTE6MCkscj0xO3I8ZTtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtpLmVtaXQuYXBwbHkoaSxbdF0uY29uY2F0KG4pKX0pLGkuaW5pdChvLHIpLGkudHJhbnNsYXRvci5vcHRpb25zPWkub3B0aW9ucyxpLnRyYW5zbGF0b3IuYmFja2VuZENvbm5lY3Rvci5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGl9fV0pLGV9KCkpLGJlPW4oMTMzKSx4ZT1uLm4oYmUpO2Z1bmN0aW9uIHdlKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBrZSh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0%2FYXJndW1lbnRzW2VdOnt9LHI9T2JqZWN0LmtleXMobik7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihyPXIuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkuZW51bWVyYWJsZX0pKSksci5mb3JFYWNoKGZ1bmN0aW9uKGUpe3dlKHQsZSxuW2VdKX0pfXJldHVybiB0fWZ1bmN0aW9uIFNlKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gRWUodCxlLG4pe3ZhciByO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMsaT1hcmd1bWVudHMsYT1mdW5jdGlvbigpe3I9bnVsbCxufHx0LmFwcGx5KG8saSl9LHM9biYmIXI7Y2xlYXJUaW1lb3V0KHIpLHI9c2V0VGltZW91dChhLGUpLHMmJnQuYXBwbHkobyxpKX19ZnVuY3Rpb24gVGUodCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuaW5kZXhPZigiIyMjIik%2BLTE%2FdC5yZXBsYWNlKC8jIyMvZywiLiIpOnR9Zm9yKHZhciBvPSJzdHJpbmciIT10eXBlb2YgZT9bXS5jb25jYXQoZSk6ZS5zcGxpdCgiLiIpO28ubGVuZ3RoPjE7KXtpZighdClyZXR1cm57fTt2YXIgaT1yKG8uc2hpZnQoKSk7IXRbaV0mJm4mJih0W2ldPW5ldyBuKSx0PXRbaV19cmV0dXJuIHQ%2Fe29iajp0LGs6cihvLnNoaWZ0KCkpfTp7fX1mdW5jdGlvbiBBZSh0LGUsbil7dmFyIHI9VGUodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIE9lKHQsZSl7dmFyIG49VGUodCxlKSxyPW4ub2JqLG89bi5rO2lmKHIpcmV0dXJuIHJbb119dmFyIENlPW5ldyBSZWdFeHAoInt7KC4rPyl9fSIsImciKTtmdW5jdGlvbiBqZSh0LGUsbil7dmFyIHIsbyxpO2Zvcig7cj1DZS5leGVjKHQpOykic3RyaW5nIiE9dHlwZW9mKG89clsxXS50cmltKCkpJiYobz1udWxsPT0oaT1vKT8iIjoiIitpKSxvfHwobz0iIiksbz1vLnJlcGxhY2UoL1wkL2csIiQkJCQiKSx0PXQucmVwbGFjZShyWzBdLGVbb118fG8pLENlLmxhc3RJbmRleD0wO3JldHVybiB0fWZ1bmN0aW9uIExlKHQsZSxuLHIsbyl7dHJ5e3ZhciBpPW5ldyhYTUxIdHRwUmVxdWVzdHx8QWN0aXZlWE9iamVjdCkoIk1TWE1MMi5YTUxIVFRQLjMuMCIpO2kub3BlbihyPyJQT1NUIjoiR0VUIix0LDEpLGUuY3Jvc3NEb21haW58fGkuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0IiksZS5hdXRob3JpemUmJmUuYXBpS2V5JiZpLnNldFJlcXVlc3RIZWFkZXIoIkF1dGhvcml6YXRpb24iLGUuYXBpS2V5KSwocnx8ZS5zZXRDb250ZW50VHlwZUpTT04pJiZpLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL2pzb24iKSxpLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2kucmVhZHlTdGF0ZT4zJiZuJiZuKGkucmVzcG9uc2VUZXh0LGkpfSxpLnNlbmQoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoKHQpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyh0KX19dmFyIFBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4scil7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksZSYmZS5wcm9qZWN0SWQ%2FdGhpcy5pbml0KG51bGwsZSx7fSxuKTp0aGlzLmluaXQobnVsbCxuLHt9LHIpLHRoaXMudHlwZT0iYmFja2VuZCJ9dmFyIGUsbixyO3JldHVybiBlPXQsKG49W3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30scj1hcmd1bWVudHMubGVuZ3RoPjI%2FYXJndW1lbnRzWzJdOnZvaWQgMCxvPWFyZ3VtZW50cy5sZW5ndGg%2BMz9hcmd1bWVudHNbM106dm9pZCAwO3RoaXMub3B0aW9ucz1rZSh7fSx7bG9hZFBhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iixwcml2YXRlUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3ByaXZhdGUve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIscHVsbFBhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby9wdWxsL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLGdldExhbmd1YWdlc1BhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby9sYW5ndWFnZXMve3twcm9qZWN0SWR9fSIsYWRkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL21pc3Npbmcve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsdXBkYXRlUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3VwZGF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixyZWZlcmVuY2VMbmc6ImVuIixjcm9zc0RvbWFpbjohMCxzZXRDb250ZW50VHlwZUpTT046ITEsdmVyc2lvbjoibGF0ZXN0IixwdWxsOiExLHByaXZhdGU6ITEsd2hpdGVsaXN0VGhyZXNob2xkOi45LGZhaWxMb2FkaW5nT25FbXB0eUpTT046ITEsYWxsb3dlZEFkZE9yVXBkYXRlSG9zdHM6WyJsb2NhbGhvc3QiXX0sdGhpcy5vcHRpb25zLG4pLHRoaXMuc2VydmljZXM9dCx0aGlzLm9wdGlvbnMucHVsbCYmY29uc29sZS53YXJuKCJkZXByZWNhdGVkOiBwdWxsIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMgYW5kIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGxvY2l6ZSBwcml2YXRlIHZlcnNpb25zIik7dmFyIGk9d2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7aT8odGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZD10aGlzLm9wdGlvbnMuYWxsb3dlZEFkZE9yVXBkYXRlSG9zdHMuaW5kZXhPZihpKT4tMSxyLnNhdmVNaXNzaW5nJiYhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZCYmdCYmdC5sb2dnZXImJnQubG9nZ2VyLndhcm4oJ2xvY2l6ZS1iYWNrZW5kOiB3aWxsIG5vdCBzYXZlIG1pc3NpbmdzIGJlY2F1c2UgdGhlIGhvc3QgIicuY29uY2F0KGksJyIgd2FzIG5vdCBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czogJykuY29uY2F0KHRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5qb2luKCIsICIpLCIgKG1hdGNoZXMgbmVlZCB0byBiZSBleGFjdCkuIikpKTp0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZ0aGlzLmdldE9wdGlvbnMoZnVuY3Rpb24odCxyKXtpZih0KXJldHVybiBvKHQpO2Uub3B0aW9ucy5yZWZlcmVuY2VMbmc9bi5yZWZlcmVuY2VMbmd8fHIucmVmZXJlbmNlTG5nfHxlLm9wdGlvbnMucmVmZXJlbmNlTG5nLG8obnVsbCxyKX0pLHRoaXMucXVldWVkV3JpdGVzPXt9LHRoaXMuZGVib3VuY2VkUHJvY2Vzcz1FZSh0aGlzLnByb2Nlc3MsMWU0KX19LHtrZXk6ImdldExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9amUodGhpcy5vcHRpb25zLmdldExhbmd1YWdlc1BhdGgse3Byb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkfSk7dGhpcy5sb2FkVXJsKGUse30sdCl9fSx7a2V5OiJnZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuZ2V0TGFuZ3VhZ2VzKGZ1bmN0aW9uKG4scil7aWYobilyZXR1cm4gdChuKTt2YXIgbz1PYmplY3Qua2V5cyhyKTtpZighby5sZW5ndGgpcmV0dXJuIHQobmV3IEVycm9yKCJ3YXMgdW5hYmxlIHRvIGxvYWQgbGFuZ3VhZ2VzIHZpYSBBUEkiKSk7dmFyIGk9by5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gcltlXS5pc1JlZmVyZW5jZUxhbmd1YWdlJiYodD1lKSx0fSwiIiksYT1vLnJlZHVjZShmdW5jdGlvbih0LG4pe3ZhciBvPXJbbl07cmV0dXJuIG8udHJhbnNsYXRlZFtlLm9wdGlvbnMudmVyc2lvbl0mJm8udHJhbnNsYXRlZFtlLm9wdGlvbnMudmVyc2lvbl0%2BPWUub3B0aW9ucy53aGl0ZWxpc3RUaHJlc2hvbGQmJnQucHVzaChuKSx0fSxbXSkscz1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBlLmluZGV4T2YoIi0iKT4tMXx8dH0sITEpO3QobnVsbCx7ZmFsbGJhY2tMbmc6aSxyZWZlcmVuY2VMbmc6aSx3aGl0ZWxpc3Q6YSxsb2FkOnM%2FImFsbCI6Imxhbmd1YWdlT25seSJ9KX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG89e307dGhpcy5vcHRpb25zLnByaXZhdGU%2FKHI9amUodGhpcy5vcHRpb25zLnByaXZhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPXthdXRob3JpemU6ITB9KTp0aGlzLm9wdGlvbnMucHVsbD8ocj1qZSh0aGlzLm9wdGlvbnMucHVsbFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnI9amUodGhpcy5vcHRpb25zLmxvYWRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSx0aGlzLmxvYWRVcmwocixvLG4pfX0se2tleToibG9hZFVybCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7TGUodCxrZSh7fSx0aGlzLm9wdGlvbnMsZSksZnVuY3Rpb24oZSxvKXtpZihvLnN0YXR1cz49NTAwJiZvLnN0YXR1czw2MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMCk7aWYoby5zdGF0dXM%2BPTQwMCYmby5zdGF0dXM8NTAwKXJldHVybiBuKCJmYWlsZWQgbG9hZGluZyAiK3QsITEpO3ZhciBpLGE7dHJ5e2k9SlNPTi5wYXJzZShlKX1jYXRjaChlKXthPSJmYWlsZWQgcGFyc2luZyAiK3QrIiB0byBqc29uIn1yZXR1cm4gYT9uKGEsITEpOnIub3B0aW9ucy5mYWlsTG9hZGluZ09uRW1wdHlKU09OJiYhT2JqZWN0LmtleXMoaSkubGVuZ3RoP24oImxvYWRlZCByZXN1bHQgZW1wdHkgZm9yICIrdCwhMSk6dm9pZCBuKG51bGwsaSl9KX19LHtrZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byBjcmVhdGUga2V5LiIpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmd9KS5sZW5ndGg8MSYmdGhpcy5zZXJ2aWNlcyYmdGhpcy5zZXJ2aWNlcy5sb2dnZXImJnRoaXMuc2VydmljZXMubG9nZ2VyLndhcm4oJ2xvY2l6ZS1iYWNrZW5kOiB3aWxsIG5vdCBzYXZlIG1pc3NpbmdzIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSAiJy5jb25jYXQodGhpcy5vcHRpb25zLnJlZmVyZW5jZUxuZywnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIHRvIHNhdmUgbGFuZ3VhZ2VzOiAnKS5jb25jYXQodC5qb2luKCIsICIpLCIgKG9wZW4geW91ciBzaXRlIGluIHRoZSByZWZlcmVuY2UgbGFuZ3VhZ2UgdG8gc2F2ZSBtaXNzaW5ncykuIikpLHQuZm9yRWFjaChmdW5jdGlvbih0KXt0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZyYmYS5xdWV1ZS5jYWxsKGEsYS5vcHRpb25zLnJlZmVyZW5jZUxuZyxlLG4scixvLGkpfSl9fSx7a2V5OiJ1cGRhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt2YXIgYT10aGlzO2lmKG98fChvPWZ1bmN0aW9uKCl7fSksIXRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQpcmV0dXJuIG8oImhvc3QgaXMgbm90IGFsbG93ZWQgdG8gdXBkYXRlIGtleS4iKTtpfHwoaT17fSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLGkuaXNVcGRhdGU9ITAsdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6IndyaXRlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIU9lKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0pKXt2YXIgcj1qZSh0aGlzLm9wdGlvbnMuYWRkUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz1qZSh0aGlzLm9wdGlvbnMudXBkYXRlUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksaT1PZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSk7aWYoQWUodGhpcy5xdWV1ZWRXcml0ZXMsW3QsZV0sW10pLGkubGVuZ3RoKXtBZSh0aGlzLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCEwKTt2YXIgYT0hMSxzPSExLHU9e30sYz17fTtpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5vcHRpb25zJiZ0Lm9wdGlvbnMudERlc2NyaXB0aW9uP3t2YWx1ZTp0LmZhbGxiYWNrVmFsdWV8fCIiLGNvbnRleHQ6e3RleHQ6dC5vcHRpb25zLnREZXNjcmlwdGlvbn19OnQuZmFsbGJhY2tWYWx1ZXx8IiI7dC5vcHRpb25zJiZ0Lm9wdGlvbnMuaXNVcGRhdGU%2FKHN8fChzPSEwKSxjW3Qua2V5XT1lKTooYXx8KGE9ITApLHVbdC5rZXldPWUpfSk7dmFyIGw9MDthJiZsKysscyYmbCsrO3ZhciBmPWZ1bmN0aW9uKCl7LS1sfHwoQWUobi5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSwhMSksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuY2FsbGJhY2smJnQuY2FsbGJhY2soKX0pLG4uZGVib3VuY2VkUHJvY2Vzcyh0LGUpKX07bHx8ZigpLGEmJkxlKHIsa2Uoe30se2F1dGhvcml6ZTohMH0sdGhpcy5vcHRpb25zKSxmdW5jdGlvbih0LGUpe2YoKX0sdSkscyYmTGUobyxrZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSxjKX19fX0se2tleToicHJvY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO09iamVjdC5rZXlzKHRoaXMucXVldWVkV3JpdGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJsb2NrcyIhPT1lJiZPYmplY3Qua2V5cyh0LnF1ZXVlZFdyaXRlc1tlXSkuZm9yRWFjaChmdW5jdGlvbihuKXt0LnF1ZXVlZFdyaXRlc1tlXVtuXS5sZW5ndGgmJnQud3JpdGUoZSxuKX0pfSl9fSx7a2V5OiJxdWV1ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpeyFmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1UZSh0LGUsT2JqZWN0KSxpPW8ub2JqLGE9by5rO2lbYV09aVthXXx8W10sciYmKGlbYV09aVthXS5jb25jYXQobikpLHJ8fGlbYV0ucHVzaChuKX0odGhpcy5xdWV1ZWRXcml0ZXMsW3QsZV0se2tleTpuLGZhbGxiYWNrVmFsdWU6cnx8IiIsY2FsbGJhY2s6byxvcHRpb25zOml9KSx0aGlzLmRlYm91bmNlZFByb2Nlc3MoKX19XSkmJlNlKGUucHJvdG90eXBlLG4pLHImJlNlKGUsciksdH0oKTtQZS50eXBlPSJiYWNrZW5kIjt2YXIgUmU9UGUsTmU9big0Myk7ZnVuY3Rpb24gSWUoKXtyZXR1cm4oSWU9dSgpKGEuYS5tYXJrKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0LmFicnVwdCgicmV0dXJuIixuZXcgUnQuYShmdW5jdGlvbih0KXttZS5jaGFuZ2VMYW5ndWFnZShlLGZ1bmN0aW9uKCl7dCh2b2lkIDApfSl9KSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSx0KX0pKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIERlKCl7dmFyIHQ7cmV0dXJuIEx0KCkodD1tZS50KS5jYWxsKHQsbWUpfXZhciBfZT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQuYShmdW5jdGlvbih0LGUpe21lLnVzZShuZXcgeGUuYShudWxsLHtvcmRlcjpbIm5hdmlnYXRvciJdfSkpLnVzZShSZSkuaW5pdCh7ZmFsbGJhY2tMbmc6ImVuIixuczpbImRlZmF1bHQiXSxkZWZhdWx0TlM6ImRlZmF1bHQiLGJhY2tlbmQ6e3Byb2plY3RJZDpOZS5sb2NpemUucHJvZHVjdElkLHZlcnNpb246TmUubG9jaXplLnZlcnNpb24sYXBpS2V5Ok5lLmxvY2l6ZS5hcGlLZXkscmVmZXJlbmNlTG5nOiJlbiJ9fSxmdW5jdGlvbihuLHIpe3JldHVybiBuP2Uobik6dChyKX0pfSl9LGNoYW5nZUxhbmd1YWdlOmZ1bmN0aW9uKHQpe3JldHVybiBJZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGdldExhbmd1YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIG1lLmxhbmd1YWdlfSxnZXRUOkRlfTtmdW5jdGlvbiBNZSh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IW8uYSlyZXR1cm4hMTtpZihvLmEuc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8oKShEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUEoKSh0KTtpZihlKXt2YXIgaT1BKCkodGhpcykuY29uc3RydWN0b3I7bj1vKCkocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBFKCkodGhpcyxuKX19dmFyIFVlPXtieUl0ZW1Db2RlOntuYW1lOiJkYXRhIixjb2x1bW5zOlsicHJvZHVjdENvZGUiLCJkZW5pZWRDb3VudHJpZXMiXX19LEJlPXdpbmRvdy56aWd6YWcscWU9L1wvaXRlbVwvZGV0YWlsLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTt6Lm9uQ2hhbmdlc1JlYWR5KGZ1bmN0aW9uKHQpe3oub3ZlcnJpZGVDbGlja0V2ZW50KHQsJ2FbaHJlZio9IiNtb2RhbC1jYXJ0Il0sIGJ1dHRvbi5hZGQtY2FydCcsZnVuY3Rpb24oKXtCZS5wYWdlVG8oIml0ZW0iKX0pLHoub3ZlcnJpZGVDbGlja0V2ZW50KHQsJ2FbaHJlZio9Ii9jYXJ0LyJdJyxmdW5jdGlvbigpe0JlLnBhZ2VUbygiY2FydCIpfSl9KTt2YXIgRmU9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9TWUobik7ZnVuY3Rpb24gbigpe3JldHVybiB2KCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbSgpKG4sW3trZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PW5ldyBSZWdFeHAoIi8oWzAtOV0rKS8%2FJCIpLmV4ZWMod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtyZXR1cm4gdCYmdC5sZW5ndGg%2BMT90WzFdOiIifX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbz1CZS51dGlscy4kLGk9eCgpKEEoKShuLnByb3RvdHlwZSksImdldEl0ZW0iLHRoaXMpLmNhbGwodGhpcyksYT1kKCkodD1vKCIuZGV0YWlsIC5icmFuZCIpLnRleHQoKSkuY2FsbCh0KSxzPWQoKShlPW8oIi5nZW5kZXIgLmlzLWN1cnJlbnQiKS50ZXh0KCkpLmNhbGwoZSk7cmV0dXJuIGkuY2F0ZWdvcnk9cCgpKHI9IiIuY29uY2F0KGEsIiAoIikpLmNhbGwocixzLCIpIiksaX19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MCxlPXRoaXMuJCgiLmRldGFpbCAucHJpY2UgLmFmdGVyIik7cmV0dXJuIGUubGVuZ3RoPjA%2FVihZKGUpKTp0fX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kLG49W10scj1lKCJ1bC5jb2xvcj5saSIpO2lmKHIubGVuZ3RoPjApZm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKz0xKWZvcih2YXIgaT1lKHIuZ2V0KG8pKSxhPWwoKShpKS5jYWxsKGksIi50aHVtYiAubmFtZSIpLHM9bCgpKGkpLmNhbGwoaSwiLnNpemUgbGkiKSx1PTA7dTxzLmxlbmd0aDt1Kz0xKXt2YXIgYz1lKHMuZ2V0KHUpKSxmPWwoKShjKS5jYWxsKGMsIi5kYXRhIC5uYW1lIik7aWYobCgpKGMpLmNhbGwoYywiLmFkZC1jYXJ0IikubGVuZ3RoPjApe3ZhciBwLGgsZz17fTtnWyJza3UuY29sb3IiXT1kKCkocD1hLnRleHQoKSkuY2FsbChwKSxnWyJza3Uuc2l6ZSJdPWQoKShoPWYudGV4dCgpKS5jYWxsKGgpLGcucHJpY2U9dC5wcmljZSxnLnN0b2NrPTEsbi5wdXNoKGcpfX1yZXR1cm4gbn19LHtrZXk6ImdldFB1cmNoYXNhYmxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5za3VSb3dzLmxlbmd0aD4wfX1dKSxufShodCksSGU9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9TWUobik7ZnVuY3Rpb24gbigpe3JldHVybiB2KCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQ3QpO0JlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmxvY2F0aW9uLG49dC5jYWxsYmFjazshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKCl7dmFyIHQ9dSgpKGEuYS5tYXJrKGZ1bmN0aW9uIHQocil7dmFyIG8saSxzO3JldHVybiBhLmEud3JhcChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZih0LnByZXY9MCxxZSl7dC5uZXh0PTM7YnJlYWt9cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG4oKSk7Y2FzZSAzOnJldHVybiBvPW5ldyB3dCh7ZGF0YTpCZS5zaG9wRGF0YXx8e30sc2hlZXRUeXBlOlVlfSkuZXhlY3V0ZSgpLCIuZGV0YWlsIC5uYW1lIiwiLmRldGFpbCAucHJpY2UiLGk9bmV3IEZlKHskOnIsbmFtZToiLmRldGFpbCAubmFtZSIscHJpY2U6Ii5kZXRhaWwgLnByaWNlIn0pLmV4ZWN1dGUoKSxzPW5ldyBIZSh7bG9jYXRpb246ZSxzY3JhcGVyUmVzdWx0OmksZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKSx0LmFicnVwdCgicmV0dXJuIixuKG51bGwse2l0ZW06aS5pdGVtLHNrdVJvd3M6aS5za3VSb3dzLGV4Y2x1c2lvbjpzfSkpO2Nhc2UgMTE6cmV0dXJuIHQucHJldj0xMSx0LnQwPXQuY2F0Y2goMCksdC5hYnJ1cHQoInJldHVybiIsbih0LnQwKSk7Y2FzZSAxNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0sdCxudWxsLFtbMCwxMV1dKX0pKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSl9KTt2YXIgemU9bmV3IERhdGUoIk1vbiBGZWIgMSAyMDIxIDAwOjAwOjAwIEdNVCswODAwIiksV2U9bmV3IERhdGUoIlN1biBGZWIgMTQgMjAyMSAyMzo1OTo1OSBHTVQrMDgwMCIpLCRlPW5ldyBEYXRlLFZlPSRlLmdldFRpbWUoKT49emUuZ2V0VGltZSgpJiYkZS5nZXRUaW1lKCk8PVdlLmdldFRpbWUoKSxZZT0vXnpoL2kudGVzdChMKCkpLEdlPSgwLEJlLnV0aWxzLiQpKCIuaXMtbW9iaWxlIikubGVuZ3RoPjA7aWYoVmUmJlllKXt2YXIgS2U9RGUoKTtCZS5ub3RpY2VNb2RhbChmdW5jdGlvbigpe3ZhciB0LGU7cmV0dXJuIEdlP3tqdW1ib3Ryb246e2h0bWw6cCgpKHQ9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDEgc3R5bGU9ImZvbnQtc2l6ZTogMzBweCAhaW1wb3J0YW50OyBjb2xvcjogIzMzMzMzNCAhaW1wb3J0YW50OyI%2BPHNwYW4%2BPGltZyBzcmM9Imh0dHBzOi8vY2hlY2tvdXQtc3RhdGljLndvcmxkc2hvcHBpbmcuanAvaW1hZ2VzL2NvbW1vbi9sb2dvLnN2ZyIgYWx0PSJXb3JsZFNob3BwaW5nIj48L3NwYW4%2BJy5jb25jYXQoS2UoImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgICAgICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50OyBjb2xvcjogIzMzMzMzNCAhaW1wb3J0YW50OyI%2BJykpLmNhbGwodCxLZSgiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1zcF8yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyI%2BXG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgJyl9fTp7anVtYm90cm9uOntodG1sOnAoKShlPSdcbiAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbjogNnB4IDAgMCAhaW1wb3J0YW50OyI%2BXG4gICAgICAgIDxkaXY%2BXG4gICAgICAgICAgPGgxIHN0eWxlPSJmb250LXNpemU6IDMwcHggIWltcG9ydGFudDsgY29sb3I6ICMzMzMzMzQgIWltcG9ydGFudDsiPjxzcGFuPjxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vbG9nby5zdmciIGFsdD0iV29ybGRTaG9wcGluZyI%2BPC9zcGFuPicuY29uY2F0KEtlKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgxIiksJzwvaDE%2BXG4gICAgICAgICAgPGgyIHN0eWxlPSJmb250LXNpemU6IDE2cHggIWltcG9ydGFudDsgY29sb3I6ICMzMzMzMzQgIWltcG9ydGFudDsiPicpKS5jYWxsKGUsS2UoImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwnPC9oMj5cbiAgICAgICAgPC9kaXY%2BXG4gICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1wY18yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDM4MHB4ICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvZGl2PlxuICAgICAgJyl9fX0pLEJlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3JldHVybiBHZT97Ym90dG9tOntodG1sOidcbiAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICA8aW1nIHNyYz0iaHR0cHM6Ly9zdGF0aWMtY29udGVudHMud29ybGRzaG9wcGluZy5qcC9zaG9wcy90b3dlcl9qcC9jYW1wYWlnbi1iYW5uZXItc3BfMjAyMTAxMjIucG5nIiBzdHlsZT0id2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPlxuICA8L2E%2BXG4gICd9fTp7Ym90dG9tOntodG1sOidcbiAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXBjXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiA4NSUgIWltcG9ydGFudDsgbWF4LXdpZHRoOiAyNDBweCAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAtMTVweCFpbXBvcnRhbnQ7Ij5cbiAgJ319fSksX2UuaW5pdGlhbGl6ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gQmUucnVuKCl9KX1lbHNlIEJlLnJ1bigpfV0pO30%3D&_u=aHjACEALBAAAAG~&jid=1925858874&gjid=1101523241&cid=158121857.1614430449&tid=UA-53738514-61&_gid=701959399.1614430461&_r=1&gtm=2wg2h0KC52B6&z=112678851
Domain
www.google-analytics.com
URL
https://www.google-analytics.com/j/collect?v=1&_v=j88&a=71325334&t=event&ni=0&_s=1&dl=https%3A%2F%2Fbaycrews.jp%2F&ul=en-us&de=UTF-8&dt=%E3%83%99%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%80%9A%E8%B2%A9%20-%20BAYCREW%E2%80%99S%20STORE&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=JS%20ERROR&ea=46%20%3A%20Uncaught%20TypeError%3A%20Cannot%20read%20property%20%27getItem%27%20of%20null&el=data%3Atext%2Fjavascript%3Bbase64%2CZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU%2FZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0yOTcpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQpLG89big0NSkuZixpPW4oODYpLGE9bigyKSxzPW4oMjkpLHU9bigxNSksYz1uKDEyKSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg%2FcyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oNTcpLGk9big2OCksYT1uKDk3KSxzPXIuU3ltYm9sLHU9bygid2tzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB1W3RdfHwodVt0XT1hJiZzW3RdfHwoYT9zOmkpKCJTeW1ib2wuIit0KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMiksbz1uKDEyKSxpPW4oNzcpLGE9bigyMCkuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ci5TeW1ib2x8fChyLlN5bWJvbD17fSk7byhlLHQpfHxhKGUsdCx7dmFsdWU6aS5mKHQpfSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09TWF0aCYmdH07dC5leHBvcnRzPXIodHlwZW9mIGdsb2JhbFRoaXM9PW4mJmdsb2JhbFRoaXMpfHxyKHR5cGVvZiB3aW5kb3c9PW4mJndpbmRvdyl8fHIodHlwZW9mIHNlbGY9PW4mJnNlbGYpfHxyKHR5cGVvZiBlPT1uJiZlKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0pLmNhbGwodGhpcyxuKDgyKSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ%2FbnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY0KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEzNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpKyIgaXMgbm90IGFuIG9iamVjdCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2OSk7ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCkscih0LG8ua2V5LG8pfX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlJiZvKHQucHJvdG90eXBlLGUpLG4mJm8odCxuKSx0fX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5jYWxsKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxODIpLG89bigxMTIpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8%2FcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjApLGk9bigyOCk7dC5leHBvcnRzPXI%2FZnVuY3Rpb24odCxlLG4pe3JldHVybiBvLmYodCxlLGkoMSxuKSl9OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1uLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHJbdCsiUHJvdG90eXBlIl19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTYxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODQpLG89big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByKG8odCkpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDg1KSxpPW4oOSksYT1uKDU0KSxzPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmY9cj9zOmZ1bmN0aW9uKHQsZSxuKXtpZihpKHQpLGU9YShlLCEwKSxpKG4pLG8pdHJ5e3JldHVybiBzKHQsZSxuKX1jYXRjaCh0KXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCIpO3JldHVybiJ2YWx1ZSJpbiBuJiYodFtlXT1uLnZhbHVlKSx0fX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMCkuZixvPW4oMTUpLGk9bigxMiksYT1uKDE0NSkscz1uKDEpKCJ0b1N0cmluZ1RhZyIpLHU9YSE9PXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXtpZih0KXt2YXIgbD1uP3Q6dC5wcm90b3R5cGU7aShsLHMpfHxyKGwscyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KSxjJiZ1JiZvKGwsInRvU3RyaW5nIixhKX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTg5KSxvPW4oMTkzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1Nyl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYocih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChuKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FsbChlKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5jYWxsKGUsbil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gdC5jYWxsKGUsbixyKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHIsbyl7cmV0dXJuIHQuY2FsbChlLG4scixvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpLG89big0KSxpPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2koclt0XSl8fGkob1t0XSk6clt0XSYmclt0XVtlXXx8b1t0XSYmb1t0XVtlXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY2KSxvPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP28ocih0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0MikuY2hhckF0LG89big0OCksaT1uKDkzKSxhPW8uc2V0LHM9by5nZXR0ZXJGb3IoIlN0cmluZyBJdGVyYXRvciIpO2koU3RyaW5nLCJTdHJpbmciLGZ1bmN0aW9uKHQpe2EodGhpcyx7dHlwZToiU3RyaW5nIEl0ZXJhdG9yIixzdHJpbmc6U3RyaW5nKHQpLGluZGV4OjB9KX0sZnVuY3Rpb24oKXt2YXIgdCxlPXModGhpcyksbj1lLnN0cmluZyxvPWUuaW5kZXg7cmV0dXJuIG8%2BPW4ubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9cihuLG8pLGUuaW5kZXgrPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe28mJm8uZW51bWVyYWJsZT90W2VdPW46cih0LGUsbil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTQpLG89bigyMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PXIoZSkmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP28odCk6ZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMjkpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM2KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM5KX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPUpTT04ucGFyc2UoJ3sibG9jaXplIjp7InByb2R1Y3RJZCI6IjYwZmY4MjI0LWJiY2MtNDgwMi04ZDU5LWM4OTgzZGVhZThkMCIsImFwaUtleSI6IjczOTZlNzc4LTA5MDMtNGU3ZS04MjgyLWU2NzE1ODU4YmI4YyIsInZlcnNpb24iOiJwcm9kdWN0aW9uIn0sImludGVncmF0aW9ucyI6eyJjb2xvcm1lQXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9jb2xvcm1lLndvcmxkc2hvcHBpbmcuanAvdjEvcHJvZHVjdCJ9fSwic2hvcGlmeUFwcCI6eyJhcGkiOnsicHJvZHVjdCI6Imh0dHBzOi8vYXBwLXMud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19fSwibGFtYmRhIjp7ImNyZWF0ZSI6InNob3AtZGF0YS1wcm9kLWNyZWF0ZSIsImNsZWFyIjoic2hvcC1kYXRhLXByb2QtY2xlYXIifSwic2ZkYyI6eyJjb25uZWN0aW9uU2V0dGluZ3NQYXRoIjoiL3NmZGMvcHJvZC9hcGkifSwiZGVidWdIb3N0cyI6WyJzaG9wLWRhc2hib2FyZC53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWRldi53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWxvY2FsLndvcmxkc2hvcHBpbmcuYml6Il19Jyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDgzKSxpPW4oMjgpLGE9bigxOCkscz1uKDU0KSx1PW4oMTIpLGM9big4NSksbD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2UuZj1yP2w6ZnVuY3Rpb24odCxlKXtpZih0PWEodCksZT1zKGUsITApLGMpdHJ5e3JldHVybiBsKHQsZSl9Y2F0Y2godCl7fWlmKHUodCxlKSlyZXR1cm4gaSghby5mLmNhbGwodCxlKSx0W2VdKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSksbz1uKDEzNyksaT1uKDY3KSxhPW4oNTUpLHM9big4OSksdT1uKDYzKSxjPW4oNTYpKCJJRV9QUk9UTyIpLGw9ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24oKXt2YXIgdCxlPXUoImlmcmFtZSIpLG49aS5sZW5ndGg7Zm9yKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIscy5hcHBlbmRDaGlsZChlKSxlLnNyYz1TdHJpbmcoImphdmFzY3JpcHQ6IiksKHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksdC53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSx0LmNsb3NlKCksZj10LkY7bi0tOylkZWxldGUgZi5wcm90b3R5cGVbaVtuXV07cmV0dXJuIGYoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG51bGwhPT10PyhsLnByb3RvdHlwZT1yKHQpLG49bmV3IGwsbC5wcm90b3R5cGU9bnVsbCxuW2NdPXQpOm49ZigpLHZvaWQgMD09PWU%2FbjpvKG4sZSl9LGFbY109ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT1uKDE0Mykscz1uKDQpLHU9big2KSxjPW4oMTUpLGw9bigxMiksZj1uKDU2KSxwPW4oNTUpLGg9cy5XZWFrTWFwO2lmKGEpe3ZhciBkPW5ldyBoLGc9ZC5nZXQsdj1kLmhhcyx5PWQuc2V0O3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5jYWxsKGQsdCxlKSxlfSxvPWZ1bmN0aW9uKHQpe3JldHVybiBnLmNhbGwoZCx0KXx8e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHYuY2FsbChkLHQpfX1lbHNle3ZhciBtPWYoInN0YXRlIik7cFttXT0hMCxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGModCxtLGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKT90W21dOnt9fSxpPWZ1bmN0aW9uKHQpe3JldHVybiBsKHQsbSl9fXQuZXhwb3J0cz17c2V0OnIsZ2V0Om8saGFzOmksZW5mb3JjZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KT9vKHQpOnIodCx7fSl9LGdldHRlckZvcjpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG47aWYoIXUoZSl8fChuPW8oZSkpLnR5cGUhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3QrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMiksbz1uKDIzKSxpPW4oNTYpLGE9big5Nikscz1pKCJJRV9QUk9UTyIpLHU9T2JqZWN0LnByb3RvdHlwZTt0LmV4cG9ydHM9YT9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9byh0KSxyKHQscyk%2FdFtzXToiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3RvciYmdCBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3I%2FdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIE9iamVjdD91Om51bGx9fSxmdW5jdGlvbih0LGUsbil7big5OCk7dmFyIHI9bigxNDcpLG89big0KSxpPW4oMTUpLGE9bigyNSkscz1uKDEpKCJ0b1N0cmluZ1RhZyIpO2Zvcih2YXIgdSBpbiByKXt2YXIgYz1vW3VdLGw9YyYmYy5wcm90b3R5cGU7bCYmIWxbc10mJmkobCxzLHUpLGFbdV09YS5BcnJheX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY5KSxvPW4oMjUpLGk9bigxKSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtpXXx8dFsiQEBpdGVyYXRvciJdfHxvW3IodCldfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE5KSxvPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5wcm9taXNlPW5ldyB0KGZ1bmN0aW9uKHQscil7aWYodm9pZCAwIT09ZXx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7ZT10LG49cn0pLHRoaXMucmVzb2x2ZT1yKGUpLHRoaXMucmVqZWN0PXIobil9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFyKHQpKXJldHVybiB0O3ZhciBuLG87aWYoZSYmImZ1bmN0aW9uIj09dHlwZW9mKG49dC50b1N0cmluZykmJiFyKG89bi5jYWxsKHQpKSlyZXR1cm4gbztpZigiZnVuY3Rpb24iPT10eXBlb2Yobj10LnZhbHVlT2YpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoIWUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87dGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1Nyksbz1uKDY4KSxpPXIoImtleXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlbdF18fChpW3RdPW8odCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDEzOCksaT1uKDIyKSxhPXJbIl9fY29yZS1qc19zaGFyZWRfXyJdfHxvKCJfX2NvcmUtanNfc2hhcmVkX18iLHt9KTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFbdF18fChhW3RdPXZvaWQgMCE9PWU%2FZTp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjIuMCIsbW9kZTppPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89bigxMDIpLGk9bigzMSksYT1uKDI5KSxzPW4oNTEpLHU9bigxMDMpLGM9ZnVuY3Rpb24odCxlKXt0aGlzLnN0b3BwZWQ9dCx0aGlzLnJlc3VsdD1lfTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGwsZil7dmFyIHAsaCxkLGcsdix5LG09YShlLG4sbD8yOjEpO2lmKGYpcD10O2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mKGg9cyh0KSkpdGhyb3cgVHlwZUVycm9yKCJUYXJnZXQgaXMgbm90IGl0ZXJhYmxlIik7aWYobyhoKSl7Zm9yKGQ9MCxnPWkodC5sZW5ndGgpO2c%2BZDtkKyspaWYoKHY9bD9tKHIoeT10W2RdKVswXSx5WzFdKTptKHRbZF0pKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX1wPWguY2FsbCh0KX1mb3IoOyEoeT1wLm5leHQoKSkuZG9uZTspaWYoKHY9dShwLG0seS52YWx1ZSxsKSkmJnYgaW5zdGFuY2VvZiBjKXJldHVybiB2O3JldHVybiBuZXcgYyghMSl9KS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYyghMCx0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm57ZXJyb3I6ITEsdmFsdWU6dCgpfX1jYXRjaCh0KXtyZXR1cm57ZXJyb3I6ITAsdmFsdWU6dH19fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQwKTtmdW5jdGlvbiBvKHQsZSxuLG8saSxhLHMpe3RyeXt2YXIgdT10W2FdKHMpLGM9dS52YWx1ZX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBuKHQpfXUuZG9uZT9lKGMpOnIucmVzb2x2ZShjKS50aGVuKG8saSl9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKHIsaSl7dmFyIGE9dC5hcHBseShlLG4pO2Z1bmN0aW9uIHModCl7byhhLHIsaSxzLHUsIm5leHQiLHQpfWZ1bmN0aW9uIHUodCl7byhhLHIsaSxzLHUsInRocm93Iix0KX1zKHZvaWQgMCl9KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ3KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI2Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89big2KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg3KSxvPW4oNjcpO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4KSxvPW4oMzEpLGk9big4OCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA%2FcjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjEpLG89bigxKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk%2FcihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSksbz1uKDE0Nik7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzApO3QuZXhwb3J0cz1yKCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiKXx8IiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI5KSxvPW4oODQpLGk9bigyMyksYT1uKDMxKSxzPW4oMTA5KSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsVD1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKVRbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoVCx5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY%2FLTE6Y3x8bD9sOlR9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTQpLG89bigyMCksaT1uKDI4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBhPXIoZSk7YSBpbiB0P28uZih0LGEsaSgwLG4pKTp0W2FdPW59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oMSkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIXIoZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4oZS5jb25zdHJ1Y3Rvcj17fSlbb109ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fSwxIT09ZVt0XShCb29sZWFuKS5mb299KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSJcdFxuXHZcZlxyIMKg4ZqA4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXHUyMDI4XHUyMDI5XHVmZWZmIn0sZnVuY3Rpb24odCxlLG4pe2UuZj1uKDEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjU0KSxvPW4oMjU3KSxpPW4oMjYyKSxhPW4oMjY1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCl8fG8odCl8fGkodCl8fGEoKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBQfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KTt2YXIgcj1uKDM2KSxvPW4ubihyKSxpPW4oMzcpLGE9bi5uKGkpLHM9bigzOCksdT1uLm4ocyksYz1uKDM5KSxsPW4ubihjKSxmPW4oNDApLHA9bi5uKGYpLGg9big0MSksZD1uLm4oaCksZz1uKDEzMCksdj1uLm4oZykseT1uKDYyKSxtPW4ubih5KSxiPW4oNykseD1uLm4oYiksdz1uKDEwKSxrPW4ubih3KSxTPW4oMTEpLEU9bi5uKFMpLFQ9bigxMzEpLEE9bi5uKFQpLE89bigzNSksQz1uKDQzKTtmdW5jdGlvbiBqKHQsZSl7dmFyIG47aWYodm9pZCAwPT09bC5hfHxudWxsPT11KCkodCkpe2lmKGEoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBMKHQsZSk7dmFyIHI9ZCgpKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7Ik9iamVjdCI9PT1yJiZ0LmNvbnN0cnVjdG9yJiYocj10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09cnx8IlNldCI9PT1yKXJldHVybiBwKCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gTCh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI%2BPXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBzLGM9ITAsZj0hMTtyZXR1cm57czpmdW5jdGlvbigpe249bygpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGM9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7Zj0hMCxzPXR9LGY6ZnVuY3Rpb24oKXt0cnl7Y3x8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihmKXRocm93IHN9fX19ZnVuY3Rpb24gTCh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfXZhciBQPXtjb2RlOiJOT05FIn0sUj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49dGhpcyxyPXQuc2NyYXBlclJlc3VsdCxvPXQubG9jYXRpb24saT10LmRhdGE7aygpKHRoaXMsZSksdGhpcy5leGNsdWRlQnlTY3JhcGVyRXJyb3I9ZnVuY3Rpb24oKXt2YXIgdD1uLnNjcmFwZXJSZXN1bHQ7cmV0dXJuIHQuZXJyb3I%2Fe2NvZGU6IkVSUk9SIixtZXNzYWdlOiJleGNsdWRlQnlTY3JhcGVyRXJyb3I6ICIuY29uY2F0KHQuZXJyb3IpfTp0Lml0ZW0%2FKHQuc2t1Um93c3x8KHQuc2t1Um93cz1bXSksUCk6e2NvZGU6IkVSUk9SIixtZXNzYWdlOiJleGNsdWRlQnlTY3JhcGVyRXJyb3I6IG5vIGl0ZW0ifX0sdGhpcy5leGNsdWRlQnlOb3RQdXJjaGFzYWJsZT1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQucHVyY2hhc2FibGU%2FUDp7Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlOb3RQdXJjaGFzYWJsZSJ9fSx0aGlzLmV4Y2x1ZGVCeVNrdVplcm89ZnVuY3Rpb24oKXtyZXR1cm4gbi5zY3JhcGVyUmVzdWx0LnNrdVJvd3MmJjA9PT1uLnNjcmFwZXJSZXN1bHQuc2t1Um93cy5sZW5ndGg%2Fe2NvZGU6Ik5PVF9QVVJDSEFTQUJMRSIsbWVzc2FnZToiZXhjbHVkZUJ5U2t1WmVybyJ9OlB9LHRoaXMuZXhjbHVkZUJ5VXJsPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlVcmwubGVuZ3RoKXJldHVybiBQO3ZhciB0PWUud2luZG93TG9jYXRpb25IcmVmO3JldHVybiBuLmV4Y2x1ZGUobi5ieVVybCx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCJeIi5jb25jYXQoQSgpKHgoKShuPWUudXJsKS5jYWxsKG4pKSkpLnRlc3QodCl9KX0sdGhpcy5leGNsdWRlQnlJdGVtTmFtZT1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbU5hbWUubGVuZ3RoKXJldHVybiBQO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5uYW1lfHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlJdGVtTmFtZSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCJeIi5jb25jYXQoeCgpKG49ZS5pdGVtTmFtZSkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGNsdWRlQnlJdGVtQ29kZT1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbUNvZGUubGVuZ3RoKXJldHVybiBQO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5jb2RlfHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlJdGVtQ29kZSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiB4KCkobj1lLml0ZW1Db2RlKS5jYWxsKG4pPT09dH0pfSx0aGlzLmV4Y2x1ZGVCeUNhdGVnb3J5PWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlDYXRlZ29yeS5sZW5ndGgpcmV0dXJuIFA7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNhdGVnb3J5fHwiIjtyZXR1cm4gbi5leGNsdWRlKG4uYnlDYXRlZ29yeSx0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiB4KCkobj1lLmNhdGVnb3J5KS5jYWxsKG4pPT09dH0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1EZXNjcmlwdGlvbj1mdW5jdGlvbigpe2lmKDA9PT1uLmJ5SXRlbURlc2NyaXB0aW9uLmxlbmd0aClyZXR1cm4gUDt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uZGVzY3JpcHRpb258fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1EZXNjcmlwdGlvbix0LGZ1bmN0aW9uKGUpe3ZhciBuO3JldHVybiBuZXcgUmVnRXhwKCIiLmNvbmNhdCh4KCkobj1lLnRleHQpLmNhbGwobikpKS50ZXN0KHQpfSl9LHRoaXMuZXhlY3V0ZT1mdW5jdGlvbigpe3ZhciB0PSExLGU9W10scj1uLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcigpO2lmKCJOT05FIiE9PXIuY29kZSlyZXR1cm57aXNFeGNsdWRlZDohMCxyZWFzb25zOltyXX07Ik5PTkUiIT09KHI9bi5leGNsdWRlQnlOb3RQdXJjaGFzYWJsZSgpKS5jb2RlJiYodD0hMCxlLnB1c2gocikpO3ZhciBvLGk9aihuLmNvbmZpZ3VyZUV4Y2x1c2lvbk1ldGhvZHMoW24uZXhjbHVkZUJ5VXJsLG4uZXhjbHVkZUJ5SXRlbU5hbWUsbi5leGNsdWRlQnlJdGVtQ29kZSxuLmV4Y2x1ZGVCeUNhdGVnb3J5LG4uZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uXSkpO3RyeXtmb3IoaS5zKCk7IShvPWkubigpKS5kb25lOyl7dmFyIGE9KDAsby52YWx1ZSkoKTtpZigiTk9ORSIhPT1hLmNvZGUmJih0PSEwLGUucHVzaChhKSksIkVSUk9SIj09PWEuY29kZSlicmVha319Y2F0Y2godCl7aS5lKHQpfWZpbmFsbHl7aS5mKCl9cmV0dXJue2lzRXhjbHVkZWQ6dCxyZWFzb25zOmV9fSx0aGlzLnNjcmFwZXJSZXN1bHQ9cix0aGlzLmxvY2F0aW9uPW8sdGhpcy5kYXRhPWksdGhpcy5ieVVybD1pLmJ5VXJsLHRoaXMuYnlJdGVtTmFtZT1pLmJ5SXRlbU5hbWUsdGhpcy5ieUl0ZW1Db2RlPWkuYnlJdGVtQ29kZSx0aGlzLmJ5Q2F0ZWdvcnk9aS5ieUNhdGVnb3J5LHRoaXMuYnlJdGVtRGVzY3JpcHRpb249aS5ieUl0ZW1EZXNjcmlwdGlvbn1yZXR1cm4gRSgpKGUsW3trZXk6ImNvbmZpZ3VyZUV4Y2x1c2lvbk1ldGhvZHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0fX0se2tleToiZXhjbHVkZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBQfX1dLFt7a2V5OiJ3aW5kb3dMb2NhdGlvbkhyZWYiLGdldDpmdW5jdGlvbigpe3ZhciBlLG49d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLHI9d2luZG93LmxvY2F0aW9uLmhyZWY7aWYobSgpKGU9Qy5kZWJ1Z0hvc3RzKS5jYWxsKGUsbikpe3ZhciBvPW5ldyB2LmEod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCJ6enVybCIpO2lmKG8pdHJ5e3I9dC5mcm9tKG8sImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGYtOCIpfWNhdGNoKHQpe08uYS5lcnJvcih0KX19cmV0dXJuIHJ9fV0pLGV9KCl9KS5jYWxsKHRoaXMsbigyNzUpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODcpfSxmdW5jdGlvbih0LGUpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaCh0KXsib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX10LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaT1vJiYhci5jYWxsKHsxOjJ9LDEpO2UuZj1pP2Z1bmN0aW9uKHQpe3ZhciBlPW8odGhpcyx0KTtyZXR1cm4hIWUmJmUuZW51bWVyYWJsZX06cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDIxKSxpPSIiLnNwbGl0O3QuZXhwb3J0cz1yKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSk%2FZnVuY3Rpb24odCl7cmV0dXJuIlN0cmluZyI9PW8odCk%2FaS5jYWxsKHQsIiIpOk9iamVjdCh0KX06T2JqZWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNCksbz1uKDUpLGk9big2Myk7dC5leHBvcnRzPSFyJiYhbyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89LyN8XC5wcm90b3R5cGVcLi8saT1mdW5jdGlvbih0LGUpe3ZhciBuPXNbYSh0KV07cmV0dXJuIG49PWN8fG4hPXUmJigiZnVuY3Rpb24iPT10eXBlb2YgZT9yKGUpOiEhZSl9LGE9aS5ub3JtYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKG8sIi4iKS50b0xvd2VyQ2FzZSgpfSxzPWkuZGF0YT17fSx1PWkuTkFUSVZFPSJOIixjPWkuUE9MWUZJTEw9IlAiO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMiksbz1uKDE4KSxpPW4oNjUpLmluZGV4T2YsYT1uKDU1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixzPW8odCksdT0wLGM9W107Zm9yKG4gaW4gcykhcihhLG4pJiZyKHMsbikmJmMucHVzaChuKTtmb3IoO2UubGVuZ3RoPnU7KXIocyxuPWVbdSsrXSkmJih%2BaShjLG4pfHxjLnB1c2gobikpO3JldHVybiBjfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjYpLG89TWF0aC5tYXgsaT1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1yKHQpO3JldHVybiBuPDA%2FbyhuK2UsMCk6aShuLGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzApO3QuZXhwb3J0cz1yKCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTkpLG89big2KSxpPVtdLnNsaWNlLGE9e30scz1mdW5jdGlvbih0LGUsbil7aWYoIShlIGluIGEpKXtmb3IodmFyIHI9W10sbz0wO288ZTtvKyspcltvXT0iYVsiK28rIl0iO2FbZV09RnVuY3Rpb24oIkMsYSIsInJldHVybiBuZXcgQygiK3Iuam9pbigiLCIpKyIpIil9cmV0dXJuIGFbZV0odCxuKX07dC5leHBvcnRzPUZ1bmN0aW9uLmJpbmR8fGZ1bmN0aW9uKHQpe3ZhciBlPXIodGhpcyksbj1pLmNhbGwoYXJndW1lbnRzLDEpLGE9ZnVuY3Rpb24oKXt2YXIgcj1uLmNvbmNhdChpLmNhbGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBhP3MoZSxyLmxlbmd0aCxyKTplLmFwcGx5KHQscil9O3JldHVybiBvKGUucHJvdG90eXBlKSYmKGEucHJvdG90eXBlPWUucHJvdG90eXBlKSxhfX0sZnVuY3Rpb24odCxlLG4pe24oOTIpLG4oMzIpLG4oNTApLG4oMTQ4KSxuKDEwOCksbigxNTIpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oOTQpLGk9big0OSksYT1uKDcwKSxzPW4oMjQpLHU9bigxNSksYz1uKDMzKSxsPW4oMSksZj1uKDIyKSxwPW4oMjUpLGg9big5NSksZD1oLkl0ZXJhdG9yUHJvdG90eXBlLGc9aC5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHY9bCgiaXRlcmF0b3IiKSx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixsLGgsbSxiKXtvKG4sZSxsKTt2YXIgeCx3LGssUz1mdW5jdGlvbih0KXtpZih0PT09aCYmQylyZXR1cm4gQztpZighZyYmdCBpbiBBKXJldHVybiBBW3RdO3N3aXRjaCh0KXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpjYXNlImVudHJpZXMiOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9fSxFPWUrIiBJdGVyYXRvciIsVD0hMSxBPXQucHJvdG90eXBlLE89QVt2XXx8QVsiQEBpdGVyYXRvciJdfHxoJiZBW2hdLEM9IWcmJk98fFMoaCksaj0iQXJyYXkiPT1lJiZBLmVudHJpZXN8fE87aWYoaiYmKHg9aShqLmNhbGwobmV3IHQpKSxkIT09T2JqZWN0LnByb3RvdHlwZSYmeC5uZXh0JiYoZnx8aSh4KT09PWR8fChhP2EoeCxkKToiZnVuY3Rpb24iIT10eXBlb2YgeFt2XSYmdSh4LHYseSkpLHMoeCxFLCEwLCEwKSxmJiYocFtFXT15KSkpLCJ2YWx1ZXMiPT1oJiZPJiYidmFsdWVzIiE9PU8ubmFtZSYmKFQ9ITAsQz1mdW5jdGlvbigpe3JldHVybiBPLmNhbGwodGhpcyl9KSxmJiYhYnx8QVt2XT09PUN8fHUoQSx2LEMpLHBbZV09QyxoKWlmKHc9e3ZhbHVlczpTKCJ2YWx1ZXMiKSxrZXlzOm0%2FQzpTKCJrZXlzIiksZW50cmllczpTKCJlbnRyaWVzIil9LGIpZm9yKGsgaW4gdykhZyYmIVQmJmsgaW4gQXx8YyhBLGssd1trXSk7ZWxzZSByKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6Z3x8VH0sdyk7cmV0dXJuIHd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOTUpLkl0ZXJhdG9yUHJvdG90eXBlLG89big0NyksaT1uKDI4KSxhPW4oMjQpLHM9bigyNSksdT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBjPWUrIiBJdGVyYXRvciI7cmV0dXJuIHQucHJvdG90eXBlPW8ocix7bmV4dDppKDEsbil9KSxhKHQsYywhMSwhMCksc1tjXT11LHR9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLG8saSxhPW4oNDkpLHM9bigxNSksdT1uKDEyKSxjPW4oMSksbD1uKDIyKSxmPWMoIml0ZXJhdG9yIikscD0hMTtbXS5rZXlzJiYoIm5leHQiaW4oaT1bXS5rZXlzKCkpPyhvPWEoYShpKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmKHI9byk6cD0hMCksbnVsbD09ciYmKHI9e30pLGx8fHUocixmKXx8cyhyLGYsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuZXhwb3J0cz17SXRlcmF0b3JQcm90b3R5cGU6cixCVUdHWV9TQUZBUklfSVRFUkFUT1JTOnB9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgdCkhPT10LnByb3RvdHlwZX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxOCksbz1uKDcxKSxpPW4oMjUpLGE9big0OCkscz1uKDkzKSx1PWEuc2V0LGM9YS5nZXR0ZXJGb3IoIkFycmF5IEl0ZXJhdG9yIik7dC5leHBvcnRzPXMoQXJyYXksIkFycmF5IixmdW5jdGlvbih0LGUpe3UodGhpcyx7dHlwZToiQXJyYXkgSXRlcmF0b3IiLHRhcmdldDpyKHQpLGluZGV4OjAsa2luZDplfSl9LGZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzKSxlPXQudGFyZ2V0LG49dC5raW5kLHI9dC5pbmRleCsrO3JldHVybiFlfHxyPj1lLmxlbmd0aD8odC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6ZVtyXSxkb25lOiExfTp7dmFsdWU6W3IsZVtyXV0sZG9uZTohMX19LCJ2YWx1ZXMiKSxpLkFyZ3VtZW50cz1pLkFycmF5LG8oImtleXMiKSxvKCJ2YWx1ZXMiKSxvKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpO3QuZXhwb3J0cz1yLlByb21pc2V9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgbyBpbiBlKW4mJm4udW5zYWZlJiZ0W29dP3Rbb109ZVtvXTpyKHQsbyxlW29dLG4pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IFR5cGVFcnJvcigiSW5jb3JyZWN0ICIrKG4%2FbisiICI6IiIpKyJpbnZvY2F0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPW4oMjUpLGk9cigiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihvLkFycmF5PT09dHx8YVtpXT09PXQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3RyeXtyZXR1cm4gbz9lKHIobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbCh0KSksZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSgiaXRlcmF0b3IiKSxvPSExO3RyeXt2YXIgaT0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIWkrK319LHJldHVybjpmdW5jdGlvbigpe289ITB9fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFvKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgaT17fTtpW3JdPWZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX19fSx0KGkpfWNhdGNoKHQpe31yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89bigxOSksaT1uKDEpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1yKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0obj1yKGEpW2ldKT9lOm8obil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9big0KSxzPW4oNSksdT1uKDIxKSxjPW4oMjkpLGw9big4OSksZj1uKDYzKSxwPWEubG9jYXRpb24saD1hLnNldEltbWVkaWF0ZSxkPWEuY2xlYXJJbW1lZGlhdGUsZz1hLnByb2Nlc3Msdj1hLk1lc3NhZ2VDaGFubmVsLHk9YS5EaXNwYXRjaCxtPTAsYj17fSx4PWZ1bmN0aW9uKHQpe2lmKGIuaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPWJbdF07ZGVsZXRlIGJbdF0sZSgpfX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt4KHQpfX0saz1mdW5jdGlvbih0KXt4KHQuZGF0YSl9LFM9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh0KyIiLHAucHJvdG9jb2wrIi8vIitwLmhvc3QpfTtoJiZkfHwoaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO2FyZ3VtZW50cy5sZW5ndGg%2BbjspZS5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gYlsrK21dPWZ1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCkpLmFwcGx5KHZvaWQgMCxlKX0scihtKSxtfSxkPWZ1bmN0aW9uKHQpe2RlbGV0ZSBiW3RdfSwicHJvY2VzcyI9PXUoZyk%2Fcj1mdW5jdGlvbih0KXtnLm5leHRUaWNrKHcodCkpfTp5JiZ5Lm5vdz9yPWZ1bmN0aW9uKHQpe3kubm93KHcodCkpfTp2PyhpPShvPW5ldyB2KS5wb3J0MixvLnBvcnQxLm9ubWVzc2FnZT1rLHI9YyhpLnBvc3RNZXNzYWdlLGksMSkpOiFhLmFkZEV2ZW50TGlzdGVuZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBwb3N0TWVzc2FnZXx8YS5pbXBvcnRTY3JpcHRzfHxzKFMpP3I9Im9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbih0KXtsLmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlbW92ZUNoaWxkKHRoaXMpLHgodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHcodCksMCl9OihyPVMsYS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrLCExKSkpLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6ZH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89big2KSxpPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKHIodCksbyhlKSYmZS5jb25zdHJ1Y3Rvcj09PXQpcmV0dXJuIGU7dmFyIG49aS5mKHQpO3JldHVybigwLG4ucmVzb2x2ZSkoZSksbi5wcm9taXNlfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxOSksaT1uKDUyKSxhPW4oNTkpLHM9big1OCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YWxsU2V0dGxlZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49aS5mKGUpLHI9bi5yZXNvbHZlLHU9bi5yZWplY3QsYz1hKGZ1bmN0aW9uKCl7dmFyIG49byhlLnJlc29sdmUpLGk9W10sYT0wLHU9MTtzKHQsZnVuY3Rpb24odCl7dmFyIG89YSsrLHM9ITE7aS5wdXNoKHZvaWQgMCksdSsrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7c3x8KHM9ITAsaVtvXT17c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOnR9LC0tdXx8cihpKSl9LGZ1bmN0aW9uKHQpe3N8fChzPSEwLGlbb109e3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjp0fSwtLXV8fHIoaSkpfSl9KSwtLXV8fHIoaSl9KTtyZXR1cm4gYy5lcnJvciYmdShjLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89big1MyksaT1uKDEpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG8odCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj10LmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhbyhuLnByb3RvdHlwZSk%2FcihuKSYmbnVsbD09PShuPW5baV0pJiYobj12b2lkIDApOm49dm9pZCAwKSxuZXcodm9pZCAwPT09bj9BcnJheTpuKSgwPT09ZT8wOmUpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big1KSxpPW4oNTMpLGE9big2KSxzPW4oMjMpLHU9bigzMSksYz1uKDc0KSxsPW4oMTA5KSxmPW4oNzUpLHA9bigxKSgiaXNDb25jYXRTcHJlYWRhYmxlIiksaD0hbyhmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0W3BdPSExLHQuY29uY2F0KClbMF0hPT10fSksZD1mKCJjb25jYXQiKSxnPWZ1bmN0aW9uKHQpe2lmKCFhKHQpKXJldHVybiExO3ZhciBlPXRbcF07cmV0dXJuIHZvaWQgMCE9PWU%2FISFlOmkodCl9O3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohaHx8IWR9LHtjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhPXModGhpcyksZj1sKGEsMCkscD0wO2ZvcihlPS0xLHI9YXJndW1lbnRzLmxlbmd0aDtlPHI7ZSsrKWlmKGk9LTE9PT1lP2E6YXJndW1lbnRzW2VdLGcoaSkpe2lmKHArKG89dShpLmxlbmd0aCkpPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgVHlwZUVycm9yKCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQiKTtmb3Iobj0wO248bztuKysscCsrKW4gaW4gaSYmYyhmLHAsaVtuXSl9ZWxzZXtpZihwPj05MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7YyhmLHArKyxpKX1yZXR1cm4gZi5sZW5ndGg9cCxmfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Niksbz0iWyIrbig3NikrIl0iLGk9UmVnRXhwKCJeIitvK28rIioiKSxhPVJlZ0V4cChvK28rIiokIikscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKHIoZSkpO3JldHVybiAxJnQmJihuPW4ucmVwbGFjZShpLCIiKSksMiZ0JiYobj1uLnJlcGxhY2UoYSwiIikpLG59fTt0LmV4cG9ydHM9e3N0YXJ0OnMoMSksZW5kOnMoMiksdHJpbTpzKDMpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4Nil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTk4KX0sZnVuY3Rpb24odCxlLG4pe24oMTEwKSxuKDkyKSxuKDE5OSksbigyMDIpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMTEzKSxuKDIwNiksbigyMDcpLG4oMjA4KSxuKDIwOSksbigyMTApLG4oMjExKSxuKDIxMiksbigyMTMpLG4oMjE0KSxuKDIxNSksbigyMTYpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuU3ltYm9sfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4Nyksbz1uKDY3KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxvKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0KSxpPW4oNzIpLGE9W10uc2xpY2Uscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjIsbz1yP2EuY2FsbChhcmd1bWVudHMsMik6dm9pZCAwO3JldHVybiB0KHI%2FZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIGU%2FZTpGdW5jdGlvbihlKSkuYXBwbHkodGhpcyxvKX06ZSxuKX19O3Ioe2dsb2JhbDohMCxiaW5kOiEwLGZvcmNlZDovTVNJRSAuXC4vLnRlc3QoaSl9LHtzZXRUaW1lb3V0OnMoby5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpzKG8uc2V0SW50ZXJ2YWwpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkpLG89big1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBpdGVyYWJsZSIpO3JldHVybiByKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7bigyMzgpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuQXJyYXkuaXNBcnJheX0sZnVuY3Rpb24odCxlLG4pe24oMzIpLG4oMjQyKTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLkFycmF5LmZyb219LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0NSksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2xpY2U7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLnNsaWNlP3I6ZX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7KG51bGw9PWV8fGU%2BdC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjU4KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTczKSxvPW4oMTc3KSxpPW4oMTgxKTtmdW5jdGlvbiBhKGUsbixzKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJm8%2FdC5leHBvcnRzPWE9bzp0LmV4cG9ydHM9YT1mdW5jdGlvbih0LGUsbil7dmFyIG89aSh0LGUpO2lmKG8pe3ZhciBhPXIobyxlKTtyZXR1cm4gYS5nZXQ%2FYS5nZXQuY2FsbChuKTphLnZhbHVlfX0sYShlLG4sc3x8ZSl9dC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI7Ci8qIQogKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjQuMQogKiBodHRwczovL2pxdWVyeS5jb20vCiAqCiAqIEluY2x1ZGVzIFNpenpsZS5qcwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxOS0wNS0wMVQyMTowNFoKICovCi8qIQogKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjQuMQogKiBodHRwczovL2pxdWVyeS5jb20vCiAqCiAqIEluY2x1ZGVzIFNpenpsZS5qcwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxOS0wNS0wMVQyMTowNFoKICovCiFmdW5jdGlvbihlLG4peyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIHQuZXhwb3J0cz90LmV4cG9ydHM9ZS5kb2N1bWVudD9uKGUsITApOmZ1bmN0aW9uKHQpe2lmKCF0LmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBuKHQpfTpuKGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihuLG8peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1bXSxhPW4uZG9jdW1lbnQscz1PYmplY3QuZ2V0UHJvdG90eXBlT2YsdT1pLnNsaWNlLGM9aS5jb25jYXQsbD1pLnB1c2gsZj1pLmluZGV4T2YscD17fSxoPXAudG9TdHJpbmcsZD1wLmhhc093blByb3BlcnR5LGc9ZC50b1N0cmluZyx2PWcuY2FsbChPYmplY3QpLHk9e30sbT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSxiPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiZ0PT09dC53aW5kb3d9LHg9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiB3KHQsZSxuKXt2YXIgcixvLGk9KG49bnx8YSkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoaS50ZXh0PXQsZSlmb3IociBpbiB4KShvPWVbcl18fGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZShyKSkmJmkuc2V0QXR0cmlidXRlKHIsbyk7bi5oZWFkLmFwcGVuZENoaWxkKGkpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSl9ZnVuY3Rpb24gayh0KXtyZXR1cm4gbnVsbD09dD90KyIiOiJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQ%2FcFtoLmNhbGwodCldfHwib2JqZWN0Ijp0eXBlb2YgdH12YXIgUz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgUy5mbi5pbml0KHQsZSl9LEU9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO2Z1bmN0aW9uIFQodCl7dmFyIGU9ISF0JiYibGVuZ3RoImluIHQmJnQubGVuZ3RoLG49ayh0KTtyZXR1cm4hbSh0KSYmIWIodCkmJigiYXJyYXkiPT09bnx8MD09PWV8fCJudW1iZXIiPT10eXBlb2YgZSYmZT4wJiZlLTEgaW4gdCl9Uy5mbj1TLnByb3RvdHlwZT17anF1ZXJ5OiIzLjQuMSIsY29uc3RydWN0b3I6UyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHUuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3UuY2FsbCh0aGlzKTp0PDA%2FdGhpc1t0K3RoaXMubGVuZ3RoXTp0aGlzW3RdfSxwdXNoU3RhY2s6ZnVuY3Rpb24odCl7dmFyIGU9Uy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksdCk7cmV0dXJuIGUucHJldk9iamVjdD10aGlzLGV9LGVhY2g6ZnVuY3Rpb24odCl7cmV0dXJuIFMuZWFjaCh0aGlzLHQpfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMubWFwKHRoaXMsZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5jYWxsKGUsbixlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxlbmd0aCxuPSt0Kyh0PDA%2FZTowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjxlP1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpsLHNvcnQ6aS5zb3J0LHNwbGljZTppLnNwbGljZX0sUy5leHRlbmQ9Uy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixvLGksYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsYz0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGM9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KHQ9YXJndW1lbnRzW3NdKSlmb3IoZSBpbiB0KXI9dFtlXSwiX19wcm90b19fIiE9PWUmJmEhPT1yJiYoYyYmciYmKFMuaXNQbGFpbk9iamVjdChyKXx8KG89QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbZV0saT1vJiYhQXJyYXkuaXNBcnJheShuKT9bXTpvfHxTLmlzUGxhaW5PYmplY3Qobik%2Fbjp7fSxvPSExLGFbZV09Uy5leHRlbmQoYyxpLHIpKTp2b2lkIDAhPT1yJiYoYVtlXT1yKSk7cmV0dXJuIGF9LFMuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKygiMy40LjEiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKHQpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlLG47cmV0dXJuISghdHx8IltvYmplY3QgT2JqZWN0XSIhPT1oLmNhbGwodCkpJiYoIShlPXModCkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj1kLmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcikmJmcuY2FsbChuKT09PXYpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24odCxlKXt3KHQse25vbmNlOmUmJmUubm9uY2V9KX0sZWFjaDpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MDtpZihUKHQpKWZvcihuPXQubGVuZ3RoO3I8biYmITEhPT1lLmNhbGwodFtyXSxyLHRbcl0pO3IrKyk7ZWxzZSBmb3IociBpbiB0KWlmKCExPT09ZS5jYWxsKHRbcl0scix0W3JdKSlicmVhaztyZXR1cm4gdH0sdHJpbTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjoodCsiIikucmVwbGFjZShFLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49ZXx8W107cmV0dXJuIG51bGwhPXQmJihUKE9iamVjdCh0KSk%2FUy5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgdD9bdF06dCk6bC5jYWxsKG4sdCkpLG59LGluQXJyYXk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT1lPy0xOmYuY2FsbChlLHQsbil9LG1lcmdlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPStlLmxlbmd0aCxyPTAsbz10Lmxlbmd0aDtyPG47cisrKXRbbysrXT1lW3JdO3JldHVybiB0Lmxlbmd0aD1vLHR9LGdyZXA6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxvPTAsaT10Lmxlbmd0aCxhPSFuO288aTtvKyspIWUodFtvXSxvKSE9PWEmJnIucHVzaCh0W29dKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9MCxhPVtdO2lmKFQodCkpZm9yKHI9dC5sZW5ndGg7aTxyO2krKyludWxsIT0obz1lKHRbaV0saSxuKSkmJmEucHVzaChvKTtlbHNlIGZvcihpIGluIHQpbnVsbCE9KG89ZSh0W2ldLGksbikpJiZhLnB1c2gobyk7cmV0dXJuIGMuYXBwbHkoW10sYSl9LGd1aWQ6MSxzdXBwb3J0Onl9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUy5mbltTeW1ib2wuaXRlcmF0b3JdPWlbU3ltYm9sLml0ZXJhdG9yXSksUy5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe3BbIltvYmplY3QgIitlKyJdIl09ZS50b0xvd2VyQ2FzZSgpfSk7dmFyIEE9Ci8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjQKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanMuZm91bmRhdGlvbi8KICoKICogRGF0ZTogMjAxOS0wNC0wOAogKi8KZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdSxjLGwsZixwLGgsZCxnLHYseSxtLGIseD0ic2l6emxlIisxKm5ldyBEYXRlLHc9dC5kb2N1bWVudCxrPTAsUz0wLEU9dXQoKSxUPXV0KCksQT11dCgpLE89dXQoKSxDPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lJiYoZj0hMCksMH0saj17fS5oYXNPd25Qcm9wZXJ0eSxMPVtdLFA9TC5wb3AsUj1MLnB1c2gsTj1MLnB1c2gsST1MLnNsaWNlLEQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYodFtuXT09PWUpcmV0dXJuIG47cmV0dXJuLTF9LF89ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixVPSIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsQj0iXFxbIitNKyIqKCIrVSsiKSg%2FOiIrTSsiKihbKl4kfCF%2BXT89KSIrTSsiKig%2FOicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg%2FOlxcXFwufFteXFxcXFwiXSkqKVwifCgiK1UrIikpfCkiK00rIipcXF0iLHE9IjooIitVKyIpKD86XFwoKCgnKCg%2FOlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg%2FOlxcXFwufFteXFxcXCgpW1xcXV18IitCKyIpKil8LiopXFwpfCkiLEY9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLEg9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg%2FOlxcXFwuKSopIitNKyIrJCIsImciKSx6PW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksVz1uZXcgUmVnRXhwKCJeIitNKyIqKFs%2BK35dfCIrTSsiKSIrTSsiKiIpLCQ9bmV3IFJlZ0V4cChNKyJ8PiIpLFY9bmV3IFJlZ0V4cChxKSxZPW5ldyBSZWdFeHAoIl4iK1UrIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK1UrIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrVSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrVSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK0IpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitxKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitfKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls%2BK35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg%2FOi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxLPS9IVE1MJC9pLFg9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLFE9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyx0dD0vWyt%2BXS8sZXQ9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI%2FfCgiK00rIil8LikiLCJpZyIpLG50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0iMHgiK2UtNjU1MzY7cmV0dXJuIHIhPXJ8fG4%2FZTpyPDA%2FU3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKHI%2BPjEwfDU1Mjk2LDEwMjMmcnw1NjMyMCl9LHJ0PS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXDAtXHgxZlx4N2YtXHVGRkZGXHctXS9nLG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU%2FIlwwIj09PXQ%2FIu%2B%2FvSI6dC5zbGljZSgwLC0xKSsiXFwiK3QuY2hhckNvZGVBdCh0Lmxlbmd0aC0xKS50b1N0cmluZygxNikrIiAiOiJcXCIrdH0saXQ9ZnVuY3Rpb24oKXtwKCl9LGF0PXh0KGZ1bmN0aW9uKHQpe3JldHVybiEwPT09dC5kaXNhYmxlZCYmImZpZWxkc2V0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKX0se2RpcjoicGFyZW50Tm9kZSIsbmV4dDoibGVnZW5kIn0pO3RyeXtOLmFwcGx5KEw9SS5jYWxsKHcuY2hpbGROb2Rlcyksdy5jaGlsZE5vZGVzKSxMW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKHQpe049e2FwcGx5OkwubGVuZ3RoP2Z1bmN0aW9uKHQsZSl7Ui5hcHBseSh0LEkuY2FsbChlKSl9OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLHI9MDt0W24rK109ZVtyKytdOyk7dC5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc3QodCxlLHIsbyl7dmFyIGkscyxjLGwsZixkLHksbT1lJiZlLm93bmVyRG9jdW1lbnQsaz1lP2Uubm9kZVR5cGU6OTtpZihyPXJ8fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiByO2lmKCFvJiYoKGU%2FZS5vd25lckRvY3VtZW50fHxlOncpIT09aCYmcChlKSxlPWV8fGgsZykpe2lmKDExIT09ayYmKGY9Wi5leGVjKHQpKSlpZihpPWZbMV0pe2lmKDk9PT1rKXtpZighKGM9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIHI7aWYoYy5pZD09PWkpcmV0dXJuIHIucHVzaChjKSxyfWVsc2UgaWYobSYmKGM9bS5nZXRFbGVtZW50QnlJZChpKSkmJmIoZSxjKSYmYy5pZD09PWkpcmV0dXJuIHIucHVzaChjKSxyfWVsc2V7aWYoZlsyXSlyZXR1cm4gTi5hcHBseShyLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLHI7aWYoKGk9ZlszXSkmJm4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBOLmFwcGx5KHIsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxyfWlmKG4ucXNhJiYhT1t0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09a3x8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZih5PXQsbT1lLDE9PT1rJiYkLnRlc3QodCkpe2ZvcigobD1lLmdldEF0dHJpYnV0ZSgiaWQiKSk%2FbD1sLnJlcGxhY2UocnQsb3QpOmUuc2V0QXR0cmlidXRlKCJpZCIsbD14KSxzPShkPWEodCkpLmxlbmd0aDtzLS07KWRbc109IiMiK2wrIiAiK2J0KGRbc10pO3k9ZC5qb2luKCIsIiksbT10dC50ZXN0KHQpJiZ5dChlLnBhcmVudE5vZGUpfHxlfXRyeXtyZXR1cm4gTi5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh5KSkscn1jYXRjaChlKXtPKHQsITApfWZpbmFsbHl7bD09PXgmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIHUodC5yZXBsYWNlKEgsIiQxIiksZSxyLG8pfWZ1bmN0aW9uIHV0KCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uIGUobixvKXtyZXR1cm4gdC5wdXNoKG4rIiAiKT5yLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVt0LnNoaWZ0KCldLGVbbisiICJdPW99fWZ1bmN0aW9uIGN0KHQpe3JldHVybiB0W3hdPSEwLHR9ZnVuY3Rpb24gbHQodCl7dmFyIGU9aC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIXQoZSl9Y2F0Y2godCl7cmV0dXJuITF9ZmluYWxseXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlPW51bGx9fWZ1bmN0aW9uIGZ0KHQsZSl7Zm9yKHZhciBuPXQuc3BsaXQoInwiKSxvPW4ubGVuZ3RoO28tLTspci5hdHRySGFuZGxlW25bb11dPWV9ZnVuY3Rpb24gcHQodCxlKXt2YXIgbj1lJiZ0LHI9biYmMT09PXQubm9kZVR5cGUmJjE9PT1lLm5vZGVUeXBlJiZ0LnNvdXJjZUluZGV4LWUuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKWZvcig7bj1uLm5leHRTaWJsaW5nOylpZihuPT09ZSlyZXR1cm4tMTtyZXR1cm4gdD8xOi0xfWZ1bmN0aW9uIGh0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZ3QodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU%2FZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ%2FImxhYmVsImluIGU%2FImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZhdChlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiB2dCh0KXtyZXR1cm4gY3QoZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsY3QoZnVuY3Rpb24obixyKXtmb3IodmFyIG8saT10KFtdLG4ubGVuZ3RoLGUpLGE9aS5sZW5ndGg7YS0tOyluW289aVthXV0mJihuW29dPSEocltvXT1uW29dKSl9KX0pfWZ1bmN0aW9uIHl0KHQpe3JldHVybiB0JiZ2b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lJiZ0fWZvcihlIGluIG49c3Quc3VwcG9ydD17fSxpPXN0LmlzWE1MPWZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZXNwYWNlVVJJLG49KHQub3duZXJEb2N1bWVudHx8dCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFLLnRlc3QoZXx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0scD1zdC5zZXREb2N1bWVudD1mdW5jdGlvbih0KXt2YXIgZSxvLGE9dD90Lm93bmVyRG9jdW1lbnR8fHQ6dztyZXR1cm4gYSE9PWgmJjk9PT1hLm5vZGVUeXBlJiZhLmRvY3VtZW50RWxlbWVudD8oZD0oaD1hKS5kb2N1bWVudEVsZW1lbnQsZz0haShoKSx3IT09aCYmKG89aC5kZWZhdWx0VmlldykmJm8udG9wIT09byYmKG8uYWRkRXZlbnRMaXN0ZW5lcj9vLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsaXQsITEpOm8uYXR0YWNoRXZlbnQmJm8uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixpdCkpLG4uYXR0cmlidXRlcz1sdChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc05hbWU9ImkiLCF0LmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxuLmdldEVsZW1lbnRzQnlUYWdOYW1lPWx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmFwcGVuZENoaWxkKGguY3JlYXRlQ29tbWVudCgiIikpLCF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVEudGVzdChoLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLG4uZ2V0QnlJZD1sdChmdW5jdGlvbih0KXtyZXR1cm4gZC5hcHBlbmRDaGlsZCh0KS5pZD14LCFoLmdldEVsZW1lbnRzQnlOYW1lfHwhaC5nZXRFbGVtZW50c0J5TmFtZSh4KS5sZW5ndGh9KSxuLmdldEJ5SWQ%2FKHIuZmlsdGVyLklEPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj1lLmdldEVsZW1lbnRCeUlkKHQpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dm9pZCAwIT09dC5nZXRBdHRyaWJ1dGVOb2RlJiZ0LmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG4mJm4udmFsdWU9PT1lfX0sci5maW5kLklEPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixvLGk9ZS5nZXRFbGVtZW50QnlJZCh0KTtpZihpKXtpZigobj1pLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09dClyZXR1cm5baV07Zm9yKG89ZS5nZXRFbGVtZW50c0J5TmFtZSh0KSxyPTA7aT1vW3IrK107KWlmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltpXX1yZXR1cm5bXX19KSxyLmZpbmQuVEFHPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWU%2FZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09ZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpOm4ucXNhP2UucXVlcnlTZWxlY3RvckFsbCh0KTp2b2lkIDB9OmZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXSxvPTAsaT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpO2lmKCIqIj09PXQpe2Zvcig7bj1pW28rK107KTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIGl9LHIuZmluZC5DTEFTUz1uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZnKXJldHVybiBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodCl9LHk9W10sdj1bXSwobi5xc2E9US50ZXN0KGgucXVlcnlTZWxlY3RvckFsbCkpJiYobHQoZnVuY3Rpb24odCl7ZC5hcHBlbmRDaGlsZCh0KS5pbm5lckhUTUw9IjxhIGlkPSciK3grIic%2BPC9hPjxzZWxlY3QgaWQ9JyIreCsiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc%2BPC9vcHRpb24%2BPC9zZWxlY3Q%2BIix0LnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoJiZ2LnB1c2goIlsqXiRdPSIrTSsiKig%2FOicnfFwiXCIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHx2LnB1c2goIlxcWyIrTSsiKig%2FOnZhbHVlfCIrXysiKSIpLHQucXVlcnlTZWxlY3RvckFsbCgiW2lkfj0iK3grIi1dIikubGVuZ3RofHx2LnB1c2goIn49IiksdC5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8di5wdXNoKCI6Y2hlY2tlZCIpLHQucXVlcnlTZWxlY3RvckFsbCgiYSMiK3grIisqIikubGVuZ3RofHx2LnB1c2goIi4jLitbK35dIil9KSxsdChmdW5jdGlvbih0KXt0LmlubmVySFRNTD0iPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT48c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc%2BPG9wdGlvbi8%2BPC9zZWxlY3Q%2BIjt2YXIgZT1oLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSx0LmFwcGVuZENoaWxkKGUpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZ2LnB1c2goIm5hbWUiK00rIipbKl4kfCF%2BXT89IiksMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxkLmFwcGVuZENoaWxkKHQpLmRpc2FibGVkPSEwLDIhPT10LnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLHQucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLHYucHVzaCgiLC4qOiIpfSkpLChuLm1hdGNoZXNTZWxlY3Rvcj1RLnRlc3QobT1kLm1hdGNoZXN8fGQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxkLm1vek1hdGNoZXNTZWxlY3Rvcnx8ZC5vTWF0Y2hlc1NlbGVjdG9yfHxkLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmx0KGZ1bmN0aW9uKHQpe24uZGlzY29ubmVjdGVkTWF0Y2g9bS5jYWxsKHQsIioiKSxtLmNhbGwodCwiW3MhPScnXTp4IikseS5wdXNoKCIhPSIscSl9KSx2PXYubGVuZ3RoJiZuZXcgUmVnRXhwKHYuam9pbigifCIpKSx5PXkubGVuZ3RoJiZuZXcgUmVnRXhwKHkuam9pbigifCIpKSxlPVEudGVzdChkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSxiPWV8fFEudGVzdChkLmNvbnRhaW5zKT9mdW5jdGlvbih0LGUpe3ZhciBuPTk9PT10Lm5vZGVUeXBlP3QuZG9jdW1lbnRFbGVtZW50OnQscj1lJiZlLnBhcmVudE5vZGU7cmV0dXJuIHQ9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbih0LGUpe2lmKGUpZm9yKDtlPWUucGFyZW50Tm9kZTspaWYoZT09PXQpcmV0dXJuITA7cmV0dXJuITF9LEM9ZT9mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiBmPSEwLDA7dmFyIHI9IXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWUuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIHJ8fCgxJihyPSh0Lm93bmVyRG9jdW1lbnR8fHQpPT09KGUub3duZXJEb2N1bWVudHx8ZSk%2FdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKToxKXx8IW4uc29ydERldGFjaGVkJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpPT09cj90PT09aHx8dC5vd25lckRvY3VtZW50PT09dyYmYih3LHQpPy0xOmU9PT1ofHxlLm93bmVyRG9jdW1lbnQ9PT13JiZiKHcsZSk%2FMTpsP0QobCx0KS1EKGwsZSk6MDo0JnI%2FLTE6MSl9OmZ1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGY9ITAsMDt2YXIgbixyPTAsbz10LnBhcmVudE5vZGUsaT1lLnBhcmVudE5vZGUsYT1bdF0scz1bZV07aWYoIW98fCFpKXJldHVybiB0PT09aD8tMTplPT09aD8xOm8%2FLTE6aT8xOmw%2FRChsLHQpLUQobCxlKTowO2lmKG89PT1pKXJldHVybiBwdCh0LGUpO2ZvcihuPXQ7bj1uLnBhcmVudE5vZGU7KWEudW5zaGlmdChuKTtmb3Iobj1lO249bi5wYXJlbnROb2RlOylzLnVuc2hpZnQobik7Zm9yKDthW3JdPT09c1tyXTspcisrO3JldHVybiByP3B0KGFbcl0sc1tyXSk6YVtyXT09PXc%2FLTE6c1tyXT09PXc%2FMTowfSxoKTpofSxzdC5tYXRjaGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHN0KHQsbnVsbCxudWxsLGUpfSxzdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtpZigodC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFPW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSYmKCF2fHwhdi50ZXN0KGUpKSl0cnl7dmFyIHI9bS5jYWxsKHQsZSk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8dC5kb2N1bWVudCYmMTEhPT10LmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKHQpe08oZSwhMCl9cmV0dXJuIHN0KGUsaCxudWxsLFt0XSkubGVuZ3RoPjB9LHN0LmNvbnRhaW5zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpLGIodCxlKX0sc3QuYXR0cj1mdW5jdGlvbih0LGUpeyh0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KTt2YXIgbz1yLmF0dHJIYW5kbGVbZS50b0xvd2VyQ2FzZSgpXSxpPW8mJmouY2FsbChyLmF0dHJIYW5kbGUsZS50b0xvd2VyQ2FzZSgpKT9vKHQsZSwhZyk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1pP2k6bi5hdHRyaWJ1dGVzfHwhZz90LmdldEF0dHJpYnV0ZShlKTooaT10LmdldEF0dHJpYnV0ZU5vZGUoZSkpJiZpLnNwZWNpZmllZD9pLnZhbHVlOm51bGx9LHN0LmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odCsiIikucmVwbGFjZShydCxvdCl9LHN0LmVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIit0KX0sc3QudW5pcXVlU29ydD1mdW5jdGlvbih0KXt2YXIgZSxyPVtdLG89MCxpPTA7aWYoZj0hbi5kZXRlY3REdXBsaWNhdGVzLGw9IW4uc29ydFN0YWJsZSYmdC5zbGljZSgwKSx0LnNvcnQoQyksZil7Zm9yKDtlPXRbaSsrXTspZT09PXRbaV0mJihvPXIucHVzaChpKSk7Zm9yKDtvLS07KXQuc3BsaWNlKHJbb10sMSl9cmV0dXJuIGw9bnVsbCx0fSxvPXN0LmdldFRleHQ9ZnVuY3Rpb24odCl7dmFyIGUsbj0iIixyPTAsaT10Lm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIHQudGV4dENvbnRlbnQpcmV0dXJuIHQudGV4dENvbnRlbnQ7Zm9yKHQ9dC5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKW4rPW8odCl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIHQubm9kZVZhbHVlfWVsc2UgZm9yKDtlPXRbcisrXTspbis9byhlKTtyZXR1cm4gbn0sKHI9c3Quc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86Y3QsbWF0Y2g6RyxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI%2BIjp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMV09dFsxXS5yZXBsYWNlKGV0LG50KSx0WzNdPSh0WzNdfHx0WzRdfHx0WzVdfHwiIikucmVwbGFjZShldCxudCksIn49Ij09PXRbMl0mJih0WzNdPSIgIit0WzNdKyIgIiksdC5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbih0KXtyZXR1cm4gdFsxXT10WzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT10WzFdLnNsaWNlKDAsMyk%2FKHRbM118fHN0LmVycm9yKHRbMF0pLHRbNF09Kyh0WzRdP3RbNV0rKHRbNl18fDEpOjIqKCJldmVuIj09PXRbM118fCJvZGQiPT09dFszXSkpLHRbNV09Kyh0WzddK3RbOF18fCJvZGQiPT09dFszXSkpOnRbM10mJnN0LmVycm9yKHRbMF0pLHR9LFBTRVVETzpmdW5jdGlvbih0KXt2YXIgZSxuPSF0WzZdJiZ0WzJdO3JldHVybiBHLkNISUxELnRlc3QodFswXSk%2FbnVsbDoodFszXT90WzJdPXRbNF18fHRbNV18fCIiOm4mJlYudGVzdChuKSYmKGU9YShuLCEwKSkmJihlPW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtZSktbi5sZW5ndGgpJiYodFswXT10WzBdLnNsaWNlKDAsZSksdFsyXT1uLnNsaWNlKDAsZSkpLHQuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09dD9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZX19LENMQVNTOmZ1bmN0aW9uKHQpe3ZhciBlPUVbdCsiICJdO3JldHVybiBlfHwoZT1uZXcgUmVnRXhwKCIoXnwiK00rIikiK3QrIigiK00rInwkKSIpKSYmRSh0LGZ1bmN0aW9uKHQpe3JldHVybiBlLnRlc3QoInN0cmluZyI9PXR5cGVvZiB0LmNsYXNzTmFtZSYmdC5jbGFzc05hbWV8fHZvaWQgMCE9PXQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbz1zdC5hdHRyKHIsdCk7cmV0dXJuIG51bGw9PW8%2FIiE9Ij09PWU6IWV8fChvKz0iIiwiPSI9PT1lP289PT1uOiIhPSI9PT1lP28hPT1uOiJePSI9PT1lP24mJjA9PT1vLmluZGV4T2Yobik6Iio9Ij09PWU%2FbiYmby5pbmRleE9mKG4pPi0xOiIkPSI9PT1lP24mJm8uc2xpY2UoLW4ubGVuZ3RoKT09PW46In49Ij09PWU%2FKCIgIitvLnJlcGxhY2UoRiwiICIpKyIgIikuaW5kZXhPZihuKT4tMToifD0iPT09ZSYmKG89PT1ufHxvLnNsaWNlKDAsbi5sZW5ndGgrMSk9PT1uKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT0ibnRoIiE9PXQuc2xpY2UoMCwzKSxhPSJsYXN0IiE9PXQuc2xpY2UoLTQpLHM9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PXImJjA9PT1vP2Z1bmN0aW9uKHQpe3JldHVybiEhdC5wYXJlbnROb2RlfTpmdW5jdGlvbihlLG4sdSl7dmFyIGMsbCxmLHAsaCxkLGc9aSE9PWE%2FIm5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIix2PWUucGFyZW50Tm9kZSx5PXMmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxtPSF1JiYhcyxiPSExO2lmKHYpe2lmKGkpe2Zvcig7Zzspe2ZvcihwPWU7cD1wW2ddOylpZihzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpcmV0dXJuITE7ZD1nPSJvbmx5Ij09PXQmJiFkJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGQ9W2E%2Fdi5maXJzdENoaWxkOnYubGFzdENoaWxkXSxhJiZtKXtmb3IoYj0oaD0oYz0obD0oZj0ocD12KVt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XXx8W10pWzBdPT09ayYmY1sxXSkmJmNbMl0scD1oJiZ2LmNoaWxkTm9kZXNbaF07cD0rK2gmJnAmJnBbZ118fChiPWg9MCl8fGQucG9wKCk7KWlmKDE9PT1wLm5vZGVUeXBlJiYrK2ImJnA9PT1lKXtsW3RdPVtrLGgsYl07YnJlYWt9fWVsc2UgaWYobSYmKGI9aD0oYz0obD0oZj0ocD1lKVt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XXx8W10pWzBdPT09ayYmY1sxXSksITE9PT1iKWZvcig7KHA9KytoJiZwJiZwW2ddfHwoYj1oPTApfHxkLnBvcCgpKSYmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PXk6MSE9PXAubm9kZVR5cGUpfHwhKytifHwobSYmKChsPShmPXBbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF09W2ssYl0pLHAhPT1lKSk7KTtyZXR1cm4oYi09byk9PT1yfHxiJXI9PTAmJmIvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24odCxlKXt2YXIgbixvPXIucHNldWRvc1t0XXx8ci5zZXRGaWx0ZXJzW3QudG9Mb3dlckNhc2UoKV18fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrdCk7cmV0dXJuIG9beF0%2FbyhlKTpvLmxlbmd0aD4xPyhuPVt0LHQsIiIsZV0sci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KHQudG9Mb3dlckNhc2UoKSk%2FY3QoZnVuY3Rpb24odCxuKXtmb3IodmFyIHIsaT1vKHQsZSksYT1pLmxlbmd0aDthLS07KXRbcj1EKHQsaVthXSldPSEobltyXT1pW2FdKX0pOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCxuKX0pOm99fSxwc2V1ZG9zOntub3Q6Y3QoZnVuY3Rpb24odCl7dmFyIGU9W10sbj1bXSxyPXModC5yZXBsYWNlKEgsIiQxIikpO3JldHVybiByW3hdP2N0KGZ1bmN0aW9uKHQsZSxuLG8pe2Zvcih2YXIgaSxhPXIodCxudWxsLG8sW10pLHM9dC5sZW5ndGg7cy0tOykoaT1hW3NdKSYmKHRbc109IShlW3NdPWkpKX0pOmZ1bmN0aW9uKHQsbyxpKXtyZXR1cm4gZVswXT10LHIoZSxudWxsLGksbiksZVswXT1udWxsLCFuLnBvcCgpfX0pLGhhczpjdChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHN0KHQsZSkubGVuZ3RoPjB9fSksY29udGFpbnM6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKGV0LG50KSxmdW5jdGlvbihlKXtyZXR1cm4oZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KT4tMX19KSxsYW5nOmN0KGZ1bmN0aW9uKHQpe3JldHVybiBZLnRlc3QodHx8IiIpfHxzdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIit0KSx0PXQucmVwbGFjZShldCxudCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgbjtkb3tpZihuPWc%2FZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT10fHwwPT09bi5pbmRleE9mKHQrIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciBuPXQubG9jYXRpb24mJnQubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1kfSxmb2N1czpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWguYWN0aXZlRWxlbWVudCYmKCFoLmhhc0ZvY3VzfHxoLmhhc0ZvY3VzKCkpJiYhISh0LnR5cGV8fHQuaHJlZnx8fnQudGFiSW5kZXgpfSxlbmFibGVkOmd0KCExKSxkaXNhYmxlZDpndCghMCksY2hlY2tlZDpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiEhdC5jaGVja2VkfHwib3B0aW9uIj09PWUmJiEhdC5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT10LnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbih0KXtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpaWYodC5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIXIucHNldWRvcy5lbXB0eSh0KX0saGVhZGVyOmZ1bmN0aW9uKHQpe3JldHVybiBKLnRlc3QodC5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBYLnRlc3QodC5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiJidXR0b24iPT09dC50eXBlfHwiYnV0dG9uIj09PWV9LHRleHQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09dC50eXBlJiYobnVsbD09KGU9dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWUudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZ0KGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2dChmdW5jdGlvbih0LGUpe3JldHVybltlLTFdfSksZXE6dnQoZnVuY3Rpb24odCxlLG4pe3JldHVybltuPDA%2FbitlOm5dfSksZXZlbjp2dChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLG9kZDp2dChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0xO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLGx0OnZ0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjwwP24rZTpuPmU%2FZTpuOy0tcj49MDspdC5wdXNoKHIpO3JldHVybiB0fSksZ3Q6dnQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uPDA%2FbitlOm47KytyPGU7KXQucHVzaChyKTtyZXR1cm4gdH0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pci5wc2V1ZG9zW2VdPWh0KGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pci5wc2V1ZG9zW2VdPWR0KGUpO2Z1bmN0aW9uIG10KCl7fWZ1bmN0aW9uIGJ0KHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGgscj0iIjtlPG47ZSsrKXIrPXRbZV0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24geHQodCxlLG4pe3ZhciByPWUuZGlyLG89ZS5uZXh0LGk9b3x8cixhPW4mJiJwYXJlbnROb2RlIj09PWkscz1TKys7cmV0dXJuIGUuZmlyc3Q%2FZnVuY3Rpb24oZSxuLG8pe2Zvcig7ZT1lW3JdOylpZigxPT09ZS5ub2RlVHlwZXx8YSlyZXR1cm4gdChlLG4sbyk7cmV0dXJuITF9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxsLGYscD1bayxzXTtpZih1KXtmb3IoO2U9ZVtyXTspaWYoKDE9PT1lLm5vZGVUeXBlfHxhKSYmdChlLG4sdSkpcmV0dXJuITB9ZWxzZSBmb3IoO2U9ZVtyXTspaWYoMT09PWUubm9kZVR5cGV8fGEpaWYobD0oZj1lW3hdfHwoZVt4XT17fSkpW2UudW5pcXVlSURdfHwoZltlLnVuaXF1ZUlEXT17fSksbyYmbz09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbcl18fGU7ZWxzZXtpZigoYz1sW2ldKSYmY1swXT09PWsmJmNbMV09PT1zKXJldHVybiBwWzJdPWNbMl07aWYobFtpXT1wLHBbMl09dChlLG4sdSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHd0KHQpe3JldHVybiB0Lmxlbmd0aD4xP2Z1bmN0aW9uKGUsbixyKXtmb3IodmFyIG89dC5sZW5ndGg7by0tOylpZighdFtvXShlLG4scikpcmV0dXJuITE7cmV0dXJuITB9OnRbMF19ZnVuY3Rpb24ga3QodCxlLG4scixvKXtmb3IodmFyIGksYT1bXSxzPTAsdT10Lmxlbmd0aCxjPW51bGwhPWU7czx1O3MrKykoaT10W3NdKSYmKG4mJiFuKGkscixvKXx8KGEucHVzaChpKSxjJiZlLnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBTdCh0LGUsbixyLG8saSl7cmV0dXJuIHImJiFyW3hdJiYocj1TdChyKSksbyYmIW9beF0mJihvPVN0KG8saSkpLGN0KGZ1bmN0aW9uKGksYSxzLHUpe3ZhciBjLGwsZixwPVtdLGg9W10sZD1hLmxlbmd0aCxnPWl8fGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MCxvPWUubGVuZ3RoO3I8bztyKyspc3QodCxlW3JdLG4pO3JldHVybiBufShlfHwiKiIscy5ub2RlVHlwZT9bc106cyxbXSksdj0hdHx8IWkmJmU%2FZzprdChnLHAsdCxzLHUpLHk9bj9vfHwoaT90OmR8fHIpP1tdOmE6djtpZihuJiZuKHYseSxzLHUpLHIpZm9yKGM9a3QoeSxoKSxyKGMsW10scyx1KSxsPWMubGVuZ3RoO2wtLTspKGY9Y1tsXSkmJih5W2hbbF1dPSEodltoW2xdXT1mKSk7aWYoaSl7aWYob3x8dCl7aWYobyl7Zm9yKGM9W10sbD15Lmxlbmd0aDtsLS07KShmPXlbbF0pJiZjLnB1c2godltsXT1mKTtvKG51bGwseT1bXSxjLHUpfWZvcihsPXkubGVuZ3RoO2wtLTspKGY9eVtsXSkmJihjPW8%2FRChpLGYpOnBbbF0pPi0xJiYoaVtjXT0hKGFbY109ZikpfX1lbHNlIHk9a3QoeT09PWE%2FeS5zcGxpY2UoZCx5Lmxlbmd0aCk6eSksbz9vKG51bGwsYSx5LHUpOk4uYXBwbHkoYSx5KX0pfWZ1bmN0aW9uIEV0KHQpe2Zvcih2YXIgZSxuLG8saT10Lmxlbmd0aCxhPXIucmVsYXRpdmVbdFswXS50eXBlXSxzPWF8fHIucmVsYXRpdmVbIiAiXSx1PWE%2FMTowLGw9eHQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lfSxzLCEwKSxmPXh0KGZ1bmN0aW9uKHQpe3JldHVybiBEKGUsdCk%2BLTF9LHMsITApLHA9W2Z1bmN0aW9uKHQsbixyKXt2YXIgbz0hYSYmKHJ8fG4hPT1jKXx8KChlPW4pLm5vZGVUeXBlP2wodCxuLHIpOmYodCxuLHIpKTtyZXR1cm4gZT1udWxsLG99XTt1PGk7dSsrKWlmKG49ci5yZWxhdGl2ZVt0W3VdLnR5cGVdKXA9W3h0KHd0KHApLG4pXTtlbHNle2lmKChuPXIuZmlsdGVyW3RbdV0udHlwZV0uYXBwbHkobnVsbCx0W3VdLm1hdGNoZXMpKVt4XSl7Zm9yKG89Kyt1O288aSYmIXIucmVsYXRpdmVbdFtvXS50eXBlXTtvKyspO3JldHVybiBTdCh1PjEmJnd0KHApLHU%2BMSYmYnQodC5zbGljZSgwLHUtMSkuY29uY2F0KHt2YWx1ZToiICI9PT10W3UtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShILCIkMSIpLG4sdTxvJiZFdCh0LnNsaWNlKHUsbykpLG88aSYmRXQodD10LnNsaWNlKG8pKSxvPGkmJmJ0KHQpKX1wLnB1c2gobil9cmV0dXJuIHd0KHApfXJldHVybiBtdC5wcm90b3R5cGU9ci5maWx0ZXJzPXIucHNldWRvcyxyLnNldEZpbHRlcnM9bmV3IG10LGE9c3QudG9rZW5pemU9ZnVuY3Rpb24odCxlKXt2YXIgbixvLGksYSxzLHUsYyxsPVRbdCsiICJdO2lmKGwpcmV0dXJuIGU%2FMDpsLnNsaWNlKDApO2ZvcihzPXQsdT1bXSxjPXIucHJlRmlsdGVyO3M7KXtmb3IoYSBpbiBuJiYhKG89ei5leGVjKHMpKXx8KG8mJihzPXMuc2xpY2Uob1swXS5sZW5ndGgpfHxzKSx1LnB1c2goaT1bXSkpLG49ITEsKG89Vy5leGVjKHMpKSYmKG49by5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOm9bMF0ucmVwbGFjZShILCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKSxyLmZpbHRlcikhKG89R1thXS5leGVjKHMpKXx8Y1thXSYmIShvPWNbYV0obykpfHwobj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6YSxtYXRjaGVzOm99KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gZT9zLmxlbmd0aDpzP3N0LmVycm9yKHQpOlQodCx1KS5zbGljZSgwKX0scz1zdC5jb21waWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1bXSxpPVtdLHM9QVt0KyIgIl07aWYoIXMpe2ZvcihlfHwoZT1hKHQpKSxuPWUubGVuZ3RoO24tLTspKHM9RXQoZVtuXSkpW3hdP28ucHVzaChzKTppLnB1c2gocyk7KHM9QSh0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg%2BMCxvPXQubGVuZ3RoPjAsaT1mdW5jdGlvbihpLGEscyx1LGwpe3ZhciBmLGQsdix5PTAsbT0iMCIsYj1pJiZbXSx4PVtdLHc9YyxTPWl8fG8mJnIuZmluZC5UQUcoIioiLGwpLEU9ays9bnVsbD09dz8xOk1hdGgucmFuZG9tKCl8fC4xLFQ9Uy5sZW5ndGg7Zm9yKGwmJihjPWE9PT1ofHxhfHxsKTttIT09VCYmbnVsbCE9KGY9U1ttXSk7bSsrKXtpZihvJiZmKXtmb3IoZD0wLGF8fGYub3duZXJEb2N1bWVudD09PWh8fChwKGYpLHM9IWcpO3Y9dFtkKytdOylpZih2KGYsYXx8aCxzKSl7dS5wdXNoKGYpO2JyZWFrfWwmJihrPUUpfW4mJigoZj0hdiYmZikmJnktLSxpJiZiLnB1c2goZikpfWlmKHkrPW0sbiYmbSE9PXkpe2ZvcihkPTA7dj1lW2QrK107KXYoYix4LGEscyk7aWYoaSl7aWYoeT4wKWZvcig7bS0tOyliW21dfHx4W21dfHwoeFttXT1QLmNhbGwodSkpO3g9a3QoeCl9Ti5hcHBseSh1LHgpLGwmJiFpJiZ4Lmxlbmd0aD4wJiZ5K2UubGVuZ3RoPjEmJnN0LnVuaXF1ZVNvcnQodSl9cmV0dXJuIGwmJihrPUUsYz13KSxifTtyZXR1cm4gbj9jdChpKTppfShpLG8pKSkuc2VsZWN0b3I9dH1yZXR1cm4gc30sdT1zdC5zZWxlY3Q9ZnVuY3Rpb24odCxlLG4sbyl7dmFyIGksdSxjLGwsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LGg9IW8mJmEodD1wLnNlbGVjdG9yfHx0KTtpZihuPW58fFtdLDE9PT1oLmxlbmd0aCl7aWYoKHU9aFswXT1oWzBdLnNsaWNlKDApKS5sZW5ndGg%2BMiYmIklEIj09PShjPXVbMF0pLnR5cGUmJjk9PT1lLm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEoZT0oci5maW5kLklEKGMubWF0Y2hlc1swXS5yZXBsYWNlKGV0LG50KSxlKXx8W10pWzBdKSlyZXR1cm4gbjtwJiYoZT1lLnBhcmVudE5vZGUpLHQ9dC5zbGljZSh1LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoaT1HLm5lZWRzQ29udGV4dC50ZXN0KHQpPzA6dS5sZW5ndGg7aS0tJiYoYz11W2ldLCFyLnJlbGF0aXZlW2w9Yy50eXBlXSk7KWlmKChmPXIuZmluZFtsXSkmJihvPWYoYy5tYXRjaGVzWzBdLnJlcGxhY2UoZXQsbnQpLHR0LnRlc3QodVswXS50eXBlKSYmeXQoZS5wYXJlbnROb2RlKXx8ZSkpKXtpZih1LnNwbGljZShpLDEpLCEodD1vLmxlbmd0aCYmYnQodSkpKXJldHVybiBOLmFwcGx5KG4sbyksbjticmVha319cmV0dXJuKHB8fHModCxoKSkobyxlLCFnLG4sIWV8fHR0LnRlc3QodCkmJnl0KGUucGFyZW50Tm9kZSl8fGUpLG59LG4uc29ydFN0YWJsZT14LnNwbGl0KCIiKS5zb3J0KEMpLmpvaW4oIiIpPT09eCxuLmRldGVjdER1cGxpY2F0ZXM9ISFmLHAoKSxuLnNvcnREZXRhY2hlZD1sdChmdW5jdGlvbih0KXtyZXR1cm4gMSZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGguY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxsdChmdW5jdGlvbih0KXtyZXR1cm4gdC5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PXQuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmdCgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24odCxlLG4pe2lmKCFuKXJldHVybiB0LmdldEF0dHJpYnV0ZShlLCJ0eXBlIj09PWUudG9Mb3dlckNhc2UoKT8xOjIpfSksbi5hdHRyaWJ1dGVzJiZsdChmdW5jdGlvbih0KXtyZXR1cm4gdC5pbm5lckhUTUw9IjxpbnB1dC8%2BIix0LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmdCgidmFsdWUiLGZ1bmN0aW9uKHQsZSxuKXtpZighbiYmImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gdC5kZWZhdWx0VmFsdWV9KSxsdChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZnQoXyxmdW5jdGlvbih0LGUsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT10W2VdP2UudG9Mb3dlckNhc2UoKToocj10LmdldEF0dHJpYnV0ZU5vZGUoZSkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzdH0obik7Uy5maW5kPUEsUy5leHByPUEuc2VsZWN0b3JzLFMuZXhwclsiOiJdPVMuZXhwci5wc2V1ZG9zLFMudW5pcXVlU29ydD1TLnVuaXF1ZT1BLnVuaXF1ZVNvcnQsUy50ZXh0PUEuZ2V0VGV4dCxTLmlzWE1MRG9jPUEuaXNYTUwsUy5jb250YWlucz1BLmNvbnRhaW5zLFMuZXNjYXBlU2VsZWN0b3I9QS5lc2NhcGU7dmFyIE89ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxvPXZvaWQgMCE9PW47KHQ9dFtlXSkmJjkhPT10Lm5vZGVUeXBlOylpZigxPT09dC5ub2RlVHlwZSl7aWYobyYmUyh0KS5pcyhuKSlicmVhaztyLnB1c2godCl9cmV0dXJuIHJ9LEM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W107dDt0PXQubmV4dFNpYmxpbmcpMT09PXQubm9kZVR5cGUmJnQhPT1lJiZuLnB1c2godCk7cmV0dXJuIG59LGo9Uy5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBMKHQsZSl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWUudG9Mb3dlckNhc2UoKX12YXIgUD0vXjwoW2Etel1bXlwvXDA%2BOlx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBSKHQsZSxuKXtyZXR1cm4gbShlKT9TLmdyZXAodCxmdW5jdGlvbih0LHIpe3JldHVybiEhZS5jYWxsKHQscix0KSE9PW59KTplLm5vZGVUeXBlP1MuZ3JlcCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZSE9PW59KToic3RyaW5nIiE9dHlwZW9mIGU%2FUy5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIGYuY2FsbChlLHQpPi0xIT09bn0pOlMuZmlsdGVyKGUsdCxuKX1TLmZpbHRlcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXTtyZXR1cm4gbiYmKHQ9Ijpub3QoIit0KyIpIiksMT09PWUubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9TLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsdCk%2FW3JdOltdOlMuZmluZC5tYXRjaGVzKHQsUy5ncmVwKGUsZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfSkpfSxTLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbih0KXt2YXIgZSxuLHI9dGhpcy5sZW5ndGgsbz10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyh0KS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoZT0wO2U8cjtlKyspaWYoUy5jb250YWlucyhvW2VdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSxlPTA7ZTxyO2UrKylTLmZpbmQodCxvW2VdLG4pO3JldHVybiByPjE%2FUy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUih0aGlzLHR8fFtdLCExKSl9LG5vdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUih0aGlzLHR8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKHQpe3JldHVybiEhUih0aGlzLCJzdHJpbmciPT10eXBlb2YgdCYmai50ZXN0KHQpP1ModCk6dHx8W10sITEpLmxlbmd0aH19KTt2YXIgTixJPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KFMuZm4uaW5pdD1mdW5jdGlvbih0LGUsbil7dmFyIHIsbztpZighdClyZXR1cm4gdGhpcztpZihuPW58fE4sInN0cmluZyI9PXR5cGVvZiB0KXtpZighKHI9IjwiPT09dFswXSYmIj4iPT09dFt0Lmxlbmd0aC0xXSYmdC5sZW5ndGg%2BPTM%2FW251bGwsdCxudWxsXTpJLmV4ZWModCkpfHwhclsxXSYmZSlyZXR1cm4hZXx8ZS5qcXVlcnk%2FKGV8fG4pLmZpbmQodCk6dGhpcy5jb25zdHJ1Y3RvcihlKS5maW5kKHQpO2lmKHJbMV0pe2lmKGU9ZSBpbnN0YW5jZW9mIFM%2FZVswXTplLFMubWVyZ2UodGhpcyxTLnBhcnNlSFRNTChyWzFdLGUmJmUubm9kZVR5cGU%2FZS5vd25lckRvY3VtZW50fHxlOmEsITApKSxQLnRlc3QoclsxXSkmJlMuaXNQbGFpbk9iamVjdChlKSlmb3IociBpbiBlKW0odGhpc1tyXSk%2FdGhpc1tyXShlW3JdKTp0aGlzLmF0dHIocixlW3JdKTtyZXR1cm4gdGhpc31yZXR1cm4obz1hLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09byx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiB0Lm5vZGVUeXBlPyh0aGlzWzBdPXQsdGhpcy5sZW5ndGg9MSx0aGlzKTptKHQpP3ZvaWQgMCE9PW4ucmVhZHk%2Fbi5yZWFkeSh0KTp0KFMpOlMubWFrZUFycmF5KHQsdGhpcyl9KS5wcm90b3R5cGU9Uy5mbixOPVMoYSk7dmFyIEQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBNKHQsZSl7Zm9yKDsodD10W2VdKSYmMSE9PXQubm9kZVR5cGU7KTtyZXR1cm4gdH1TLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKHQpe3ZhciBlPVModCx0aGlzKSxuPWUubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8bjt0KyspaWYoUy5jb250YWlucyh0aGlzLGVbdF0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTAsbz10aGlzLmxlbmd0aCxpPVtdLGE9InN0cmluZyIhPXR5cGVvZiB0JiZTKHQpO2lmKCFqLnRlc3QodCkpZm9yKDtyPG87cisrKWZvcihuPXRoaXNbcl07biYmbiE9PWU7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE%2FYS5pbmRleChuKT4tMToxPT09bi5ub2RlVHlwZSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLHQpKSl7aS5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhpLmxlbmd0aD4xP1MudW5pcXVlU29ydChpKTppKX0saW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHQ%2FInN0cmluZyI9PXR5cGVvZiB0P2YuY2FsbChTKHQpLHRoaXNbMF0pOmYuY2FsbCh0aGlzLHQuanF1ZXJ5P3RbMF06dCk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy51bmlxdWVTb3J0KFMubWVyZ2UodGhpcy5nZXQoKSxTKHQsZSkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PXQ%2FdGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIodCkpfX0pLFMuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtyZXR1cm4gZSYmMTEhPT1lLm5vZGVUeXBlP2U6bnVsbH0scGFyZW50czpmdW5jdGlvbih0KXtyZXR1cm4gTyh0LCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE8odCwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24odCl7cmV0dXJuIE0odCwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbih0KXtyZXR1cm4gTSh0LCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbih0KXtyZXR1cm4gTyh0LCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPKHQsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTyh0LCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbih0KXtyZXR1cm4gQygodC5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCx0KX0sY2hpbGRyZW46ZnVuY3Rpb24odCl7cmV0dXJuIEModC5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQuY29udGVudERvY3VtZW50P3QuY29udGVudERvY3VtZW50OihMKHQsInRlbXBsYXRlIikmJih0PXQuY29udGVudHx8dCksUy5tZXJnZShbXSx0LmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbihuLHIpe3ZhciBvPVMubWFwKHRoaXMsZSxuKTtyZXR1cm4iVW50aWwiIT09dC5zbGljZSgtNSkmJihyPW4pLHImJiJzdHJpbmciPT10eXBlb2YgciYmKG89Uy5maWx0ZXIocixvKSksdGhpcy5sZW5ndGg%2BMSYmKF9bdF18fFMudW5pcXVlU29ydChvKSxELnRlc3QodCkmJm8ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhvKX19KTt2YXIgVT0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIEIodCl7cmV0dXJuIHR9ZnVuY3Rpb24gcSh0KXt0aHJvdyB0fWZ1bmN0aW9uIEYodCxlLG4scil7dmFyIG87dHJ5e3QmJm0obz10LnByb21pc2UpP28uY2FsbCh0KS5kb25lKGUpLmZhaWwobik6dCYmbShvPXQudGhlbik%2Fby5jYWxsKHQsZSxuKTplLmFwcGx5KHZvaWQgMCxbdF0uc2xpY2UocikpfWNhdGNoKHQpe24uYXBwbHkodm9pZCAwLFt0XSl9fVMuQ2FsbGJhY2tzPWZ1bmN0aW9uKHQpe3Q9InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiBTLmVhY2godC5tYXRjaChVKXx8W10sZnVuY3Rpb24odCxuKXtlW25dPSEwfSksZX0odCk6Uy5leHRlbmQoe30sdCk7dmFyIGUsbixyLG8saT1bXSxhPVtdLHM9LTEsdT1mdW5jdGlvbigpe2ZvcihvPW98fHQub25jZSxyPWU9ITA7YS5sZW5ndGg7cz0tMSlmb3Iobj1hLnNoaWZ0KCk7KytzPGkubGVuZ3RoOykhMT09PWlbc10uYXBwbHkoblswXSxuWzFdKSYmdC5zdG9wT25GYWxzZSYmKHM9aS5sZW5ndGgsbj0hMSk7dC5tZW1vcnl8fChuPSExKSxlPSExLG8mJihpPW4%2FW106IiIpfSxjPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKG4mJiFlJiYocz1pLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gZShuKXtTLmVhY2gobixmdW5jdGlvbihuLHIpe20ocik%2FdC51bmlxdWUmJmMuaGFzKHIpfHxpLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09ayhyKSYmZShyKX0pfShhcmd1bWVudHMpLG4mJiFlJiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBTLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuOyhuPVMuaW5BcnJheShlLGksbikpPi0xOylpLnNwbGljZShuLDEpLG48PXMmJnMtLX0pLHRoaXN9LGhhczpmdW5jdGlvbih0KXtyZXR1cm4gdD9TLmluQXJyYXkodCxpKT4tMTppLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBpJiYoaT1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBvPWE9W10saT1uPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWl9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gbz1hPVtdLG58fGV8fChpPW49IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhb30sZmlyZVdpdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gb3x8KG49W3QsKG49bnx8W10pLnNsaWNlP24uc2xpY2UoKTpuXSxhLnB1c2gobiksZXx8dSgpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFyfX07cmV0dXJuIGN9LFMuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbih0KXt2YXIgZT1bWyJub3RpZnkiLCJwcm9ncmVzcyIsUy5DYWxsYmFja3MoIm1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0scj0icGVuZGluZyIsbz17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gby50aGVuKG51bGwsdCl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHM7cmV0dXJuIFMuRGVmZXJyZWQoZnVuY3Rpb24obil7Uy5lYWNoKGUsZnVuY3Rpb24oZSxyKXt2YXIgbz1tKHRbcls0XV0pJiZ0W3JbNF1dO2lbclsxXV0oZnVuY3Rpb24oKXt2YXIgdD1vJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0JiZtKHQucHJvbWlzZSk%2FdC5wcm9taXNlKCkucHJvZ3Jlc3Mobi5ub3RpZnkpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KTpuW3JbMF0rIldpdGgiXSh0aGlzLG8%2FW3RdOmFyZ3VtZW50cyl9KX0pLHQ9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsbyl7dmFyIGk9MDtmdW5jdGlvbiBhKHQsZSxyLG8pe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsYz1mdW5jdGlvbigpe3ZhciBuLGM7aWYoISh0PGkpKXtpZigobj1yLmFwcGx5KHMsdSkpPT09ZS5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7Yz1uJiYoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJm4udGhlbixtKGMpP28%2FYy5jYWxsKG4sYShpLGUsQixvKSxhKGksZSxxLG8pKTooaSsrLGMuY2FsbChuLGEoaSxlLEIsbyksYShpLGUscSxvKSxhKGksZSxCLGUubm90aWZ5V2l0aCkpKToociE9PUImJihzPXZvaWQgMCx1PVtuXSksKG98fGUucmVzb2x2ZVdpdGgpKHMsdSkpfX0sbD1vP2M6ZnVuY3Rpb24oKXt0cnl7YygpfWNhdGNoKG4pe1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmUy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKG4sbC5zdGFja1RyYWNlKSx0KzE%2BPWkmJihyIT09cSYmKHM9dm9pZCAwLHU9W25dKSxlLnJlamVjdFdpdGgocyx1KSl9fTt0P2woKTooUy5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihsLnN0YWNrVHJhY2U9Uy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksbi5zZXRUaW1lb3V0KGwpKX19cmV0dXJuIFMuRGVmZXJyZWQoZnVuY3Rpb24obil7ZVswXVszXS5hZGQoYSgwLG4sbShvKT9vOkIsbi5ub3RpZnlXaXRoKSksZVsxXVszXS5hZGQoYSgwLG4sbSh0KT90OkIpKSxlWzJdWzNdLmFkZChhKDAsbixtKHIpP3I6cSkpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10P1MuZXh0ZW5kKHQsbyk6b319LGk9e307cmV0dXJuIFMuZWFjaChlLGZ1bmN0aW9uKHQsbil7dmFyIGE9blsyXSxzPW5bNV07b1tuWzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sZVszLXRdWzJdLmRpc2FibGUsZVszLXRdWzNdLmRpc2FibGUsZVswXVsyXS5sb2NrLGVbMF1bM10ubG9jayksYS5hZGQoblszXS5maXJlKSxpW25bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGlbblswXSsiV2l0aCJdKHRoaXM9PT1pP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30saVtuWzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLG8ucHJvbWlzZShpKSx0JiZ0LmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1lLHI9QXJyYXkobiksbz11LmNhbGwoYXJndW1lbnRzKSxpPVMuRGVmZXJyZWQoKSxhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyW3RdPXRoaXMsb1t0XT1hcmd1bWVudHMubGVuZ3RoPjE%2FdS5jYWxsKGFyZ3VtZW50cyk6biwtLWV8fGkucmVzb2x2ZVdpdGgocixvKX19O2lmKGU8PTEmJihGKHQsaS5kb25lKGEobikpLnJlc29sdmUsaS5yZWplY3QsIWUpLCJwZW5kaW5nIj09PWkuc3RhdGUoKXx8bShvW25dJiZvW25dLnRoZW4pKSlyZXR1cm4gaS50aGVuKCk7Zm9yKDtuLS07KUYob1tuXSxhKG4pLGkucmVqZWN0KTtyZXR1cm4gaS5wcm9taXNlKCl9fSk7dmFyIEg9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsZSl7bi5jb25zb2xlJiZuLmNvbnNvbGUud2FybiYmdCYmSC50ZXN0KHQubmFtZSkmJm4uY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLGUpfSxTLnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe24uc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIHo9Uy5EZWZlcnJlZCgpO2Z1bmN0aW9uIFcoKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFcpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsVyksUy5yZWFkeSgpfVMuZm4ucmVhZHk9ZnVuY3Rpb24odCl7cmV0dXJuIHoudGhlbih0KS5jYXRjaChmdW5jdGlvbih0KXtTLnJlYWR5RXhjZXB0aW9uKHQpfSksdGhpc30sUy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24odCl7KCEwPT09dD8tLVMucmVhZHlXYWl0OlMuaXNSZWFkeSl8fChTLmlzUmVhZHk9ITAsITAhPT10JiYtLVMucmVhZHlXYWl0PjB8fHoucmVzb2x2ZVdpdGgoYSxbU10pKX19KSxTLnJlYWR5LnRoZW49ei50aGVuLCJjb21wbGV0ZSI9PT1hLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWEucmVhZHlTdGF0ZSYmIWEuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP24uc2V0VGltZW91dChTLnJlYWR5KTooYS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixXKSxuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFcpKTt2YXIgJD1mdW5jdGlvbih0LGUsbixyLG8saSxhKXt2YXIgcz0wLHU9dC5sZW5ndGgsYz1udWxsPT1uO2lmKCJvYmplY3QiPT09ayhuKSlmb3IocyBpbiBvPSEwLG4pJCh0LGUscyxuW3NdLCEwLGksYSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYobz0hMCxtKHIpfHwoYT0hMCksYyYmKGE%2FKGUuY2FsbCh0LHIpLGU9bnVsbCk6KGM9ZSxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYy5jYWxsKFModCksbil9KSksZSkpZm9yKDtzPHU7cysrKWUodFtzXSxuLGE%2FcjpyLmNhbGwodFtzXSxzLGUodFtzXSxuKSkpO3JldHVybiBvP3Q6Yz9lLmNhbGwodCk6dT9lKHRbMF0sbik6aX0sVj0vXi1tcy0vLFk9Ly0oW2Etel0pL2c7ZnVuY3Rpb24gRyh0LGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gSyh0KXtyZXR1cm4gdC5yZXBsYWNlKFYsIm1zLSIpLnJlcGxhY2UoWSxHKX12YXIgWD1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV8fDk9PT10Lm5vZGVUeXBlfHwhK3Qubm9kZVR5cGV9O2Z1bmN0aW9uIEooKXt0aGlzLmV4cGFuZG89Uy5leHBhbmRvK0oudWlkKyt9Si51aWQ9MSxKLnByb3RvdHlwZT17Y2FjaGU6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmV4cGFuZG9dO3JldHVybiBlfHwoZT17fSxYKHQpJiYodC5ub2RlVHlwZT90W3RoaXMuZXhwYW5kb109ZTpPYmplY3QuZGVmaW5lUHJvcGVydHkodCx0aGlzLmV4cGFuZG8se3ZhbHVlOmUsY29uZmlndXJhYmxlOiEwfSkpKSxlfSxzZXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG89dGhpcy5jYWNoZSh0KTtpZigic3RyaW5nIj09dHlwZW9mIGUpb1tLKGUpXT1uO2Vsc2UgZm9yKHIgaW4gZSlvW0socildPWVbcl07cmV0dXJuIG99LGdldDpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuY2FjaGUodCk6dFt0aGlzLmV4cGFuZG9dJiZ0W3RoaXMuZXhwYW5kb11bSyhlKV19LGFjY2VzczpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWV8fGUmJiJzdHJpbmciPT10eXBlb2YgZSYmdm9pZCAwPT09bj90aGlzLmdldCh0LGUpOih0aGlzLnNldCh0LGUsbiksdm9pZCAwIT09bj9uOmUpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRbdGhpcy5leHBhbmRvXTtpZih2b2lkIDAhPT1yKXtpZih2b2lkIDAhPT1lKXtuPShlPUFycmF5LmlzQXJyYXkoZSk%2FZS5tYXAoSyk6KGU9SyhlKSlpbiByP1tlXTplLm1hdGNoKFUpfHxbXSkubGVuZ3RoO2Zvcig7bi0tOylkZWxldGUgcltlW25dXX0odm9pZCAwPT09ZXx8Uy5pc0VtcHR5T2JqZWN0KHIpKSYmKHQubm9kZVR5cGU%2FdFt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgdFt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT1lJiYhUy5pc0VtcHR5T2JqZWN0KGUpfX07dmFyIFE9bmV3IEosWj1uZXcgSix0dD0vXig%2FOlx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGV0PS9bQS1aXS9nO2Z1bmN0aW9uIG50KHQsZSxuKXt2YXIgcjtpZih2b2lkIDA9PT1uJiYxPT09dC5ub2RlVHlwZSlpZihyPSJkYXRhLSIrZS5yZXBsYWNlKGV0LCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj10LmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPWZ1bmN0aW9uKHQpe3JldHVybiJ0cnVlIj09PXR8fCJmYWxzZSIhPT10JiYoIm51bGwiPT09dD9udWxsOnQ9PT0rdCsiIj8rdDp0dC50ZXN0KHQpP0pTT04ucGFyc2UodCk6dCl9KG4pfWNhdGNoKHQpe31aLnNldCh0LGUsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1TLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gWi5oYXNEYXRhKHQpfHxRLmhhc0RhdGEodCl9LGRhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBaLmFjY2Vzcyh0LGUsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24odCxlKXtaLnJlbW92ZSh0LGUpfSxfZGF0YTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFEuYWNjZXNzKHQsZSxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24odCxlKXtRLnJlbW92ZSh0LGUpfX0pLFMuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGk9dGhpc1swXSxhPWkmJmkuYXR0cmlidXRlcztpZih2b2lkIDA9PT10KXtpZih0aGlzLmxlbmd0aCYmKG89Wi5nZXQoaSksMT09PWkubm9kZVR5cGUmJiFRLmdldChpLCJoYXNEYXRhQXR0cnMiKSkpe2ZvcihuPWEubGVuZ3RoO24tLTspYVtuXSYmMD09PShyPWFbbl0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9SyhyLnNsaWNlKDUpKSxudChpLHIsb1tyXSkpO1Euc2V0KGksImhhc0RhdGFBdHRycyIsITApfXJldHVybiBvfXJldHVybiJvYmplY3QiPT10eXBlb2YgdD90aGlzLmVhY2goZnVuY3Rpb24oKXtaLnNldCh0aGlzLHQpfSk6JCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBuO2lmKGkmJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PShuPVouZ2V0KGksdCkpP246dm9pZCAwIT09KG49bnQoaSx0KSk%2Fbjp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5zZXQodGhpcyx0LGUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1oucmVtb3ZlKHRoaXMsdCl9KX19KSxTLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKHQpcmV0dXJuIGU9KGV8fCJmeCIpKyJxdWV1ZSIscj1RLmdldCh0LGUpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPVEuYWNjZXNzKHQsZSxTLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbih0LGUpe2U9ZXx8ImZ4Ijt2YXIgbj1TLnF1ZXVlKHQsZSkscj1uLmxlbmd0aCxvPW4uc2hpZnQoKSxpPVMuX3F1ZXVlSG9va3ModCxlKTsiaW5wcm9ncmVzcyI9PT1vJiYobz1uLnNoaWZ0KCksci0tKSxvJiYoImZ4Ij09PWUmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBpLnN0b3Asby5jYWxsKHQsZnVuY3Rpb24oKXtTLmRlcXVldWUodCxlKX0saSkpLCFyJiZpJiZpLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24odCxlKXt2YXIgbj1lKyJxdWV1ZUhvb2tzIjtyZXR1cm4gUS5nZXQodCxuKXx8US5hY2Nlc3ModCxuLHtlbXB0eTpTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtRLnJlbW92ZSh0LFtlKyJxdWV1ZSIsbl0pfSl9KX19KSxTLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxlKXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKGU9dCx0PSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4%2FUy5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PWU%2FdGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1TLnF1ZXVlKHRoaXMsdCxlKTtTLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PW5bMF0mJlMuZGVxdWV1ZSh0aGlzLHQpfSl9LGRlcXVldWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZGVxdWV1ZSh0aGlzLHQpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVldWUodHx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTEsbz1TLkRlZmVycmVkKCksaT10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8by5yZXNvbHZlV2l0aChpLFtpXSl9O2Zvcigic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLHQ9dHx8ImZ4IjthLS07KShuPVEuZ2V0KGlbYV0sdCsicXVldWVIb29rcyIpKSYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxvLnByb21pc2UoZSl9fSk7dmFyIHJ0PS9bKy1dPyg%2FOlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLG90PW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitydCsiKShbYS16JV0qKSQiLCJpIiksaXQ9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxhdD1hLmRvY3VtZW50RWxlbWVudCxzdD1mdW5jdGlvbih0KXtyZXR1cm4gUy5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCl9LHV0PXtjb21wb3NlZDohMH07YXQuZ2V0Um9vdE5vZGUmJihzdD1mdW5jdGlvbih0KXtyZXR1cm4gUy5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCl8fHQuZ2V0Um9vdE5vZGUodXQpPT09dC5vd25lckRvY3VtZW50fSk7dmFyIGN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIm5vbmUiPT09KHQ9ZXx8dCkuc3R5bGUuZGlzcGxheXx8IiI9PT10LnN0eWxlLmRpc3BsYXkmJnN0KHQpJiYibm9uZSI9PT1TLmNzcyh0LCJkaXNwbGF5Iil9LGx0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYT17fTtmb3IoaSBpbiBlKWFbaV09dC5zdHlsZVtpXSx0LnN0eWxlW2ldPWVbaV07Zm9yKGkgaW4gbz1uLmFwcGx5KHQscnx8W10pLGUpdC5zdHlsZVtpXT1hW2ldO3JldHVybiBvfTtmdW5jdGlvbiBmdCh0LGUsbixyKXt2YXIgbyxpLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIFMuY3NzKHQsZSwiIil9LHU9cygpLGM9biYmblszXXx8KFMuY3NzTnVtYmVyW2VdPyIiOiJweCIpLGw9dC5ub2RlVHlwZSYmKFMuY3NzTnVtYmVyW2VdfHwicHgiIT09YyYmK3UpJiZvdC5leGVjKFMuY3NzKHQsZSkpO2lmKGwmJmxbM10hPT1jKXtmb3IodS89MixjPWN8fGxbM10sbD0rdXx8MTthLS07KVMuc3R5bGUodCxlLGwrYyksKDEtaSkqKDEtKGk9cygpL3V8fC41KSk8PTAmJihhPTApLGwvPWk7bCo9MixTLnN0eWxlKHQsZSxsK2MpLG49bnx8W119cmV0dXJuIG4mJihsPStsfHwrdXx8MCxvPW5bMV0%2FbCsoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9YyxyLnN0YXJ0PWwsci5lbmQ9bykpLG99dmFyIHB0PXt9O2Z1bmN0aW9uIGh0KHQpe3ZhciBlLG49dC5vd25lckRvY3VtZW50LHI9dC5ub2RlTmFtZSxvPXB0W3JdO3JldHVybiBvfHwoZT1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxvPVMuY3NzKGUsImRpc3BsYXkiKSxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksIm5vbmUiPT09byYmKG89ImJsb2NrIikscHRbcl09byxvKX1mdW5jdGlvbiBkdCh0LGUpe2Zvcih2YXIgbixyLG89W10saT0wLGE9dC5sZW5ndGg7aTxhO2krKykocj10W2ldKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LGU%2FKCJub25lIj09PW4mJihvW2ldPVEuZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxvW2ldfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmN0KHIpJiYob1tpXT1odChyKSkpOiJub25lIiE9PW4mJihvW2ldPSJub25lIixRLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihpPTA7aTxhO2krKyludWxsIT1vW2ldJiYodFtpXS5zdHlsZS5kaXNwbGF5PW9baV0pO3JldHVybiB0fVMuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGR0KHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGR0KHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdD90P3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2N0KHRoaXMpP1ModGhpcykuc2hvdygpOlModGhpcykuaGlkZSgpfSl9fSk7dmFyIGd0PS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHZ0PS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLHl0PS9eJHxebW9kdWxlJHxcLyg%2FOmphdmF8ZWNtYSlzY3JpcHQvaSxtdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc%2BIiwiPC9zZWxlY3Q%2BIl0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU%2BIl0sdHI6WzIsIjx0YWJsZT48dGJvZHk%2BIiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU%2BPHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk%2BPC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2Z1bmN0aW9uIGJ0KHQsZSl7dmFyIG47cmV0dXJuIG49dm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGV8fCIqIik6dm9pZCAwIT09dC5xdWVyeVNlbGVjdG9yQWxsP3QucXVlcnlTZWxlY3RvckFsbChlfHwiKiIpOltdLHZvaWQgMD09PWV8fGUmJkwodCxlKT9TLm1lcmdlKFt0XSxuKTpufWZ1bmN0aW9uIHh0KHQsZSl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKVEuc2V0KHRbbl0sImdsb2JhbEV2YWwiLCFlfHxRLmdldChlW25dLCJnbG9iYWxFdmFsIikpfW10Lm9wdGdyb3VwPW10Lm9wdGlvbixtdC50Ym9keT1tdC50Zm9vdD1tdC5jb2xncm91cD1tdC5jYXB0aW9uPW10LnRoZWFkLG10LnRoPW10LnRkO3ZhciB3dCxrdCxTdD0vPHwmIz9cdys7LztmdW5jdGlvbiBFdCh0LGUsbixyLG8pe2Zvcih2YXIgaSxhLHMsdSxjLGwsZj1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxwPVtdLGg9MCxkPXQubGVuZ3RoO2g8ZDtoKyspaWYoKGk9dFtoXSl8fDA9PT1pKWlmKCJvYmplY3QiPT09ayhpKSlTLm1lcmdlKHAsaS5ub2RlVHlwZT9baV06aSk7ZWxzZSBpZihTdC50ZXN0KGkpKXtmb3IoYT1hfHxmLmFwcGVuZENoaWxkKGUuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KHZ0LmV4ZWMoaSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1tdFtzXXx8bXQuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStTLmh0bWxQcmVmaWx0ZXIoaSkrdVsyXSxsPXVbMF07bC0tOylhPWEubGFzdENoaWxkO1MubWVyZ2UocCxhLmNoaWxkTm9kZXMpLChhPWYuZmlyc3RDaGlsZCkudGV4dENvbnRlbnQ9IiJ9ZWxzZSBwLnB1c2goZS5jcmVhdGVUZXh0Tm9kZShpKSk7Zm9yKGYudGV4dENvbnRlbnQ9IiIsaD0wO2k9cFtoKytdOylpZihyJiZTLmluQXJyYXkoaSxyKT4tMSlvJiZvLnB1c2goaSk7ZWxzZSBpZihjPXN0KGkpLGE9YnQoZi5hcHBlbmRDaGlsZChpKSwic2NyaXB0IiksYyYmeHQoYSksbilmb3IobD0wO2k9YVtsKytdOyl5dC50ZXN0KGkudHlwZXx8IiIpJiZuLnB1c2goaSk7cmV0dXJuIGZ9d3Q9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGt0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksa3Quc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLHd0LmFwcGVuZENoaWxkKGt0KSx5LmNoZWNrQ2xvbmU9d3QuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLHd0LmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIXd0LmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTt2YXIgVHQ9L15rZXkvLEF0PS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxPdD0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gQ3QoKXtyZXR1cm4hMH1mdW5jdGlvbiBqdCgpe3JldHVybiExfWZ1bmN0aW9uIEx0KHQsZSl7cmV0dXJuIHQ9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fWNhdGNoKHQpe319KCk9PSgiZm9jdXMiPT09ZSl9ZnVuY3Rpb24gUHQodCxlLG4scixvLGkpe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IocyBpbiJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCksZSlQdCh0LHMsbixyLGVbc10saSk7cmV0dXJuIHR9aWYobnVsbD09ciYmbnVsbD09bz8obz1uLHI9bj12b2lkIDApOm51bGw9PW8mJigic3RyaW5nIj09dHlwZW9mIG4%2FKG89cixyPXZvaWQgMCk6KG89cixyPW4sbj12b2lkIDApKSwhMT09PW8pbz1qdDtlbHNlIGlmKCFvKXJldHVybiB0O3JldHVybiAxPT09aSYmKGE9bywobz1mdW5jdGlvbih0KXtyZXR1cm4gUygpLm9mZih0KSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPVMuZ3VpZCsrKSksdC5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5hZGQodGhpcyxlLG8scixuKX0pfWZ1bmN0aW9uIFJ0KHQsZSxuKXtuPyhRLnNldCh0LGUsITEpLFMuZXZlbnQuYWRkKHQsZSx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIHIsbyxpPVEuZ2V0KHRoaXMsZSk7aWYoMSZ0LmlzVHJpZ2dlciYmdGhpc1tlXSl7aWYoaS5sZW5ndGgpKFMuZXZlbnQuc3BlY2lhbFtlXXx8e30pLmRlbGVnYXRlVHlwZSYmdC5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKGk9dS5jYWxsKGFyZ3VtZW50cyksUS5zZXQodGhpcyxlLGkpLHI9bih0aGlzLGUpLHRoaXNbZV0oKSxpIT09KG89US5nZXQodGhpcyxlKSl8fHI%2FUS5zZXQodGhpcyxlLCExKTpvPXt9LGkhPT1vKXJldHVybiB0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSxvLnZhbHVlfWVsc2UgaS5sZW5ndGgmJihRLnNldCh0aGlzLGUse3ZhbHVlOlMuZXZlbnQudHJpZ2dlcihTLmV4dGVuZChpWzBdLFMuRXZlbnQucHJvdG90eXBlKSxpLnNsaWNlKDEpLHRoaXMpfSksdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PVEuZ2V0KHQsZSkmJlMuZXZlbnQuYWRkKHQsZSxDdCl9Uy5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsaCxkLGcsdj1RLmdldCh0KTtpZih2KWZvcihuLmhhbmRsZXImJihuPShpPW4pLmhhbmRsZXIsbz1pLnNlbGVjdG9yKSxvJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGF0LG8pLG4uZ3VpZHx8KG4uZ3VpZD1TLmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz17fSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09UyYmUy5ldmVudC50cmlnZ2VyZWQhPT1lLnR5cGU%2FUy5ldmVudC5kaXNwYXRjaC5hcHBseSh0LGFyZ3VtZW50cyk6dm9pZCAwfSksYz0oZT0oZXx8IiIpLm1hdGNoKFUpfHxbIiJdKS5sZW5ndGg7Yy0tOyloPWc9KHM9T3QuZXhlYyhlW2NdKXx8W10pWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoJiYoZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LGg9KG8%2FZi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGgsZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LGw9Uy5leHRlbmQoe3R5cGU6aCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6byxuZWVkc0NvbnRleHQ6byYmUy5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KG8pLG5hbWVzcGFjZTpkLmpvaW4oIi4iKX0saSksKHA9dVtoXSl8fCgocD11W2hdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwodCxyLGQsYSl8fHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKGgsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbCh0LGwpLGwuaGFuZGxlci5ndWlkfHwobC5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksbz9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGwpOnAucHVzaChsKSxTLmV2ZW50Lmdsb2JhbFtoXT0hMCl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsaCxkLGcsdj1RLmhhc0RhdGEodCkmJlEuZ2V0KHQpO2lmKHYmJih1PXYuZXZlbnRzKSl7Zm9yKGM9KGU9KGV8fCIiKS5tYXRjaChVKXx8WyIiXSkubGVuZ3RoO2MtLTspaWYoaD1nPShzPU90LmV4ZWMoZVtjXSl8fFtdKVsxXSxkPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksaCl7Zm9yKGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxwPXVbaD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8aF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrZC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPWk9cC5sZW5ndGg7aS0tOylsPXBbaV0sIW8mJmchPT1sLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1sLmd1aWR8fHMmJiFzLnRlc3QobC5uYW1lc3BhY2UpfHxyJiZyIT09bC5zZWxlY3RvciYmKCIqKiIhPT1yfHwhbC5zZWxlY3Rvcil8fChwLnNwbGljZShpLDEpLGwuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKHQsbCkpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKHQsZCx2LmhhbmRsZSl8fFMucmVtb3ZlRXZlbnQodCxoLHYuaGFuZGxlKSxkZWxldGUgdVtoXSl9ZWxzZSBmb3IoaCBpbiB1KVMuZXZlbnQucmVtb3ZlKHQsaCtlW2NdLG4sciwhMCk7Uy5pc0VtcHR5T2JqZWN0KHUpJiZRLnJlbW92ZSh0LCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscz1TLmV2ZW50LmZpeCh0KSx1PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxjPShRLmdldCh0aGlzLCJldmVudHMiKXx8e30pW3MudHlwZV18fFtdLGw9Uy5ldmVudC5zcGVjaWFsW3MudHlwZV18fHt9O2Zvcih1WzBdPXMsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdVtlXT1hcmd1bWVudHNbZV07aWYocy5kZWxlZ2F0ZVRhcmdldD10aGlzLCFsLnByZURpc3BhdGNofHwhMSE9PWwucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHMpKXtmb3IoYT1TLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxzLGMpLGU9MDsobz1hW2UrK10pJiYhcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOylmb3Iocy5jdXJyZW50VGFyZ2V0PW8uZWxlbSxuPTA7KGk9by5oYW5kbGVyc1tuKytdKSYmIXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTspcy5ybmFtZXNwYWNlJiYhMSE9PWkubmFtZXNwYWNlJiYhcy5ybmFtZXNwYWNlLnRlc3QoaS5uYW1lc3BhY2UpfHwocy5oYW5kbGVPYmo9aSxzLmRhdGE9aS5kYXRhLHZvaWQgMCE9PShyPSgoUy5ldmVudC5zcGVjaWFsW2kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxpLmhhbmRsZXIpLmFwcGx5KG8uZWxlbSx1KSkmJiExPT09KHMucmVzdWx0PXIpJiYocy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCkpKTtyZXR1cm4gbC5wb3N0RGlzcGF0Y2gmJmwucG9zdERpc3BhdGNoLmNhbGwodGhpcyxzKSxzLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGksYSxzPVtdLHU9ZS5kZWxlZ2F0ZUNvdW50LGM9dC50YXJnZXQ7aWYodSYmYy5ub2RlVHlwZSYmISgiY2xpY2siPT09dC50eXBlJiZ0LmJ1dHRvbj49MSkpZm9yKDtjIT09dGhpcztjPWMucGFyZW50Tm9kZXx8dGhpcylpZigxPT09Yy5ub2RlVHlwZSYmKCJjbGljayIhPT10LnR5cGV8fCEwIT09Yy5kaXNhYmxlZCkpe2ZvcihpPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtvPShyPWVbbl0pLnNlbGVjdG9yKyIgIl0mJihhW29dPXIubmVlZHNDb250ZXh0P1Mobyx0aGlzKS5pbmRleChjKT4tMTpTLmZpbmQobyx0aGlzLG51bGwsW2NdKS5sZW5ndGgpLGFbb10mJmkucHVzaChyKTtpLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmMsaGFuZGxlcnM6aX0pfXJldHVybiBjPXRoaXMsdTxlLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmMsaGFuZGxlcnM6ZS5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoUy5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk%2FZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKHQpe3JldHVybiB0W1MuZXhwYW5kb10%2FdDpuZXcgUy5FdmVudCh0KX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzfHx0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUnQoZSwiY2xpY2siLEN0KSwhMX0sdHJpZ2dlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzfHx0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUnQoZSwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZRLmdldChlLCJjbGljayIpfHxMKGUsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQucmVzdWx0JiZ0Lm9yaWdpbmFsRXZlbnQmJih0Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9dC5yZXN1bHQpfX19fSxTLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKHQsZSxuKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXImJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4pfSxTLkV2ZW50PWZ1bmN0aW9uKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgUy5FdmVudCkpcmV0dXJuIG5ldyBTLkV2ZW50KHQsZSk7dCYmdC50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9dCx0aGlzLnR5cGU9dC50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPXQuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09dC5kZWZhdWx0UHJldmVudGVkJiYhMT09PXQucmV0dXJuVmFsdWU%2FQ3Q6anQsdGhpcy50YXJnZXQ9dC50YXJnZXQmJjM9PT10LnRhcmdldC5ub2RlVHlwZT90LnRhcmdldC5wYXJlbnROb2RlOnQudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD10LmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PXQucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPXQsZSYmUy5leHRlbmQodGhpcyxlKSx0aGlzLnRpbWVTdGFtcD10JiZ0LnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW1MuZXhwYW5kb109ITB9LFMuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpqdCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpqdCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpqdCxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1DdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1DdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Q3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LFMuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxjaGFyOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24odCl7dmFyIGU9dC5idXR0b247cmV0dXJuIG51bGw9PXQud2hpY2gmJlR0LnRlc3QodC50eXBlKT9udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlOiF0LndoaWNoJiZ2b2lkIDAhPT1lJiZBdC50ZXN0KHQudHlwZSk%2FMSZlPzE6MiZlPzM6NCZlPzI6MDp0LndoaWNofX0sUy5ldmVudC5hZGRQcm9wKSxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7Uy5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBSdCh0aGlzLHQsTHQpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIFJ0KHRoaXMsdCksITB9LGRlbGVnYXRlVHlwZTplfX0pLFMuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24odCxlKXtTLmV2ZW50LnNwZWNpYWxbdF09e2RlbGVnYXRlVHlwZTplLGJpbmRUeXBlOmUsaGFuZGxlOmZ1bmN0aW9uKHQpe3ZhciBuLHI9dGhpcyxvPXQucmVsYXRlZFRhcmdldCxpPXQuaGFuZGxlT2JqO3JldHVybiBvJiYobz09PXJ8fFMuY29udGFpbnMocixvKSl8fCh0LnR5cGU9aS5vcmlnVHlwZSxuPWkuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC50eXBlPWUpLG59fX0pLFMuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gUHQodGhpcyx0LGUsbixyKX0sb25lOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBQdCh0aGlzLHQsZSxuLHIsMSl9LG9mZjpmdW5jdGlvbih0LGUsbil7dmFyIHIsbztpZih0JiZ0LnByZXZlbnREZWZhdWx0JiZ0LmhhbmRsZU9iailyZXR1cm4gcj10LmhhbmRsZU9iaixTKHQuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlKyIuIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKG8gaW4gdCl0aGlzLm9mZihvLGUsdFtvXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZXx8KG49ZSxlPXZvaWQgMCksITE9PT1uJiYobj1qdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5yZW1vdmUodGhpcyx0LG4sZSl9KX19KTt2YXIgTnQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW2Etel1bXlwvXDA%2BXHgyMFx0XHJcblxmXSopW14%2BXSopXC8%2BL2dpLEl0PS88c2NyaXB0fDxzdHlsZXw8bGluay9pLER0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLF90PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg%2FOlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBNdCh0LGUpe3JldHVybiBMKHQsInRhYmxlIikmJkwoMTEhPT1lLm5vZGVUeXBlP2U6ZS5maXJzdENoaWxkLCJ0ciIpJiZTKHQpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHx0fWZ1bmN0aW9uIFV0KHQpe3JldHVybiB0LnR5cGU9KG51bGwhPT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrdC50eXBlLHR9ZnVuY3Rpb24gQnQodCl7cmV0dXJuInRydWUvIj09PSh0LnR5cGV8fCIiKS5zbGljZSgwLDUpP3QudHlwZT10LnR5cGUuc2xpY2UoNSk6dC5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSx0fWZ1bmN0aW9uIHF0KHQsZSl7dmFyIG4scixvLGksYSxzLHUsYztpZigxPT09ZS5ub2RlVHlwZSl7aWYoUS5oYXNEYXRhKHQpJiYoaT1RLmFjY2Vzcyh0KSxhPVEuc2V0KGUsaSksYz1pLmV2ZW50cykpZm9yKG8gaW4gZGVsZXRlIGEuaGFuZGxlLGEuZXZlbnRzPXt9LGMpZm9yKG49MCxyPWNbb10ubGVuZ3RoO248cjtuKyspUy5ldmVudC5hZGQoZSxvLGNbb11bbl0pO1ouaGFzRGF0YSh0KSYmKHM9Wi5hY2Nlc3ModCksdT1TLmV4dGVuZCh7fSxzKSxaLnNldChlLHUpKX19ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PW4mJmd0LnRlc3QodC50eXBlKT9lLmNoZWNrZWQ9dC5jaGVja2VkOiJpbnB1dCIhPT1uJiYidGV4dGFyZWEiIT09bnx8KGUuZGVmYXVsdFZhbHVlPXQuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBIdCh0LGUsbixyKXtlPWMuYXBwbHkoW10sZSk7dmFyIG8saSxhLHMsdSxsLGY9MCxwPXQubGVuZ3RoLGg9cC0xLGQ9ZVswXSxnPW0oZCk7aWYoZ3x8cD4xJiYic3RyaW5nIj09dHlwZW9mIGQmJiF5LmNoZWNrQ2xvbmUmJkR0LnRlc3QoZCkpcmV0dXJuIHQuZWFjaChmdW5jdGlvbihvKXt2YXIgaT10LmVxKG8pO2cmJihlWzBdPWQuY2FsbCh0aGlzLG8saS5odG1sKCkpKSxIdChpLGUsbixyKX0pO2lmKHAmJihpPShvPUV0KGUsdFswXS5vd25lckRvY3VtZW50LCExLHQscikpLmZpcnN0Q2hpbGQsMT09PW8uY2hpbGROb2Rlcy5sZW5ndGgmJihvPWkpLGl8fHIpKXtmb3Iocz0oYT1TLm1hcChidChvLCJzY3JpcHQiKSxVdCkpLmxlbmd0aDtmPHA7ZisrKXU9byxmIT09aCYmKHU9Uy5jbG9uZSh1LCEwLCEwKSxzJiZTLm1lcmdlKGEsYnQodSwic2NyaXB0IikpKSxuLmNhbGwodFtmXSx1LGYpO2lmKHMpZm9yKGw9YVthLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LFMubWFwKGEsQnQpLGY9MDtmPHM7ZisrKXU9YVtmXSx5dC50ZXN0KHUudHlwZXx8IiIpJiYhUS5hY2Nlc3ModSwiZ2xvYmFsRXZhbCIpJiZTLmNvbnRhaW5zKGwsdSkmJih1LnNyYyYmIm1vZHVsZSIhPT0odS50eXBlfHwiIikudG9Mb3dlckNhc2UoKT9TLl9ldmFsVXJsJiYhdS5ub01vZHVsZSYmUy5fZXZhbFVybCh1LnNyYyx7bm9uY2U6dS5ub25jZXx8dS5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9KTp3KHUudGV4dENvbnRlbnQucmVwbGFjZShfdCwiIiksdSxsKSl9cmV0dXJuIHR9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgcixvPWU%2FUy5maWx0ZXIoZSx0KTp0LGk9MDtudWxsIT0ocj1vW2ldKTtpKyspbnx8MSE9PXIubm9kZVR5cGV8fFMuY2xlYW5EYXRhKGJ0KHIpKSxyLnBhcmVudE5vZGUmJihuJiZzdChyKSYmeHQoYnQociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIHR9Uy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZShOdCwiPCQxPjwvJDI%2BIil9LGNsb25lOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzPXQuY2xvbmVOb2RlKCEwKSx1PXN0KHQpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PXQubm9kZVR5cGUmJjExIT09dC5ub2RlVHlwZXx8Uy5pc1hNTERvYyh0KSkpZm9yKGE9YnQocykscj0wLG89KGk9YnQodCkpLmxlbmd0aDtyPG87cisrKUZ0KGlbcl0sYVtyXSk7aWYoZSlpZihuKWZvcihpPWl8fGJ0KHQpLGE9YXx8YnQocykscj0wLG89aS5sZW5ndGg7cjxvO3IrKylxdChpW3JdLGFbcl0pO2Vsc2UgcXQodCxzKTtyZXR1cm4oYT1idChzLCJzY3JpcHQiKSkubGVuZ3RoPjAmJnh0KGEsIXUmJmJ0KHQsInNjcmlwdCIpKSxzfSxjbGVhbkRhdGE6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4scixvPVMuZXZlbnQuc3BlY2lhbCxpPTA7dm9pZCAwIT09KG49dFtpXSk7aSsrKWlmKFgobikpe2lmKGU9bltRLmV4cGFuZG9dKXtpZihlLmV2ZW50cylmb3IociBpbiBlLmV2ZW50cylvW3JdP1MuZXZlbnQucmVtb3ZlKG4scik6Uy5yZW1vdmVFdmVudChuLHIsZS5oYW5kbGUpO25bUS5leHBhbmRvXT12b2lkIDB9bltaLmV4cGFuZG9dJiYobltaLmV4cGFuZG9dPXZvaWQgMCl9fX0pLFMuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHRoaXMsdCwhMCl9LHJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4genQodGhpcyx0KX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P1MudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD10KX0pfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8TXQodGhpcyx0KS5hcHBlbmRDaGlsZCh0KX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgZT1NdCh0aGlzLHQpO2UuaW5zZXJ0QmVmb3JlKHQsZS5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9MDtudWxsIT0odD10aGlzW2VdKTtlKyspMT09PXQubm9kZVR5cGUmJihTLmNsZWFuRGF0YShidCh0LCExKSksdC50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9bnVsbCE9dCYmdCxlPW51bGw9PWU%2FdDplLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIFMuY2xvbmUodGhpcyx0LGUpfSl9LGh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0KXt2YXIgZT10aGlzWzBdfHx7fSxuPTAscj10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT10JiYxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZS5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYhSXQudGVzdCh0KSYmIW10Wyh2dC5leGVjKHQpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7dD1TLmh0bWxQcmVmaWx0ZXIodCk7dHJ5e2Zvcig7bjxyO24rKykxPT09KGU9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEoYnQoZSwhMSkpLGUuaW5uZXJIVE1MPXQpO2U9MH1jYXRjaCh0KXt9fWUmJnRoaXMuZW1wdHkoKS5hcHBlbmQodCl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5wYXJlbnROb2RlO1MuaW5BcnJheSh0aGlzLHQpPDAmJihTLmNsZWFuRGF0YShidCh0aGlzKSksbiYmbi5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LHQpfX0pLFMuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbih0KXtmb3IodmFyIG4scj1bXSxvPVModCksaT1vLmxlbmd0aC0xLGE9MDthPD1pO2ErKyluPWE9PT1pP3RoaXM6dGhpcy5jbG9uZSghMCksUyhvW2FdKVtlXShuKSxsLmFwcGx5KHIsbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpfX0pO3ZhciBXdD1uZXcgUmVnRXhwKCJeKCIrcnQrIikoPyFweClbYS16JV0rJCIsImkiKSwkdD1mdW5jdGlvbih0KXt2YXIgZT10Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGUmJmUub3BlbmVyfHwoZT1uKSxlLmdldENvbXB1dGVkU3R5bGUodCl9LFZ0PW5ldyBSZWdFeHAoaXQuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gWXQodCxlLG4pe3ZhciByLG8saSxhLHM9dC5zdHlsZTtyZXR1cm4obj1ufHwkdCh0KSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZShlKXx8bltlXSl8fHN0KHQpfHwoYT1TLnN0eWxlKHQsZSkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJld0LnRlc3QoYSkmJlZ0LnRlc3QoZSkmJihyPXMud2lkdGgsbz1zLm1pbldpZHRoLGk9cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1vLHMubWF4V2lkdGg9aSkpLHZvaWQgMCE9PWE%2FYSsiIjphfWZ1bmN0aW9uIEd0KHQsZSl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCF0KCkpcmV0dXJuKHRoaXMuZ2V0PWUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7aWYobCl7Yy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLGF0LmFwcGVuZENoaWxkKGMpLmFwcGVuZENoaWxkKGwpO3ZhciB0PW4uZ2V0Q29tcHV0ZWRTdHlsZShsKTtyPSIxJSIhPT10LnRvcCx1PTEyPT09ZSh0Lm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9IjYwJSIscz0zNj09PWUodC5yaWdodCksbz0zNj09PWUodC53aWR0aCksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT1lKGwub2Zmc2V0V2lkdGgvMyksYXQucmVtb3ZlQ2hpbGQoYyksbD1udWxsfX1mdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQodCkpfXZhciByLG8saSxzLHUsYz1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGw9YS5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLnN0eWxlJiYobC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGwuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09bC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxTLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHJ9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksaX19KSl9KCk7dmFyIEt0PVsiV2Via2l0IiwiTW96IiwibXMiXSxYdD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLEp0PXt9O2Z1bmN0aW9uIFF0KHQpe3ZhciBlPVMuY3NzUHJvcHNbdF18fEp0W3RdO3JldHVybiBlfHwodCBpbiBYdD90Okp0W3RdPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxuPUt0Lmxlbmd0aDtuLS07KWlmKCh0PUt0W25dK2UpaW4gWHQpcmV0dXJuIHR9KHQpfHx0KX12YXIgWnQ9L14obm9uZXx0YWJsZSg%2FIS1jW2VhXSkuKykvLHRlPS9eLS0vLGVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxuZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gcmUodCxlLG4pe3ZhciByPW90LmV4ZWMoZSk7cmV0dXJuIHI%2FTWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOmV9ZnVuY3Rpb24gb2UodCxlLG4scixvLGkpe3ZhciBhPSJ3aWR0aCI9PT1lPzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9Uy5jc3ModCxuK2l0W2FdLCEwLG8pKSxyPygiY29udGVudCI9PT1uJiYodS09Uy5jc3ModCwicGFkZGluZyIraXRbYV0sITAsbykpLCJtYXJnaW4iIT09biYmKHUtPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKSkpOih1Kz1TLmNzcyh0LCJwYWRkaW5nIitpdFthXSwhMCxvKSwicGFkZGluZyIhPT1uP3UrPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKTpzKz1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbykpO3JldHVybiFyJiZpPj0wJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0taS11LXMtLjUpKXx8MCksdX1mdW5jdGlvbiBpZSh0LGUsbil7dmFyIHI9JHQodCksbz0oIXkuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsciksaT1vLGE9WXQodCxlLHIpLHM9Im9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7aWYoV3QudGVzdChhKSl7aWYoIW4pcmV0dXJuIGE7YT0iYXV0byJ9cmV0dXJuKCF5LmJveFNpemluZ1JlbGlhYmxlKCkmJm98fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PVMuY3NzKHQsImRpc3BsYXkiLCExLHIpKSYmdC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKG89ImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxyKSwoaT1zIGluIHQpJiYoYT10W3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrb2UodCxlLG58fChvPyJib3JkZXIiOiJjb250ZW50IiksaSxyLGEpKyJweCJ9ZnVuY3Rpb24gYWUodCxlLG4scixvKXtyZXR1cm4gbmV3IGFlLnByb3RvdHlwZS5pbml0KHQsZSxuLHIsbyl9Uy5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24odCxlKXtpZihlKXt2YXIgbj1ZdCh0LCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbih0LGUsbixyKXtpZih0JiYzIT09dC5ub2RlVHlwZSYmOCE9PXQubm9kZVR5cGUmJnQuc3R5bGUpe3ZhciBvLGksYSxzPUsoZSksdT10ZS50ZXN0KGUpLGM9dC5zdHlsZTtpZih1fHwoZT1RdChzKSksYT1TLmNzc0hvb2tzW2VdfHxTLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KG89YS5nZXQodCwhMSxyKSk%2FbzpjW2VdOyJzdHJpbmciPT09KGk9dHlwZW9mIG4pJiYobz1vdC5leGVjKG4pKSYmb1sxXSYmKG49ZnQodCxlLG8pLGk9Im51bWJlciIpLG51bGwhPW4mJm49PW4mJigibnVtYmVyIiE9PWl8fHV8fChuKz1vJiZvWzNdfHwoUy5jc3NOdW1iZXJbc10%2FIiI6InB4IikpLHkuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT1lLmluZGV4T2YoImJhY2tncm91bmQiKXx8KGNbZV09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KHQsbixyKSl8fCh1P2Muc2V0UHJvcGVydHkoZSxuKTpjW2VdPW4pKX19LGNzczpmdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGEscz1LKGUpO3JldHVybiB0ZS50ZXN0KGUpfHwoZT1RdChzKSksKGE9Uy5jc3NIb29rc1tlXXx8Uy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKG89YS5nZXQodCwhMCxuKSksdm9pZCAwPT09byYmKG89WXQodCxlLHIpKSwibm9ybWFsIj09PW8mJmUgaW4gbmUmJihvPW5lW2VdKSwiIj09PW58fG4%2FKGk9cGFyc2VGbG9hdChvKSwhMD09PW58fGlzRmluaXRlKGkpP2l8fDA6byk6b319KSxTLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1tlXT17Z2V0OmZ1bmN0aW9uKHQsbixyKXtpZihuKXJldHVybiFadC50ZXN0KFMuY3NzKHQsImRpc3BsYXkiKSl8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg%2FaWUodCxlLHIpOmx0KHQsZWUsZnVuY3Rpb24oKXtyZXR1cm4gaWUodCxlLHIpfSl9LHNldDpmdW5jdGlvbih0LG4scil7dmFyIG8saT0kdCh0KSxhPSF5LnNjcm9sbGJveFNpemUoKSYmImFic29sdXRlIj09PWkucG9zaXRpb24scz0oYXx8cikmJiJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsaSksdT1yP29lKHQsZSxyLHMsaSk6MDtyZXR1cm4gcyYmYSYmKHUtPU1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbZV0pLW9lKHQsZSwiYm9yZGVyIiwhMSxpKS0uNSkpLHUmJihvPW90LmV4ZWMobikpJiYicHgiIT09KG9bM118fCJweCIpJiYodC5zdHlsZVtlXT1uLG49Uy5jc3ModCxlKSkscmUoMCxuLHUpfX19KSxTLmNzc0hvb2tzLm1hcmdpbkxlZnQ9R3QoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24odCxlKXtpZihlKXJldHVybihwYXJzZUZsb2F0KFl0KHQsIm1hcmdpbkxlZnQiKSl8fHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1sdCh0LHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksUy5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW3QrZV09e2V4cGFuZDpmdW5jdGlvbihuKXtmb3IodmFyIHI9MCxvPXt9LGk9InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07cjw0O3IrKylvW3QraXRbcl0rZV09aVtyXXx8aVtyLTJdfHxpWzBdO3JldHVybiBvfX0sIm1hcmdpbiIhPT10JiYoUy5jc3NIb29rc1t0K2VdLnNldD1yZSl9KSxTLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KGUpKXtmb3Iocj0kdCh0KSxvPWUubGVuZ3RoO2E8bzthKyspaVtlW2FdXT1TLmNzcyh0LGVbYV0sITEscik7cmV0dXJuIGl9cmV0dXJuIHZvaWQgMCE9PW4%2FUy5zdHlsZSh0LGUsbik6Uy5jc3ModCxlKX0sdCxlLGFyZ3VtZW50cy5sZW5ndGg%2BMSl9fSksUy5Ud2Vlbj1hZSxhZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmFlLGluaXQ6ZnVuY3Rpb24odCxlLG4scixvLGkpe3RoaXMuZWxlbT10LHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPW98fFMuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1lLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1pfHwoUy5jc3NOdW1iZXJbbl0%2FIiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciB0PWFlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0JiZ0LmdldD90LmdldCh0aGlzKTphZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24odCl7dmFyIGUsbj1hZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWU9Uy5lYXNpbmdbdGhpcy5lYXNpbmddKHQsdGhpcy5vcHRpb25zLmR1cmF0aW9uKnQsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9ZT10LHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSplK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOmFlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGFlLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1hZS5wcm90b3R5cGUsYWUucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiAxIT09dC5lbGVtLm5vZGVUeXBlfHxudWxsIT10LmVsZW1bdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW3QucHJvcF0%2FdC5lbGVtW3QucHJvcF06KGU9Uy5jc3ModC5lbGVtLHQucHJvcCwiIikpJiYiYXV0byIhPT1lP2U6MH0sc2V0OmZ1bmN0aW9uKHQpe1MuZnguc3RlcFt0LnByb3BdP1MuZnguc3RlcFt0LnByb3BdKHQpOjEhPT10LmVsZW0ubm9kZVR5cGV8fCFTLmNzc0hvb2tzW3QucHJvcF0mJm51bGw9PXQuZWxlbS5zdHlsZVtRdCh0LnByb3ApXT90LmVsZW1bdC5wcm9wXT10Lm5vdzpTLnN0eWxlKHQuZWxlbSx0LnByb3AsdC5ub3crdC51bml0KX19fSxhZS5wcm9wSG9va3Muc2Nyb2xsVG9wPWFlLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24odCl7dC5lbGVtLm5vZGVUeXBlJiZ0LmVsZW0ucGFyZW50Tm9kZSYmKHQuZWxlbVt0LnByb3BdPXQubm93KX19LFMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHN3aW5nOmZ1bmN0aW9uKHQpe3JldHVybi41LU1hdGguY29zKHQqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sUy5meD1hZS5wcm90b3R5cGUuaW5pdCxTLmZ4LnN0ZXA9e307dmFyIHNlLHVlLGNlPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxsZT0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGZlKCl7dWUmJighMT09PWEuaGlkZGVuJiZuLnJlcXVlc3RBbmltYXRpb25GcmFtZT9uLnJlcXVlc3RBbmltYXRpb25GcmFtZShmZSk6bi5zZXRUaW1lb3V0KGZlLFMuZnguaW50ZXJ2YWwpLFMuZngudGljaygpKX1mdW5jdGlvbiBwZSgpe3JldHVybiBuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZT12b2lkIDB9KSxzZT1EYXRlLm5vdygpfWZ1bmN0aW9uIGhlKHQsZSl7dmFyIG4scj0wLG89e2hlaWdodDp0fTtmb3IoZT1lPzE6MDtyPDQ7cis9Mi1lKW9bIm1hcmdpbiIrKG49aXRbcl0pXT1vWyJwYWRkaW5nIituXT10O3JldHVybiBlJiYoby5vcGFjaXR5PW8ud2lkdGg9dCksb31mdW5jdGlvbiBkZSh0LGUsbil7Zm9yKHZhciByLG89KGdlLnR3ZWVuZXJzW2VdfHxbXSkuY29uY2F0KGdlLnR3ZWVuZXJzWyIqIl0pLGk9MCxhPW8ubGVuZ3RoO2k8YTtpKyspaWYocj1vW2ldLmNhbGwobixlLHQpKXJldHVybiByfWZ1bmN0aW9uIGdlKHQsZSxuKXt2YXIgcixvLGk9MCxhPWdlLnByZWZpbHRlcnMubGVuZ3RoLHM9Uy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYobylyZXR1cm4hMTtmb3IodmFyIGU9c2V8fHBlKCksbj1NYXRoLm1heCgwLGMuc3RhcnRUaW1lK2MuZHVyYXRpb24tZSkscj0xLShuL2MuZHVyYXRpb258fDApLGk9MCxhPWMudHdlZW5zLmxlbmd0aDtpPGE7aSsrKWMudHdlZW5zW2ldLnJ1bihyKTtyZXR1cm4gcy5ub3RpZnlXaXRoKHQsW2MscixuXSkscjwxJiZhP246KGF8fHMubm90aWZ5V2l0aCh0LFtjLDEsMF0pLHMucmVzb2x2ZVdpdGgodCxbY10pLCExKX0sYz1zLnByb21pc2Uoe2VsZW06dCxwcm9wczpTLmV4dGVuZCh7fSxlKSxvcHRzOlMuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpTLmVhc2luZy5fZGVmYXVsdH0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOnNlfHxwZSgpLGR1cmF0aW9uOm4uZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsbil7dmFyIHI9Uy5Ud2Vlbih0LGMub3B0cyxlLG4sYy5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGMub3B0cy5lYXNpbmcpO3JldHVybiBjLnR3ZWVucy5wdXNoKHIpLHJ9LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIG49MCxyPWU%2FYy50d2VlbnMubGVuZ3RoOjA7aWYobylyZXR1cm4gdGhpcztmb3Iobz0hMDtuPHI7bisrKWMudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKHQsW2MsMSwwXSkscy5yZXNvbHZlV2l0aCh0LFtjLGVdKSk6cy5yZWplY3RXaXRoKHQsW2MsZV0pLHRoaXN9fSksbD1jLnByb3BzO2ZvcighZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saSxhO2ZvcihuIGluIHQpaWYobz1lW3I9SyhuKV0saT10W25dLEFycmF5LmlzQXJyYXkoaSkmJihvPWlbMV0saT10W25dPWlbMF0pLG4hPT1yJiYodFtyXT1pLGRlbGV0ZSB0W25dKSwoYT1TLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIGk9YS5leHBhbmQoaSksZGVsZXRlIHRbcl0saSluIGluIHR8fCh0W25dPWlbbl0sZVtuXT1vKTtlbHNlIGVbcl09b30obCxjLm9wdHMuc3BlY2lhbEVhc2luZyk7aTxhO2krKylpZihyPWdlLnByZWZpbHRlcnNbaV0uY2FsbChjLHQsbCxjLm9wdHMpKXJldHVybiBtKHIuc3RvcCkmJihTLl9xdWV1ZUhvb2tzKGMuZWxlbSxjLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIFMubWFwKGwsZGUsYyksbShjLm9wdHMuc3RhcnQpJiZjLm9wdHMuc3RhcnQuY2FsbCh0LGMpLGMucHJvZ3Jlc3MoYy5vcHRzLnByb2dyZXNzKS5kb25lKGMub3B0cy5kb25lLGMub3B0cy5jb21wbGV0ZSkuZmFpbChjLm9wdHMuZmFpbCkuYWx3YXlzKGMub3B0cy5hbHdheXMpLFMuZngudGltZXIoUy5leHRlbmQodSx7ZWxlbTp0LGFuaW06YyxxdWV1ZTpjLm9wdHMucXVldWV9KSksY31TLkFuaW1hdGlvbj1TLmV4dGVuZChnZSx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKHQsZSk7cmV0dXJuIGZ0KG4uZWxlbSx0LG90LmV4ZWMoZSksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKHQsZSl7bSh0KT8oZT10LHQ9WyIqIl0pOnQ9dC5tYXRjaChVKTtmb3IodmFyIG4scj0wLG89dC5sZW5ndGg7cjxvO3IrKyluPXRbcl0sZ2UudHdlZW5lcnNbbl09Z2UudHdlZW5lcnNbbl18fFtdLGdlLnR3ZWVuZXJzW25dLnVuc2hpZnQoZSl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYyxsLGY9IndpZHRoImluIGV8fCJoZWlnaHQiaW4gZSxwPXRoaXMsaD17fSxkPXQuc3R5bGUsZz10Lm5vZGVUeXBlJiZjdCh0KSx2PVEuZ2V0KHQsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1TLl9xdWV1ZUhvb2tzKHQsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFMucXVldWUodCwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksZSlpZihvPWVbcl0sY2UudGVzdChvKSl7aWYoZGVsZXRlIGVbcl0saT1pfHwidG9nZ2xlIj09PW8sbz09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1vfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWhbcl09diYmdltyXXx8Uy5zdHlsZSh0LHIpfWlmKCh1PSFTLmlzRW1wdHlPYmplY3QoZSkpfHwhUy5pc0VtcHR5T2JqZWN0KGgpKWZvcihyIGluIGYmJjE9PT10Lm5vZGVUeXBlJiYobi5vdmVyZmxvdz1bZC5vdmVyZmxvdyxkLm92ZXJmbG93WCxkLm92ZXJmbG93WV0sbnVsbD09KGM9diYmdi5kaXNwbGF5KSYmKGM9US5nZXQodCwiZGlzcGxheSIpKSwibm9uZSI9PT0obD1TLmNzcyh0LCJkaXNwbGF5IikpJiYoYz9sPWM6KGR0KFt0XSwhMCksYz10LnN0eWxlLmRpc3BsYXl8fGMsbD1TLmNzcyh0LCJkaXNwbGF5IiksZHQoW3RdKSkpLCgiaW5saW5lIj09PWx8fCJpbmxpbmUtYmxvY2siPT09bCYmbnVsbCE9YykmJiJub25lIj09PVMuY3NzKHQsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7ZC5kaXNwbGF5PWN9KSxudWxsPT1jJiYobD1kLmRpc3BsYXksYz0ibm9uZSI9PT1sPyIiOmwpKSxkLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoZC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2Qub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxkLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGQub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxoKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9US5hY2Nlc3ModCwiZnhzaG93Iix7ZGlzcGxheTpjfSksaSYmKHYuaGlkZGVuPSFnKSxnJiZkdChbdF0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGR0KFt0XSksUS5yZW1vdmUodCwiZnhzaG93IiksaClTLnN0eWxlKHQscixoW3JdKX0pKSx1PWRlKGc%2FdltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKHQsZSl7ZT9nZS5wcmVmaWx0ZXJzLnVuc2hpZnQodCk6Z2UucHJlZmlsdGVycy5wdXNoKHQpfX0pLFMuc3BlZWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQmJiJvYmplY3QiPT10eXBlb2YgdD9TLmV4dGVuZCh7fSx0KTp7Y29tcGxldGU6bnx8IW4mJmV8fG0odCkmJnQsZHVyYXRpb246dCxlYXNpbmc6biYmZXx8ZSYmIW0oZSkmJmV9O3JldHVybiBTLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBTLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVMuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249Uy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmUy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LFMuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGN0KS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmV9LHQsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1TLmlzRW1wdHlPYmplY3QodCksaT1TLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9Z2UodGhpcyxTLmV4dGVuZCh7fSx0KSxpKTsob3x8US5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxvfHwhMT09PWkucXVldWU%2FdGhpcy5lYWNoKGEpOnRoaXMucXVldWUoaS5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbih0LGUsbil7dmFyIHI9ZnVuY3Rpb24odCl7dmFyIGU9dC5zdG9wO2RlbGV0ZSB0LnN0b3AsZShuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYobj1lLGU9dCx0PXZvaWQgMCksZSYmITEhPT10JiZ0aGlzLnF1ZXVlKHR8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPSEwLG89bnVsbCE9dCYmdCsicXVldWVIb29rcyIsaT1TLnRpbWVycyxhPVEuZ2V0KHRoaXMpO2lmKG8pYVtvXSYmYVtvXS5zdG9wJiZyKGFbb10pO2Vsc2UgZm9yKG8gaW4gYSlhW29dJiZhW29dLnN0b3AmJmxlLnRlc3QobykmJnIoYVtvXSk7Zm9yKG89aS5sZW5ndGg7by0tOylpW29dLmVsZW0hPT10aGlzfHxudWxsIT10JiZpW29dLnF1ZXVlIT09dHx8KGlbb10uYW5pbS5zdG9wKG4pLGU9ITEsaS5zcGxpY2UobywxKSk7IWUmJm58fFMuZGVxdWV1ZSh0aGlzLHQpfSl9LGZpbmlzaDpmdW5jdGlvbih0KXtyZXR1cm4hMSE9PXQmJih0PXR8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLG49US5nZXQodGhpcykscj1uW3QrInF1ZXVlIl0sbz1uW3QrInF1ZXVlSG9va3MiXSxpPVMudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCxTLnF1ZXVlKHRoaXMsdCxbXSksbyYmby5zdG9wJiZvLnN0b3AuY2FsbCh0aGlzLCEwKSxlPWkubGVuZ3RoO2UtLTspaVtlXS5lbGVtPT09dGhpcyYmaVtlXS5xdWV1ZT09PXQmJihpW2VdLmFuaW0uc3RvcCghMCksaS5zcGxpY2UoZSwxKSk7Zm9yKGU9MDtlPGE7ZSsrKXJbZV0mJnJbZV0uZmluaXNoJiZyW2VdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pLFMuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24odCxlKXt2YXIgbj1TLmZuW2VdO1MuZm5bZV09ZnVuY3Rpb24odCxyLG8pe3JldHVybiBudWxsPT10fHwiYm9vbGVhbiI9PXR5cGVvZiB0P24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShoZShlLCEwKSx0LHIsbyl9fSksUy5lYWNoKHtzbGlkZURvd246aGUoInNob3ciKSxzbGlkZVVwOmhlKCJoaWRlIiksc2xpZGVUb2dnbGU6aGUoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKGUsdCxuLHIpfX0pLFMudGltZXJzPVtdLFMuZngudGljaz1mdW5jdGlvbigpe3ZhciB0LGU9MCxuPVMudGltZXJzO2ZvcihzZT1EYXRlLm5vdygpO2U8bi5sZW5ndGg7ZSsrKSh0PW5bZV0pKCl8fG5bZV0hPT10fHxuLnNwbGljZShlLS0sMSk7bi5sZW5ndGh8fFMuZnguc3RvcCgpLHNlPXZvaWQgMH0sUy5meC50aW1lcj1mdW5jdGlvbih0KXtTLnRpbWVycy5wdXNoKHQpLFMuZnguc3RhcnQoKX0sUy5meC5pbnRlcnZhbD0xMyxTLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7dWV8fCh1ZT0hMCxmZSgpKX0sUy5meC5zdG9wPWZ1bmN0aW9uKCl7dWU9bnVsbH0sUy5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sUy5mbi5kZWxheT1mdW5jdGlvbih0LGUpe3JldHVybiB0PVMuZngmJlMuZnguc3BlZWRzW3RdfHx0LGU9ZXx8ImZ4Iix0aGlzLnF1ZXVlKGUsZnVuY3Rpb24oZSxyKXt2YXIgbz1uLnNldFRpbWVvdXQoZSx0KTtyLnN0b3A9ZnVuY3Rpb24oKXtuLmNsZWFyVGltZW91dChvKX19KX0sZnVuY3Rpb24oKXt2YXIgdD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksZT1hLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO3QudHlwZT0iY2hlY2tib3giLHkuY2hlY2tPbj0iIiE9PXQudmFsdWUseS5vcHRTZWxlY3RlZD1lLnNlbGVjdGVkLCh0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLHQudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT10LnZhbHVlfSgpO3ZhciB2ZSx5ZT1TLmV4cHIuYXR0ckhhbmRsZTtTLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsUy5hdHRyLHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLnJlbW92ZUF0dHIodGhpcyx0KX0pfX0pLFMuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9dC5ub2RlVHlwZTtpZigzIT09aSYmOCE9PWkmJjIhPT1pKXJldHVybiB2b2lkIDA9PT10LmdldEF0dHJpYnV0ZT9TLnByb3AodCxlLG4pOigxPT09aSYmUy5pc1hNTERvYyh0KXx8KG89Uy5hdHRySG9va3NbZS50b0xvd2VyQ2FzZSgpXXx8KFMuZXhwci5tYXRjaC5ib29sLnRlc3QoZSk%2FdmU6dm9pZCAwKSksdm9pZCAwIT09bj9udWxsPT09bj92b2lkIFMucmVtb3ZlQXR0cih0LGUpOm8mJiJzZXQiaW4gbyYmdm9pZCAwIT09KHI9by5zZXQodCxuLGUpKT9yOih0LnNldEF0dHJpYnV0ZShlLG4rIiIpLG4pOm8mJiJnZXQiaW4gbyYmbnVsbCE9PShyPW8uZ2V0KHQsZSkpP3I6bnVsbD09KHI9Uy5maW5kLmF0dHIodCxlKSk%2Fdm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbih0LGUpe2lmKCF5LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1lJiZMKHQsImlucHV0Iikpe3ZhciBuPXQudmFsdWU7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJ0eXBlIixlKSxuJiYodC52YWx1ZT1uKSxlfX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLG89ZSYmZS5tYXRjaChVKTtpZihvJiYxPT09dC5ub2RlVHlwZSlmb3IoO249b1tyKytdOyl0LnJlbW92ZUF0dHJpYnV0ZShuKX19KSx2ZT17c2V0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hMT09PWU%2FUy5yZW1vdmVBdHRyKHQsbik6dC5zZXRBdHRyaWJ1dGUobixuKSxufX0sUy5lYWNoKFMuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKHQsZSl7dmFyIG49eWVbZV18fFMuZmluZC5hdHRyO3llW2VdPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGE9ZS50b0xvd2VyQ2FzZSgpO3JldHVybiByfHwoaT15ZVthXSx5ZVthXT1vLG89bnVsbCE9bih0LGUscik%2FYTpudWxsLHllW2FdPWkpLG99fSk7dmFyIG1lPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksYmU9L14oPzphfGFyZWEpJC9pO2Z1bmN0aW9uIHhlKHQpe3JldHVybih0Lm1hdGNoKFUpfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIHdlKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIGtlKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3Q6InN0cmluZyI9PXR5cGVvZiB0JiZ0Lm1hdGNoKFUpfHxbXX1TLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsUy5wcm9wLHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tTLnByb3BGaXhbdF18fHRdfSl9fSksUy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT10Lm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIDE9PT1pJiZTLmlzWE1MRG9jKHQpfHwoZT1TLnByb3BGaXhbZV18fGUsbz1TLnByb3BIb29rc1tlXSksdm9pZCAwIT09bj9vJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KHQsbixlKSk%2Fcjp0W2VdPW46byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQodCxlKSk%2Fcjp0W2VdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9Uy5maW5kLmF0dHIodCwidGFiaW5kZXgiKTtyZXR1cm4gZT9wYXJzZUludChlLDEwKTptZS50ZXN0KHQubm9kZU5hbWUpfHxiZS50ZXN0KHQubm9kZU5hbWUpJiZ0LmhyZWY%2FMDotMX19fSxwcm9wRml4Ontmb3I6Imh0bWxGb3IiLGNsYXNzOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChTLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtyZXR1cm4gZSYmZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO2UmJihlLnNlbGVjdGVkSW5kZXgsZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksUy5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtTLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksUy5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLHdlKHRoaXMpKSl9KTtpZigoZT1rZSh0KSkubGVuZ3RoKWZvcig7bj10aGlzW3UrK107KWlmKG89d2Uobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3hlKG8pKyIgIil7Zm9yKGE9MDtpPWVbYSsrXTspci5pbmRleE9mKCIgIitpKyIgIik8MCYmKHIrPWkrIiAiKTtvIT09KHM9eGUocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSx3ZSh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigoZT1rZSh0KSkubGVuZ3RoKWZvcig7bj10aGlzW3UrK107KWlmKG89d2Uobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3hlKG8pKyIgIil7Zm9yKGE9MDtpPWVbYSsrXTspZm9yKDtyLmluZGV4T2YoIiAiK2krIiAiKT4tMTspcj1yLnJlcGxhY2UoIiAiK2krIiAiLCIgIik7byE9PShzPXhlKHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdCxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheSh0KTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlJiZyP2U%2FdGhpcy5hZGRDbGFzcyh0KTp0aGlzLnJlbW92ZUNsYXNzKHQpOm0odCk%2FdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe1ModGhpcykudG9nZ2xlQ2xhc3ModC5jYWxsKHRoaXMsbix3ZSh0aGlzKSxlKSxlKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLG8saSxhO2lmKHIpZm9yKG89MCxpPVModGhpcyksYT1rZSh0KTtlPWFbbysrXTspaS5oYXNDbGFzcyhlKT9pLnJlbW92ZUNsYXNzKGUpOmkuYWRkQ2xhc3MoZSk7ZWxzZSB2b2lkIDAhPT10JiYiYm9vbGVhbiIhPT1ufHwoKGU9d2UodGhpcykpJiZRLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixlKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixlfHwhMT09PXQ%2FIiI6US5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj0wO2ZvcihlPSIgIit0KyIgIjtuPXRoaXNbcisrXTspaWYoMT09PW4ubm9kZVR5cGUmJigiICIreGUod2UobikpKyIgIikuaW5kZXhPZihlKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgU2U9L1xyL2c7Uy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbz10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW0odCksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBvOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KG89cj90LmNhbGwodGhpcyxuLFModGhpcykudmFsKCkpOnQpP289IiI6Im51bWJlciI9PXR5cGVvZiBvP28rPSIiOkFycmF5LmlzQXJyYXkobykmJihvPVMubWFwKG8sZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ%2FIiI6dCsiIn0pKSwoZT1TLnZhbEhvb2tzW3RoaXMudHlwZV18fFMudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gZSYmdm9pZCAwIT09ZS5zZXQodGhpcyxvLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1vKSl9KSk6bz8oZT1TLnZhbEhvb2tzW28udHlwZV18fFMudmFsSG9va3Nbby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJnZXQiaW4gZSYmdm9pZCAwIT09KG49ZS5nZXQobywidmFsdWUiKSk%2Fbjoic3RyaW5nIj09dHlwZW9mKG49by52YWx1ZSk%2Fbi5yZXBsYWNlKFNlLCIiKTpudWxsPT1uPyIiOm46dm9pZCAwfX0pLFMuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9Uy5maW5kLmF0dHIodCwidmFsdWUiKTtyZXR1cm4gbnVsbCE9ZT9lOnhlKFMudGV4dCh0KSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbz10Lm9wdGlvbnMsaT10LnNlbGVjdGVkSW5kZXgsYT0ic2VsZWN0LW9uZSI9PT10LnR5cGUscz1hP251bGw6W10sdT1hP2krMTpvLmxlbmd0aDtmb3Iocj1pPDA%2FdTphP2k6MDtyPHU7cisrKWlmKCgobj1vW3JdKS5zZWxlY3RlZHx8cj09PWkpJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFMKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGU9UyhuKS52YWwoKSxhKXJldHVybiBlO3MucHVzaChlKX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHIsbz10Lm9wdGlvbnMsaT1TLm1ha2VBcnJheShlKSxhPW8ubGVuZ3RoO2EtLTspKChyPW9bYV0pLnNlbGVjdGVkPVMuaW5BcnJheShTLnZhbEhvb2tzLm9wdGlvbi5nZXQociksaSk%2BLTEpJiYobj0hMCk7cmV0dXJuIG58fCh0LnNlbGVjdGVkSW5kZXg9LTEpLGl9fX19KSxTLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtTLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24odCxlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiB0LmNoZWNrZWQ9Uy5pbkFycmF5KFModCkudmFsKCksZSk%2BLTF9fSx5LmNoZWNrT258fChTLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6dC52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gbjt2YXIgRWU9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFRlPWZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9O1MuZXh0ZW5kKFMuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxlLHIsbyl7dmFyIGkscyx1LGMsbCxmLHAsaCxnPVtyfHxhXSx2PWQuY2FsbCh0LCJ0eXBlIik%2FdC50eXBlOnQseT1kLmNhbGwodCwibmFtZXNwYWNlIik%2FdC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1yPXJ8fGEsMyE9PXIubm9kZVR5cGUmJjghPT1yLm5vZGVUeXBlJiYhRWUudGVzdCh2K1MuZXZlbnQudHJpZ2dlcmVkKSYmKHYuaW5kZXhPZigiLiIpPi0xJiYoeT12LnNwbGl0KCIuIiksdj15LnNoaWZ0KCkseS5zb3J0KCkpLGw9di5pbmRleE9mKCI6Iik8MCYmIm9uIit2LCh0PXRbUy5leHBhbmRvXT90Om5ldyBTLkV2ZW50KHYsIm9iamVjdCI9PXR5cGVvZiB0JiZ0KSkuaXNUcmlnZ2VyPW8%2FMjozLHQubmFtZXNwYWNlPXkuam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit5LmpvaW4oIlxcLig%2FOi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9ciksZT1udWxsPT1lP1t0XTpTLm1ha2VBcnJheShlLFt0XSkscD1TLmV2ZW50LnNwZWNpYWxbdl18fHt9LG98fCFwLnRyaWdnZXJ8fCExIT09cC50cmlnZ2VyLmFwcGx5KHIsZSkpKXtpZighbyYmIXAubm9CdWJibGUmJiFiKHIpKXtmb3IoYz1wLmRlbGVnYXRlVHlwZXx8dixFZS50ZXN0KGMrdil8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSlnLnB1c2gocyksdT1zO3U9PT0oci5vd25lckRvY3VtZW50fHxhKSYmZy5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxuKX1mb3IoaT0wOyhzPWdbaSsrXSkmJiF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWg9cyx0LnR5cGU9aT4xP2M6cC5iaW5kVHlwZXx8diwoZj0oUS5nZXQocywiZXZlbnRzIil8fHt9KVt0LnR5cGVdJiZRLmdldChzLCJoYW5kbGUiKSkmJmYuYXBwbHkocyxlKSwoZj1sJiZzW2xdKSYmZi5hcHBseSYmWChzKSYmKHQucmVzdWx0PWYuYXBwbHkocyxlKSwhMT09PXQucmVzdWx0JiZ0LnByZXZlbnREZWZhdWx0KCkpO3JldHVybiB0LnR5cGU9dixvfHx0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHxwLl9kZWZhdWx0JiYhMSE9PXAuX2RlZmF1bHQuYXBwbHkoZy5wb3AoKSxlKXx8IVgocil8fGwmJm0oclt2XSkmJiFiKHIpJiYoKHU9cltsXSkmJihyW2xdPW51bGwpLFMuZXZlbnQudHJpZ2dlcmVkPXYsdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLmFkZEV2ZW50TGlzdGVuZXIodixUZSksclt2XSgpLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5yZW1vdmVFdmVudExpc3RlbmVyKHYsVGUpLFMuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCx1JiYocltsXT11KSksdC5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9Uy5leHRlbmQobmV3IFMuRXZlbnQsbix7dHlwZTp0LGlzU2ltdWxhdGVkOiEwfSk7Uy5ldmVudC50cmlnZ2VyKHIsbnVsbCxlKX19KSxTLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnRyaWdnZXIodCxlLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBTLmV2ZW50LnRyaWdnZXIodCxlLG4sITApfX0pLHkuZm9jdXNpbnx8Uy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe1MuZXZlbnQuc2ltdWxhdGUoZSx0LnRhcmdldCxTLmV2ZW50LmZpeCh0KSl9O1MuZXZlbnQuc3BlY2lhbFtlXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsbz1RLmFjY2VzcyhyLGUpO298fHIuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITApLFEuYWNjZXNzKHIsZSwob3x8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89US5hY2Nlc3MocixlKS0xO28%2FUS5hY2Nlc3MocixlLG8pOihyLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCEwKSxRLnJlbW92ZShyLGUpKX19fSk7dmFyIEFlPW4ubG9jYXRpb24sT2U9RGF0ZS5ub3coKSxDZT0vXD8vO1MucGFyc2VYTUw9ZnVuY3Rpb24odCl7dmFyIGU7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gbnVsbDt0cnl7ZT0obmV3IG4uRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC94bWwiKX1jYXRjaCh0KXtlPXZvaWQgMH1yZXR1cm4gZSYmIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxTLmVycm9yKCJJbnZhbGlkIFhNTDogIit0KSxlfTt2YXIgamU9L1xbXF0kLyxMZT0vXHI%2FXG4vZyxQZT0vXig%2FOnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksUmU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIE5lKHQsZSxuLHIpe3ZhciBvO2lmKEFycmF5LmlzQXJyYXkoZSkpUy5lYWNoKGUsZnVuY3Rpb24oZSxvKXtufHxqZS50ZXN0KHQpP3IodCxvKTpOZSh0KyJbIisoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT1vP2U6IiIpKyJdIixvLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09ayhlKSlyKHQsZSk7ZWxzZSBmb3IobyBpbiBlKU5lKHQrIlsiK28rIl0iLGVbb10sbixyKX1TLnBhcmFtPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXSxvPWZ1bmN0aW9uKHQsZSl7dmFyIG49bShlKT9lKCk6ZTtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQodCkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihudWxsPT10KXJldHVybiIiO2lmKEFycmF5LmlzQXJyYXkodCl8fHQuanF1ZXJ5JiYhUy5pc1BsYWluT2JqZWN0KHQpKVMuZWFjaCh0LGZ1bmN0aW9uKCl7byh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIHQpTmUobix0W25dLGUsbyk7cmV0dXJuIHIuam9pbigiJiIpfSxTLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIFMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgdD1TLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gdD9TLm1ha2VBcnJheSh0KTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFTKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmUmUudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVBlLnRlc3QodCkmJih0aGlzLmNoZWNrZWR8fCFndC50ZXN0KHQpKX0pLm1hcChmdW5jdGlvbih0LGUpe3ZhciBuPVModGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4%2FbnVsbDpBcnJheS5pc0FycmF5KG4pP1MubWFwKG4sZnVuY3Rpb24odCl7cmV0dXJue25hbWU6ZS5uYW1lLHZhbHVlOnQucmVwbGFjZShMZSwiXHJcbiIpfX0pOntuYW1lOmUubmFtZSx2YWx1ZTpuLnJlcGxhY2UoTGUsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIgSWU9LyUyMC9nLERlPS8jLiokLyxfZT0vKFs%2FJl0pXz1bXiZdKi8sTWU9L14oLio%2FKTpbIFx0XSooW15cclxuXSopJC9nbSxVZT0vXig%2FOkdFVHxIRUFEKSQvLEJlPS9eXC9cLy8scWU9e30sRmU9e30sSGU9IiovIi5jb25jYXQoIioiKSx6ZT1hLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBXZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXsic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT0iKiIpO3ZhciByLG89MCxpPWUudG9Mb3dlckNhc2UoKS5tYXRjaChVKXx8W107aWYobShuKSlmb3IoO3I9aVtvKytdOykiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwodFtyXT10W3JdfHxbXSkudW5zaGlmdChuKSk6KHRbcl09dFtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uICRlKHQsZSxuLHIpe3ZhciBvPXt9LGk9dD09PUZlO2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIG9bc109ITAsUy5lYWNoKHRbc118fFtdLGZ1bmN0aW9uKHQscyl7dmFyIGM9cyhlLG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxpfHxvW2NdP2k%2FISh1PWMpOnZvaWQgMDooZS5kYXRhVHlwZXMudW5zaGlmdChjKSxhKGMpLCExKX0pLHV9cmV0dXJuIGEoZS5kYXRhVHlwZXNbMF0pfHwhb1siKiJdJiZhKCIqIil9ZnVuY3Rpb24gVmUodCxlKXt2YXIgbixyLG89Uy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIGUpdm9pZCAwIT09ZVtuXSYmKChvW25dP3Q6cnx8KHI9e30pKVtuXT1lW25dKTtyZXR1cm4gciYmUy5leHRlbmQoITAsdCxyKSx0fXplLmhyZWY9QWUuaHJlZixTLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6QWUuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChBZS5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpIZSx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Uy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU%2FVmUoVmUodCxTLmFqYXhTZXR0aW5ncyksZSk6VmUoUy5hamF4U2V0dGluZ3MsdCl9LGFqYXhQcmVmaWx0ZXI6V2UocWUpLGFqYXhUcmFuc3BvcnQ6V2UoRmUpLGFqYXg6ZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLGU9ZXx8e307dmFyIHIsbyxpLHMsdSxjLGwsZixwLGgsZD1TLmFqYXhTZXR1cCh7fSxlKSxnPWQuY29udGV4dHx8ZCx2PWQuY29udGV4dCYmKGcubm9kZVR5cGV8fGcuanF1ZXJ5KT9TKGcpOlMuZXZlbnQseT1TLkRlZmVycmVkKCksbT1TLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxiPWQuc3RhdHVzQ29kZXx8e30seD17fSx3PXt9LGs9ImNhbmNlbGVkIixFPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24odCl7dmFyIGU7aWYobCl7aWYoIXMpZm9yKHM9e307ZT1NZS5leGVjKGkpOylzW2VbMV0udG9Mb3dlckNhc2UoKSsiICJdPShzW2VbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KGVbMl0pO2U9c1t0LnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09ZT9udWxsOmUuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGw%2FaTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWwmJih0PXdbdC50b0xvd2VyQ2FzZSgpXT13W3QudG9Mb3dlckNhc2UoKV18fHQseFt0XT1lKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT1sJiYoZC5taW1lVHlwZT10KSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHQpaWYobClFLmFsd2F5cyh0W0Uuc3RhdHVzXSk7ZWxzZSBmb3IoZSBpbiB0KWJbZV09W2JbZV0sdFtlXV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKHQpe3ZhciBlPXR8fGs7cmV0dXJuIHImJnIuYWJvcnQoZSksVCgwLGUpLHRoaXN9fTtpZih5LnByb21pc2UoRSksZC51cmw9KCh0fHxkLnVybHx8QWUuaHJlZikrIiIpLnJlcGxhY2UoQmUsQWUucHJvdG9jb2wrIi8vIiksZC50eXBlPWUubWV0aG9kfHxlLnR5cGV8fGQubWV0aG9kfHxkLnR5cGUsZC5kYXRhVHlwZXM9KGQuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChVKXx8WyIiXSxudWxsPT1kLmNyb3NzRG9tYWluKXtjPWEuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtjLmhyZWY9ZC51cmwsYy5ocmVmPWMuaHJlZixkLmNyb3NzRG9tYWluPXplLnByb3RvY29sKyIvLyIremUuaG9zdCE9Yy5wcm90b2NvbCsiLy8iK2MuaG9zdH1jYXRjaCh0KXtkLmNyb3NzRG9tYWluPSEwfX1pZihkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgZC5kYXRhJiYoZC5kYXRhPVMucGFyYW0oZC5kYXRhLGQudHJhZGl0aW9uYWwpKSwkZShxZSxkLGUsRSksbClyZXR1cm4gRTtmb3IocCBpbihmPVMuZXZlbnQmJmQuZ2xvYmFsKSYmMD09Uy5hY3RpdmUrKyYmUy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxkLnR5cGU9ZC50eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFVZS50ZXN0KGQudHlwZSksbz1kLnVybC5yZXBsYWNlKERlLCIiKSxkLmhhc0NvbnRlbnQ%2FZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiYwPT09KGQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKGQuZGF0YT1kLmRhdGEucmVwbGFjZShJZSwiKyIpKTooaD1kLnVybC5zbGljZShvLmxlbmd0aCksZC5kYXRhJiYoZC5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiBkLmRhdGEpJiYobys9KENlLnRlc3Qobyk%2FIiYiOiI%2FIikrZC5kYXRhLGRlbGV0ZSBkLmRhdGEpLCExPT09ZC5jYWNoZSYmKG89by5yZXBsYWNlKF9lLCIkMSIpLGg9KENlLnRlc3Qobyk%2FIiYiOiI%2FIikrIl89IitPZSsrK2gpLGQudXJsPW8raCksZC5pZk1vZGlmaWVkJiYoUy5sYXN0TW9kaWZpZWRbb10mJkUuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLFMubGFzdE1vZGlmaWVkW29dKSxTLmV0YWdbb10mJkUuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsUy5ldGFnW29dKSksKGQuZGF0YSYmZC5oYXNDb250ZW50JiYhMSE9PWQuY29udGVudFR5cGV8fGUuY29udGVudFR5cGUpJiZFLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksRS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGQuZGF0YVR5cGVzWzBdJiZkLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dP2QuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0rKCIqIiE9PWQuZGF0YVR5cGVzWzBdPyIsICIrSGUrIjsgcT0wLjAxIjoiIik6ZC5hY2NlcHRzWyIqIl0pLGQuaGVhZGVycylFLnNldFJlcXVlc3RIZWFkZXIocCxkLmhlYWRlcnNbcF0pO2lmKGQuYmVmb3JlU2VuZCYmKCExPT09ZC5iZWZvcmVTZW5kLmNhbGwoZyxFLGQpfHxsKSlyZXR1cm4gRS5hYm9ydCgpO2lmKGs9ImFib3J0IixtLmFkZChkLmNvbXBsZXRlKSxFLmRvbmUoZC5zdWNjZXNzKSxFLmZhaWwoZC5lcnJvcikscj0kZShGZSxkLGUsRSkpe2lmKEUucmVhZHlTdGF0ZT0xLGYmJnYudHJpZ2dlcigiYWpheFNlbmQiLFtFLGRdKSxsKXJldHVybiBFO2QuYXN5bmMmJmQudGltZW91dD4wJiYodT1uLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtFLmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtsPSExLHIuc2VuZCh4LFQpfWNhdGNoKHQpe2lmKGwpdGhyb3cgdDtUKC0xLHQpfX1lbHNlIFQoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIFQodCxlLGEscyl7dmFyIGMscCxoLHgsdyxrPWU7bHx8KGw9ITAsdSYmbi5jbGVhclRpbWVvdXQodSkscj12b2lkIDAsaT1zfHwiIixFLnJlYWR5U3RhdGU9dD4wPzQ6MCxjPXQ%2BPTIwMCYmdDwzMDB8fDMwND09PXQsYSYmKHg9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixvLGksYSxzPXQuY29udGVudHMsdT10LmRhdGFUeXBlczsiKiI9PT11WzBdOyl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9dC5taW1lVHlwZXx8ZS5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKG8gaW4gcylpZihzW29dJiZzW29dLnRlc3Qocikpe3UudW5zaGlmdChvKTticmVha31pZih1WzBdaW4gbilpPXVbMF07ZWxzZXtmb3IobyBpbiBuKXtpZighdVswXXx8dC5jb252ZXJ0ZXJzW28rIiAiK3VbMF1dKXtpPW87YnJlYWt9YXx8KGE9byl9aT1pfHxhfWlmKGkpcmV0dXJuIGkhPT11WzBdJiZ1LnVuc2hpZnQoaSksbltpXX0oZCxFLGEpKSx4PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzLHUsYz17fSxsPXQuZGF0YVR5cGVzLnNsaWNlKCk7aWYobFsxXSlmb3IoYSBpbiB0LmNvbnZlcnRlcnMpY1thLnRvTG93ZXJDYXNlKCldPXQuY29udmVydGVyc1thXTtmb3IoaT1sLnNoaWZ0KCk7aTspaWYodC5yZXNwb25zZUZpZWxkc1tpXSYmKG5bdC5yZXNwb25zZUZpZWxkc1tpXV09ZSksIXUmJnImJnQuZGF0YUZpbHRlciYmKGU9dC5kYXRhRmlsdGVyKGUsdC5kYXRhVHlwZSkpLHU9aSxpPWwuc2hpZnQoKSlpZigiKiI9PT1pKWk9dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1pKXtpZighKGE9Y1t1KyIgIitpXXx8Y1siKiAiK2ldKSlmb3IobyBpbiBjKWlmKChzPW8uc3BsaXQoIiAiKSlbMV09PT1pJiYoYT1jW3UrIiAiK3NbMF1dfHxjWyIqICIrc1swXV0pKXshMD09PWE%2FYT1jW29dOiEwIT09Y1tvXSYmKGk9c1swXSxsLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKCEwIT09YSlpZihhJiZ0LnRocm93cyllPWEoZSk7ZWxzZSB0cnl7ZT1hKGUpfWNhdGNoKHQpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE%2FdDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIraX19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTplfX0oZCx4LEUsYyksYz8oZC5pZk1vZGlmaWVkJiYoKHc9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKFMubGFzdE1vZGlmaWVkW29dPXcpLCh3PUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihTLmV0YWdbb109dykpLDIwND09PXR8fCJIRUFEIj09PWQudHlwZT9rPSJub2NvbnRlbnQiOjMwND09PXQ%2Faz0ibm90bW9kaWZpZWQiOihrPXguc3RhdGUscD14LmRhdGEsYz0hKGg9eC5lcnJvcikpKTooaD1rLCF0JiZrfHwoaz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0oZXx8aykrIiIsYz95LnJlc29sdmVXaXRoKGcsW3AsayxFXSk6eS5yZWplY3RXaXRoKGcsW0UsayxoXSksRS5zdGF0dXNDb2RlKGIpLGI9dm9pZCAwLGYmJnYudHJpZ2dlcihjPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsZCxjP3A6aF0pLG0uZmlyZVdpdGgoZyxbRSxrXSksZiYmKHYudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxkXSksLS1TLmFjdGl2ZXx8Uy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24odCxlLG4pe3JldHVybiBTLmdldCh0LGUsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUy5nZXQodCx2b2lkIDAsZSwic2NyaXB0Iil9fSksUy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKHQsZSl7U1tlXT1mdW5jdGlvbih0LG4scixvKXtyZXR1cm4gbShuKSYmKG89b3x8cixyPW4sbj12b2lkIDApLFMuYWpheChTLmV4dGVuZCh7dXJsOnQsdHlwZTplLGRhdGFUeXBlOm8sZGF0YTpuLHN1Y2Nlc3M6cn0sUy5pc1BsYWluT2JqZWN0KHQpJiZ0KSl9fSksUy5fZXZhbFVybD1mdW5jdGlvbih0LGUpe3JldHVybiBTLmFqYXgoe3VybDp0LHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKHQpe1MuZ2xvYmFsRXZhbCh0LGUpfX0pfSxTLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdGhpc1swXSYmKG0odCkmJih0PXQuY2FsbCh0aGlzWzBdKSksZT1TKHQsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZlLmluc2VydEJlZm9yZSh0aGlzWzBdKSxlLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzO3QuZmlyc3RFbGVtZW50Q2hpbGQ7KXQ9dC5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gdH0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKHQpe3JldHVybiBtKHQpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBJbm5lcih0LmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TKHRoaXMpLG49ZS5jb250ZW50cygpO24ubGVuZ3RoP24ud3JhcEFsbCh0KTplLmFwcGVuZCh0KX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBlPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXtTKHRoaXMpLndyYXBBbGwoZT90LmNhbGwodGhpcyxuKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucGFyZW50KHQpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLFMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4hUy5leHByLnBzZXVkb3MudmlzaWJsZSh0KX0sUy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4hISh0Lm9mZnNldFdpZHRofHx0Lm9mZnNldEhlaWdodHx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LFMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IG4uWE1MSHR0cFJlcXVlc3R9Y2F0Y2godCl7fX07dmFyIFllPXswOjIwMCwxMjIzOjIwNH0sR2U9Uy5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhR2UmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gR2UseS5hamF4PUdlPSEhR2UsUy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoeS5jb3JzfHxHZSYmIXQuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24obyxpKXt2YXIgYSxzPXQueGhyKCk7aWYocy5vcGVuKHQudHlwZSx0LnVybCx0LmFzeW5jLHQudXNlcm5hbWUsdC5wYXNzd29yZCksdC54aHJGaWVsZHMpZm9yKGEgaW4gdC54aHJGaWVsZHMpc1thXT10LnhockZpZWxkc1thXTtmb3IoYSBpbiB0Lm1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSh0Lm1pbWVUeXBlKSx0LmNyb3NzRG9tYWlufHxvWyJYLVJlcXVlc3RlZC1XaXRoIl18fChvWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksbylzLnNldFJlcXVlc3RIZWFkZXIoYSxvW2FdKTtlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2UmJihlPXI9cy5vbmxvYWQ9cy5vbmVycm9yPXMub25hYm9ydD1zLm9udGltZW91dD1zLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT10P3MuYWJvcnQoKToiZXJyb3IiPT09dD8ibnVtYmVyIiE9dHlwZW9mIHMuc3RhdHVzP2koMCwiZXJyb3IiKTppKHMuc3RhdHVzLHMuc3RhdHVzVGV4dCk6aShZZVtzLnN0YXR1c118fHMuc3RhdHVzLHMuc3RhdHVzVGV4dCwidGV4dCIhPT0ocy5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygcy5yZXNwb25zZVRleHQ%2Fe2JpbmFyeTpzLnJlc3BvbnNlfTp7dGV4dDpzLnJlc3BvbnNlVGV4dH0scy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0scy5vbmxvYWQ9ZSgpLHI9cy5vbmVycm9yPXMub250aW1lb3V0PWUoImVycm9yIiksdm9pZCAwIT09cy5vbmFib3J0P3Mub25hYm9ydD1yOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXMucmVhZHlTdGF0ZSYmbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSYmcigpfSl9LGU9ZSgiYWJvcnQiKTt0cnl7cy5zZW5kKHQuaGFzQ29udGVudCYmdC5kYXRhfHxudWxsKX1jYXRjaCh0KXtpZihlKXRocm93IHR9fSxhYm9ydDpmdW5jdGlvbigpe2UmJmUoKX19fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKHQpe3QuY3Jvc3NEb21haW4mJih0LmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbih0KXtyZXR1cm4gUy5nbG9iYWxFdmFsKHQpLHR9fX0pLFMuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbih0KXt2b2lkIDA9PT10LmNhY2hlJiYodC5jYWNoZT0hMSksdC5jcm9zc0RvbWFpbiYmKHQudHlwZT0iR0VUIil9KSxTLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24odCl7dmFyIGUsbjtpZih0LmNyb3NzRG9tYWlufHx0LnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKHIsbyl7ZT1TKCI8c2NyaXB0PiIpLmF0dHIodC5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6dC5zY3JpcHRDaGFyc2V0LHNyYzp0LnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKHQpe2UucmVtb3ZlKCksbj1udWxsLHQmJm8oImVycm9yIj09PXQudHlwZT80MDQ6MjAwLHQudHlwZSl9KSxhLmhlYWQuYXBwZW5kQ2hpbGQoZVswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19KTt2YXIgS2UsWGU9W10sSmU9Lyg9KVw%2FKD89JnwkKXxcP1w%2FLztTLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIHQ9WGUucG9wKCl8fFMuZXhwYW5kbysiXyIrT2UrKztyZXR1cm4gdGhpc1t0XT0hMCx0fX0pLFMuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYSxzPSExIT09dC5qc29ucCYmKEplLnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmSmUudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gbz10Lmpzb25wQ2FsbGJhY2s9bSh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKEplLCIkMSIrbyk6ITEhPT10Lmpzb25wJiYodC51cmwrPShDZS50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitvKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8Uy5lcnJvcihvKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsaT1uW29dLG5bb109ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP1MobikucmVtb3ZlUHJvcChvKTpuW29dPWksdFtvXSYmKHQuanNvbnBDYWxsYmFjaz1lLmpzb25wQ2FsbGJhY2ssWGUucHVzaChvKSksYSYmbShpKSYmaShhWzBdKSxhPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKEtlPWEuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0%2BIiwyPT09S2UuY2hpbGROb2Rlcy5sZW5ndGgpLFMucGFyc2VIVE1MPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQ%2FW106KCJib29sZWFuIj09dHlwZW9mIGUmJihuPWUsZT0hMSksZXx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0oZT1hLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1hLmxvY2F0aW9uLmhyZWYsZS5oZWFkLmFwcGVuZENoaWxkKHIpKTplPWEpLGk9IW4mJltdLChvPVAuZXhlYyh0KSk%2FW2UuY3JlYXRlRWxlbWVudChvWzFdKV06KG89RXQoW3RdLGUsaSksaSYmaS5sZW5ndGgmJlMoaSkucmVtb3ZlKCksUy5tZXJnZShbXSxvLmNoaWxkTm9kZXMpKSk7dmFyIHIsbyxpfSxTLmZuLmxvYWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPXRoaXMscz10LmluZGV4T2YoIiAiKTtyZXR1cm4gcz4tMSYmKHI9eGUodC5zbGljZShzKSksdD10LnNsaWNlKDAscykpLG0oZSk%2FKG49ZSxlPXZvaWQgMCk6ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYobz0iUE9TVCIpLGEubGVuZ3RoPjAmJlMuYWpheCh7dXJsOnQsdHlwZTpvfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTplfSkuZG9uZShmdW5jdGlvbih0KXtpPWFyZ3VtZW50cyxhLmh0bWwocj9TKCI8ZGl2PiIpLmFwcGVuZChTLnBhcnNlSFRNTCh0KSkuZmluZChyKTp0KX0pLmFsd2F5cyhuJiZmdW5jdGlvbih0LGUpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxpfHxbdC5yZXNwb25zZVRleHQsZSx0XSl9KX0pLHRoaXN9LFMuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKHQsZSl7Uy5mbltlXT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vbihlLHQpfX0pLFMuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKHQpe3JldHVybiBTLmdyZXAoUy50aW1lcnMsZnVuY3Rpb24oZSl7cmV0dXJuIHQ9PT1lLmVsZW19KS5sZW5ndGh9LFMub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjPVMuY3NzKHQsInBvc2l0aW9uIiksbD1TKHQpLGY9e307InN0YXRpYyI9PT1jJiYodC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxzPWwub2Zmc2V0KCksaT1TLmNzcyh0LCJ0b3AiKSx1PVMuY3NzKHQsImxlZnQiKSwoImFic29sdXRlIj09PWN8fCJmaXhlZCI9PT1jKSYmKGkrdSkuaW5kZXhPZigiYXV0byIpPi0xPyhhPShyPWwucG9zaXRpb24oKSkudG9wLG89ci5sZWZ0KTooYT1wYXJzZUZsb2F0KGkpfHwwLG89cGFyc2VGbG9hdCh1KXx8MCksbShlKSYmKGU9ZS5jYWxsKHQsbixTLmV4dGVuZCh7fSxzKSkpLG51bGwhPWUudG9wJiYoZi50b3A9ZS50b3Atcy50b3ArYSksbnVsbCE9ZS5sZWZ0JiYoZi5sZWZ0PWUubGVmdC1zLmxlZnQrbyksInVzaW5nImluIGU%2FZS51c2luZy5jYWxsKHQsZik6bC5jc3MoZil9fSxTLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXQ%2FdGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsdCxlKX0pO3ZhciBlLG4scj10aGlzWzBdO3JldHVybiByP3IuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg%2FKGU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOmUudG9wK24ucGFnZVlPZmZzZXQsbGVmdDplLmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9OnZvaWQgMH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgdCxlLG4scj10aGlzWzBdLG89e3RvcDowLGxlZnQ6MH07aWYoImZpeGVkIj09PVMuY3NzKHIsInBvc2l0aW9uIikpZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7Zm9yKGU9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCx0PXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt0JiYodD09PW4uYm9keXx8dD09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TLmNzcyh0LCJwb3NpdGlvbiIpOyl0PXQucGFyZW50Tm9kZTt0JiZ0IT09ciYmMT09PXQubm9kZVR5cGUmJigobz1TKHQpLm9mZnNldCgpKS50b3ArPVMuY3NzKHQsImJvcmRlclRvcFdpZHRoIiwhMCksby5sZWZ0Kz1TLmNzcyh0LCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDplLnRvcC1vLnRvcC1TLmNzcyhyLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmUubGVmdC1vLmxlZnQtUy5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLm9mZnNldFBhcmVudDt0JiYic3RhdGljIj09PVMuY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5vZmZzZXRQYXJlbnQ7cmV0dXJuIHR8fGF0fSl9fSksUy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PWU7Uy5mblt0XT1mdW5jdGlvbihyKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQscixvKXt2YXIgaTtpZihiKHQpP2k9dDo5PT09dC5ub2RlVHlwZSYmKGk9dC5kZWZhdWx0Vmlldyksdm9pZCAwPT09bylyZXR1cm4gaT9pW2VdOnRbcl07aT9pLnNjcm9sbFRvKG4%2FaS5wYWdlWE9mZnNldDpvLG4%2FbzppLnBhZ2VZT2Zmc2V0KTp0W3JdPW99LHQscixhcmd1bWVudHMubGVuZ3RoKX19KSxTLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW2VdPUd0KHkucGl4ZWxQb3NpdGlvbixmdW5jdGlvbih0LG4pe2lmKG4pcmV0dXJuIG49WXQodCxlKSxXdC50ZXN0KG4pP1ModCkucG9zaXRpb24oKVtlXSsicHgiOm59KX0pLFMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrdCxjb250ZW50OmUsIiI6Im91dGVyIit0fSxmdW5jdGlvbihuLHIpe1MuZm5bcl09ZnVuY3Rpb24obyxpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2Ygbykscz1ufHwoITA9PT1vfHwhMD09PWk%2FIm1hcmdpbiI6ImJvcmRlciIpO3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSxuLG8pe3ZhciBpO3JldHVybiBiKGUpPzA9PT1yLmluZGV4T2YoIm91dGVyIik%2FZVsiaW5uZXIiK3RdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK3RdOjk9PT1lLm5vZGVUeXBlPyhpPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIit0XSxpWyJzY3JvbGwiK3RdLGUuYm9keVsib2Zmc2V0Iit0XSxpWyJvZmZzZXQiK3RdLGlbImNsaWVudCIrdF0pKTp2b2lkIDA9PT1vP1MuY3NzKGUsbixzKTpTLnN0eWxlKGUsbixvLHMpfSxlLGE%2Fbzp2b2lkIDAsYSl9fSl9KSxTLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtTLmZuW2VdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg%2BMD90aGlzLm9uKGUsbnVsbCx0LG4pOnRoaXMudHJpZ2dlcihlKX19KSxTLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKHQpLm1vdXNlbGVhdmUoZXx8dCl9fSksUy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLm9uKHQsbnVsbCxlLG4pfSx1bmJpbmQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vZmYodCxudWxsLGUpfSxkZWxlZ2F0ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdGhpcy5vbihlLHQsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKHQsIioqIik6dGhpcy5vZmYoZSx0fHwiKioiLG4pfX0pLFMucHJveHk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLG87aWYoInN0cmluZyI9PXR5cGVvZiBlJiYobj10W2VdLGU9dCx0PW4pLG0odCkpcmV0dXJuIHI9dS5jYWxsKGFyZ3VtZW50cywyKSwobz1mdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGV8fHRoaXMsci5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKX0pLmd1aWQ9dC5ndWlkPXQuZ3VpZHx8Uy5ndWlkKyssb30sUy5ob2xkUmVhZHk9ZnVuY3Rpb24odCl7dD9TLnJlYWR5V2FpdCsrOlMucmVhZHkoITApfSxTLmlzQXJyYXk9QXJyYXkuaXNBcnJheSxTLnBhcnNlSlNPTj1KU09OLnBhcnNlLFMubm9kZU5hbWU9TCxTLmlzRnVuY3Rpb249bSxTLmlzV2luZG93PWIsUy5jYW1lbENhc2U9SyxTLnR5cGU9ayxTLm5vdz1EYXRlLm5vdyxTLmlzTnVtZXJpYz1mdW5jdGlvbih0KXt2YXIgZT1TLnR5cGUodCk7cmV0dXJuKCJudW1iZXIiPT09ZXx8InN0cmluZyI9PT1lKSYmIWlzTmFOKHQtcGFyc2VGbG9hdCh0KSl9LHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJuIFN9LmFwcGx5KGUsW10pKXx8KHQuZXhwb3J0cz1yKTt2YXIgUWU9bi5qUXVlcnksWmU9bi4kO3JldHVybiBTLm5vQ29uZmxpY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG4uJD09PVMmJihuLiQ9WmUpLHQmJm4ualF1ZXJ5PT09UyYmKG4ualF1ZXJ5PVFlKSxTfSxvfHwobi5qUXVlcnk9bi4kPVMpLFN9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyOCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3OSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX1yLnByb3RvPWZ1bmN0aW9uKCl7cmV0dXJuIFJlZ0V4cC5lc2NhcGU9cixyfSx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Myl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4OCkuZGVmYXVsdDt0LmV4cG9ydHM9cix0LmV4cG9ydHMuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM1KX0sZnVuY3Rpb24odCxlLG4pe24oMTM2KTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLlJlZmxlY3QuY29uc3RydWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMzApLGk9bigxOSksYT1uKDkpLHM9big2KSx1PW4oNDcpLGM9big5MCksbD1uKDUpLGY9bygiUmVmbGVjdCIsImNvbnN0cnVjdCIpLHA9bChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShmKGZ1bmN0aW9uKCl7fSxbXSx0KWluc3RhbmNlb2YgdCl9KSxoPSFsKGZ1bmN0aW9uKCl7ZihmdW5jdGlvbigpe30pfSksZD1wfHxoO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxmb3JjZWQ6ZCxzaGFtOmR9LHtjb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlKXtpKHQpLGEoZSk7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3Q6aShhcmd1bWVudHNbMl0pO2lmKGgmJiFwKXJldHVybiBmKHQsZSxuKTtpZih0PT1uKXtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKX12YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGUpLG5ldyhjLmFwcGx5KHQscikpfXZhciBvPW4ucHJvdG90eXBlLGw9dShzKG8pP286T2JqZWN0LnByb3RvdHlwZSksZD1GdW5jdGlvbi5hcHBseS5jYWxsKHQsbCxlKTtyZXR1cm4gcyhkKT9kOmx9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjApLGk9big5KSxhPW4oNjQpO3QuZXhwb3J0cz1yP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7aSh0KTtmb3IodmFyIG4scj1hKGUpLHM9ci5sZW5ndGgsdT0wO3M%2BdTspby5mKHQsbj1yW3UrK10sZVtuXSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3RyeXtvKHIsdCxlKX1jYXRjaChuKXtyW3RdPWV9cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9ZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlLG49T2JqZWN0LnByb3RvdHlwZSxyPW4uaGFzT3duUHJvcGVydHksbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxpPW8uaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixhPW8uYXN5bmNJdGVyYXRvcnx8IkBAYXN5bmNJdGVyYXRvciIscz1vLnRvU3RyaW5nVGFnfHwiQEB0b1N0cmluZ1RhZyI7ZnVuY3Rpb24gdSh0LGUsbil7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSx0W2VdfXRyeXt1KHt9LCIiKX1jYXRjaCh0KXt1PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1ufX1mdW5jdGlvbiBjKHQsZSxuLHIpe3ZhciBvPWUmJmUucHJvdG90eXBlIGluc3RhbmNlb2Ygdj9lOnYsaT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSxhPW5ldyBDKHJ8fFtdKTtyZXR1cm4gaS5faW52b2tlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mO3JldHVybiBmdW5jdGlvbihvLGkpe2lmKHI9PT1oKXRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2lmKHI9PT1kKXtpZigidGhyb3ciPT09byl0aHJvdyBpO3JldHVybiBMKCl9Zm9yKG4ubWV0aG9kPW8sbi5hcmc9aTs7KXt2YXIgYT1uLmRlbGVnYXRlO2lmKGEpe3ZhciBzPVQoYSxuKTtpZihzKXtpZihzPT09Zyljb250aW51ZTtyZXR1cm4gc319aWYoIm5leHQiPT09bi5tZXRob2Qpbi5zZW50PW4uX3NlbnQ9bi5hcmc7ZWxzZSBpZigidGhyb3ciPT09bi5tZXRob2Qpe2lmKHI9PT1mKXRocm93IHI9ZCxuLmFyZztuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKX1lbHNlInJldHVybiI9PT1uLm1ldGhvZCYmbi5hYnJ1cHQoInJldHVybiIsbi5hcmcpO3I9aDt2YXIgdT1sKHQsZSxuKTtpZigibm9ybWFsIj09PXUudHlwZSl7aWYocj1uLmRvbmU%2FZDpwLHUuYXJnPT09Zyljb250aW51ZTtyZXR1cm57dmFsdWU6dS5hcmcsZG9uZTpuLmRvbmV9fSJ0aHJvdyI9PT11LnR5cGUmJihyPWQsbi5tZXRob2Q9InRocm93IixuLmFyZz11LmFyZyl9fX0odCxuLGEpLGl9ZnVuY3Rpb24gbCh0LGUsbil7dHJ5e3JldHVybnt0eXBlOiJub3JtYWwiLGFyZzp0LmNhbGwoZSxuKX19Y2F0Y2godCl7cmV0dXJue3R5cGU6InRocm93Iixhcmc6dH19fXQud3JhcD1jO3ZhciBmPSJzdXNwZW5kZWRTdGFydCIscD0ic3VzcGVuZGVkWWllbGQiLGg9ImV4ZWN1dGluZyIsZD0iY29tcGxldGVkIixnPXt9O2Z1bmN0aW9uIHYoKXt9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiBtKCl7fXZhciBiPXt9O2JbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dmFyIHg9T2JqZWN0LmdldFByb3RvdHlwZU9mLHc9eCYmeCh4KGooW10pKSk7dyYmdyE9PW4mJnIuY2FsbCh3LGkpJiYoYj13KTt2YXIgaz1tLnByb3RvdHlwZT12LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIpO2Z1bmN0aW9uIFModCl7WyJuZXh0IiwidGhyb3ciLCJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UodCxlLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbnZva2UoZSx0KX0pfSl9ZnVuY3Rpb24gRSh0LGUpe3ZhciBuO3RoaXMuX2ludm9rZT1mdW5jdGlvbihvLGkpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gbmV3IGUoZnVuY3Rpb24obixhKXshZnVuY3Rpb24gbihvLGksYSxzKXt2YXIgdT1sKHRbb10sdCxpKTtpZigidGhyb3ciIT09dS50eXBlKXt2YXIgYz11LmFyZyxmPWMudmFsdWU7cmV0dXJuIGYmJiJvYmplY3QiPT10eXBlb2YgZiYmci5jYWxsKGYsIl9fYXdhaXQiKT9lLnJlc29sdmUoZi5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHQpe24oIm5leHQiLHQsYSxzKX0sZnVuY3Rpb24odCl7bigidGhyb3ciLHQsYSxzKX0pOmUucmVzb2x2ZShmKS50aGVuKGZ1bmN0aW9uKHQpe2MudmFsdWU9dCxhKGMpfSxmdW5jdGlvbih0KXtyZXR1cm4gbigidGhyb3ciLHQsYSxzKX0pfXModS5hcmcpfShvLGksbixhKX0pfXJldHVybiBuPW4%2Fbi50aGVuKGEsYSk6YSgpfX1mdW5jdGlvbiBUKHQsbil7dmFyIHI9dC5pdGVyYXRvcltuLm1ldGhvZF07aWYocj09PWUpe2lmKG4uZGVsZWdhdGU9bnVsbCwidGhyb3ciPT09bi5tZXRob2Qpe2lmKHQuaXRlcmF0b3IucmV0dXJuJiYobi5tZXRob2Q9InJldHVybiIsbi5hcmc9ZSxUKHQsbiksInRocm93Ij09PW4ubWV0aG9kKSlyZXR1cm4gZztuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2QiKX1yZXR1cm4gZ312YXIgbz1sKHIsdC5pdGVyYXRvcixuLmFyZyk7aWYoInRocm93Ij09PW8udHlwZSlyZXR1cm4gbi5tZXRob2Q9InRocm93IixuLmFyZz1vLmFyZyxuLmRlbGVnYXRlPW51bGwsZzt2YXIgaT1vLmFyZztyZXR1cm4gaT9pLmRvbmU%2FKG5bdC5yZXN1bHROYW1lXT1pLnZhbHVlLG4ubmV4dD10Lm5leHRMb2MsInJldHVybiIhPT1uLm1ldGhvZCYmKG4ubWV0aG9kPSJuZXh0IixuLmFyZz1lKSxuLmRlbGVnYXRlPW51bGwsZyk6aToobi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLG4uZGVsZWdhdGU9bnVsbCxnKX1mdW5jdGlvbiBBKHQpe3ZhciBlPXt0cnlMb2M6dFswXX07MSBpbiB0JiYoZS5jYXRjaExvYz10WzFdKSwyIGluIHQmJihlLmZpbmFsbHlMb2M9dFsyXSxlLmFmdGVyTG9jPXRbM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKGUpfWZ1bmN0aW9uIE8odCl7dmFyIGU9dC5jb21wbGV0aW9ufHx7fTtlLnR5cGU9Im5vcm1hbCIsZGVsZXRlIGUuYXJnLHQuY29tcGxldGlvbj1lfWZ1bmN0aW9uIEModCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLHQuZm9yRWFjaChBLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIGoodCl7aWYodCl7dmFyIG49dFtpXTtpZihuKXJldHVybiBuLmNhbGwodCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQubmV4dClyZXR1cm4gdDtpZighaXNOYU4odC5sZW5ndGgpKXt2YXIgbz0tMSxhPWZ1bmN0aW9uIG4oKXtmb3IoOysrbzx0Lmxlbmd0aDspaWYoci5jYWxsKHQsbykpcmV0dXJuIG4udmFsdWU9dFtvXSxuLmRvbmU9ITEsbjtyZXR1cm4gbi52YWx1ZT1lLG4uZG9uZT0hMCxufTtyZXR1cm4gYS5uZXh0PWF9fXJldHVybntuZXh0Okx9fWZ1bmN0aW9uIEwoKXtyZXR1cm57dmFsdWU6ZSxkb25lOiEwfX1yZXR1cm4geS5wcm90b3R5cGU9ay5jb25zdHJ1Y3Rvcj1tLG0uY29uc3RydWN0b3I9eSx5LmRpc3BsYXlOYW1lPXUobSxzLCJHZW5lcmF0b3JGdW5jdGlvbiIpLHQuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4hIWUmJihlPT09eXx8IkdlbmVyYXRvckZ1bmN0aW9uIj09PShlLmRpc3BsYXlOYW1lfHxlLm5hbWUpKX0sdC5tYXJrPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y%2FT2JqZWN0LnNldFByb3RvdHlwZU9mKHQsbSk6KHQuX19wcm90b19fPW0sdSh0LHMsIkdlbmVyYXRvckZ1bmN0aW9uIikpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoayksdH0sdC5hd3JhcD1mdW5jdGlvbih0KXtyZXR1cm57X19hd2FpdDp0fX0sUyhFLnByb3RvdHlwZSksRS5wcm90b3R5cGVbYV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5Bc3luY0l0ZXJhdG9yPUUsdC5hc3luYz1mdW5jdGlvbihlLG4scixvLGkpe3ZvaWQgMD09PWkmJihpPVByb21pc2UpO3ZhciBhPW5ldyBFKGMoZSxuLHIsbyksaSk7cmV0dXJuIHQuaXNHZW5lcmF0b3JGdW5jdGlvbihuKT9hOmEubmV4dCgpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIHQuZG9uZT90LnZhbHVlOmEubmV4dCgpfSl9LFMoayksdShrLHMsIkdlbmVyYXRvciIpLGtbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30say50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSx0LmtleXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlLnJldmVyc2UoKSxmdW5jdGlvbiBuKCl7Zm9yKDtlLmxlbmd0aDspe3ZhciByPWUucG9wKCk7aWYociBpbiB0KXJldHVybiBuLnZhbHVlPXIsbi5kb25lPSExLG59cmV0dXJuIG4uZG9uZT0hMCxufX0sdC52YWx1ZXM9aixDLnByb3RvdHlwZT17Y29uc3RydWN0b3I6QyxyZXNldDpmdW5jdGlvbih0KXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD1lLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPWUsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goTyksIXQpZm9yKHZhciBuIGluIHRoaXMpInQiPT09bi5jaGFyQXQoMCkmJnIuY2FsbCh0aGlzLG4pJiYhaXNOYU4oK24uc2xpY2UoMSkpJiYodGhpc1tuXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgdD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKHQpe2lmKHRoaXMuZG9uZSl0aHJvdyB0O3ZhciBuPXRoaXM7ZnVuY3Rpb24gbyhyLG8pe3JldHVybiBzLnR5cGU9InRocm93IixzLmFyZz10LG4ubmV4dD1yLG8mJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksISFvfWZvcih2YXIgaT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7aT49MDstLWkpe3ZhciBhPXRoaXMudHJ5RW50cmllc1tpXSxzPWEuY29tcGxldGlvbjtpZigicm9vdCI9PT1hLnRyeUxvYylyZXR1cm4gbygiZW5kIik7aWYoYS50cnlMb2M8PXRoaXMucHJldil7dmFyIHU9ci5jYWxsKGEsImNhdGNoTG9jIiksYz1yLmNhbGwoYSwiZmluYWxseUxvYyIpO2lmKHUmJmMpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiBvKGEuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIG8oYS5maW5hbGx5TG9jKX1lbHNlIGlmKHUpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiBvKGEuY2F0Y2hMb2MsITApfWVsc2V7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIG8oYS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIG89dGhpcy50cnlFbnRyaWVzW25dO2lmKG8udHJ5TG9jPD10aGlzLnByZXYmJnIuY2FsbChvLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxvLmZpbmFsbHlMb2Mpe3ZhciBpPW87YnJlYWt9fWkmJigiYnJlYWsiPT09dHx8ImNvbnRpbnVlIj09PXQpJiZpLnRyeUxvYzw9ZSYmZTw9aS5maW5hbGx5TG9jJiYoaT1udWxsKTt2YXIgYT1pP2kuY29tcGxldGlvbjp7fTtyZXR1cm4gYS50eXBlPXQsYS5hcmc9ZSxpPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PWkuZmluYWxseUxvYyxnKTp0aGlzLmNvbXBsZXRlKGEpfSxjb21wbGV0ZTpmdW5jdGlvbih0LGUpe2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuImJyZWFrIj09PXQudHlwZXx8ImNvbnRpbnVlIj09PXQudHlwZT90aGlzLm5leHQ9dC5hcmc6InJldHVybiI9PT10LnR5cGU%2FKHRoaXMucnZhbD10aGlzLmFyZz10LmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09dC50eXBlJiZlJiYodGhpcy5uZXh0PWUpLGd9LGZpbmlzaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U%2BPTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi5maW5hbGx5TG9jPT09dClyZXR1cm4gdGhpcy5jb21wbGV0ZShuLmNvbXBsZXRpb24sbi5hZnRlckxvYyksTyhuKSxnfX0sY2F0Y2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4udHJ5TG9jPT09dCl7dmFyIHI9bi5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1yLnR5cGUpe3ZhciBvPXIuYXJnO08obil9cmV0dXJuIG99fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpqKHQpLHJlc3VsdE5hbWU6bixuZXh0TG9jOnJ9LCJuZXh0Ij09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9ZSksZ319LHR9KHQuZXhwb3J0cyk7dHJ5e3JlZ2VuZXJhdG9yUnVudGltZT1yfWNhdGNoKHQpe0Z1bmN0aW9uKCJyIiwicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9big5MSksbigxNTMpLG4oMTU0KSxuKDE1NSksbigxNTYpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2Niksbz1uKDQ2KSxpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpLGEscz1TdHJpbmcobyhlKSksdT1yKG4pLGM9cy5sZW5ndGg7cmV0dXJuIHU8MHx8dT49Yz90PyIiOnZvaWQgMDooaT1zLmNoYXJDb2RlQXQodSkpPDU1Mjk2fHxpPjU2MzE5fHx1KzE9PT1jfHwoYT1zLmNoYXJDb2RlQXQodSsxKSk8NTYzMjB8fGE%2BNTczNDM%2FdD9zLmNoYXJBdCh1KTppOnQ%2Fcy5zbGljZSh1LHUrMik6YS01NjMyMCsoaS01NTI5Njw8MTApKzY1NTM2fX07dC5leHBvcnRzPXtjb2RlQXQ6aSghMSksY2hhckF0OmkoITApfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDE0NCksaT1yLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBpJiYvbmF0aXZlIGNvZGUvLnRlc3Qoby5jYWxsKGkpKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTcpO3QuZXhwb3J0cz1yKCJuYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nIixGdW5jdGlvbi50b1N0cmluZyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2OSksbz17fTtvW24oMSkoInRvU3RyaW5nVGFnIildPSJ6Iix0LmV4cG9ydHM9IltvYmplY3Qgel0iIT09U3RyaW5nKG8pP2Z1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIityKHRoaXMpKyJdIn06by50b1N0cmluZ30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpJiZudWxsIT09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IHNldCAiK1N0cmluZyh0KSsiIGFzIGEgcHJvdG90eXBlIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGEscz1uKDApLHU9bigyMiksYz1uKDQpLGw9bigyKSxmPW4oOTkpLHA9bigzMyksaD1uKDEwMCksZD1uKDI0KSxnPW4oMTQ5KSx2PW4oNikseT1uKDE5KSxtPW4oMTAxKSxiPW4oMjEpLHg9big1OCksdz1uKDEwNCksaz1uKDEwNSksUz1uKDEwNikuc2V0LEU9bigxNTApLFQ9bigxMDcpLEE9bigxNTEpLE89big1MiksQz1uKDU5KSxqPW4oNzIpLEw9big0OCksUD1uKDg2KSxSPW4oMSkoInNwZWNpZXMiKSxOPSJQcm9taXNlIixJPUwuZ2V0LEQ9TC5zZXQsXz1MLmdldHRlckZvcihOKSxNPWYsVT1jLlR5cGVFcnJvcixCPWMuZG9jdW1lbnQscT1jLnByb2Nlc3MsRj1jLmZldGNoLEg9cSYmcS52ZXJzaW9ucyx6PUgmJkgudjh8fCIiLFc9Ty5mLCQ9VyxWPSJwcm9jZXNzIj09YihxKSxZPSEhKEImJkIuY3JlYXRlRXZlbnQmJmMuZGlzcGF0Y2hFdmVudCksRz1QKE4sZnVuY3Rpb24oKXt2YXIgdD1NLnJlc29sdmUoMSksZT1mdW5jdGlvbigpe30sbj0odC5jb25zdHJ1Y3Rvcj17fSlbUl09ZnVuY3Rpb24odCl7dChlLGUpfTtyZXR1cm4hKChWfHwiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSYmKCF1fHx0LmZpbmFsbHkpJiZ0LnRoZW4oZSlpbnN0YW5jZW9mIG4mJjAhPT16LmluZGV4T2YoIjYuNiIpJiYtMT09PWouaW5kZXhPZigiQ2hyb21lLzY2IikpfSksSz1HfHwhdyhmdW5jdGlvbih0KXtNLmFsbCh0KS5jYXRjaChmdW5jdGlvbigpe30pfSksWD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4hKCF2KHQpfHwiZnVuY3Rpb24iIT10eXBlb2YoZT10LnRoZW4pKSYmZX0sSj1mdW5jdGlvbih0LGUsbil7aWYoIWUubm90aWZpZWQpe2Uubm90aWZpZWQ9ITA7dmFyIHI9ZS5yZWFjdGlvbnM7RShmdW5jdGlvbigpe2Zvcih2YXIgbz1lLnZhbHVlLGk9MT09ZS5zdGF0ZSxhPTA7ci5sZW5ndGg%2BYTspe3ZhciBzLHUsYyxsPXJbYSsrXSxmPWk%2FbC5vazpsLmZhaWwscD1sLnJlc29sdmUsaD1sLnJlamVjdCxkPWwuZG9tYWluO3RyeXtmPyhpfHwoMj09PWUucmVqZWN0aW9uJiZldCh0LGUpLGUucmVqZWN0aW9uPTEpLCEwPT09Zj9zPW86KGQmJmQuZW50ZXIoKSxzPWYobyksZCYmKGQuZXhpdCgpLGM9ITApKSxzPT09bC5wcm9taXNlP2goVSgiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToodT1YKHMpKT91LmNhbGwocyxwLGgpOnAocykpOmgobyl9Y2F0Y2godCl7ZCYmIWMmJmQuZXhpdCgpLGgodCl9fWUucmVhY3Rpb25zPVtdLGUubm90aWZpZWQ9ITEsbiYmIWUucmVqZWN0aW9uJiZaKHQsZSl9KX19LFE9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87WT8oKHI9Qi5jcmVhdGVFdmVudCgiRXZlbnQiKSkucHJvbWlzZT1lLHIucmVhc29uPW4sci5pbml0RXZlbnQodCwhMSwhMCksYy5kaXNwYXRjaEV2ZW50KHIpKTpyPXtwcm9taXNlOmUscmVhc29uOm59LChvPWNbIm9uIit0XSk%2FbyhyKToidW5oYW5kbGVkcmVqZWN0aW9uIj09PXQmJkEoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIsbil9LFo9ZnVuY3Rpb24odCxlKXtTLmNhbGwoYyxmdW5jdGlvbigpe3ZhciBuLHI9ZS52YWx1ZTtpZih0dChlKSYmKG49QyhmdW5jdGlvbigpe1Y%2FcS5lbWl0KCJ1bmhhbmRsZWRSZWplY3Rpb24iLHIsdCk6USgidW5oYW5kbGVkcmVqZWN0aW9uIix0LHIpfSksZS5yZWplY3Rpb249Vnx8dHQoZSk%2FMjoxLG4uZXJyb3IpKXRocm93IG4udmFsdWV9KX0sdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEhPT10LnJlamVjdGlvbiYmIXQucGFyZW50fSxldD1mdW5jdGlvbih0LGUpe1MuY2FsbChjLGZ1bmN0aW9uKCl7Vj9xLmVtaXQoInJlamVjdGlvbkhhbmRsZWQiLHQpOlEoInJlamVjdGlvbmhhbmRsZWQiLHQsZS52YWx1ZSl9KX0sbnQ9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGZ1bmN0aW9uKG8pe3QoZSxuLG8scil9fSxydD1mdW5jdGlvbih0LGUsbixyKXtlLmRvbmV8fChlLmRvbmU9ITAsciYmKGU9ciksZS52YWx1ZT1uLGUuc3RhdGU9MixKKHQsZSwhMCkpfSxvdD1mdW5jdGlvbih0LGUsbixyKXtpZighZS5kb25lKXtlLmRvbmU9ITAsciYmKGU9cik7dHJ5e2lmKHQ9PT1uKXRocm93IFUoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7dmFyIG89WChuKTtvP0UoZnVuY3Rpb24oKXt2YXIgcj17ZG9uZTohMX07dHJ5e28uY2FsbChuLG50KG90LHQscixlKSxudChydCx0LHIsZSkpfWNhdGNoKG4pe3J0KHQscixuLGUpfX0pOihlLnZhbHVlPW4sZS5zdGF0ZT0xLEoodCxlLCExKSl9Y2F0Y2gobil7cnQodCx7ZG9uZTohMX0sbixlKX19fTtHJiYoTT1mdW5jdGlvbih0KXttKHRoaXMsTSxOKSx5KHQpLHIuY2FsbCh0aGlzKTt2YXIgZT1JKHRoaXMpO3RyeXt0KG50KG90LHRoaXMsZSksbnQocnQsdGhpcyxlKSl9Y2F0Y2godCl7cnQodGhpcyxlLHQpfX0sKHI9ZnVuY3Rpb24odCl7RCh0aGlzLHt0eXBlOk4sZG9uZTohMSxub3RpZmllZDohMSxwYXJlbnQ6ITEscmVhY3Rpb25zOltdLHJlamVjdGlvbjohMSxzdGF0ZTowLHZhbHVlOnZvaWQgMH0pfSkucHJvdG90eXBlPWgoTS5wcm90b3R5cGUse3RoZW46ZnVuY3Rpb24odCxlKXt2YXIgbj1fKHRoaXMpLHI9VyhrKHRoaXMsTSkpO3JldHVybiByLm9rPSJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0LHIuZmFpbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxyLmRvbWFpbj1WP3EuZG9tYWluOnZvaWQgMCxuLnBhcmVudD0hMCxuLnJlYWN0aW9ucy5wdXNoKHIpLDAhPW4uc3RhdGUmJkoodGhpcyxuLCExKSxyLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfX0pLG89ZnVuY3Rpb24oKXt2YXIgdD1uZXcgcixlPUkodCk7dGhpcy5wcm9taXNlPXQsdGhpcy5yZXNvbHZlPW50KG90LHQsZSksdGhpcy5yZWplY3Q9bnQocnQsdCxlKX0sTy5mPVc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1NfHx0PT09aT9uZXcgbyh0KTokKHQpfSx1fHwiZnVuY3Rpb24iIT10eXBlb2YgZnx8KGE9Zi5wcm90b3R5cGUudGhlbixwKGYucHJvdG90eXBlLCJ0aGVuIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBNKGZ1bmN0aW9uKHQsZSl7YS5jYWxsKG4sdCxlKX0pLnRoZW4odCxlKX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBGJiZzKHtnbG9iYWw6ITAsZW51bWVyYWJsZTohMCxmb3JjZWQ6ITB9LHtmZXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gVChNLEYuYXBwbHkoYyxhcmd1bWVudHMpKX19KSkpLHMoe2dsb2JhbDohMCx3cmFwOiEwLGZvcmNlZDpHfSx7UHJvbWlzZTpNfSksZChNLE4sITEsITApLGcoTiksaT1sLlByb21pc2Uscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6R30se3JlamVjdDpmdW5jdGlvbih0KXt2YXIgZT1XKHRoaXMpO3JldHVybiBlLnJlamVjdC5jYWxsKHZvaWQgMCx0KSxlLnByb21pc2V9fSkscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6dXx8R30se3Jlc29sdmU6ZnVuY3Rpb24odCl7cmV0dXJuIFQodSYmdGhpcz09PWk%2FTTp0aGlzLHQpfX0pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOkt9LHthbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPVcoZSkscj1uLnJlc29sdmUsbz1uLnJlamVjdCxpPUMoZnVuY3Rpb24oKXt2YXIgbj15KGUucmVzb2x2ZSksaT1bXSxhPTAscz0xO3godCxmdW5jdGlvbih0KXt2YXIgdT1hKyssYz0hMTtpLnB1c2godm9pZCAwKSxzKyssbi5jYWxsKGUsdCkudGhlbihmdW5jdGlvbih0KXtjfHwoYz0hMCxpW3VdPXQsLS1zfHxyKGkpKX0sbyl9KSwtLXN8fHIoaSl9KTtyZXR1cm4gaS5lcnJvciYmbyhpLnZhbHVlKSxuLnByb21pc2V9LHJhY2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPVcoZSkscj1uLnJlamVjdCxvPUMoZnVuY3Rpb24oKXt2YXIgbz15KGUucmVzb2x2ZSk7eCh0LGZ1bmN0aW9uKHQpe28uY2FsbChlLHQpLnRoZW4obi5yZXNvbHZlLHIpfSl9KTtyZXR1cm4gby5lcnJvciYmcihvLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDIwKSxpPW4oMSksYT1uKDE0KSxzPWkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9cih0KSxuPW8uZjthJiZlJiYhZVtzXSYmbihlLHMse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYyxsPW4oNCksZj1uKDQ1KS5mLHA9bigyMSksaD1uKDEwNikuc2V0LGQ9big3MiksZz1sLk11dGF0aW9uT2JzZXJ2ZXJ8fGwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcix2PWwucHJvY2Vzcyx5PWwuUHJvbWlzZSxtPSJwcm9jZXNzIj09cCh2KSxiPWYobCwicXVldWVNaWNyb3Rhc2siKSx4PWImJmIudmFsdWU7eHx8KHI9ZnVuY3Rpb24oKXt2YXIgdCxlO2ZvcihtJiYodD12LmRvbWFpbikmJnQuZXhpdCgpO287KXtlPW8uZm4sbz1vLm5leHQ7dHJ5e2UoKX1jYXRjaCh0KXt0aHJvdyBvP2EoKTppPXZvaWQgMCx0fX1pPXZvaWQgMCx0JiZ0LmVudGVyKCl9LG0%2FYT1mdW5jdGlvbigpe3YubmV4dFRpY2socil9OmcmJiEvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QoZCk%2FKHM9ITAsdT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksbmV3IGcocikub2JzZXJ2ZSh1LHtjaGFyYWN0ZXJEYXRhOiEwfSksYT1mdW5jdGlvbigpe3UuZGF0YT1zPSFzfSk6eSYmeS5yZXNvbHZlPyhjPXkucmVzb2x2ZSh2b2lkIDApLGE9ZnVuY3Rpb24oKXtjLnRoZW4ocil9KTphPWZ1bmN0aW9uKCl7aC5jYWxsKGwscil9KSx0LmV4cG9ydHM9eHx8ZnVuY3Rpb24odCl7dmFyIGU9e2ZuOnQsbmV4dDp2b2lkIDB9O2kmJihpLm5leHQ9ZSksb3x8KG89ZSxhKCkpLGk9ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIuY29uc29sZTtuJiZuLmVycm9yJiYoMT09PWFyZ3VtZW50cy5sZW5ndGg%2Fbi5lcnJvcih0KTpuLmVycm9yKHQsZSkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyMiksaT1uKDk5KSxhPW4oMzApLHM9bigxMDUpLHU9bigxMDcpLGM9bigzMyk7cih7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsYSgiUHJvbWlzZSIpKSxuPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4obj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBufSl9OnQsbj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IG59KX06dCl9fSksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fGkucHJvdG90eXBlLmZpbmFsbHl8fGMoaS5wcm90b3R5cGUsImZpbmFsbHkiLGEoIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0OSksaT1uKDcwKSxhPW4oNDcpLHM9bigyOCksdT1uKDU4KSxjPW4oMTUpLGw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCEobiBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0LGUpO2kmJihuPWkobmV3IEVycm9yKGUpLG8obikpKTt2YXIgcj1bXTtyZXR1cm4gdSh0LHIucHVzaCxyKSxjKG4sImVycm9ycyIsciksdm9pZCAwIT09ZSYmYyhuLCJtZXNzYWdlIixTdHJpbmcoZSkpLG59O2wucHJvdG90eXBlPWEoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpzKDUsbCksbmFtZTpzKDUsIkFnZ3JlZ2F0ZUVycm9yIil9KSxyKHtnbG9iYWw6ITB9LHtBZ2dyZWdhdGVFcnJvcjpsfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEwOCl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNTIpLGk9big1OSk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7dHJ5OmZ1bmN0aW9uKHQpe3ZhciBlPW8uZih0aGlzKSxuPWkodCk7cmV0dXJuKG4uZXJyb3I%2FZS5yZWplY3Q6ZS5yZXNvbHZlKShuLnZhbHVlKSxlLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMTkpLGk9bigzMCksYT1uKDUyKSxzPW4oNTkpLHU9big1OCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hLmYoZSkscj1uLnJlc29sdmUsYz1uLnJlamVjdCxsPXMoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksYT1bXSxzPTAsbD0xLGY9ITE7dSh0LGZ1bmN0aW9uKHQpe3ZhciBvPXMrKyx1PSExO2EucHVzaCh2b2lkIDApLGwrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3V8fGZ8fChmPSEwLHIodCkpfSxmdW5jdGlvbih0KXt1fHxmfHwodT0hMCxhW29dPXQsLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKSl9KX0pLC0tbHx8YyhuZXcoaSgiQWdncmVnYXRlRXJyb3IiKSkoYSwiTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiKSl9KTtyZXR1cm4gbC5lcnJvciYmYyhsLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTgpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTkpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTYwKTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3MSksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2Myksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY29uY2F0O3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09by5jb25jYXQ%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTEwKTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5jb25jYXR9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjUpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNjYpLG89U3RyaW5nLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC50cmltO3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8dD09PW98fHQgaW5zdGFuY2VvZiBTdHJpbmcmJmU9PT1vLnRyaW0%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMTY3KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiU3RyaW5nIikudHJpbX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxMTEpLnRyaW07cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpuKDE2OCkoInRyaW0iKX0se3RyaW06ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDc2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIoZnVuY3Rpb24oKXtyZXR1cm4hIW9bdF0oKXx8IuKAi8KF4aCOIiE9IuKAi8KF4aCOIlt0XSgpfHxvW3RdLm5hbWUhPT10fSl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTcwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3MSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE3Mik7dmFyIHI9bigyKS5PYmplY3Qsbz10LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiByLmRlZmluZVByb3BlcnR5KHQsZSxuKX07ci5kZWZpbmVQcm9wZXJ0eS5zaGFtJiYoby5zaGFtPSEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDE0KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IW8sc2hhbTohb30se2RlZmluZVByb3BlcnR5Om4oMjApLmZ9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3NCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzUpfSxmdW5jdGlvbih0LGUsbil7bigxNzYpO3ZhciByPW4oMikuT2JqZWN0LG89dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSl9O3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNSksaT1uKDE4KSxhPW4oNDUpLmYscz1uKDE0KSx1PW8oZnVuY3Rpb24oKXthKDEpfSk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFzfHx1LHNoYW06IXN9LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYShpKHQpLGUpfX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE4MCk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5SZWZsZWN0LmdldH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDYpLGk9big5KSxhPW4oMTIpLHM9big0NSksdT1uKDQ5KTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtnZXQ6ZnVuY3Rpb24gdChlLG4pe3ZhciByLGMsbD1hcmd1bWVudHMubGVuZ3RoPDM%2FZTphcmd1bWVudHNbMl07cmV0dXJuIGkoZSk9PT1sP2Vbbl06KHI9cy5mKGUsbikpP2EociwidmFsdWUiKT9yLnZhbHVlOnZvaWQgMD09PXIuZ2V0P3ZvaWQgMDpyLmdldC5jYWxsKGwpOm8oYz11KGUpKT90KGMsbixsKTp2b2lkIDB9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmbnVsbCE9PSh0PXIodCkpOyk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTgzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4NCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE4NSk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5PYmplY3QuZ2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big1KSxpPW4oMjMpLGE9big0OSkscz1uKDk2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6byhmdW5jdGlvbigpe2EoMSl9KSxzaGFtOiFzfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxODcpfSxmdW5jdGlvbih0LGUsbil7bigxODgpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpuKDcwKX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTkwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE5MSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE5Mik7dmFyIHI9bigyKS5PYmplY3Q7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY3JlYXRlKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsc2hhbTohbigxNCl9LHtjcmVhdGU6big0Nyl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEyKTtmdW5jdGlvbiBvKGUsbil7cmV0dXJuIHQuZXhwb3J0cz1vPXJ8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0sbyhlLG4pfXQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTUpLG89bigxMTQpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPSJmdW5jdGlvbiI9PXR5cGVvZiBvJiYic3ltYm9sIj09dHlwZW9mIHI%2FZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuY29uc3RydWN0b3I9PT1vJiZ0IT09by5wcm90b3R5cGU%2FInN5bWJvbCI6dHlwZW9mIHR9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxOTYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTk3KX0sZnVuY3Rpb24odCxlLG4pe24oMTEzKSxuKDMyKSxuKDUwKTt2YXIgcj1uKDc3KTt0LmV4cG9ydHM9ci5mKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE1KSxuKDIxNyksbigyMTgpLG4oMjE5KSxuKDIyMCksbigyMjEpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDQpLGk9bigyMiksYT1uKDE0KSxzPW4oOTcpLHU9big1KSxjPW4oMTIpLGw9big1MyksZj1uKDYpLHA9big5KSxoPW4oMjMpLGQ9bigxOCksZz1uKDU0KSx2PW4oMjgpLHk9big0NyksbT1uKDY0KSxiPW4oMTE2KSx4PW4oMjAwKSx3PW4oMjAxKSxrPW4oNDUpLFM9bigyMCksRT1uKDgzKSxUPW4oMTUpLEE9bigzMyksTz1uKDU3KSxDPW4oNTYpLGo9big1NSksTD1uKDY4KSxQPW4oMSksUj1uKDc3KSxOPW4oMyksST1uKDI0KSxEPW4oNDgpLF89big3MykuZm9yRWFjaCxNPUMoImhpZGRlbiIpLFU9UCgidG9QcmltaXRpdmUiKSxCPUQuc2V0LHE9RC5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsVj1TLmYsWT14LmYsRz1FLmYsSz1PKCJzeW1ib2xzIiksWD1PKCJvcC1zeW1ib2xzIiksSj1PKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1PKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1PKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoVih7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBWKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sVih0LGUsbiksciYmdCE9PUYmJlYoRixlLHIpfTpWLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I%2FZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU%2FKGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8Vih0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpWKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIF8ocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1ZKGQodCkpLG49W107cmV0dXJuIF8oZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoaix0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1ZKGU%2FWDpkKHQpKSxyPVtdO3JldHVybiBfKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KEEoKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoVihILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8QShGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxSLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFAodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksXyhtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxUKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxqW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOCksbz1uKDExNikuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM%2FT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7bigzKSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oMykoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyNCkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTtuKDI0KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oMykoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMjUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2Y7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmluZGV4T2Y%2FcjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjI2KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5pbmRleE9mfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDY1KS5pbmRleE9mLGk9bigyMjcpLGE9W10uaW5kZXhPZixzPSEhYSYmMS9bMV0uaW5kZXhPZigxLC0wKTwwLHU9aSgiaW5kZXhPZiIpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpzfHx1fSx7aW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gcz9hLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MDpvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXVt0XTtyZXR1cm4hbnx8IXIoZnVuY3Rpb24oKXtuLmNhbGwobnVsbCxlfHxmdW5jdGlvbigpe3Rocm93IDF9LDEpfSl9fSxmdW5jdGlvbih0LGUsbil7bigxMTcpLHQuZXhwb3J0cz1uKDIpLnNldFRpbWVvdXR9LGZ1bmN0aW9uKHQsZSxuKXtuKDExNyksdC5leHBvcnRzPW4oMikuc2V0SW50ZXJ2YWx9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzEpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSxvPXIuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmluZ2lmeS5hcHBseShvLGFyZ3VtZW50cyl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjMzKX0sZnVuY3Rpb24odCxlLG4pe24oMjM0KTt2YXIgcj1uKDIpO3QuZXhwb3J0cz1yLnBhcnNlSW50fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMjM1KTtyKHtnbG9iYWw6ITAsZm9yY2VkOnBhcnNlSW50IT1vfSx7cGFyc2VJbnQ6b30pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTExKS50cmltLGk9big3NiksYT1yLnBhcnNlSW50LHM9L15bKy1dPzBbWHhdLyx1PTghPT1hKGkrIjA4Iil8fDIyIT09YShpKyIweDE2Iik7dC5leHBvcnRzPXU%2FZnVuY3Rpb24odCxlKXt2YXIgbj1vKFN0cmluZyh0KSk7cmV0dXJuIGEobixlPj4%2BMHx8KHMudGVzdChuKT8xNjoxMCkpfTphfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oMTE4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExOSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6IkFycmF5IixzdGF0OiEwfSx7aXNBcnJheTpuKDUzKX0pfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oNTEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEyMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyNDMpO3Ioe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITAsZm9yY2VkOiFuKDEwNCkoZnVuY3Rpb24odCl7QXJyYXkuZnJvbSh0KX0pfSx7ZnJvbTpvfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyOSksbz1uKDIzKSxpPW4oMTAzKSxhPW4oMTAyKSxzPW4oMzEpLHU9big3NCksYz1uKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsbixsLGYscD1vKHQpLGg9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXM%2FdGhpczpBcnJheSxkPWFyZ3VtZW50cy5sZW5ndGgsZz1kPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCx2PXZvaWQgMCE9PWcseT0wLG09YyhwKTtpZih2JiYoZz1yKGcsZD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsMikpLG51bGw9PW18fGg9PUFycmF5JiZhKG0pKWZvcihuPW5ldyBoKGU9cyhwLmxlbmd0aCkpO2U%2BeTt5KyspdShuLHksdj9nKHBbeV0seSk6cFt5XSk7ZWxzZSBmb3IoZj1tLmNhbGwocCksbj1uZXcgaDshKGw9Zi5uZXh0KCkpLmRvbmU7eSsrKXUobix5LHY%2FaShmLGcsW2wudmFsdWUseV0sITApOmwudmFsdWUpO3JldHVybiBuLmxlbmd0aD15LG59fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTIxKX0sZnVuY3Rpb24odCxlLG4pe24oMjQ2KTt2YXIgcj1uKDE2KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5zbGljZX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big2KSxpPW4oNTMpLGE9big4OCkscz1uKDMxKSx1PW4oMTgpLGM9big3NCksbD1uKDc1KSxmPW4oMSkoInNwZWNpZXMiKSxwPVtdLnNsaWNlLGg9TWF0aC5tYXg7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFsKCJzbGljZSIpfSx7c2xpY2U6ZnVuY3Rpb24odCxlKXt2YXIgbixyLGwsZD11KHRoaXMpLGc9cyhkLmxlbmd0aCksdj1hKHQsZykseT1hKHZvaWQgMD09PWU%2FZzplLGcpO2lmKGkoZCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj1kLmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhaShuLnByb3RvdHlwZSk%2FbyhuKSYmbnVsbD09PShuPW5bZl0pJiYobj12b2lkIDApOm49dm9pZCAwLG49PT1BcnJheXx8dm9pZCAwPT09bikpcmV0dXJuIHAuY2FsbChkLHYseSk7Zm9yKHI9bmV3KHZvaWQgMD09PW4%2FQXJyYXk6bikoaCh5LXYsMCkpLGw9MDt2PHk7disrLGwrKyl2IGluIGQmJmMocixsLGRbdl0pO3JldHVybiByLmxlbmd0aD1sLHJ9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDgpfSxmdW5jdGlvbih0LGUsbil7bigyNDkpO3ZhciByPW4oMik7dC5leHBvcnRzPXIuT2JqZWN0LmtleXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMyksaT1uKDY0KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6big1KShmdW5jdGlvbigpe2koMSl9KX0se2tleXM6ZnVuY3Rpb24odCl7cmV0dXJuIGkobyh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTEpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTIpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8ubWFwP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI1Myk7dmFyIHI9bigxNik7dC5leHBvcnRzPXIoIkFycmF5IikubWFwfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5tYXA7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDc1KSgibWFwIil9LHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjU1KSxvPW4oMTIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYocih0KSlyZXR1cm4gbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTIzKSxvPW4oMjU5KSxpPW4oMTE0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09aSYmbyhPYmplY3QodCkpKXJldHVybiByKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEyMCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjApfSxmdW5jdGlvbih0LGUsbil7big1MCksbigzMiksdC5leHBvcnRzPW4oMjYxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjkpLG89bigxKSxpPW4oMjUpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0KHQpO3JldHVybiB2b2lkIDAhPT1lW2FdfHwiQEBpdGVyYXRvciJpbiBlfHxpLmhhc093blByb3BlcnR5KHIoZSkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTIzKSxvPW4oMjYzKSxpPW4oMTIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGkodCxlKTt2YXIgYT1vKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7cmV0dXJuIk9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpLCJNYXAiPT09YXx8IlNldCI9PT1hP3IodCk6IkFyZ3VtZW50cyI9PT1hfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChhKT9pKHQsZSk6dm9pZCAwfX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTIxKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNjgpLG89bigyNzApLGk9QXJyYXkucHJvdG90eXBlLGE9U3RyaW5nLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5pbmNsdWRlcztyZXR1cm4gdD09PWl8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PWkuaW5jbHVkZXM%2Fcjoic3RyaW5nIj09dHlwZW9mIHR8fHQ9PT1hfHx0IGluc3RhbmNlb2YgU3RyaW5nJiZlPT09YS5pbmNsdWRlcz9vOmV9fSxmdW5jdGlvbih0LGUsbil7bigyNjkpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluY2x1ZGVzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDY1KS5pbmNsdWRlcyxpPW4oNzEpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxpKCJpbmNsdWRlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyNzEpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS5pbmNsdWRlc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyNzIpLGk9big0Nik7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohbigyNzQpKCJpbmNsdWRlcyIpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuISF%2BU3RyaW5nKGkodGhpcykpLmluZGV4T2Yobyh0KSxhcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89bigyMSksaT1uKDEpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gcih0KSYmKHZvaWQgMCE9PShlPXRbaV0pPyEhZToiUmVnRXhwIj09byh0KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9Ly4vO3RyeXsiLy4vIlt0XShlKX1jYXRjaChuKXt0cnl7cmV0dXJuIGVbcl09ITEsIi8uLyJbdF0oZSl9Y2F0Y2godCl7fX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpewovKiEKICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuCiAqCiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPgogKiBAbGljZW5zZSAgTUlUCiAqLwp2YXIgcj1uKDI3Niksbz1uKDI3NyksaT1uKDI3OCk7ZnVuY3Rpb24gYSgpe3JldHVybiB1LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FMjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHModCxlKXtpZihhKCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpKS5fX3Byb3RvX189dS5wcm90b3R5cGU6KG51bGw9PT10JiYodD1uZXcgdShlKSksdC5sZW5ndGg9ZSksdH1mdW5jdGlvbiB1KHQsZSxuKXtpZighKHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIHUpKXJldHVybiBuZXcgdSh0LGUsbik7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBmKHRoaXMsdCl9cmV0dXJuIGModGhpcyx0LGUsbil9ZnVuY3Rpb24gYyh0LGUsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbih0LGUsbixyKXtpZihlLmJ5dGVMZW5ndGgsbjwwfHxlLmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO2U9dm9pZCAwPT09biYmdm9pZCAwPT09cj9uZXcgVWludDhBcnJheShlKTp2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KGUsbik6bmV3IFVpbnQ4QXJyYXkoZSxuLHIpO3UuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1lKS5fX3Byb3RvX189dS5wcm90b3R5cGU6dD1wKHQsZSk7cmV0dXJuIHR9KHQsZSxuLHIpOiJzdHJpbmciPT10eXBlb2YgZT9mdW5jdGlvbih0LGUsbil7InN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4Iik7aWYoIXUuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGQoZSxuKSxvPSh0PXModCxyKSkud3JpdGUoZSxuKTtvIT09ciYmKHQ9dC5zbGljZSgwLG8pKTtyZXR1cm4gdH0odCxlLG4pOmZ1bmN0aW9uKHQsZSl7aWYodS5pc0J1ZmZlcihlKSl7dmFyIG49MHxoKGUubGVuZ3RoKTtyZXR1cm4gMD09PSh0PXModCxuKSkubGVuZ3RoP3Q6KGUuY29weSh0LDAsMCxuKSx0KX1pZihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIGUpcmV0dXJuIm51bWJlciIhPXR5cGVvZiBlLmxlbmd0aHx8KHI9ZS5sZW5ndGgpIT1yP3ModCwwKTpwKHQsZSk7aWYoIkJ1ZmZlciI9PT1lLnR5cGUmJmkoZS5kYXRhKSlyZXR1cm4gcCh0LGUuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfSh0LGUpfWZ1bmN0aW9uIGwodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBmKHQsZSl7aWYobChlKSx0PXModCxlPDA%2FMDowfGgoZSkpLCF1LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjxlOysrbil0W25dPTA7cmV0dXJuIHR9ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPWUubGVuZ3RoPDA%2FMDowfGgoZS5sZW5ndGgpO3Q9cyh0LG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKXRbcl09MjU1JmVbcl07cmV0dXJuIHR9ZnVuY3Rpb24gaCh0KXtpZih0Pj1hKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2EoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gZCh0LGUpe2lmKHUuaXNCdWZmZXIodCkpcmV0dXJuIHQubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciBuPXQubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEYodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipuO2Nhc2UiaGV4IjpyZXR1cm4gbj4%2BPjE7Y2FzZSJiYXNlNjQiOnJldHVybiBIKHQpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEYodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZyh0LGUsbil7dmFyIHI9ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU%2BdGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PW58fG4%2BdGhpcy5sZW5ndGgpJiYobj10aGlzLmxlbmd0aCksbjw9MClyZXR1cm4iIjtpZigobj4%2BPj0wKTw9KGU%2BPj49MCkpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBMKHRoaXMsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBBKHRoaXMsZSxuKTtjYXNlImFzY2lpIjpyZXR1cm4gQyh0aGlzLGUsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gaih0aGlzLGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsZSxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFAodGhpcyxlLG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gdih0LGUsbil7dmFyIHI9dFtlXTt0W2VdPXRbbl0sdFtuXT1yfWZ1bmN0aW9uIHkodCxlLG4scixvKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc%2Fbj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1vPzA6dC5sZW5ndGgtMSksbjwwJiYobj10Lmxlbmd0aCtuKSxuPj10Lmxlbmd0aCl7aWYobylyZXR1cm4tMTtuPXQubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFvKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIGUmJihlPXUuZnJvbShlLHIpKSx1LmlzQnVmZmVyKGUpKXJldHVybiAwPT09ZS5sZW5ndGg%2FLTE6bSh0LGUsbixyLG8pO2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZSY9MjU1LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y%2Fbz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLG4pOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLG4pOm0odCxbZV0sbixyLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIG0odCxlLG4scixvKXt2YXIgaSxhPTEscz10Lmxlbmd0aCx1PWUubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKHQubGVuZ3RoPDJ8fGUubGVuZ3RoPDIpcmV0dXJuLTE7YT0yLHMvPTIsdS89MixuLz0yfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gMT09PWE%2FdFtlXTp0LnJlYWRVSW50MTZCRShlKmEpfWlmKG8pe3ZhciBsPS0xO2ZvcihpPW47aTxzO2krKylpZihjKHQsaSk9PT1jKGUsLTE9PT1sPzA6aS1sKSl7aWYoLTE9PT1sJiYobD1pKSxpLWwrMT09PXUpcmV0dXJuIGwqYX1lbHNlLTEhPT1sJiYoaS09aS1sKSxsPS0xfWVsc2UgZm9yKG4rdT5zJiYobj1zLXUpLGk9bjtpPj0wO2ktLSl7Zm9yKHZhciBmPSEwLHA9MDtwPHU7cCsrKWlmKGModCxpK3ApIT09YyhlLHApKXtmPSExO2JyZWFrfWlmKGYpcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gYih0LGUsbixyKXtuPU51bWJlcihuKXx8MDt2YXIgbz10Lmxlbmd0aC1uO3I%2FKHI9TnVtYmVyKHIpKT5vJiYocj1vKTpyPW87dmFyIGk9ZS5sZW5ndGg7aWYoaSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I%2BaS8yJiYocj1pLzIpO2Zvcih2YXIgYT0wO2E8cjsrK2Epe3ZhciBzPXBhcnNlSW50KGUuc3Vic3RyKDIqYSwyKSwxNik7aWYoaXNOYU4ocykpcmV0dXJuIGE7dFtuK2FdPXN9cmV0dXJuIGF9ZnVuY3Rpb24geCh0LGUsbixyKXtyZXR1cm4geihGKGUsdC5sZW5ndGgtbiksdCxuLHIpfWZ1bmN0aW9uIHcodCxlLG4scil7cmV0dXJuIHooZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbillLnB1c2goMjU1JnQuY2hhckNvZGVBdChuKSk7cmV0dXJuIGV9KGUpLHQsbixyKX1mdW5jdGlvbiBrKHQsZSxuLHIpe3JldHVybiB3KHQsZSxuLHIpfWZ1bmN0aW9uIFModCxlLG4scil7cmV0dXJuIHooSChlKSx0LG4scil9ZnVuY3Rpb24gRSh0LGUsbixyKXtyZXR1cm4geihmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLG8saT1bXSxhPTA7YTx0Lmxlbmd0aCYmISgoZS09Mik8MCk7KythKW49dC5jaGFyQ29kZUF0KGEpLHI9bj4%2BOCxvPW4lMjU2LGkucHVzaChvKSxpLnB1c2gocik7cmV0dXJuIGl9KGUsdC5sZW5ndGgtbiksdCxuLHIpfWZ1bmN0aW9uIFQodCxlLG4pe3JldHVybiAwPT09ZSYmbj09PXQubGVuZ3RoP3IuZnJvbUJ5dGVBcnJheSh0KTpyLmZyb21CeXRlQXJyYXkodC5zbGljZShlLG4pKX1mdW5jdGlvbiBBKHQsZSxuKXtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxvPWU7bzxuOyl7dmFyIGksYSxzLHUsYz10W29dLGw9bnVsbCxmPWM%2BMjM5PzQ6Yz4yMjM%2FMzpjPjE5MT8yOjE7aWYobytmPD1uKXN3aXRjaChmKXtjYXNlIDE6YzwxMjgmJihsPWMpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGk9dFtvKzFdKSkmJih1PSgzMSZjKTw8Nnw2MyZpKT4xMjcmJihsPXUpO2JyZWFrO2Nhc2UgMzppPXRbbysxXSxhPXRbbysyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmMpPDwxMnwoNjMmaSk8PDZ8NjMmYSk%2BMjA0NyYmKHU8NTUyOTZ8fHU%2BNTczNDMpJiYobD11KTticmVhaztjYXNlIDQ6aT10W28rMV0sYT10W28rMl0scz10W28rM10sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImYSkmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmMpPDwxOHwoNjMmaSk8PDEyfCg2MyZhKTw8Nnw2MyZzKT42NTUzNSYmdTwxMTE0MTEyJiYobD11KX1udWxsPT09bD8obD02NTUzMyxmPTEpOmw%2BNjU1MzUmJihsLT02NTUzNixyLnB1c2gobD4%2BPjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxyLnB1c2gobCksbys9Zn1yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9TylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIG49IiIscj0wO2Zvcig7cjxlOyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKHIscis9TykpO3JldHVybiBufShyKX1lLkJ1ZmZlcj11LGUuU2xvd0J1ZmZlcj1mdW5jdGlvbih0KXsrdCE9dCYmKHQ9MCk7cmV0dXJuIHUuYWxsb2MoK3QpfSxlLklOU1BFQ1RfTUFYX0JZVEVTPTUwLHUuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDAhPT10LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FdC5UWVBFRF9BUlJBWV9TVVBQT1JUOmZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0Ll9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09dC5mb28oKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc3ViYXJyYXkmJjA9PT10LnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaCh0KXtyZXR1cm4hMX19KCksZS5rTWF4TGVuZ3RoPWEoKSx1LnBvb2xTaXplPTgxOTIsdS5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189dS5wcm90b3R5cGUsdH0sdS5mcm9tPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYyhudWxsLHQsZSxuKX0sdS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYodS5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLHUuX19wcm90b19fPVVpbnQ4QXJyYXksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5zcGVjaWVzJiZ1W1N5bWJvbC5zcGVjaWVzXT09PXUmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH0pKSx1LmFsbG9jPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGwoZSksZTw9MD9zKHQsZSk6dm9pZCAwIT09bj8ic3RyaW5nIj09dHlwZW9mIHI%2Fcyh0LGUpLmZpbGwobixyKTpzKHQsZSkuZmlsbChuKTpzKHQsZSl9KG51bGwsdCxlLG4pfSx1LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBmKG51bGwsdCl9LHUuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBmKG51bGwsdCl9LHUuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfSx1LmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighdS5pc0J1ZmZlcih0KXx8IXUuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgbj10Lmxlbmd0aCxyPWUubGVuZ3RoLG89MCxpPU1hdGgubWluKG4scik7bzxpOysrbylpZih0W29dIT09ZVtvXSl7bj10W29dLHI9ZVtvXTticmVha31yZXR1cm4gbjxyPy0xOnI8bj8xOjB9LHUuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sdS5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighaSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB1LmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxuPTA7bjx0Lmxlbmd0aDsrK24pZSs9dFtuXS5sZW5ndGg7dmFyIHI9dS5hbGxvY1Vuc2FmZShlKSxvPTA7Zm9yKG49MDtuPHQubGVuZ3RoOysrbil7dmFyIGE9dFtuXTtpZighdS5pc0J1ZmZlcihhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7YS5jb3B5KHIsbyksbys9YS5sZW5ndGh9cmV0dXJuIHJ9LHUuYnl0ZUxlbmd0aD1kLHUucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCx1LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpdih0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KXYodGhpcyxlLGUrMyksdih0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpdih0aGlzLGUsZSs3KSx2KHRoaXMsZSsxLGUrNiksdih0aGlzLGUrMixlKzUpLHYodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9BKHRoaXMsMCx0KTpnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT11LmNvbXBhcmUodGhpcyx0KX0sdS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiLG49ZS5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg%2BMCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLG4pLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD5uJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LHUucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLG4scixvKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1vJiYobz10aGlzLmxlbmd0aCksZTwwfHxuPnQubGVuZ3RofHxyPDB8fG8%2BdGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI%2BPW8mJmU%2BPW4pcmV0dXJuIDA7aWYocj49bylyZXR1cm4tMTtpZihlPj1uKXJldHVybiAxO2lmKHRoaXM9PT10KXJldHVybiAwO2Zvcih2YXIgaT0obz4%2BPj0wKS0ocj4%2BPj0wKSxhPShuPj4%2BPTApLShlPj4%2BPTApLHM9TWF0aC5taW4oaSxhKSxjPXRoaXMuc2xpY2UocixvKSxsPXQuc2xpY2UoZSxuKSxmPTA7ZjxzOysrZilpZihjW2ZdIT09bFtmXSl7aT1jW2ZdLGE9bFtmXTticmVha31yZXR1cm4gaTxhPy0xOmE8aT8xOjB9LHUucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUsbil9LHUucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5KHRoaXMsdCxlLG4sITApfSx1LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkodGhpcyx0LGUsbiwhMSl9LHUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHZvaWQgMD09PWUpcj0idXRmOCIsbj10aGlzLmxlbmd0aCxlPTA7ZWxzZSBpZih2b2lkIDA9PT1uJiYic3RyaW5nIj09dHlwZW9mIGUpcj1lLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTtlfD0wLGlzRmluaXRlKG4pPyhufD0wLHZvaWQgMD09PXImJihyPSJ1dGY4IikpOihyPW4sbj12b2lkIDApfXZhciBvPXRoaXMubGVuZ3RoLWU7aWYoKHZvaWQgMD09PW58fG4%2BbykmJihuPW8pLHQubGVuZ3RoPjAmJihuPDB8fGU8MCl8fGU%2BdGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cnx8KHI9InV0ZjgiKTtmb3IodmFyIGk9ITE7Oylzd2l0Y2gocil7Y2FzZSJoZXgiOnJldHVybiBiKHRoaXMsdCxlLG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIHgodGhpcyx0LGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIHcodGhpcyx0LGUsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gayh0aGlzLHQsZSxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFModGhpcyx0LGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBFKHRoaXMsdCxlLG4pO2RlZmF1bHQ6aWYoaSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksaT0hMH19LHUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIE89NDA5NjtmdW5jdGlvbiBDKHQsZSxuKXt2YXIgcj0iIjtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgbz1lO288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmdFtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gaih0LGUsbil7dmFyIHI9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIG89ZTtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUodFtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTCh0LGUsbil7dmFyIHI9dC5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIW58fG48MHx8bj5yKSYmKG49cik7Zm9yKHZhciBvPSIiLGk9ZTtpPG47KytpKW8rPXEodFtpXSk7cmV0dXJuIG99ZnVuY3Rpb24gUCh0LGUsbil7Zm9yKHZhciByPXQuc2xpY2UoZSxuKSxvPSIiLGk9MDtpPHIubGVuZ3RoO2krPTIpbys9U3RyaW5nLmZyb21DaGFyQ29kZShyW2ldKzI1NipyW2krMV0pO3JldHVybiBvfWZ1bmN0aW9uIFIodCxlLG4pe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U%2Bbil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE4odCxlLG4scixvLGkpe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPm98fGU8aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYobityPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBJKHQsZSxuLHIpe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKHQubGVuZ3RoLW4sMik7bzxpOysrbyl0W24rb109KGUmMjU1PDw4KihyP286MS1vKSk%2BPj44KihyP286MS1vKX1mdW5jdGlvbiBEKHQsZSxuLHIpe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4odC5sZW5ndGgtbiw0KTtvPGk7KytvKXRbbitvXT1lPj4%2BOCoocj9vOjMtbykmMjU1fWZ1bmN0aW9uIF8odCxlLG4scixvLGkpe2lmKG4rcj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBNKHQsZSxuLHIsaSl7cmV0dXJuIGl8fF8odCwwLG4sNCksby53cml0ZSh0LGUsbixyLDIzLDQpLG4rNH1mdW5jdGlvbiBVKHQsZSxuLHIsaSl7cmV0dXJuIGl8fF8odCwwLG4sOCksby53cml0ZSh0LGUsbixyLDUyLDgpLG4rOH11LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcy5sZW5ndGg7aWYoKHQ9fn50KTwwPyh0Kz1yKTwwJiYodD0wKTp0PnImJih0PXIpLChlPXZvaWQgMD09PWU%2Fcjp%2BfmUpPDA%2FKGUrPXIpPDAmJihlPTApOmU%2BciYmKGU9ciksZTx0JiYoZT10KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQpKG49dGhpcy5zdWJhcnJheSh0LGUpKS5fX3Byb3RvX189dS5wcm90b3R5cGU7ZWxzZXt2YXIgbz1lLXQ7bj1uZXcgdShvLHZvaWQgMCk7Zm9yKHZhciBpPTA7aTxvOysraSluW2ldPXRoaXNbaSt0XX1yZXR1cm4gbn0sdS5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFIodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0XSxvPTEsaT0wOysraTxlJiYobyo9MjU2KTspcis9dGhpc1t0K2ldKm87cmV0dXJuIHJ9LHUucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxSKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdCstLWVdLG89MTtlPjAmJihvKj0yNTYpOylyKz10aGlzW3QrLS1lXSpvO3JldHVybiByfSx1LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LHUucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LHUucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LHUucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sdS5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSx1LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxSKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdF0sbz0xLGk9MDsrK2k8ZSYmKG8qPTI1Nik7KXIrPXRoaXNbdCtpXSpvO3JldHVybiByPj0obyo9MTI4KSYmKHItPU1hdGgucG93KDIsOCplKSkscn0sdS5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8Uih0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj1lLG89MSxpPXRoaXNbdCstLXJdO3I%2BMCYmKG8qPTI1Nik7KWkrPXRoaXNbdCstLXJdKm87cmV0dXJuIGk%2BPShvKj0xMjgpJiYoaS09TWF0aC5wb3coMiw4KmUpKSxpfSx1LnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0%2FLTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LHUucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Uih0LDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSx1LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fFIodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sdS5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sdS5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITAsMjMsNCl9LHUucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCExLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITAsNTIsOCl9LHUucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMSw1Miw4KX0sdS5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLG4scil7KHQ9K3QsZXw9MCxufD0wLHIpfHxOKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89MSxpPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytpPG4mJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUsbixyKXsodD0rdCxlfD0wLG58PTAscil8fE4odGhpcyx0LGUsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz1uLTEsaT0xO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYoaSo9MjU2KTspdGhpc1tlK29dPXQvaSYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDEsMjU1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4%2BPjgpOkkodGhpcyx0LGUsITApLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsNjU1MzUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ%2BPj44LHRoaXNbZSsxXT0yNTUmdCk6SSh0aGlzLHQsZSwhMSksZSsyfSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ%2BPj4yNCx0aGlzW2UrMl09dD4%2BPjE2LHRoaXNbZSsxXT10Pj4%2BOCx0aGlzW2VdPTI1NSZ0KTpEKHRoaXMsdCxlLCEwKSxlKzR9LHUucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ%2BPj4yNCx0aGlzW2UrMV09dD4%2BPjE2LHRoaXNbZSsyXT10Pj4%2BOCx0aGlzW2UrM109MjU1JnQpOkQodGhpcyx0LGUsITEpLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUsbixyKXtpZih0PSt0LGV8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO04odGhpcyx0LGUsbixvLTEsLW8pfXZhciBpPTAsYT0xLHM9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2k8biYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UraS0xXSYmKHM9MSksdGhpc1tlK2ldPSh0L2E%2BPjApLXMmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLG4scil7aWYodD0rdCxlfD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtOKHRoaXMsdCxlLG4sby0xLC1vKX12YXIgaT1uLTEsYT0xLHM9MDtmb3IodGhpc1tlK2ldPTI1NSZ0Oy0taT49MCYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UraSsxXSYmKHM9MSksdGhpc1tlK2ldPSh0L2E%2BPjApLXMmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDEsMTI3LC0xMjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sdS5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4%2BPjgpOkkodGhpcyx0LGUsITApLGUrMn0sdS5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4%2BOCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ%2FKHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ%2BPj44LHRoaXNbZSsyXT10Pj4%2BMTYsdGhpc1tlKzNdPXQ%2BPj4yNCk6RCh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4%2BMjQsdGhpc1tlKzFdPXQ%2BPj4xNix0aGlzW2UrMl09dD4%2BPjgsdGhpc1tlKzNdPTI1NSZ0KTpEKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE0odGhpcyx0LGUsITAsbil9LHUucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE0odGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVSh0aGlzLHQsZSwhMSxuKX0sdS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUsbixyKXtpZihufHwobj0wKSxyfHwwPT09cnx8KHI9dGhpcy5sZW5ndGgpLGU%2BPXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCkscj4wJiZyPG4mJihyPW4pLHI9PT1uKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7cj50aGlzLmxlbmd0aCYmKHI9dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8ci1uJiYocj10Lmxlbmd0aC1lK24pO3ZhciBvLGk9ci1uO2lmKHRoaXM9PT10JiZuPGUmJmU8cilmb3Iobz1pLTE7bz49MDstLW8pdFtvK2VdPXRoaXNbbytuXTtlbHNlIGlmKGk8MWUzfHwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihvPTA7bzxpOysrbyl0W28rZV09dGhpc1tvK25dO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KG4sbitpKSxlKTtyZXR1cm4gaX0sdS5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8ocj1lLGU9MCxuPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIG4mJihyPW4sbj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgbz10LmNoYXJDb2RlQXQoMCk7bzwyNTYmJih0PW8pfWlmKHZvaWQgMCE9PXImJiJzdHJpbmciIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiByJiYhdS5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPD1lKXJldHVybiB0aGlzO3ZhciBpO2lmKGU%2BPj49MCxuPXZvaWQgMD09PW4%2FdGhpcy5sZW5ndGg6bj4%2BPjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihpPWU7aTxuOysraSl0aGlzW2ldPXQ7ZWxzZXt2YXIgYT11LmlzQnVmZmVyKHQpP3Q6RihuZXcgdSh0LHIpLnRvU3RyaW5nKCkpLHM9YS5sZW5ndGg7Zm9yKGk9MDtpPG4tZTsrK2kpdGhpc1tpK2VdPWFbaSVzXX1yZXR1cm4gdGhpc307dmFyIEI9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gRih0LGUpe3ZhciBuO2U9ZXx8MS8wO2Zvcih2YXIgcj10Lmxlbmd0aCxvPW51bGwsaT1bXSxhPTA7YTxyOysrYSl7aWYoKG49dC5jaGFyQ29kZUF0KGEpKT41NTI5NSYmbjw1NzM0NCl7aWYoIW8pe2lmKG4%2BNTYzMTkpeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihhKzE9PT1yKXsoZS09Myk%2BLTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bz1uO2NvbnRpbnVlfWlmKG48NTYzMjApeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxvPW47Y29udGludWV9bj02NTUzNisoby01NTI5Njw8MTB8bi01NjMyMCl9ZWxzZSBvJiYoZS09Myk%2BLTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYobz1udWxsLG48MTI4KXtpZigoZS09MSk8MClicmVhaztpLnB1c2gobil9ZWxzZSBpZihuPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO2kucHVzaChuPj42fDE5Miw2MyZufDEyOCl9ZWxzZSBpZihuPDY1NTM2KXtpZigoZS09Myk8MClicmVhaztpLnB1c2gobj4%2BMTJ8MjI0LG4%2BPjYmNjN8MTI4LDYzJm58MTI4KX1lbHNle2lmKCEobjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO2kucHVzaChuPj4xOHwyNDAsbj4%2BMTImNjN8MTI4LG4%2BPjYmNjN8MTI4LDYzJm58MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gSCh0KXtyZXR1cm4gci50b0J5dGVBcnJheShmdW5jdGlvbih0KXtpZigodD1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSh0KS5yZXBsYWNlKEIsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIHoodCxlLG4scil7Zm9yKHZhciBvPTA7bzxyJiYhKG8rbj49ZS5sZW5ndGh8fG8%2BPXQubGVuZ3RoKTsrK28pZVtvK25dPXRbb107cmV0dXJuIG99fSkuY2FsbCh0aGlzLG4oODIpKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmJ5dGVMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9Yyh0KSxuPWVbMF0scj1lWzFdO3JldHVybiAzKihuK3IpLzQtcn0sZS50b0J5dGVBcnJheT1mdW5jdGlvbih0KXt2YXIgZSxuLHI9Yyh0KSxhPXJbMF0scz1yWzFdLHU9bmV3IGkoZnVuY3Rpb24odCxlLG4pe3JldHVybiAzKihlK24pLzQtbn0oMCxhLHMpKSxsPTAsZj1zPjA%2FYS00OmE7Zm9yKG49MDtuPGY7bis9NCllPW9bdC5jaGFyQ29kZUF0KG4pXTw8MTh8b1t0LmNoYXJDb2RlQXQobisxKV08PDEyfG9bdC5jaGFyQ29kZUF0KG4rMildPDw2fG9bdC5jaGFyQ29kZUF0KG4rMyldLHVbbCsrXT1lPj4xNiYyNTUsdVtsKytdPWU%2BPjgmMjU1LHVbbCsrXT0yNTUmZTsyPT09cyYmKGU9b1t0LmNoYXJDb2RlQXQobildPDwyfG9bdC5jaGFyQ29kZUF0KG4rMSldPj40LHVbbCsrXT0yNTUmZSk7MT09PXMmJihlPW9bdC5jaGFyQ29kZUF0KG4pXTw8MTB8b1t0LmNoYXJDb2RlQXQobisxKV08PDR8b1t0LmNoYXJDb2RlQXQobisyKV0%2BPjIsdVtsKytdPWU%2BPjgmMjU1LHVbbCsrXT0yNTUmZSk7cmV0dXJuIHV9LGUuZnJvbUJ5dGVBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj10Lmxlbmd0aCxvPW4lMyxpPVtdLGE9MCxzPW4tbzthPHM7YSs9MTYzODMpaS5wdXNoKGwodCxhLGErMTYzODM%2Bcz9zOmErMTYzODMpKTsxPT09bz8oZT10W24tMV0saS5wdXNoKHJbZT4%2BMl0rcltlPDw0JjYzXSsiPT0iKSk6Mj09PW8mJihlPSh0W24tMl08PDgpK3Rbbi0xXSxpLnB1c2gocltlPj4xMF0rcltlPj40JjYzXStyW2U8PDImNjNdKyI9IikpO3JldHVybiBpLmpvaW4oIiIpfTtmb3IodmFyIHI9W10sbz1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGE9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHM9MCx1PWEubGVuZ3RoO3M8dTsrK3MpcltzXT1hW3NdLG9bYS5jaGFyQ29kZUF0KHMpXT1zO2Z1bmN0aW9uIGModCl7dmFyIGU9dC5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49dC5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj1lKSxbbixuPT09ZT8wOjQtbiU0XX1mdW5jdGlvbiBsKHQsZSxuKXtmb3IodmFyIG8saSxhPVtdLHM9ZTtzPG47cys9MylvPSh0W3NdPDwxNiYxNjcxMTY4MCkrKHRbcysxXTw8OCY2NTI4MCkrKDI1NSZ0W3MrMl0pLGEucHVzaChyWyhpPW8pPj4xOCY2M10rcltpPj4xMiY2M10rcltpPj42JjYzXStyWzYzJmldKTtyZXR1cm4gYS5qb2luKCIiKX1vWyItIi5jaGFyQ29kZUF0KDApXT02MixvWyJfIi5jaGFyQ29kZUF0KDApXT02M30sZnVuY3Rpb24odCxlKXtlLnJlYWQ9ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHM9OCpvLXItMSx1PSgxPDxzKS0xLGM9dT4%2BMSxsPS03LGY9bj9vLTE6MCxwPW4%2FLTE6MSxoPXRbZStmXTtmb3IoZis9cCxpPWgmKDE8PC1sKS0xLGg%2BPj0tbCxsKz1zO2w%2BMDtpPTI1NippK3RbZStmXSxmKz1wLGwtPTgpO2ZvcihhPWkmKDE8PC1sKS0xLGk%2BPj0tbCxsKz1yO2w%2BMDthPTI1NiphK3RbZStmXSxmKz1wLGwtPTgpO2lmKDA9PT1pKWk9MS1jO2Vsc2V7aWYoaT09PXUpcmV0dXJuIGE%2FTmFOOjEvMCooaD8tMToxKTthKz1NYXRoLnBvdygyLHIpLGktPWN9cmV0dXJuKGg%2FLTE6MSkqYSpNYXRoLnBvdygyLGktcil9LGUud3JpdGU9ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhLHMsdSxjPTgqaS1vLTEsbD0oMTw8YyktMSxmPWw%2BPjEscD0yMz09PW8%2FTWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGg9cj8wOmktMSxkPXI%2FMTotMSxnPWU8MHx8MD09PWUmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8ocz1pc05hTihlKT8xOjAsYT1sKTooYT1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKih1PU1hdGgucG93KDIsLWEpKTwxJiYoYS0tLHUqPTIpLChlKz1hK2Y%2BPTE%2FcC91OnAqTWF0aC5wb3coMiwxLWYpKSp1Pj0yJiYoYSsrLHUvPTIpLGErZj49bD8ocz0wLGE9bCk6YStmPj0xPyhzPShlKnUtMSkqTWF0aC5wb3coMixvKSxhKz1mKToocz1lKk1hdGgucG93KDIsZi0xKSpNYXRoLnBvdygyLG8pLGE9MCkpO28%2BPTg7dFtuK2hdPTI1NSZzLGgrPWQscy89MjU2LG8tPTgpO2ZvcihhPWE8PG98cyxjKz1vO2M%2BMDt0W24raF09MjU1JmEsaCs9ZCxhLz0yNTYsYy09OCk7dFtuK2gtZF18PTEyOCpnfX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09bi5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4MCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDI4MSk7dmFyIHI9bigyKTt0LmV4cG9ydHM9ci5VUkxTZWFyY2hQYXJhbXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7big5OCk7dmFyIHI9bigwKSxvPW4oMjgyKSxpPW4oMzMpLGE9bigxMDApLHM9bigyNCksdT1uKDk0KSxjPW4oNDgpLGw9bigxMDEpLGY9bigxMikscD1uKDI5KSxoPW4oOSksZD1uKDYpLGc9bigxMTgpLHY9big1MSkseT1uKDEpKCJpdGVyYXRvciIpLG09Yy5zZXQsYj1jLmdldHRlckZvcigiVVJMU2VhcmNoUGFyYW1zIikseD1jLmdldHRlckZvcigiVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IiKSx3PS9cKy9nLGs9QXJyYXkoNCksUz1mdW5jdGlvbih0KXtyZXR1cm4ga1t0LTFdfHwoa1t0LTFdPVJlZ0V4cCgiKCg%2FOiVbXFxkYS1mXXsyfSl7Iit0KyJ9KSIsImdpIikpfSxFPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQpfWNhdGNoKGUpe3JldHVybiB0fX0sVD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UodywiICIpLG49NDt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaCh0KXtmb3IoO247KWU9ZS5yZXBsYWNlKFMobi0tKSxFKTtyZXR1cm4gZX19LEE9L1shJygpfl18JTIwL2csTz17IiEiOiIlMjEiLCInIjoiJTI3IiwiKCI6IiUyOCIsIikiOiIlMjkiLCJ%2BIjoiJTdFIiwiJTIwIjoiKyJ9LEM9ZnVuY3Rpb24odCl7cmV0dXJuIE9bdF19LGo9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKEEsQyl9LEw9ZnVuY3Rpb24odCxlKXtpZihlKWZvcih2YXIgbixyLG89ZS5zcGxpdCgiJiIpLGk9MDtpPG8ubGVuZ3RoOykobj1vW2krK10pLmxlbmd0aCYmKHI9bi5zcGxpdCgiPSIpLHQucHVzaCh7a2V5OlQoci5zaGlmdCgpKSx2YWx1ZTpUKHIuam9pbigiPSIpKX0pKX0sUD1mdW5jdGlvbih0KXt0aGlzLmVudHJpZXMubGVuZ3RoPTAsTCh0aGlzLmVudHJpZXMsdCl9LFI9ZnVuY3Rpb24odCxlKXtpZih0PGUpdGhyb3cgVHlwZUVycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpfSxOPXUoZnVuY3Rpb24odCxlKXttKHRoaXMse3R5cGU6IlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIixpdGVyYXRvcjpnKGIodCkuZW50cmllcyksa2luZDplfSl9LCJJdGVyYXRvciIsZnVuY3Rpb24oKXt2YXIgdD14KHRoaXMpLGU9dC5raW5kLG49dC5pdGVyYXRvci5uZXh0KCkscj1uLnZhbHVlO3JldHVybiBuLmRvbmV8fChuLnZhbHVlPSJrZXlzIj09PWU%2Fci5rZXk6InZhbHVlcyI9PT1lP3IudmFsdWU6W3Iua2V5LHIudmFsdWVdKSxufSksST1mdW5jdGlvbigpe2wodGhpcyxJLCJVUkxTZWFyY2hQYXJhbXMiKTt2YXIgdCxlLG4scixvLGksYSxzPWFyZ3VtZW50cy5sZW5ndGg%2BMD9hcmd1bWVudHNbMF06dm9pZCAwLHU9dGhpcyxjPVtdO2lmKG0odSx7dHlwZToiVVJMU2VhcmNoUGFyYW1zIixlbnRyaWVzOmMsdXBkYXRlVVJMOmZ1bmN0aW9uKCl7fSx1cGRhdGVTZWFyY2hQYXJhbXM6UH0pLHZvaWQgMCE9PXMpaWYoZChzKSlpZigiZnVuY3Rpb24iPT10eXBlb2YodD12KHMpKSlmb3IoZT10LmNhbGwocyk7IShuPWUubmV4dCgpKS5kb25lOyl7aWYoKG89KHI9ZyhoKG4udmFsdWUpKSkubmV4dCgpKS5kb25lfHwoaT1yLm5leHQoKSkuZG9uZXx8IXIubmV4dCgpLmRvbmUpdGhyb3cgVHlwZUVycm9yKCJFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyIik7Yy5wdXNoKHtrZXk6by52YWx1ZSsiIix2YWx1ZTppLnZhbHVlKyIifSl9ZWxzZSBmb3IoYSBpbiBzKWYocyxhKSYmYy5wdXNoKHtrZXk6YSx2YWx1ZTpzW2FdKyIifSk7ZWxzZSBMKGMsInN0cmluZyI9PXR5cGVvZiBzPyI%2FIj09PXMuY2hhckF0KDApP3Muc2xpY2UoMSk6czpzKyIiKX0sRD1JLnByb3RvdHlwZTthKEQse2FwcGVuZDpmdW5jdGlvbih0LGUpe1IoYXJndW1lbnRzLmxlbmd0aCwyKTt2YXIgbj1iKHRoaXMpO24uZW50cmllcy5wdXNoKHtrZXk6dCsiIix2YWx1ZTplKyIifSksbi51cGRhdGVVUkwoKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe1IoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKSxuPWUuZW50cmllcyxyPXQrIiIsbz0wO288bi5sZW5ndGg7KW5bb10ua2V5PT09cj9uLnNwbGljZShvLDEpOm8rKztlLnVwZGF0ZVVSTCgpfSxnZXQ6ZnVuY3Rpb24odCl7Uihhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdLmtleT09PW4pcmV0dXJuIGVbcl0udmFsdWU7cmV0dXJuIG51bGx9LGdldEFsbDpmdW5jdGlvbih0KXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcykuZW50cmllcyxuPXQrIiIscj1bXSxvPTA7bzxlLmxlbmd0aDtvKyspZVtvXS5rZXk9PT1uJiZyLnB1c2goZVtvXS52YWx1ZSk7cmV0dXJuIHJ9LGhhczpmdW5jdGlvbih0KXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcykuZW50cmllcyxuPXQrIiIscj0wO3I8ZS5sZW5ndGg7KWlmKGVbcisrXS5rZXk9PT1uKXJldHVybiEwO3JldHVybiExfSxzZXQ6ZnVuY3Rpb24odCxlKXtSKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBuLHI9Yih0aGlzKSxvPXIuZW50cmllcyxpPSExLGE9dCsiIixzPWUrIiIsdT0wO3U8by5sZW5ndGg7dSsrKShuPW9bdV0pLmtleT09PWEmJihpP28uc3BsaWNlKHUtLSwxKTooaT0hMCxuLnZhbHVlPXMpKTtpfHxvLnB1c2goe2tleTphLHZhbHVlOnN9KSxyLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9Yih0aGlzKSxvPXIuZW50cmllcyxpPW8uc2xpY2UoKTtmb3Ioby5sZW5ndGg9MCxuPTA7bjxpLmxlbmd0aDtuKyspe2Zvcih0PWlbbl0sZT0wO2U8bjtlKyspaWYob1tlXS5rZXk%2BdC5rZXkpe28uc3BsaWNlKGUsMCx0KTticmVha31lPT09biYmby5wdXNoKHQpfXIudXBkYXRlVVJMKCl9LGZvckVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49Yih0aGlzKS5lbnRyaWVzLHI9cCh0LGFyZ3VtZW50cy5sZW5ndGg%2BMT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89MDtvPG4ubGVuZ3RoOylyKChlPW5bbysrXSkudmFsdWUsZS5rZXksdGhpcyl9LGtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywia2V5cyIpfSx2YWx1ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywidmFsdWVzIil9LGVudHJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcywiZW50cmllcyIpfX0se2VudW1lcmFibGU6ITB9KSxpKEQseSxELmVudHJpZXMpLGkoRCwidG9TdHJpbmciLGZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9Yih0aGlzKS5lbnRyaWVzLG49W10scj0wO3I8ZS5sZW5ndGg7KXQ9ZVtyKytdLG4ucHVzaChqKHQua2V5KSsiPSIraih0LnZhbHVlKSk7cmV0dXJuIG4uam9pbigiJiIpfSx7ZW51bWVyYWJsZTohMH0pLHMoSSwiVVJMU2VhcmNoUGFyYW1zIikscih7Z2xvYmFsOiEwLGZvcmNlZDohb30se1VSTFNlYXJjaFBhcmFtczpJfSksdC5leHBvcnRzPXtVUkxTZWFyY2hQYXJhbXM6SSxnZXRTdGF0ZTpifX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDEpLGk9bigyMiksYT1vKCJpdGVyYXRvciIpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3ZhciB0PW5ldyBVUkwoImI%2FZT0xIiwiaHR0cDovL2EiKSxlPXQuc2VhcmNoUGFyYW1zO3JldHVybiB0LnBhdGhuYW1lPSJjJTIwZCIsaSYmIXQudG9KU09OfHwhZS5zb3J0fHwiaHR0cDovL2EvYyUyMGQ%2FZT0xIiE9PXQuaHJlZnx8IjEiIT09ZS5nZXQoImUiKXx8ImE9MSIhPT1TdHJpbmcobmV3IFVSTFNlYXJjaFBhcmFtcygiP2E9MSIpKXx8IWVbYV18fCJhIiE9PW5ldyBVUkwoImh0dHBzOi8vYUBiIikudXNlcm5hbWV8fCJiIiE9PW5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygiYT1iIikpLmdldCgiYSIpfHwieG4tLWUxYXliYyIhPT1uZXcgVVJMKCJodHRwOi8v0YLQtdGB0YIiKS5ob3N0fHwiIyVEMCVCMSIhPT1uZXcgVVJMKCJodHRwOi8vYSPQsSIpLmhhc2h9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4NCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4NSksbz1GdW5jdGlvbi5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuYmluZDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBGdW5jdGlvbiYmZT09PW8uYmluZD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyODYpO3ZhciByPW4oMTYpO3QuZXhwb3J0cz1yKCJGdW5jdGlvbiIpLmJpbmR9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6IkZ1bmN0aW9uIixwcm90bzohMH0se2JpbmQ6big5MCl9KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDkxKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbiYmdChlLnByb3RvdHlwZSxuKSxyJiZ0KGUsciksZX19KCksbz1mdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9KG4oMjg5KSksaT1wKG4oMjkwKSksYT1wKG4oMjkxKSkscz1wKG4oMjkyKSksdT1wKG4oMjkzKSksYz1wKG4oMjk0KSksbD1wKG4oMjk1KSksZj1wKG4oMjk2KSk7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19dmFyIGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSx0aGlzLnR5cGU9Imxhbmd1YWdlRGV0ZWN0b3IiLHRoaXMuZGV0ZWN0b3JzPXt9LHRoaXMuaW5pdChlLG4pfXJldHVybiByKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg%2BMiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTt0aGlzLnNlcnZpY2VzPXQsdGhpcy5vcHRpb25zPW8uZGVmYXVsdHMoZSx0aGlzLm9wdGlvbnN8fHt9LHtvcmRlcjpbInF1ZXJ5c3RyaW5nIiwiY29va2llIiwibG9jYWxTdG9yYWdlIiwibmF2aWdhdG9yIiwiaHRtbFRhZyJdLGxvb2t1cFF1ZXJ5c3RyaW5nOiJsbmciLGxvb2t1cENvb2tpZToiaTE4bmV4dCIsbG9va3VwTG9jYWxTdG9yYWdlOiJpMThuZXh0TG5nIixjYWNoZXM6WyJsb2NhbFN0b3JhZ2UiXSxleGNsdWRlQ2FjaGVGb3I6WyJjaW1vZGUiXX0pLHRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXgmJih0aGlzLm9wdGlvbnMubG9va3VwRnJvbVBhdGhJbmRleD10aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4KSx0aGlzLmkxOG5PcHRpb25zPW4sdGhpcy5hZGREZXRlY3RvcihpLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoYS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKHMuZGVmYXVsdCksdGhpcy5hZGREZXRlY3Rvcih1LmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoYy5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGwuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihmLmRlZmF1bHQpfX0se2tleToiYWRkRGV0ZWN0b3IiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuZGV0ZWN0b3JzW3QubmFtZV09dH19LHtrZXk6ImRldGVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0fHwodD10aGlzLm9wdGlvbnMub3JkZXIpO3ZhciBuPVtdO3QuZm9yRWFjaChmdW5jdGlvbih0KXtpZihlLmRldGVjdG9yc1t0XSl7dmFyIHI9ZS5kZXRlY3RvcnNbdF0ubG9va3VwKGUub3B0aW9ucyk7ciYmInN0cmluZyI9PXR5cGVvZiByJiYocj1bcl0pLHImJihuPW4uY29uY2F0KHIpKX19KTt2YXIgcj12b2lkIDA7aWYobi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFyKXt2YXIgbj1lLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO2Uuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5pc1doaXRlbGlzdGVkKG4pJiYocj1uKX19KSwhcil7dmFyIG89dGhpcy5pMThuT3B0aW9ucy5mYWxsYmFja0xuZzsic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSksb3x8KG89W10pLHI9IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobyk%2Fb1swXTpvWzBdfHxvLmRlZmF1bHQmJm8uZGVmYXVsdFswXX1yZXR1cm4gcn19LHtrZXk6ImNhY2hlVXNlckxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7ZXx8KGU9dGhpcy5vcHRpb25zLmNhY2hlcyksZSYmKHRoaXMub3B0aW9ucy5leGNsdWRlQ2FjaGVGb3ImJnRoaXMub3B0aW9ucy5leGNsdWRlQ2FjaGVGb3IuaW5kZXhPZih0KT4tMXx8ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24uZGV0ZWN0b3JzW2VdJiZuLmRldGVjdG9yc1tlXS5jYWNoZVVzZXJMYW5ndWFnZSh0LG4ub3B0aW9ucyl9KSl9fV0pLHR9KCk7aC50eXBlPSJsYW5ndWFnZURldGVjdG9yIixlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0cz1mdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKGkuY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIG4gaW4gZSl2b2lkIDA9PT10W25dJiYodFtuXT1lW25dKX0pLHR9LGUuZXh0ZW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNhbGwoaS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbihlKXtpZihlKWZvcih2YXIgbiBpbiBlKXRbbl09ZVtuXX0pLHR9O3ZhciByPVtdLG89ci5mb3JFYWNoLGk9ci5zbGljZX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24odCxlLG4scil7dmFyIG89dm9pZCAwO2lmKG4pe3ZhciBpPW5ldyBEYXRlO2kuc2V0VGltZShpLmdldFRpbWUoKSs2MCpuKjFlMyksbz0iOyBleHBpcmVzPSIraS50b0dNVFN0cmluZygpfWVsc2Ugbz0iIjtyPXI%2FImRvbWFpbj0iK3IrIjsiOiIiLGRvY3VtZW50LmNvb2tpZT10KyI9IitlK28rIjsiK3IrInBhdGg9LyJ9LG89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQrIj0iLG49ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7Iikscj0wO3I8bi5sZW5ndGg7cisrKXtmb3IodmFyIG89bltyXTsiICI9PT1vLmNoYXJBdCgwKTspbz1vLnN1YnN0cmluZygxLG8ubGVuZ3RoKTtpZigwPT09by5pbmRleE9mKGUpKXJldHVybiBvLnN1YnN0cmluZyhlLmxlbmd0aCxvLmxlbmd0aCl9cmV0dXJuIG51bGx9O2UuZGVmYXVsdD17bmFtZToiY29va2llIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKHQubG9va3VwQ29va2llJiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgbj1vKHQubG9va3VwQ29va2llKTtuJiYoZT1uKX1yZXR1cm4gZX0sY2FjaGVVc2VyTGFuZ3VhZ2U6ZnVuY3Rpb24odCxlKXtlLmxvb2t1cENvb2tpZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmcihlLmxvb2t1cENvb2tpZSx0LGUuY29va2llTWludXRlcyxlLmNvb2tpZURvbWFpbil9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJxdWVyeXN0cmluZyIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdylmb3IodmFyIG49d2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoIiYiKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl0uaW5kZXhPZigiPSIpO2lmKG8%2BMCluW3JdLnN1YnN0cmluZygwLG8pPT09dC5sb29rdXBRdWVyeXN0cmluZyYmKGU9bltyXS5zdWJzdHJpbmcobysxKSl9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9dm9pZCAwO3RyeXtyPSJ1bmRlZmluZWQiIT09d2luZG93JiZudWxsIT09d2luZG93LmxvY2FsU3RvcmFnZTt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oImkxOG5leHQudHJhbnNsYXRlLmJvbyIsImZvbyIpLHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgiaTE4bmV4dC50cmFuc2xhdGUuYm9vIil9Y2F0Y2godCl7cj0hMX1lLmRlZmF1bHQ9e25hbWU6ImxvY2FsU3RvcmFnZSIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZih0Lmxvb2t1cExvY2FsU3RvcmFnZSYmcil7dmFyIG49d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHQubG9va3VwTG9jYWxTdG9yYWdlKTtuJiYoZT1uKX1yZXR1cm4gZX0sY2FjaGVVc2VyTGFuZ3VhZ2U6ZnVuY3Rpb24odCxlKXtlLmxvb2t1cExvY2FsU3RvcmFnZSYmciYmd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGUubG9va3VwTG9jYWxTdG9yYWdlLHQpfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToibmF2aWdhdG9yIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9W107aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3Ipe2lmKG5hdmlnYXRvci5sYW5ndWFnZXMpZm9yKHZhciBuPTA7bjxuYXZpZ2F0b3IubGFuZ3VhZ2VzLmxlbmd0aDtuKyspZS5wdXNoKG5hdmlnYXRvci5sYW5ndWFnZXNbbl0pO25hdmlnYXRvci51c2VyTGFuZ3VhZ2UmJmUucHVzaChuYXZpZ2F0b3IudXNlckxhbmd1YWdlKSxuYXZpZ2F0b3IubGFuZ3VhZ2UmJmUucHVzaChuYXZpZ2F0b3IubGFuZ3VhZ2UpfXJldHVybiBlLmxlbmd0aD4wP2U6dm9pZCAwfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToiaHRtbFRhZyIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMCxuPXQuaHRtbFRhZ3x8KCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ%2FZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Om51bGwpO3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5nZXRBdHRyaWJ1dGUmJihlPW4uZ2V0QXR0cmlidXRlKCJsYW5nIikpLGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJwYXRoIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUubWF0Y2goL1wvKFthLXpBLVotXSopL2cpO2lmKG4gaW5zdGFuY2VvZiBBcnJheSlpZigibnVtYmVyIj09dHlwZW9mIHQubG9va3VwRnJvbVBhdGhJbmRleCl7aWYoInN0cmluZyIhPXR5cGVvZiBuW3QubG9va3VwRnJvbVBhdGhJbmRleF0pcmV0dXJuO2U9blt0Lmxvb2t1cEZyb21QYXRoSW5kZXhdLnJlcGxhY2UoIi8iLCIiKX1lbHNlIGU9blswXS5yZXBsYWNlKCIvIiwiIil9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJzdWJkb21haW4iLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBuPXdpbmRvdy5sb2NhdGlvbi5ocmVmLm1hdGNoKC8oPzpodHRwW3NdKlw6XC9cLykqKC4qPylcLig%2FPVteXC9dKlwuLnsyLDV9KS9naSk7biBpbnN0YW5jZW9mIEFycmF5JiYoZT0ibnVtYmVyIj09dHlwZW9mIHQubG9va3VwRnJvbVN1YmRvbWFpbkluZGV4P25bdC5sb29rdXBGcm9tU3ViZG9tYWluSW5kZXhdLnJlcGxhY2UoImh0dHA6Ly8iLCIiKS5yZXBsYWNlKCJodHRwczovLyIsIiIpLnJlcGxhY2UoIi4iLCIiKTpuWzBdLnJlcGxhY2UoImh0dHA6Ly8iLCIiKS5yZXBsYWNlKCJodHRwczovLyIsIiIpLnJlcGxhY2UoIi4iLCIiKSl9cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLnIoZSk7dmFyIHI9big4KSxvPW4ubihyKSxpPW4oNDIpLGE9bi5uKGkpLHM9big2MCksdT1uLm4ocyksYz1uKDI3KSxsPW4ubihjKSxmPW4oMTcpLHA9bi5uKGYpLGg9big3KSxkPW4ubihoKSxnPW4oMTApLHY9bi5uKGcpLHk9bigxMSksbT1uLm4oeSksYj1uKDEyNCkseD1uLm4oYiksdz1uKDI2KSxrPW4ubih3KSxTPW4oMzQpLEU9bi5uKFMpLFQ9bigxMyksQT1uLm4oVCksTz1uKDEyNSksQz1uLm4oTyksaj1uKDEyNik7ZnVuY3Rpb24gTCgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgUD1uKDEyNyksUj1uLm4oUCksTj1uKDEyOCksST1uLm4oTiksRD0iemlnemFnIjt2YXIgXz1uKDM1KSxNPSJ1c2FnZSIsVT0iemlnemFnLWZsb3ctY29udHJvbGxlZCI7ZnVuY3Rpb24gQih0LGUpe3dpbmRvdy4kJiZmdW5jdGlvbihuKXt2YXIgcj1uKHQpO2lmKHImJnIubGVuZ3RoPjApZm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKz0xKXt2YXIgaT1yLmdldChvKTtpLmhhc0F0dHJpYnV0ZShVKXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBxPXtwcmVzZXJ2ZU9yaWdpbmFsRXZlbnQ6ITEsZGlzYWJsZVBvaW50ZXJFdmVudDohMX07ZnVuY3Rpb24gRih0KXt2YXIgZT1JKCkoZnVuY3Rpb24oKXt2YXIgbixyLG89d2luZG93LnppZ3phZzsiZGVhY3RpdmF0ZWQiPT09KG49TSxyPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShEKSxKU09OLnBhcnNlKHI%2FZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBIKHQsZSl7dmFyIG49d2luZG93LnppZ3phZztSKCkoZnVuY3Rpb24oKXsvQ2hyb21lLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSYmMD09PXQoZSkubGVuZ3RoJiZuJiYiaXRlbSI9PT1uLmRpc2NvdmVyeVN0YXR1cyYmXy5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp%2BipsuW9k%2BOBmeOCi%2BODleODreODvOWItuW%2BoeeUqOOBruimgee0oOOBjOimi%2BOBpOOBi%2BOCiuOBvuOBm%2BOCkyIpKX0sNWUzKX12YXIgej17b25DaGFuZ2VzUmVhZHk6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOlsiamEiXTtCb29sZWFuKGwoKShlKS5jYWxsKGUsZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuLTEhPT1DKCkoZT1MKCkpLmNhbGwoZSx0KX0pKXx8RihmdW5jdGlvbigpe3Qoail9KX0sb3ZlcnJpZGVDbGlja0V2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106cTtpZihIKHQsZSksci5kaXNhYmxlUG9pbnRlckV2ZW50KXtpZih3aW5kb3cuZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoVSkpcmV0dXJuO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7by5pbm5lckhUTUw9IlxuICAgICIuY29uY2F0KGUsIiB7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9Iik7dmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0Iik7cmV0dXJuIGkmJmkucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvLGkpLHQoZG9jdW1lbnQpLm9uKCJjbGljayIsZnVuY3Rpb24ocil7ci50YXJnZXQmJnQoci50YXJnZXQpLmNsb3Nlc3QodChlKS5wYXJlbnQoKSkubGVuZ3RoPjAmJm4ocil9KSx2b2lkIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZShVLCIxIil9ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fEIoZSwiY2xpY2siKTtmb3IodmFyIGE9dChlKSxzPTA7czxhLmxlbmd0aDtzKz0xKXt2YXIgdT1hLmdldChzKTt1Lmhhc0F0dHJpYnV0ZShVKXx8KHUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKHQpe3IucHJlc2VydmVPcmlnaW5hbEV2ZW50fHwodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpLG4odCl9LCEwKSx1LnNldEF0dHJpYnV0ZShVLCIxIikpfX0sb3ZlcnJpZGVTdWJtaXRFdmVudDpmdW5jdGlvbih0LGUsbil7SCh0LGUpLEIoZSwic3VibWl0Iik7dmFyIHI9dChlKTtpZihyJiZyLmxlbmd0aD4wKWZvcih2YXIgbz0wO288ci5sZW5ndGg7bys9MSl7dmFyIGk9ci5nZXQobyk7aS5oYXNBdHRyaWJ1dGUoVSl8fCh0KGkpLm9uKCJzdWJtaXQiLG4pLGkuc2V0QXR0cmlidXRlKFUsIjEiKSl9fSx1bmJpbmRPcmlnaW5hbEpRdWVyeUV2ZW50czpCfSxXPW4oNzgpLCQ9bi5uKFcpO2Z1bmN0aW9uIFYodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOjAsbj0kKCkodC5yZXBsYWNlKC9bXjAtOV0vZ2ksIiIpLDEwKTtyZXR1cm4gbnx8ZX1mdW5jdGlvbiBZKHQpe3ZhciBlPSIiLG49dC5jb250ZW50cygpO2lmKG4ubGVuZ3RoPjApZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKz0xKXt2YXIgbz1uLmdldChyKTszPT09by5ub2RlVHlwZSYmby5kYXRhJiYoZSs9by5kYXRhKX1yZXR1cm4gZX1mdW5jdGlvbiBHKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3JldHVybiB0KGUpLmxlbmd0aD4wJiYiaW1nIj09PXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk%2FdChlKS5hdHRyKCJhbHQiKXx8IiI6dChlKS50ZXh0KCkucmVwbGFjZSgvXG4vLCIiKX1mdW5jdGlvbiBLKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3ZhciBuPSIiO2lmKHQoZSkubGVuZ3RoPjApe3ZhciByPXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk7bj0iaW5wdXQiPT09cj90KGUpLnZhbCgpOiJtZXRhIj09PXI%2FdChlKS5hdHRyKCJjb250ZW50Iil8fCIiOlkodChlKSl9cmV0dXJuIG49bi5yZXBsYWNlKC9bXjAtOV0vZywiIiksJCgpKG4sMTApfXZhciBYPW4oMzYpLEo9bi5uKFgpLFE9bigzNyksWj1uLm4oUSksdHQ9bigzOCksZXQ9bi5uKHR0KSxudD1uKDM5KSxydD1uLm4obnQpLG90PW4oNDApLGl0PW4ubihvdCksYXQ9big0MSksc3Q9bi5uKGF0KSx1dD1uKDYxKSxjdD1uLm4odXQpO2Z1bmN0aW9uIGx0KHQsZSl7dmFyIG47aWYodm9pZCAwPT09cnQuYXx8bnVsbD09ZXQoKSh0KSl7aWYoWigpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGZ0KHQsZSk7dmFyIHI9c3QoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gaXQoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg%2FOjh8MTZ8MzIpKD86Q2xhbXBlZCk%2FQXJyYXkkLy50ZXN0KHIpKXJldHVybiBmdCh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI%2BPXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLGE9ITAscz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249SigpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IGl9fX19ZnVuY3Rpb24gZnQodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBwdCh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNLVeOBjOS4jeato%2BOBp%2BOBmSIpO2lmKDA9PT1jdCgpKHQpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNLVemgheebruaVsOOBjOS4jeato%2BOBp%2BOBmSIpfXZhciBodD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49ZS4kLHI9ZS5uYW1lLG89ZS5wcmljZTt2KCkodGhpcyx0KSx0aGlzLiQ9bix0aGlzLm5hbWVTZWxlY3Rvcj1yfHwiIix0aGlzLnByaWNlU2VsZWN0b3I9b3x8IiJ9cmV0dXJuIG0oKSh0LFt7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuITB9fSx7a2V5OiJleGVjdXRlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGUsbixyPSEwO3RyeXtyZXR1cm4gdD10aGlzLmdldEl0ZW0oKSxlPXRoaXMuZ2V0U2t1Um93cyh0KSxyPXRoaXMuZ2V0UHVyY2hhc2FibGUoe2l0ZW06dCxza3VSb3dzOmV9KSxmdW5jdGlvbih0KXt2YXIgZT10Lml0ZW0sbj10LnNrdVJvd3M7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6DjgYzkuI3mraPjgafjgZkiKTtpZighZS5uYW1lKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og5ZCN5YmN44GM5LiN5q2j44Gn44GZIik7aWYoIShuJiYwIT09bi5sZW5ndGh8fGUucHJpY2UpKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og6YeR6aGN44GM5LiN5q2j44Gn44GZIik7aWYobil7dmFyIHIsbz1sdChuKTt0cnl7Zm9yKG8ucygpOyEocj1vLm4oKSkuZG9uZTspe3B0KHIudmFsdWUpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX19fSh7aXRlbTp0LHNrdVJvd3M6ZX0pLHtpdGVtOnQsc2t1Um93czplLHB1cmNoYXNhYmxlOnJ9fWNhdGNoKHQpe249dH12YXIgbz17cHVyY2hhc2FibGU6cn07cmV0dXJuIHQmJihvLml0ZW09dCksZSYmKG8uc2t1Um93cz1lKSxuJiYoby5lcnJvcj1uKSxvfX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17bmFtZToiIixwcmljZTowfTt0aGlzLm5hbWVTZWxlY3Rvcj90Lm5hbWU9dGhpcy5nZXRJdGVtTmFtZShHKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3RvcikpOnQubmFtZT10aGlzLmdldEl0ZW1OYW1lKCksdGhpcy5wcmljZVNlbGVjdG9yP3QucHJpY2U9dGhpcy5nZXRJdGVtUHJpY2UoSyh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKSk6dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZSgpO3ZhciBlPXRoaXMuZ2V0SXRlbUNvZGUoKTtyZXR1cm4gZSYmKHQuY29kZT1lKSx0fX0se2tleToiZ2V0SXRlbU5hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOiIiO3JldHVybiB0aGlzLm5hbWVTZWxlY3Rvcj9HKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MDtyZXR1cm4gdGhpcy5wcmljZVNlbGVjdG9yP0sodGhpcy4kLHRoaXMucHJpY2VTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIifX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuW119fV0pLHR9KCksZHQ9big0NCksZ3Q9bi5uKGR0KSx2dD1uKDc5KSx5dD1uLm4odnQpLG10PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1lLmRhdGE7digpKHRoaXMsdCksdGhpcy5kYXRhPW59cmV0dXJuIG0oKSh0LG51bGwsW3trZXk6ImNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9MTtyPGUubGVuZ3RoO3IrPTEpe2Zvcih2YXIgbz17fSxpPTA7aTx0Lmxlbmd0aDtpKz0xKW9bdFtpXV09ZVtyXVtpXTtuLnB1c2gobyl9cmV0dXJuIG59fSx7a2V5OiJzcGxpdENvdW50cmllcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ%2FIiI9PT10fHwiLCI9PT10P1tdOnQuc3BsaXQoIiwiKTpbXX19LHtrZXk6Im5vcm1hbGl6ZVJhd0RhdGEiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9MCxvPWN0KCkodCk7cjxvLmxlbmd0aDtyKyspe3ZhciBpLGE9dFtvW3JdXTthLnNoaWZ0KCksbj1wKCkoaT1bXSkuY2FsbChpLHl0KCkobikseXQoKShhKSl9cmV0dXJuIG4udW5zaGlmdChlKSx7ZGF0YTpufX19XSksdH0oKTtmdW5jdGlvbiBidCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IW8uYSlyZXR1cm4hMTtpZihvLmEuc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8oKShEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUEoKSh0KTtpZihlKXt2YXIgaT1BKCkodGhpcykuY29uc3RydWN0b3I7bj1vKCkocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBFKCkodGhpcyxuKX19dmFyIHh0PXtieVVybDp7bmFtZToiYnlVcmwiLGNvbHVtbnM6WyJ1cmwiLCJjb3VudHJpZXMiXX0sYnlJdGVtTmFtZTp7bmFtZToiYnlJdGVtTmFtZSIsY29sdW1uczpbIml0ZW1OYW1lIiwiY291bnRyaWVzIl19LGJ5SXRlbUNvZGU6e25hbWU6ImJ5SXRlbUNvZGUiLGNvbHVtbnM6WyJpdGVtQ29kZSIsImNvdW50cmllcyJdfSxieUNhdGVnb3J5OntuYW1lOiJieUNhdGVnb3J5Iixjb2x1bW5zOlsiY2F0ZWdvcnkiLCJjb3VudHJpZXMiXX0sYnlJdGVtRGVzY3JpcHRpb246e25hbWU6ImJ5SXRlbURlc2NyaXB0aW9uIixjb2x1bW5zOlsidGV4dCIsImNvdW50cmllcyJdfX0sd3Q9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9YnQobik7ZnVuY3Rpb24gbih0KXt2YXIgcjtyZXR1cm4gdigpKHRoaXMsbiksKHI9ZS5jYWxsKHRoaXMsdCkpLmRhdGE9dC5kYXRhLHIuc2hlZXRUeXBlPXQuc2hlZXRUeXBlfHx4dCxyfXJldHVybiBtKCkobixbe2tleToiYnlVcmwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5VXJsKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5VXJsO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6bXQuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbU5hbWU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczptdC5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUl0ZW1Db2RlKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGU7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPW10LmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gZ3QoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtQ29kZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOm10LnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5Q2F0ZWdvcnkiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnkpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlDYXRlZ29yeTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9bXQuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBndCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6bXQuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1tdC5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGd0KCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dGV4dDplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOm10LnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImV4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2V4Y2x1c2lvbjp7YnlVcmw6dGhpcy5ieVVybCgpLGJ5SXRlbU5hbWU6dGhpcy5ieUl0ZW1OYW1lKCksYnlJdGVtQ29kZTp0aGlzLmJ5SXRlbUNvZGUoKSxieUNhdGVnb3J5OnRoaXMuYnlDYXRlZ29yeSgpLGJ5SXRlbURlc2NyaXB0aW9uOnRoaXMuYnlJdGVtRGVzY3JpcHRpb24oKX19fX1dKSxufShtdCksa3Q9big2MiksU3Q9bi5uKGt0KSxFdD1uKDgwKTtmdW5jdGlvbiBUdCh0LGUpe3ZhciBuO2lmKHZvaWQgMD09PXJ0LmF8fG51bGw9PWV0KCkodCkpe2lmKFooKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBBdCh0LGUpO3ZhciByPXN0KCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIGl0KCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig%2FOlVpfEkpbnQoPzo4fDE2fDMyKSg%2FOkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gQXQodCxlKX0odCkpfHxlJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXtuJiYodD1uKTt2YXIgcj0wLG89ZnVuY3Rpb24oKXt9O3JldHVybntzOm8sbjpmdW5jdGlvbigpe3JldHVybiByPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtyKytdfX0sZTpmdW5jdGlvbih0KXt0aHJvdyB0fSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgaSxhPSEwLHM9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPUooKSh0KX0sbjpmdW5jdGlvbigpe3ZhciB0PW4ubmV4dCgpO3JldHVybiBhPXQuZG9uZSx0fSxlOmZ1bmN0aW9uKHQpe3M9ITAsaT10fSxmOmZ1bmN0aW9uKCl7dHJ5e2F8fG51bGw9PW4ucmV0dXJufHxuLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBpfX19fWZ1bmN0aW9uIEF0KHQsZSl7KG51bGw9PWV8fGU%2BdC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gT3QodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1BKCkodCk7aWYoZSl7dmFyIGk9QSgpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gRSgpKHRoaXMsbil9fXZhciBDdD1mdW5jdGlvbih0KXtrKCkobix0KTt2YXIgZT1PdChuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIHYoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBtKCkobixbe2tleToiZXhjbHVkZSIsdmFsdWU6ZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYSxzPSExLHU9dGhpcy5sb2NhdGlvbi5jb3VudHJ5LGM9VHQodCk7dHJ5e2ZvcihjLnMoKTshKG89Yy5uKCkpLmRvbmU7KXt2YXIgbD1vLnZhbHVlO2lmKHIobCkpe3M9bi5tYXRjaENvdW50cnkobCx1KTticmVha319fWNhdGNoKHQpe2MuZSh0KX1maW5hbGx5e2MuZigpfXJldHVybiBzPyhfLmEuZGVidWcocCgpKGk9IkVYQ0xVREVEIEJZIFNQUkVBRFNIRUVUOiAiLmNvbmNhdChlLCIsICIpKS5jYWxsKGksdSkpLHtjb2RlOiJFWENMVURFRF9CWV9CTEFDS0xJU1QiLG1lc3NhZ2U6cCgpKGE9IiIuY29uY2F0KGUsIiwgIikpLmNhbGwoYSx1LCIg44Gr6Kmy5b2T44GX44Gf44Gf44KB6Zmk5aSWIikscGFyYW1zOnt2YWx1ZTplLGNvdW50cnk6dX19KTpFdC5hfX1dLFt7a2V5OiJtYXRjaENvdW50cnkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuISghdC5pc0FsbCYmMCE9PXQuY291bnRyaWVzLmxlbmd0aCl8fFN0KCkobj10LmNvdW50cmllcykuY2FsbChuLGUpfX1dKSxufShFdC5iKTt2YXIganQ9bigxMzIpLEx0PW4ubihqdCksUHQ9big4MSksUnQ9bi5uKFB0KTtmdW5jdGlvbiBOdCh0KXtyZXR1cm4oTnQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I%2FZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU%2FInN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBJdCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9ZnVuY3Rpb24gRHQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP09iamVjdChhcmd1bWVudHNbZV0pOnt9LHI9T2JqZWN0LmtleXMobik7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihyPXIuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkuZW51bWVyYWJsZX0pKSksci5mb3JFYWNoKGZ1bmN0aW9uKGUpe0l0KHQsZSxuW2VdKX0pfXJldHVybiB0fWZ1bmN0aW9uIF90KHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gTXQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIGUmJk10KHQucHJvdG90eXBlLGUpLG4mJk10KHQsbiksdH1mdW5jdGlvbiBCdCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gcXQodCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPT1OdChlKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU%2FQnQodCk6ZX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4oRnQ9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIEh0KHQsZSl7cmV0dXJuKEh0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiB6dCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZIdCh0LGUpfXZhciBXdD17dHlwZToibG9nZ2VyIixsb2c6ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoImxvZyIsdCl9LHdhcm46ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoIndhcm4iLHQpfSxlcnJvcjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgiZXJyb3IiLHQpfSxvdXRwdXQ6ZnVuY3Rpb24odCxlKXtjb25zb2xlJiZjb25zb2xlW3RdJiZjb25zb2xlW3RdLmFwcGx5KGNvbnNvbGUsZSl9fSwkdD1uZXcoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtfdCh0aGlzLHQpLHRoaXMuaW5pdChlLG4pfXJldHVybiBVdCh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5wcmVmaXg9ZS5wcmVmaXh8fCJpMThuZXh0OiIsdGhpcy5sb2dnZXI9dHx8V3QsdGhpcy5vcHRpb25zPWUsdGhpcy5kZWJ1Zz1lLmRlYnVnfX0se2tleToic2V0RGVidWciLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuZGVidWc9dH19LHtrZXk6ImxvZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsImxvZyIsIiIsITApfX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsIndhcm4iLCIiLCEwKX19LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwiZXJyb3IiLCIiKX19LHtrZXk6ImRlcHJlY2F0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5mb3J3YXJkKGUsIndhcm4iLCJXQVJOSU5HIERFUFJFQ0FURUQ6ICIsITApfX0se2tleToiZm9yd2FyZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHImJiF0aGlzLmRlYnVnP251bGw6KCJzdHJpbmciPT10eXBlb2YgdFswXSYmKHRbMF09IiIuY29uY2F0KG4pLmNvbmNhdCh0aGlzLnByZWZpeCwiICIpLmNvbmNhdCh0WzBdKSksdGhpcy5sb2dnZXJbZV0odCkpfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQodGhpcy5sb2dnZXIsRHQoe30se3ByZWZpeDoiIi5jb25jYXQodGhpcy5wcmVmaXgsIjoiKS5jb25jYXQoZSwiOiIpfSx0aGlzLm9wdGlvbnMpKX19XSksdH0oKSksVnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7X3QodGhpcyx0KSx0aGlzLm9ic2VydmVycz17fX1yZXR1cm4gVXQodCxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdC5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7bi5vYnNlcnZlcnNbdF09bi5vYnNlcnZlcnNbdF18fFtdLG4ub2JzZXJ2ZXJzW3RdLnB1c2goZSl9KSx0aGlzfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMub2JzZXJ2ZXJzW3RdJiYoZT90aGlzLm9ic2VydmVyc1t0XT10aGlzLm9ic2VydmVyc1t0XS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1lfSk6ZGVsZXRlIHRoaXMub2JzZXJ2ZXJzW3RdKX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KGU%2BMT9lLTE6MCkscj0xO3I8ZTtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtpZih0aGlzLm9ic2VydmVyc1t0XSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW3RdKTtvLmZvckVhY2goZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsbil9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgaT1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7aS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYXBwbHkoZSxbdF0uY29uY2F0KG4pKX0pfX19XSksdH0oKTtmdW5jdGlvbiBZdCgpe3ZhciB0LGUsbj1uZXcgUHJvbWlzZShmdW5jdGlvbihuLHIpe3Q9bixlPXJ9KTtyZXR1cm4gbi5yZXNvbHZlPXQsbi5yZWplY3Q9ZSxufWZ1bmN0aW9uIEd0KHQpe3JldHVybiBudWxsPT10PyIiOiIiK3R9ZnVuY3Rpb24gS3QodCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuaW5kZXhPZigiIyMjIik%2BLTE%2FdC5yZXBsYWNlKC8jIyMvZywiLiIpOnR9ZnVuY3Rpb24gbygpe3JldHVybiF0fHwic3RyaW5nIj09dHlwZW9mIHR9Zm9yKHZhciBpPSJzdHJpbmciIT10eXBlb2YgZT9bXS5jb25jYXQoZSk6ZS5zcGxpdCgiLiIpO2kubGVuZ3RoPjE7KXtpZihvKCkpcmV0dXJue307dmFyIGE9cihpLnNoaWZ0KCkpOyF0W2FdJiZuJiYodFthXT1uZXcgbiksdD10W2FdfXJldHVybiBvKCk%2Fe306e29iajp0LGs6cihpLnNoaWZ0KCkpfX1mdW5jdGlvbiBYdCh0LGUsbil7dmFyIHI9S3QodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIEp0KHQsZSl7dmFyIG49S3QodCxlKSxyPW4ub2JqLG89bi5rO2lmKHIpcmV0dXJuIHJbb119ZnVuY3Rpb24gUXQodCxlLG4pe3ZhciByPUp0KHQsbik7cmV0dXJuIHZvaWQgMCE9PXI%2FcjpKdChlLG4pfWZ1bmN0aW9uIFp0KHQsZSxuKXtmb3IodmFyIHIgaW4gZSkiX19wcm90b19fIiE9PXImJiJjb25zdHJ1Y3RvciIhPT1yJiYociBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFtyXXx8dFtyXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIGVbcl18fGVbcl1pbnN0YW5jZW9mIFN0cmluZz9uJiYodFtyXT1lW3JdKTpadCh0W3JdLGVbcl0sbik6dFtyXT1lW3JdKTtyZXR1cm4gdH1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgZWU9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBuZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ%2FdC5yZXBsYWNlKC9bJjw%2BIidcL10vZyxmdW5jdGlvbih0KXtyZXR1cm4gZWVbdF19KTp0fXZhciByZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm5hdmlnYXRvciYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKT4tMSxvZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOntuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOiJ0cmFuc2xhdGlvbiJ9O3JldHVybiBfdCh0aGlzLGUpLG49cXQodGhpcyxGdChlKS5jYWxsKHRoaXMpKSxyZSYmVnQuY2FsbChCdChuKSksbi5kYXRhPXR8fHt9LG4ub3B0aW9ucz1yLHZvaWQgMD09PW4ub3B0aW9ucy5rZXlTZXBhcmF0b3ImJihuLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksbn1yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToiYWRkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmdGhpcy5vcHRpb25zLm5zLnB1c2godCl9fSx7a2V5OiJyZW1vdmVOYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGUsMSl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg%2BMyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxvPXZvaWQgMCE9PXIua2V5U2VwYXJhdG9yP3Iua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT1bdCxlXTtyZXR1cm4gbiYmInN0cmluZyIhPXR5cGVvZiBuJiYoaT1pLmNvbmNhdChuKSksbiYmInN0cmluZyI9PXR5cGVvZiBuJiYoaT1pLmNvbmNhdChvP24uc3BsaXQobyk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYoaT10LnNwbGl0KCIuIikpLEp0KHRoaXMuZGF0YSxpKX19LHtrZXk6ImFkZFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06e3NpbGVudDohMX0saT10aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO3ZvaWQgMD09PWkmJihpPSIuIik7dmFyIGE9W3QsZV07biYmKGE9YS5jb25jYXQoaT9uLnNwbGl0KGkpOm4pKSx0LmluZGV4T2YoIi4iKT4tMSYmKHI9ZSxlPShhPXQuc3BsaXQoIi4iKSlbMV0pLHRoaXMuYWRkTmFtZXNwYWNlcyhlKSxYdCh0aGlzLmRhdGEsYSxyKSxvLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4scil9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciBvIGluIG4pInN0cmluZyIhPXR5cGVvZiBuW29dJiYiW29iamVjdCBBcnJheV0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuW29dKXx8dGhpcy5hZGRSZXNvdXJjZSh0LGUsbyxuW29dLHtzaWxlbnQ6ITB9KTtyLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4pfX0se2tleToiYWRkUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0%2FYXJndW1lbnRzWzVdOntzaWxlbnQ6ITF9LGE9W3QsZV07dC5pbmRleE9mKCIuIik%2BLTEmJihyPW4sbj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpO3ZhciBzPUp0KHRoaXMuZGF0YSxhKXx8e307cj9adChzLG4sbyk6cz1EdCh7fSxzLG4pLFh0KHRoaXMuZGF0YSxhLHMpLGkuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHQsZSkmJmRlbGV0ZSB0aGlzLmRhdGFbdF1bZV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGUpLHRoaXMuZW1pdCgicmVtb3ZlZCIsdCxlKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT10aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8KGU9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksInYxIj09PXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJP0R0KHt9LHt9LHRoaXMuZ2V0UmVzb3VyY2UodCxlKSk6dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0RGF0YUJ5TGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdF19fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX19XSksZX0oKSxpZT17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPXRoaXM7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtpLnByb2Nlc3NvcnNbdF0mJihlPWkucHJvY2Vzc29yc1t0XS5wcm9jZXNzKGUsbixyLG8pKX0pLGV9fSxhZT17fSxzZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOnt9O3JldHVybiBfdCh0aGlzLGUpLG49cXQodGhpcyxGdChlKS5jYWxsKHRoaXMpKSxyZSYmVnQuY2FsbChCdChuKSksZnVuY3Rpb24odCxlLG4pe3QuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdJiYoblt0XT1lW3RdKX0pfShbInJlc291cmNlU3RvcmUiLCJsYW5ndWFnZVV0aWxzIiwicGx1cmFsUmVzb2x2ZXIiLCJpbnRlcnBvbGF0b3IiLCJiYWNrZW5kQ29ubmVjdG9yIiwiaTE4bkZvcm1hdCIsInV0aWxzIl0sdCxCdChuKSksbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxuLmxvZ2dlcj0kdC5jcmVhdGUoInRyYW5zbGF0b3IiKSxufXJldHVybiB6dChlLFZ0KSxVdChlLFt7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7dCYmKHRoaXMubGFuZ3VhZ2U9dCl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7aW50ZXJwb2xhdGlvbjp7fX0sbj10aGlzLnJlc29sdmUodCxlKTtyZXR1cm4gbiYmdm9pZCAwIT09bi5yZXN9fSx7a2V5OiJleHRyYWN0RnJvbUtleSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj12b2lkIDAhPT1lLm5zU2VwYXJhdG9yP2UubnNTZXBhcmF0b3I6dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3ZvaWQgMD09PW4mJihuPSI6Iik7dmFyIHI9dm9pZCAwIT09ZS5rZXlTZXBhcmF0b3I%2FZS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixvPWUubnN8fHRoaXMub3B0aW9ucy5kZWZhdWx0TlM7aWYobiYmdC5pbmRleE9mKG4pPi0xKXt2YXIgaT10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2lmKGkmJmkubGVuZ3RoPjApcmV0dXJue2tleTp0LG5hbWVzcGFjZXM6b307dmFyIGE9dC5zcGxpdChuKTsobiE9PXJ8fG49PT1yJiZ0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihhWzBdKT4tMSkmJihvPWEuc2hpZnQoKSksdD1hLmpvaW4ocil9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBvJiYobz1bb10pLHtrZXk6dCxuYW1lc3BhY2VzOm99fX0se2tleToidHJhbnNsYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztpZigib2JqZWN0IiE9PU50KGUpJiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJihlPXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSxlfHwoZT17fSksbnVsbD09dClyZXR1cm4iIjtBcnJheS5pc0FycmF5KHQpfHwodD1bU3RyaW5nKHQpXSk7dmFyIG89dm9pZCAwIT09ZS5rZXlTZXBhcmF0b3I%2FZS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPXRoaXMuZXh0cmFjdEZyb21LZXkodFt0Lmxlbmd0aC0xXSxlKSxhPWkua2V5LHM9aS5uYW1lc3BhY2VzLHU9c1tzLmxlbmd0aC0xXSxjPWUubG5nfHx0aGlzLmxhbmd1YWdlLGw9ZS5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZXx8dGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO2lmKGMmJiJjaW1vZGUiPT09Yy50b0xvd2VyQ2FzZSgpKXtpZihsKXt2YXIgZj1lLm5zU2VwYXJhdG9yfHx0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7cmV0dXJuIHUrZithfXJldHVybiBhfXZhciBwPXRoaXMucmVzb2x2ZSh0LGUpLGg9cCYmcC5yZXMsZD1wJiZwLnVzZWRLZXl8fGEsZz1wJiZwLmV4YWN0VXNlZEtleXx8YSx2PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoaCkseT1bIltvYmplY3QgTnVtYmVyXSIsIltvYmplY3QgRnVuY3Rpb25dIiwiW29iamVjdCBSZWdFeHBdIl0sbT12b2lkIDAhPT1lLmpvaW5BcnJheXM%2FZS5qb2luQXJyYXlzOnRoaXMub3B0aW9ucy5qb2luQXJyYXlzLGI9IXRoaXMuaTE4bkZvcm1hdHx8dGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0LHg9InN0cmluZyIhPXR5cGVvZiBoJiYiYm9vbGVhbiIhPXR5cGVvZiBoJiYibnVtYmVyIiE9dHlwZW9mIGg7aWYoYiYmaCYmeCYmeS5pbmRleE9mKHYpPDAmJigic3RyaW5nIiE9dHlwZW9mIG18fCJbb2JqZWN0IEFycmF5XSIhPT12KSl7aWYoIWUucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKSx0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIoZCxoLGUpOiJrZXkgJyIuY29uY2F0KGEsIiAoIikuY29uY2F0KHRoaXMubGFuZ3VhZ2UsIiknIHJldHVybmVkIGFuIG9iamVjdCBpbnN0ZWFkIG9mIHN0cmluZy4iKTtpZihvKXt2YXIgdz0iW29iamVjdCBBcnJheV0iPT09dixrPXc%2FW106e30sUz13P2c6ZDtmb3IodmFyIEUgaW4gaClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaCxFKSl7dmFyIFQ9IiIuY29uY2F0KFMpLmNvbmNhdChvKS5jb25jYXQoRSk7a1tFXT10aGlzLnRyYW5zbGF0ZShULER0KHt9LGUse2pvaW5BcnJheXM6ITEsbnM6c30pKSxrW0VdPT09VCYmKGtbRV09aFtFXSl9aD1rfX1lbHNlIGlmKGImJiJzdHJpbmciPT10eXBlb2YgbSYmIltvYmplY3QgQXJyYXldIj09PXYpKGg9aC5qb2luKG0pKSYmKGg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLHQsZSxuKSk7ZWxzZXt2YXIgQT0hMSxPPSExO2lmKCF0aGlzLmlzVmFsaWRMb29rdXAoaCkmJnZvaWQgMCE9PWUuZGVmYXVsdFZhbHVlKXtpZihBPSEwLHZvaWQgMCE9PWUuY291bnQpe3ZhciBDPXRoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KGMsZS5jb3VudCk7aD1lWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChDKV19aHx8KGg9ZS5kZWZhdWx0VmFsdWUpfXRoaXMuaXNWYWxpZExvb2t1cChoKXx8KE89ITAsaD1hKTt2YXIgaj1lLmRlZmF1bHRWYWx1ZSYmZS5kZWZhdWx0VmFsdWUhPT1oJiZ0aGlzLm9wdGlvbnMudXBkYXRlTWlzc2luZztpZihPfHxBfHxqKXtpZih0aGlzLmxvZ2dlci5sb2coaj8idXBkYXRlS2V5IjoibWlzc2luZ0tleSIsYyx1LGEsaj9lLmRlZmF1bHRWYWx1ZTpoKSxvKXt2YXIgTD10aGlzLnJlc29sdmUoYSxEdCh7fSxlLHtrZXlTZXBhcmF0b3I6ITF9KSk7TCYmTC5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgUD1bXSxSPXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxlLmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZSJiZSWzBdKWZvcih2YXIgTj0wO048Ui5sZW5ndGg7TisrKVAucHVzaChSW05dKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9QPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZS5sbmd8fHRoaXMubGFuZ3VhZ2UpOlAucHVzaChlLmxuZ3x8dGhpcy5sYW5ndWFnZSk7dmFyIEk9ZnVuY3Rpb24odCxuKXtyLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI%2Fci5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKHQsdSxuLGo%2FZS5kZWZhdWx0VmFsdWU6aCxqLGUpOnIuYmFja2VuZENvbm5lY3RvciYmci5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcodCx1LG4saj9lLmRlZmF1bHRWYWx1ZTpoLGosZSksci5lbWl0KCJtaXNzaW5nS2V5Iix0LHUsbixoKX07aWYodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nKXt2YXIgRD12b2lkIDAhPT1lLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIGUuY291bnQ7dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nUGx1cmFscyYmRD9QLmZvckVhY2goZnVuY3Rpb24odCl7ci5wbHVyYWxSZXNvbHZlci5nZXRQbHVyYWxGb3Jtc09mS2V5KHQsYSkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gSShbdF0sZSl9KX0pOkkoUCxhKX19aD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLHAsbiksTyYmaD09PWEmJnRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXkmJihoPSIiLmNvbmNhdCh1LCI6IikuY29uY2F0KGEpKSxPJiZ0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlciYmKGg9dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoaCkpfXJldHVybiBofX0se2tleToiZXh0ZW5kVHJhbnNsYXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztpZih0aGlzLmkxOG5Gb3JtYXQmJnRoaXMuaTE4bkZvcm1hdC5wYXJzZSl0PXRoaXMuaTE4bkZvcm1hdC5wYXJzZSh0LG4sci51c2VkTG5nLHIudXNlZE5TLHIudXNlZEtleSx7cmVzb2x2ZWQ6cn0pO2Vsc2UgaWYoIW4uc2tpcEludGVycG9sYXRpb24pe24uaW50ZXJwb2xhdGlvbiYmdGhpcy5pbnRlcnBvbGF0b3IuaW5pdChEdCh7fSxuLHtpbnRlcnBvbGF0aW9uOkR0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLG4uaW50ZXJwb2xhdGlvbil9KSk7dmFyIGEscz1uLmludGVycG9sYXRpb24mJm4uaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztpZihzKXt2YXIgdT10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2E9dSYmdS5sZW5ndGh9dmFyIGM9bi5yZXBsYWNlJiYic3RyaW5nIiE9dHlwZW9mIG4ucmVwbGFjZT9uLnJlcGxhY2U6bjtpZih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzJiYoYz1EdCh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzLGMpKSx0PXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHQsYyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSxuKSxzKXt2YXIgbD10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2E8KGwmJmwubGVuZ3RoKSYmKG4ubmVzdD0hMSl9ITEhPT1uLm5lc3QmJih0PXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QodCxmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KHQpLGE9MDthPHQ7YSsrKXJbYV09YXJndW1lbnRzW2FdO3JldHVybiBvJiZvWzBdPT09clswXSYmIW4uY29udGV4dD8oaS5sb2dnZXIud2FybigiSXQgc2VlbXMgeW91IGFyZSBuZXN0aW5nIHJlY3Vyc2l2ZWx5IGtleTogIi5jb25jYXQoclswXSwiIGluIGtleTogIikuY29uY2F0KGVbMF0pKSxudWxsKTppLnRyYW5zbGF0ZS5hcHBseShpLHIuY29uY2F0KFtlXSkpfSxuKSksbi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5yZXNldCgpfXZhciBmPW4ucG9zdFByb2Nlc3N8fHRoaXMub3B0aW9ucy5wb3N0UHJvY2VzcyxwPSJzdHJpbmciPT10eXBlb2YgZj9bZl06ZjtyZXR1cm4gbnVsbCE9dCYmcCYmcC5sZW5ndGgmJiExIT09bi5hcHBseVBvc3RQcm9jZXNzb3ImJih0PWllLmhhbmRsZShwLHQsZSx0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5wb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZD9EdCh7aTE4blJlc29sdmVkOnJ9LG4pOm4sdGhpcykpLHR9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGE9dGhpcyxzPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe3ZhciB1PWEuZXh0cmFjdEZyb21LZXkodCxzKSxjPXUua2V5O249Yzt2YXIgbD11Lm5hbWVzcGFjZXM7YS5vcHRpb25zLmZhbGxiYWNrTlMmJihsPWwuY29uY2F0KGEub3B0aW9ucy5mYWxsYmFja05TKSk7dmFyIGY9dm9pZCAwIT09cy5jb3VudCYmInN0cmluZyIhPXR5cGVvZiBzLmNvdW50LHA9dm9pZCAwIT09cy5jb250ZXh0JiYic3RyaW5nIj09dHlwZW9mIHMuY29udGV4dCYmIiIhPT1zLmNvbnRleHQsaD1zLmxuZ3M%2Fcy5sbmdzOmEubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkocy5sbmd8fGEubGFuZ3VhZ2Uscy5mYWxsYmFja0xuZyk7bC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EuaXNWYWxpZExvb2t1cChlKXx8KGk9dCwhYWVbIiIuY29uY2F0KGhbMF0sIi0iKS5jb25jYXQodCldJiZhLnV0aWxzJiZhLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIWEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGkpJiYoYWVbIiIuY29uY2F0KGhbMF0sIi0iKS5jb25jYXQodCldPSEwLGEubG9nZ2VyLndhcm4oJ2tleSAiJy5jb25jYXQobiwnIiBmb3IgbGFuZ3VhZ2VzICInKS5jb25jYXQoaC5qb2luKCIsICIpLCciIHdvblwndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICInKS5jb25jYXQoaSwnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLGguZm9yRWFjaChmdW5jdGlvbihuKXtpZighYS5pc1ZhbGlkTG9va3VwKGUpKXtvPW47dmFyIGksdSxsPWMsaD1bbF07aWYoYS5pMThuRm9ybWF0JiZhLmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cylhLmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cyhoLGMsbix0LHMpO2Vsc2UgZiYmKGk9YS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgobixzLmNvdW50KSksZiYmcCYmaC5wdXNoKGwraSkscCYmaC5wdXNoKGwrPSIiLmNvbmNhdChhLm9wdGlvbnMuY29udGV4dFNlcGFyYXRvcikuY29uY2F0KHMuY29udGV4dCkpLGYmJmgucHVzaChsKz1pKTtmb3IoO3U9aC5wb3AoKTspYS5pc1ZhbGlkTG9va3VwKGUpfHwocj11LGU9YS5nZXRSZXNvdXJjZShuLHQsdSxzKSl9fSkpfSl9fSkse3JlczplLHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOm8sdXNlZE5TOml9fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISh2b2lkIDA9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybk51bGwmJm51bGw9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiYiIj09PXQpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSh0LGUsbixyKTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UodCxlLG4scil9fV0pLGV9KCk7ZnVuY3Rpb24gdWUodCl7cmV0dXJuIHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX12YXIgY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe190KHRoaXMsdCksdGhpcy5vcHRpb25zPWUsdGhpcy53aGl0ZWxpc3Q9dGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3N8fCExLHRoaXMuc3VwcG9ydGVkTG5ncz10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5sb2dnZXI9JHQuY3JlYXRlKCJsYW5ndWFnZVV0aWxzIil9cmV0dXJuIFV0KHQsW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiAyPT09ZS5sZW5ndGg%2FbnVsbDooZS5wb3AoKSwieCI9PT1lW2UubGVuZ3RoLTFdLnRvTG93ZXJDYXNlKCk%2FbnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlLmpvaW4oIi0iKSkpfX0se2tleToiZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0fHx0LmluZGV4T2YoIi0iKTwwKXJldHVybiB0O3ZhciBlPXQuc3BsaXQoIi0iKTtyZXR1cm4gdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoZVswXSl9fSx7a2V5OiJmb3JtYXRMYW5ndWFnZUNvZGUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmdC5pbmRleE9mKCItIik%2BLTEpe3ZhciBlPVsiaGFucyIsImhhbnQiLCJsYXRuIiwiY3lybCIsImNhbnMiLCJtb25nIiwiYXJhYiJdLG49dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP249bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX0pOjI9PT1uLmxlbmd0aD8oblswXT1uWzBdLnRvTG93ZXJDYXNlKCksblsxXT1uWzFdLnRvVXBwZXJDYXNlKCksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk%2BLTEmJihuWzFdPXVlKG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk%2BLTEmJihuWzFdPXVlKG5bMV0udG9Mb3dlckNhc2UoKSkpLGUuaW5kZXhPZihuWzJdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsyXT11ZShuWzJdLnRvTG93ZXJDYXNlKCkpKSksbi5qb2luKCItIil9cmV0dXJuIHRoaXMub3B0aW9ucy5jbGVhbkNvZGV8fHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc%2FdC50b0xvd2VyQ2FzZSgpOnR9fSx7a2V5OiJpc1doaXRlbGlzdGVkIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJsYW5ndWFnZVV0aWxzLmlzV2hpdGVsaXN0ZWQiLCdmdW5jdGlvbiAiaXNXaGl0ZWxpc3RlZCIgd2lsbCBiZSByZW5hbWVkIHRvICJpc1N1cHBvcnRlZENvZGUiIGluIHRoZSBuZXh0IG1ham9yIC0gcGxlYXNlIG1ha2Ugc3VyZSB0byByZW5hbWUgaXRcJ3MgdXNhZ2UgYXNhcC4nKSx0aGlzLmlzU3VwcG9ydGVkQ29kZSh0KX19LHtrZXk6ImlzU3VwcG9ydGVkQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuKCJsYW5ndWFnZU9ubHkiPT09dGhpcy5vcHRpb25zLmxvYWR8fHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpJiYodD10aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSwhdGhpcy5zdXBwb3J0ZWRMbmdzfHwhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aHx8dGhpcy5zdXBwb3J0ZWRMbmdzLmluZGV4T2YodCk%2BLTF9fSx7a2V5OiJnZXRCZXN0TWF0Y2hGcm9tQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcztyZXR1cm4gdD8odC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmZvcm1hdExhbmd1YWdlQ29kZSh0KTtuLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmIW4uaXNTdXBwb3J0ZWRDb2RlKHIpfHwoZT1yKX19KSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJnQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighZSl7dmFyIHI9bi5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KTtpZihuLmlzU3VwcG9ydGVkQ29kZShyKSlyZXR1cm4gZT1yO2U9bi5vcHRpb25zLnN1cHBvcnRlZExuZ3MuZmluZChmdW5jdGlvbih0KXtpZigwPT09dC5pbmRleE9mKHIpKXJldHVybiB0fSl9fSksZXx8KGU9dGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF0pLGUpOm51bGx9fSx7a2V5OiJnZXRGYWxsYmFja0NvZGVzIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybltdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD10KGUpKSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodCkpcmV0dXJuIHQ7aWYoIWUpcmV0dXJuIHQuZGVmYXVsdHx8W107dmFyIG49dFtlXTtyZXR1cm4gbnx8KG49dFt0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShlKV0pLG58fChuPXRbdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoZSldKSxufHwobj10W3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoZSldKSxufHwobj10LmRlZmF1bHQpLG58fFtdfX0se2tleToidG9SZXNvbHZlSGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldEZhbGxiYWNrQ29kZXMoZXx8dGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nfHxbXSx0KSxvPVtdLGk9ZnVuY3Rpb24odCl7dCYmKG4uaXNTdXBwb3J0ZWRDb2RlKHQpP28ucHVzaCh0KTpuLmxvZ2dlci53YXJuKCJyZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogIi5jb25jYXQodCkpKX07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMT8oImxhbmd1YWdlT25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksImxhbmd1YWdlT25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmImN1cnJlbnRPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKHQpKSwiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KSkpOiJzdHJpbmciPT10eXBlb2YgdCYmaSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksci5mb3JFYWNoKGZ1bmN0aW9uKHQpe28uaW5kZXhPZih0KTwwJiZpKG4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKX0pLG99fV0pLHR9KCksbGU9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0aSIsInRyIiwidXoiLCJ3YSJdLG5yOlsxLDJdLGZjOjF9LHtsbmdzOlsiYWYiLCJhbiIsImFzdCIsImF6IiwiYmciLCJibiIsImNhIiwiZGEiLCJkZSIsImRldiIsImVsIiwiZW4iLCJlbyIsImVzIiwiZXQiLCJldSIsImZpIiwiZm8iLCJmdXIiLCJmeSIsImdsIiwiZ3UiLCJoYSIsImhpIiwiaHUiLCJoeSIsImlhIiwiaXQiLCJrbiIsImt1IiwibGIiLCJtYWkiLCJtbCIsIm1uIiwibXIiLCJuYWgiLCJuYXAiLCJuYiIsIm5lIiwibmwiLCJubiIsIm5vIiwibnNvIiwicGEiLCJwYXAiLCJwbXMiLCJwcyIsInB0LVBUIiwicm0iLCJzY28iLCJzZSIsInNpIiwic28iLCJzb24iLCJzcSIsInN2Iiwic3ciLCJ0YSIsInRlIiwidGsiLCJ1ciIsInlvIl0sbnI6WzEsMl0sZmM6Mn0se2xuZ3M6WyJheSIsImJvIiwiY2dnIiwiZmEiLCJodCIsImlkIiwiamEiLCJqYm8iLCJrYSIsImtrIiwia20iLCJrbyIsImt5IiwibG8iLCJtcyIsInNhaCIsInN1IiwidGgiLCJ0dCIsInVnIiwidmkiLCJ3byIsInpoIl0sbnI6WzFdLGZjOjN9LHtsbmdzOlsiYmUiLCJicyIsImNuciIsImR6IiwiaHIiLCJydSIsInNyIiwidWsiXSxucjpbMSwyLDVdLGZjOjR9LHtsbmdzOlsiYXIiXSxucjpbMCwxLDIsMywxMSwxMDBdLGZjOjV9LHtsbmdzOlsiY3MiLCJzayJdLG5yOlsxLDIsNV0sZmM6Nn0se2xuZ3M6WyJjc2IiLCJwbCJdLG5yOlsxLDIsNV0sZmM6N30se2xuZ3M6WyJjeSJdLG5yOlsxLDIsMyw4XSxmYzo4fSx7bG5nczpbImZyIl0sbnI6WzEsMl0sZmM6OX0se2xuZ3M6WyJnYSJdLG5yOlsxLDIsMyw3LDExXSxmYzoxMH0se2xuZ3M6WyJnZCJdLG5yOlsxLDIsMywyMF0sZmM6MTF9LHtsbmdzOlsiaXMiXSxucjpbMSwyXSxmYzoxMn0se2xuZ3M6WyJqdiJdLG5yOlswLDFdLGZjOjEzfSx7bG5nczpbImt3Il0sbnI6WzEsMiwzLDRdLGZjOjE0fSx7bG5nczpbImx0Il0sbnI6WzEsMiwxMF0sZmM6MTV9LHtsbmdzOlsibHYiXSxucjpbMSwyLDBdLGZjOjE2fSx7bG5nczpbIm1rIl0sbnI6WzEsMl0sZmM6MTd9LHtsbmdzOlsibW5rIl0sbnI6WzAsMSwyXSxmYzoxOH0se2xuZ3M6WyJtdCJdLG5yOlsxLDIsMTEsMjBdLGZjOjE5fSx7bG5nczpbIm9yIl0sbnI6WzIsMV0sZmM6Mn0se2xuZ3M6WyJybyJdLG5yOlsxLDIsMjBdLGZjOjIwfSx7bG5nczpbInNsIl0sbnI6WzUsMSwyLDNdLGZjOjIxfSx7bG5nczpbImhlIiwiaXciXSxucjpbMSwyLDIwLDIxXSxmYzoyMn1dLGZlPXsxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD4xKX0sMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDEhPXQpfSwzOmZ1bmN0aW9uKHQpe3JldHVybiAwfSw0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjI9PXQ%2FMjp0JTEwMD49MyYmdCUxMDA8PTEwPzM6dCUxMDA%2BPTExPzQ6NSl9LDY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dD49MiYmdDw9ND8xOjIpfSw3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOnQlMTA%2BPTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA%2BPTIwKT8xOjIpfSw4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMTo4IT10JiYxMSE9dD8yOjMpfSw5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD49Mil9LDEwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMTp0PDc%2FMjp0PDExPzM6NCl9LDExOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dHx8MTE9PXQ%2FMDoyPT10fHwxMj09dD8xOnQ%2BMiYmdDwyMD8yOjMpfSwxMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAhPTF8fHQlMTAwPT0xMSl9LDEzOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMCE9PXQpfSwxNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ%2FMDoyPT10PzE6Mz09dD8yOjMpfSwxNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA%2BPTImJih0JTEwMDwxMHx8dCUxMDA%2BPTIwKT8xOjIpfSwxNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOjAhPT10PzE6Mil9LDE3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dHx8dCUxMD09MSYmdCUxMDAhPTExPzA6MSl9LDE4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMD09dD8wOjE9PXQ%2FMToyKX0sMTk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6MD09dHx8dCUxMDA%2BMSYmdCUxMDA8MTE%2FMTp0JTEwMD4xMCYmdCUxMDA8MjA%2FMjozKX0sMjA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6MD09dHx8dCUxMDA%2BMCYmdCUxMDA8MjA%2FMToyKX0sMjE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwMD09MT8xOnQlMTAwPT0yPzI6dCUxMDA9PTN8fHQlMTAwPT00PzM6MCl9LDIyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ%2FMToodDwwfHx0PjEwKSYmdCUxMD09MD8yOjMpfX07dmFyIHBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbixyPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtfdCh0aGlzLHQpLHRoaXMubGFuZ3VhZ2VVdGlscz1lLHRoaXMub3B0aW9ucz1yLHRoaXMubG9nZ2VyPSR0LmNyZWF0ZSgicGx1cmFsUmVzb2x2ZXIiKSx0aGlzLnJ1bGVzPShuPXt9LGxlLmZvckVhY2goZnVuY3Rpb24odCl7dC5sbmdzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlXT17bnVtYmVyczp0Lm5yLHBsdXJhbHM6ZmVbdC5mY119fSl9KSxuKX1yZXR1cm4gVXQodCxbe2tleToiYWRkUnVsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLnJ1bGVzW3RdPWV9fSx7a2V5OiJnZXRSdWxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ydWxlc1t0XXx8dGhpcy5ydWxlc1t0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCldfX0se2tleToibmVlZHNQbHVyYWwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gZSYmZS5udW1iZXJzLmxlbmd0aD4xfX0se2tleToiZ2V0UGx1cmFsRm9ybXNPZktleSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9W10sbz10aGlzLmdldFJ1bGUodCk7cmV0dXJuIG8%2FKG8ubnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPW4uZ2V0U3VmZml4KHQsbyk7ci5wdXNoKCIiLmNvbmNhdChlKS5jb25jYXQoaSkpfSkscik6cn19LHtrZXk6ImdldFN1ZmZpeCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5nZXRSdWxlKHQpO2lmKHIpe3ZhciBvPXIubm9BYnM%2Fci5wbHVyYWxzKGUpOnIucGx1cmFscyhNYXRoLmFicyhlKSksaT1yLm51bWJlcnNbb107dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4JiYyPT09ci5udW1iZXJzLmxlbmd0aCYmMT09PXIubnVtYmVyc1swXSYmKDI9PT1pP2k9InBsdXJhbCI6MT09PWkmJihpPSIiKSk7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gbi5vcHRpb25zLnByZXBlbmQmJmkudG9TdHJpbmcoKT9uLm9wdGlvbnMucHJlcGVuZCtpLnRvU3RyaW5nKCk6aS50b1N0cmluZygpfTtyZXR1cm4idjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPzE9PT1pPyIiOiJudW1iZXIiPT10eXBlb2YgaT8iX3BsdXJhbF8iLmNvbmNhdChpLnRvU3RyaW5nKCkpOmEoKToidjIiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OP2EoKTp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdP2EoKTp0aGlzLm9wdGlvbnMucHJlcGVuZCYmby50b1N0cmluZygpP3RoaXMub3B0aW9ucy5wcmVwZW5kK28udG9TdHJpbmcoKTpvLnRvU3RyaW5nKCl9cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIm5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogIi5jb25jYXQodCkpLCIifX1dKSx0fSgpLGhlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtfdCh0aGlzLHQpLHRoaXMubG9nZ2VyPSR0LmNyZWF0ZSgiaW50ZXJwb2xhdG9yIiksdGhpcy5vcHRpb25zPWUsdGhpcy5mb3JtYXQ9ZS5pbnRlcnBvbGF0aW9uJiZlLmludGVycG9sYXRpb24uZm9ybWF0fHxmdW5jdGlvbih0KXtyZXR1cm4gdH0sdGhpcy5pbml0KGUpfXJldHVybiBVdCh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0LmludGVycG9sYXRpb258fCh0LmludGVycG9sYXRpb249e2VzY2FwZVZhbHVlOiEwfSk7dmFyIGU9dC5pbnRlcnBvbGF0aW9uO3RoaXMuZXNjYXBlPXZvaWQgMCE9PWUuZXNjYXBlP2UuZXNjYXBlOm5lLHRoaXMuZXNjYXBlVmFsdWU9dm9pZCAwPT09ZS5lc2NhcGVWYWx1ZXx8ZS5lc2NhcGVWYWx1ZSx0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGU9dm9pZCAwIT09ZS51c2VSYXdWYWx1ZVRvRXNjYXBlJiZlLnVzZVJhd1ZhbHVlVG9Fc2NhcGUsdGhpcy5wcmVmaXg9ZS5wcmVmaXg%2FdGUoZS5wcmVmaXgpOmUucHJlZml4RXNjYXBlZHx8Int7Iix0aGlzLnN1ZmZpeD1lLnN1ZmZpeD90ZShlLnN1ZmZpeCk6ZS5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1lLnVuZXNjYXBlU3VmZml4PyIiOmUudW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg%2FIiI6ZS51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PWUubmVzdGluZ1ByZWZpeD90ZShlLm5lc3RpbmdQcmVmaXgpOmUubmVzdGluZ1ByZWZpeEVzY2FwZWR8fHRlKCIkdCgiKSx0aGlzLm5lc3RpbmdTdWZmaXg9ZS5uZXN0aW5nU3VmZml4P3RlKGUubmVzdGluZ1N1ZmZpeCk6ZS5uZXN0aW5nU3VmZml4RXNjYXBlZHx8dGUoIikiKSx0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yPWUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I%2FZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjplLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yfHwiLCIsdGhpcy5tYXhSZXBsYWNlcz1lLm1heFJlcGxhY2VzP2UubWF4UmVwbGFjZXM6MWUzLHRoaXMuYWx3YXlzRm9ybWF0PXZvaWQgMCE9PWUuYWx3YXlzRm9ybWF0JiZlLmFsd2F5c0Zvcm1hdCx0aGlzLnJlc2V0UmVnRXhwKCl9fSx7a2V5OiJyZXNldCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMmJnRoaXMuaW5pdCh0aGlzLm9wdGlvbnMpfX0se2tleToicmVzZXRSZWdFeHAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9IiIuY29uY2F0KHRoaXMucHJlZml4LCIoLis%2FKSIpLmNvbmNhdCh0aGlzLnN1ZmZpeCk7dGhpcy5yZWdleHA9bmV3IFJlZ0V4cCh0LCJnIik7dmFyIGU9IiIuY29uY2F0KHRoaXMucHJlZml4KS5jb25jYXQodGhpcy51bmVzY2FwZVByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy51bmVzY2FwZVN1ZmZpeCkuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cFVuZXNjYXBlPW5ldyBSZWdFeHAoZSwiZyIpO3ZhciBuPSIiLmNvbmNhdCh0aGlzLm5lc3RpbmdQcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMubmVzdGluZ1N1ZmZpeCk7dGhpcy5uZXN0aW5nUmVnZXhwPW5ldyBSZWdFeHAobiwiZyIpfX0se2tleToiaW50ZXJwb2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzPXRoaXMsdT10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uJiZ0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzfHx7fTtmdW5jdGlvbiBjKHQpe3JldHVybiB0LnJlcGxhY2UoL1wkL2csIiQkJCQiKX12YXIgbD1mdW5jdGlvbih0KXtpZih0LmluZGV4T2Yocy5mb3JtYXRTZXBhcmF0b3IpPDApe3ZhciBvPVF0KGUsdSx0KTtyZXR1cm4gcy5hbHdheXNGb3JtYXQ%2Fcy5mb3JtYXQobyx2b2lkIDAsbik6b312YXIgaT10LnNwbGl0KHMuZm9ybWF0U2VwYXJhdG9yKSxhPWkuc2hpZnQoKS50cmltKCksYz1pLmpvaW4ocy5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtyZXR1cm4gcy5mb3JtYXQoUXQoZSx1LGEpLGMsbixyKX07dGhpcy5yZXNldFJlZ0V4cCgpO3ZhciBmPXImJnIubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyfHx0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyLHA9ciYmci5pbnRlcnBvbGF0aW9uJiZyLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzfHx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM7cmV0dXJuW3tyZWdleDp0aGlzLnJlZ2V4cFVuZXNjYXBlLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gYyh0KX19LHtyZWdleDp0aGlzLnJlZ2V4cCxzYWZlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHMuZXNjYXBlVmFsdWU%2FYyhzLmVzY2FwZSh0KSk6Yyh0KX19XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihhPTA7bz1lLnJlZ2V4LmV4ZWModCk7KXtpZih2b2lkIDA9PT0oaT1sKG9bMV0udHJpbSgpKSkpaWYoImZ1bmN0aW9uIj09dHlwZW9mIGYpe3ZhciBuPWYodCxvLHIpO2k9InN0cmluZyI9PXR5cGVvZiBuP246IiJ9ZWxzZXtpZihwKXtpPW9bMF07Y29udGludWV9cy5sb2dnZXIud2FybigibWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgIi5jb25jYXQob1sxXSwiIGZvciBpbnRlcnBvbGF0aW5nICIpLmNvbmNhdCh0KSksaT0iIn1lbHNlInN0cmluZyI9PXR5cGVvZiBpfHxzLnVzZVJhd1ZhbHVlVG9Fc2NhcGV8fChpPUd0KGkpKTtpZih0PXQucmVwbGFjZShvWzBdLGUuc2FmZVZhbHVlKGkpKSxlLnJlZ2V4Lmxhc3RJbmRleD0wLCsrYT49cy5tYXhSZXBsYWNlcylicmVha319KSx0fX0se2tleToibmVzdCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG89dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg%2BMiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxhPUR0KHt9LGkpO2Z1bmN0aW9uIHModCxlKXt2YXIgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHQuaW5kZXhPZihuKTwwKXJldHVybiB0O3ZhciByPXQuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQobiwiWyBdKnsiKSkpLG89InsiLmNvbmNhdChyWzFdKTt0PXJbMF0sbz0obz10aGlzLmludGVycG9sYXRlKG8sYSkpLnJlcGxhY2UoLycvZywnIicpO3RyeXthPUpTT04ucGFyc2UobyksZSYmKGE9RHQoe30sZSxhKSl9Y2F0Y2goZSl7cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImZhaWxlZCBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nIGluIG5lc3RpbmcgZm9yIGtleSAiLmNvbmNhdCh0KSxlKSwiIi5jb25jYXQodCkuY29uY2F0KG4pLmNvbmNhdChvKX1yZXR1cm4gZGVsZXRlIGEuZGVmYXVsdFZhbHVlLHR9Zm9yKGEuYXBwbHlQb3N0UHJvY2Vzc29yPSExLGRlbGV0ZSBhLmRlZmF1bHRWYWx1ZTtuPXRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKHQpOyl7dmFyIHU9W10sYz0hMTtpZihuWzBdLmluY2x1ZGVzKHRoaXMuZm9ybWF0U2VwYXJhdG9yKSYmIS97Lip9Ly50ZXN0KG5bMV0pKXt2YXIgbD1uWzFdLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSk7blsxXT1sLnNoaWZ0KCksdT1sLGM9ITB9aWYoKHI9ZShzLmNhbGwodGhpcyxuWzFdLnRyaW0oKSxhKSxhKSkmJm5bMF09PT10JiYic3RyaW5nIiE9dHlwZW9mIHIpcmV0dXJuIHI7InN0cmluZyIhPXR5cGVvZiByJiYocj1HdChyKSkscnx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG5bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHI9IiIpLGMmJihyPXUucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uZm9ybWF0KHQsZSxpLmxuZyxpKX0sci50cmltKCkpKSx0PXQucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiB0fX1dKSx0fSgpO3ZhciBkZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsbixyKXt2YXIgbyxpPWFyZ3VtZW50cy5sZW5ndGg%2BMyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gX3QodGhpcyxlKSxvPXF0KHRoaXMsRnQoZSkuY2FsbCh0aGlzKSkscmUmJlZ0LmNhbGwoQnQobykpLG8uYmFja2VuZD10LG8uc3RvcmU9bixvLnNlcnZpY2VzPXIsby5sYW5ndWFnZVV0aWxzPXIubGFuZ3VhZ2VVdGlscyxvLm9wdGlvbnM9aSxvLmxvZ2dlcj0kdC5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSxvLnN0YXRlPXt9LG8ucXVldWU9W10sby5iYWNrZW5kJiZvLmJhY2tlbmQuaW5pdCYmby5iYWNrZW5kLmluaXQocixpLmJhY2tlbmQsaSksb31yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToicXVldWVMb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgbz10aGlzLGk9W10sYT1bXSxzPVtdLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj0hMDtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHM9IiIuY29uY2F0KHQsInwiKS5jb25jYXQoZSk7IW4ucmVsb2FkJiZvLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHQsZSk%2Fby5zdGF0ZVtzXT0yOm8uc3RhdGVbc108MHx8KDE9PT1vLnN0YXRlW3NdP2EuaW5kZXhPZihzKTwwJiZhLnB1c2gocyk6KG8uc3RhdGVbc109MSxyPSExLGEuaW5kZXhPZihzKTwwJiZhLnB1c2gocyksaS5pbmRleE9mKHMpPDAmJmkucHVzaChzKSx1LmluZGV4T2YoZSk8MCYmdS5wdXNoKGUpKSl9KSxyfHxzLnB1c2godCl9KSwoaS5sZW5ndGh8fGEubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOmEsbG9hZGVkOnt9LGVycm9yczpbXSxjYWxsYmFjazpyfSkse3RvTG9hZDppLHBlbmRpbmc6YSx0b0xvYWRMYW5ndWFnZXM6cyx0b0xvYWROYW1lc3BhY2VzOnV9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5zcGxpdCgifCIpLG89clswXSxpPXJbMV07ZSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixvLGksZSksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShvLGksbiksdGhpcy5zdGF0ZVt0XT1lPy0xOjI7dmFyIGE9e307dGhpcy5xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKG4peyFmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1LdCh0LGUsT2JqZWN0KSxpPW8ub2JqLGE9by5rO2lbYV09aVthXXx8W10sciYmKGlbYV09aVthXS5jb25jYXQobikpLHJ8fGlbYV0ucHVzaChuKX0obi5sb2FkZWQsW29dLGkpLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuaW5kZXhPZihlKTstMSE9PW47KXQuc3BsaWNlKG4sMSksbj10LmluZGV4T2YoZSl9KG4ucGVuZGluZyx0KSxlJiZuLmVycm9ycy5wdXNoKGUpLDAhPT1uLnBlbmRpbmcubGVuZ3RofHxuLmRvbmV8fChPYmplY3Qua2V5cyhuLmxvYWRlZCkuZm9yRWFjaChmdW5jdGlvbih0KXthW3RdfHwoYVt0XT1bXSksbi5sb2FkZWRbdF0ubGVuZ3RoJiZuLmxvYWRlZFt0XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2FbdF0uaW5kZXhPZihlKTwwJiZhW3RdLnB1c2goZSl9KX0pLG4uZG9uZT0hMCxuLmVycm9ycy5sZW5ndGg%2Fbi5jYWxsYmFjayhuLmVycm9ycyk6bi5jYWxsYmFjaygpKX0pLHRoaXMuZW1pdCgibG9hZGVkIixhKSx0aGlzLnF1ZXVlPXRoaXMucXVldWUuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRvbmV9KX19LHtrZXk6InJlYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10%2FYXJndW1lbnRzWzNdOjAsaT1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MzUwLGE9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7cmV0dXJuIHQubGVuZ3RoP3RoaXMuYmFja2VuZFtuXSh0LGUsZnVuY3Rpb24ocyx1KXtzJiZ1JiZvPDU%2Fc2V0VGltZW91dChmdW5jdGlvbigpe3IucmVhZC5jYWxsKHIsdCxlLG4sbysxLDIqaSxhKX0saSk6YShzLHUpfSk6YShudWxsLHt9KX19LHtrZXk6InByZXBhcmVMb2FkaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30sbz1hcmd1bWVudHMubGVuZ3RoPjM%2FYXJndW1lbnRzWzNdOnZvaWQgMDtpZighdGhpcy5iYWNrZW5kKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLiIpLG8mJm8oKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkpLCJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKTt2YXIgaT10aGlzLnF1ZXVlTG9hZCh0LGUscixvKTtpZighaS50b0xvYWQubGVuZ3RoKXJldHVybiBpLnBlbmRpbmcubGVuZ3RofHxvKCksbnVsbDtpLnRvTG9hZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ubG9hZE9uZSh0KX0pfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMucHJlcGFyZUxvYWRpbmcodCxlLHt9LG4pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse3JlbG9hZDohMH0sbil9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOiIiLHI9dC5zcGxpdCgifCIpLG89clswXSxpPXJbMV07dGhpcy5yZWFkKG8saSwicmVhZCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihyLGEpe3ImJmUubG9nZ2VyLndhcm4oIiIuY29uY2F0KG4sImxvYWRpbmcgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvLCIgZmFpbGVkIiksciksIXImJmEmJmUubG9nZ2VyLmxvZygiIi5jb25jYXQobiwibG9hZGVkIG5hbWVzcGFjZSAiKS5jb25jYXQoaSwiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQobyksYSksZS5sb2FkZWQodCxyLGEpfSl9fSx7a2V5OiJzYXZlTWlzc2luZyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e307dGhpcy5zZXJ2aWNlcy51dGlscyYmdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShlKT90aGlzLmxvZ2dlci53YXJuKCdkaWQgbm90IHNhdmUga2V5ICInLmNvbmNhdChuLCciIGFzIHRoZSBuYW1lc3BhY2UgIicpLmNvbmNhdChlLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKTpudWxsIT1uJiYiIiE9PW4mJih0aGlzLmJhY2tlbmQmJnRoaXMuYmFja2VuZC5jcmVhdGUmJnRoaXMuYmFja2VuZC5jcmVhdGUodCxlLG4scixudWxsLER0KHt9LGkse2lzVXBkYXRlOm99KSksdCYmdFswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZSh0WzBdLGUsbixyKSl9fV0pLGV9KCk7ZnVuY3Rpb24gZ2UoKXtyZXR1cm57ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsd2hpdGVsaXN0OiExLG5vbkV4cGxpY2l0V2hpdGVsaXN0OiExLHN1cHBvcnRlZExuZ3M6ITEsbm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzOiExLGxvYWQ6ImFsbCIscHJlbG9hZDohMSxzaW1wbGlmeVBsdXJhbFN1ZmZpeDohMCxrZXlTZXBhcmF0b3I6Ii4iLG5zU2VwYXJhdG9yOiI6IixwbHVyYWxTZXBhcmF0b3I6Il8iLGNvbnRleHRTZXBhcmF0b3I6Il8iLHBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzOiExLHNhdmVNaXNzaW5nOiExLHVwZGF0ZU1pc3Npbmc6ITEsc2F2ZU1pc3NpbmdUbzoiZmFsbGJhY2siLHNhdmVNaXNzaW5nUGx1cmFsczohMCxtaXNzaW5nS2V5SGFuZGxlcjohMSxtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXI6ITEscG9zdFByb2Nlc3M6ITEscG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ6ITEscmV0dXJuTnVsbDohMCxyZXR1cm5FbXB0eVN0cmluZzohMCxyZXR1cm5PYmplY3RzOiExLGpvaW5BcnJheXM6ITEscmV0dXJuZWRPYmplY3RIYW5kbGVyOiExLHBhcnNlTWlzc2luZ0tleUhhbmRsZXI6ITEsYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5OiExLGFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlOiExLG92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXt9O2lmKCJvYmplY3QiPT09TnQodFsxXSkmJihlPXRbMV0pLCJzdHJpbmciPT10eXBlb2YgdFsxXSYmKGUuZGVmYXVsdFZhbHVlPXRbMV0pLCJzdHJpbmciPT10eXBlb2YgdFsyXSYmKGUudERlc2NyaXB0aW9uPXRbMl0pLCJvYmplY3QiPT09TnQodFsyXSl8fCJvYmplY3QiPT09TnQodFszXSkpe3ZhciBuPXRbM118fHRbMl07T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPW5bdF19KX1yZXR1cm4gZX0saW50ZXJwb2xhdGlvbjp7ZXNjYXBlVmFsdWU6ITAsZm9ybWF0OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0fSxwcmVmaXg6Int7IixzdWZmaXg6In19Iixmb3JtYXRTZXBhcmF0b3I6IiwiLHVuZXNjYXBlUHJlZml4OiItIixuZXN0aW5nUHJlZml4OiIkdCgiLG5lc3RpbmdTdWZmaXg6IikiLG5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOiIsIixtYXhSZXBsYWNlczoxZTMsc2tpcE9uVmFyaWFibGVzOiExfX19ZnVuY3Rpb24gdmUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0Lm5zJiYodC5ucz1bdC5uc10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja0xuZyYmKHQuZmFsbGJhY2tMbmc9W3QuZmFsbGJhY2tMbmddKSwic3RyaW5nIj09dHlwZW9mIHQuZmFsbGJhY2tOUyYmKHQuZmFsbGJhY2tOUz1bdC5mYWxsYmFja05TXSksdC53aGl0ZWxpc3QmJih0LndoaXRlbGlzdCYmdC53aGl0ZWxpc3QuaW5kZXhPZigiY2ltb2RlIik8MCYmKHQud2hpdGVsaXN0PXQud2hpdGVsaXN0LmNvbmNhdChbImNpbW9kZSJdKSksdC5zdXBwb3J0ZWRMbmdzPXQud2hpdGVsaXN0KSx0Lm5vbkV4cGxpY2l0V2hpdGVsaXN0JiYodC5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M9dC5ub25FeHBsaWNpdFdoaXRlbGlzdCksdC5zdXBwb3J0ZWRMbmdzJiZ0LnN1cHBvcnRlZExuZ3MuaW5kZXhPZigiY2ltb2RlIik8MCYmKHQuc3VwcG9ydGVkTG5ncz10LnN1cHBvcnRlZExuZ3MuY29uY2F0KFsiY2ltb2RlIl0pKSx0fWZ1bmN0aW9uIHllKCl7fXZhciBtZT1uZXcoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciB0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoX3QodGhpcyxlKSx0PXF0KHRoaXMsRnQoZSkuY2FsbCh0aGlzKSkscmUmJlZ0LmNhbGwoQnQodCkpLHQub3B0aW9ucz12ZShuKSx0LnNlcnZpY2VzPXt9LHQubG9nZ2VyPSR0LHQubW9kdWxlcz17ZXh0ZXJuYWw6W119LHImJiF0LmlzSW5pdGlhbGl6ZWQmJiFuLmlzQ2xvbmUpe2lmKCF0Lm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gdC5pbml0KG4scikscXQodCxCdCh0KSk7c2V0VGltZW91dChmdW5jdGlvbigpe3QuaW5pdChuLHIpfSwwKX1yZXR1cm4gdH1yZXR1cm4genQoZSxWdCksVXQoZSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0%2FYXJndW1lbnRzWzBdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdD9uZXcgdDp0Om51bGx9aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUmJihuPWUsZT17fSksZS53aGl0ZWxpc3QmJiFlLnN1cHBvcnRlZExuZ3MmJnRoaXMubG9nZ2VyLmRlcHJlY2F0ZSgid2hpdGVsaXN0Iiwnb3B0aW9uICJ3aGl0ZWxpc3QiIHdpbGwgYmUgcmVuYW1lZCB0byAic3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLGUubm9uRXhwbGljaXRXaGl0ZWxpc3QmJiFlLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb25zICJub25FeHBsaWNpdFdoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MiIGluIHRoZSBuZXh0IG1ham9yIC0gcGxlYXNlIG1ha2Ugc3VyZSB0byByZW5hbWUgdGhpcyBvcHRpb24gYXNhcC4nKSx0aGlzLm9wdGlvbnM9RHQoe30sZ2UoKSx0aGlzLm9wdGlvbnMsdmUoZSkpLHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxufHwobj15ZSksIXRoaXMub3B0aW9ucy5pc0Nsb25lKXt0aGlzLm1vZHVsZXMubG9nZ2VyPyR0LmluaXQocih0aGlzLm1vZHVsZXMubG9nZ2VyKSx0aGlzLm9wdGlvbnMpOiR0LmluaXQobnVsbCx0aGlzLm9wdGlvbnMpO3ZhciBvPW5ldyBjZSh0aGlzLm9wdGlvbnMpO3RoaXMuc3RvcmU9bmV3IG9lKHRoaXMub3B0aW9ucy5yZXNvdXJjZXMsdGhpcy5vcHRpb25zKTt2YXIgaT10aGlzLnNlcnZpY2VzO2kubG9nZ2VyPSR0LGkucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLGkubGFuZ3VhZ2VVdGlscz1vLGkucGx1cmFsUmVzb2x2ZXI9bmV3IHBlKG8se3ByZXBlbmQ6dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcixjb21wYXRpYmlsaXR5SlNPTjp0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04sc2ltcGxpZnlQbHVyYWxTdWZmaXg6dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4fSksaS5pbnRlcnBvbGF0b3I9bmV3IGhlKHRoaXMub3B0aW9ucyksaS51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LGkuYmFja2VuZENvbm5lY3Rvcj1uZXcgZGUocih0aGlzLm1vZHVsZXMuYmFja2VuZCksaS5yZXNvdXJjZVN0b3JlLGksdGhpcy5vcHRpb25zKSxpLmJhY2tlbmRDb25uZWN0b3Iub24oIioiLGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4%2BMT9uLTE6MCksbz0xO288bjtvKyspcltvLTFdPWFyZ3VtZW50c1tvXTt0LmVtaXQuYXBwbHkodCxbZV0uY29uY2F0KHIpKX0pLHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yJiYoaS5sYW5ndWFnZURldGVjdG9yPXIodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpLGkubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KGksdGhpcy5vcHRpb25zLmRldGVjdGlvbix0aGlzLm9wdGlvbnMpKSx0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCYmKGkuaTE4bkZvcm1hdD1yKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSxpLmkxOG5Gb3JtYXQuaW5pdCYmaS5pMThuRm9ybWF0LmluaXQodGhpcykpLHRoaXMudHJhbnNsYXRvcj1uZXcgc2UodGhpcy5zZXJ2aWNlcyx0aGlzLm9wdGlvbnMpLHRoaXMudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pbml0JiZlLmluaXQodCl9KX10aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3J8fHRoaXMub3B0aW9ucy5sbmd8fHRoaXMubG9nZ2VyLndhcm4oImluaXQ6IG5vIGxhbmd1YWdlRGV0ZWN0b3IgaXMgdXNlZCBhbmQgbm8gbG5nIGlzIGRlZmluZWQiKTt2YXIgYT1bImdldFJlc291cmNlIiwiaGFzUmVzb3VyY2VCdW5kbGUiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsImdldERhdGFCeUxhbmd1YWdlIl07YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4obj10LnN0b3JlKVtlXS5hcHBseShuLGFyZ3VtZW50cyl9fSk7dmFyIHM9WyJhZGRSZXNvdXJjZSIsImFkZFJlc291cmNlcyIsImFkZFJlc291cmNlQnVuZGxlIiwicmVtb3ZlUmVzb3VyY2VCdW5kbGUiXTtzLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKSx0fX0pO3ZhciB1PVl0KCksYz1mdW5jdGlvbigpe3QuY2hhbmdlTGFuZ3VhZ2UodC5vcHRpb25zLmxuZyxmdW5jdGlvbihlLHIpe3QuaXNJbml0aWFsaXplZD0hMCx0Lm9wdGlvbnMuaXNDbG9uZXx8dC5sb2dnZXIubG9nKCJpbml0aWFsaXplZCIsdC5vcHRpb25zKSx0LmVtaXQoImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHUucmVzb2x2ZShyKSxuKGUscil9KX07cmV0dXJuIHRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fCF0aGlzLm9wdGlvbnMuaW5pdEltbWVkaWF0ZT9jKCk6c2V0VGltZW91dChjLDApLHV9fSx7a2V5OiJsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0%2FYXJndW1lbnRzWzFdOnllLHI9bixvPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMubGFuZ3VhZ2U7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihyPXQpLCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHx0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpe2lmKG8mJiJjaW1vZGUiPT09by50b0xvd2VyQ2FzZSgpKXJldHVybiByKCk7dmFyIGk9W10sYT1mdW5jdGlvbih0KXt0JiZlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2goZnVuY3Rpb24odCl7aS5pbmRleE9mKHQpPDAmJmkucHVzaCh0KX0pfTtpZihvKWEobyk7ZWxzZXt2YXIgcz10aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpO3MuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gYSh0KX0pfXRoaXMub3B0aW9ucy5wcmVsb2FkJiZ0aGlzLm9wdGlvbnMucHJlbG9hZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmxvYWQoaSx0aGlzLm9wdGlvbnMubnMscil9ZWxzZSByKG51bGwpfX0se2tleToicmVsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9WXQoKTtyZXR1cm4gdHx8KHQ9dGhpcy5sYW5ndWFnZXMpLGV8fChlPXRoaXMub3B0aW9ucy5ucyksbnx8KG49eWUpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5yZWxvYWQodCxlLGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLG4odCl9KSxyfX0se2tleToidXNlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhbiB1bmRlZmluZWQgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO2lmKCF0LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYSB3cm9uZyBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7cmV0dXJuImJhY2tlbmQiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmJhY2tlbmQ9dCksKCJsb2dnZXIiPT09dC50eXBlfHx0LmxvZyYmdC53YXJuJiZ0LmVycm9yKSYmKHRoaXMubW9kdWxlcy5sb2dnZXI9dCksImxhbmd1YWdlRGV0ZWN0b3IiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3I9dCksImkxOG5Gb3JtYXQiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQ9dCksInBvc3RQcm9jZXNzb3IiPT09dC50eXBlJiZpZS5hZGRQb3N0UHJvY2Vzc29yKHQpLCIzcmRQYXJ0eSI9PT10LnR5cGUmJnRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKHQpLHRoaXN9fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89dDt2YXIgcj1ZdCgpO3RoaXMuZW1pdCgibGFuZ3VhZ2VDaGFuZ2luZyIsdCk7dmFyIG89ZnVuY3Rpb24odCl7dmFyIG89InN0cmluZyI9PXR5cGVvZiB0P3Q6bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEJlc3RNYXRjaEZyb21Db2Rlcyh0KTtvJiYobi5sYW5ndWFnZXx8KG4ubGFuZ3VhZ2U9byxuLmxhbmd1YWdlcz1uLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KG8pKSxuLnRyYW5zbGF0b3IubGFuZ3VhZ2V8fG4udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShvKSxuLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJm4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5jYWNoZVVzZXJMYW5ndWFnZShvKSksbi5sb2FkUmVzb3VyY2VzKG8sZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsbyl7bz8obi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobyksbi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLG4uZW1pdCgibGFuZ3VhZ2VDaGFuZ2VkIixvKSxuLmxvZ2dlci5sb2coImxhbmd1YWdlQ2hhbmdlZCIsbykpOm4uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLHIucmVzb2x2ZShmdW5jdGlvbigpe3JldHVybiBuLnQuYXBwbHkobixhcmd1bWVudHMpfSksZSYmZSh0LGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KX0odCxvKX0pfTtyZXR1cm4gdHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyF0JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz90aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KG8pOm8odCk6byh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpLHJ9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWZ1bmN0aW9uIHQoZSxyKXt2YXIgbztpZigib2JqZWN0IiE9PU50KHIpKXtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShpPjI%2FaS0yOjApLHM9MjtzPGk7cysrKWFbcy0yXT1hcmd1bWVudHNbc107bz1uLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoW2Uscl0uY29uY2F0KGEpKX1lbHNlIG89RHQoe30scik7cmV0dXJuIG8ubG5nPW8ubG5nfHx0LmxuZyxvLmxuZ3M9by5sbmdzfHx0LmxuZ3Msby5ucz1vLm5zfHx0Lm5zLG4udChlLG8pfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ%2Fci5sbmc9dDpyLmxuZ3M9dCxyLm5zPWUscn19LHtrZXk6InQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS50cmFuc2xhdGUuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJih0PXRoaXMudHJhbnNsYXRvcikuZXhpc3RzLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6InNldERlZmF1bHROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5kZWZhdWx0TlM9dH19LHtrZXk6Imhhc0xvYWRlZE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighdGhpcy5pc0luaXRpYWxpemVkKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG5leHQgd2FzIG5vdCBpbml0aWFsaXplZCIsdGhpcy5sYW5ndWFnZXMpLCExO2lmKCF0aGlzLmxhbmd1YWdlc3x8IXRoaXMubGFuZ3VhZ2VzLmxlbmd0aClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuLmxhbmd1YWdlcyB3ZXJlIHVuZGVmaW5lZCBvciBlbXB0eSIsdGhpcy5sYW5ndWFnZXMpLCExO3ZhciByPXRoaXMubGFuZ3VhZ2VzWzBdLG89ISF0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxpPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZigiY2ltb2RlIj09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDt2YXIgYT1mdW5jdGlvbih0LG4pe3ZhciByPWUuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQodCwifCIpLmNvbmNhdChuKV07cmV0dXJuLTE9PT1yfHwyPT09cn07aWYobi5wcmVjaGVjayl7dmFyIHM9bi5wcmVjaGVjayh0aGlzLGEpO2lmKHZvaWQgMCE9PXMpcmV0dXJuIHN9cmV0dXJuISF0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHIsdCl8fCghdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmR8fCEoIWEocix0KXx8byYmIWEoaSx0KSkpfX0se2tleToibG9hZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPVl0KCk7cmV0dXJuIHRoaXMub3B0aW9ucy5ucz8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZuLm9wdGlvbnMubnMucHVzaCh0KX0pLHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbih0KXtyLnJlc29sdmUoKSxlJiZlKHQpfSkscik6KGUmJmUoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJsb2FkTGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPVl0KCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pO3ZhciByPXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxvPXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiByLmluZGV4T2YodCk8MH0pO3JldHVybiBvLmxlbmd0aD8odGhpcy5vcHRpb25zLnByZWxvYWQ9ci5jb25jYXQobyksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe24ucmVzb2x2ZSgpLGUmJmUodCl9KSxuKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImRpciIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodHx8KHQ9dGhpcy5sYW5ndWFnZXMmJnRoaXMubGFuZ3VhZ2VzLmxlbmd0aD4wP3RoaXMubGFuZ3VhZ2VzWzBdOnRoaXMubGFuZ3VhZ2UpLCF0KXJldHVybiJydGwiO3JldHVyblsiYXIiLCJzaHUiLCJzcXIiLCJzc2giLCJ4YWEiLCJ5aGQiLCJ5dWQiLCJhYW8iLCJhYmgiLCJhYnYiLCJhY20iLCJhY3EiLCJhY3ciLCJhY3giLCJhY3kiLCJhZGYiLCJhZHMiLCJhZWIiLCJhZWMiLCJhZmIiLCJhanAiLCJhcGMiLCJhcGQiLCJhcmIiLCJhcnEiLCJhcnMiLCJhcnkiLCJhcnoiLCJhdXoiLCJhdmwiLCJheWgiLCJheWwiLCJheW4iLCJheXAiLCJiYnoiLCJwZ2EiLCJoZSIsIml3IiwicHMiLCJwYnQiLCJwYnUiLCJwc3QiLCJwcnAiLCJwcmQiLCJ1ZyIsInVyIiwieWRkIiwieWRzIiwieWloIiwiamkiLCJ5aSIsImhibyIsIm1lbiIsInhtbiIsImZhIiwianByIiwicGVvIiwicGVzIiwicHJzIiwiZHYiLCJzYW0iXS5pbmRleE9mKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KSk%2BPTA%2FInJ0bCI6Imx0ciJ9fSx7a2V5OiJjcmVhdGVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE%2FYXJndW1lbnRzWzFdOnZvaWQgMDtyZXR1cm4gbmV3IGUodCxuKX19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg%2BMCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg%2BMSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp5ZSxvPUR0KHt9LHRoaXMub3B0aW9ucyxuLHtpc0Nsb25lOiEwfSksaT1uZXcgZShvKSxhPVsic3RvcmUiLCJzZXJ2aWNlcyIsImxhbmd1YWdlIl07cmV0dXJuIGEuZm9yRWFjaChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSxpLnNlcnZpY2VzPUR0KHt9LHRoaXMuc2VydmljZXMpLGkuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTppLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKGkpfSxpLnRyYW5zbGF0b3I9bmV3IHNlKGkuc2VydmljZXMsaS5vcHRpb25zKSxpLnRyYW5zbGF0b3Iub24oIioiLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KGU%2BMT9lLTE6MCkscj0xO3I8ZTtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtpLmVtaXQuYXBwbHkoaSxbdF0uY29uY2F0KG4pKX0pLGkuaW5pdChvLHIpLGkudHJhbnNsYXRvci5vcHRpb25zPWkub3B0aW9ucyxpLnRyYW5zbGF0b3IuYmFja2VuZENvbm5lY3Rvci5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGl9fV0pLGV9KCkpLGJlPW4oMTMzKSx4ZT1uLm4oYmUpO2Z1bmN0aW9uIHdlKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBrZSh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0%2FYXJndW1lbnRzW2VdOnt9LHI9T2JqZWN0LmtleXMobik7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihyPXIuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkuZW51bWVyYWJsZX0pKSksci5mb3JFYWNoKGZ1bmN0aW9uKGUpe3dlKHQsZSxuW2VdKX0pfXJldHVybiB0fWZ1bmN0aW9uIFNlKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gRWUodCxlLG4pe3ZhciByO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMsaT1hcmd1bWVudHMsYT1mdW5jdGlvbigpe3I9bnVsbCxufHx0LmFwcGx5KG8saSl9LHM9biYmIXI7Y2xlYXJUaW1lb3V0KHIpLHI9c2V0VGltZW91dChhLGUpLHMmJnQuYXBwbHkobyxpKX19ZnVuY3Rpb24gVGUodCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuaW5kZXhPZigiIyMjIik%2BLTE%2FdC5yZXBsYWNlKC8jIyMvZywiLiIpOnR9Zm9yKHZhciBvPSJzdHJpbmciIT10eXBlb2YgZT9bXS5jb25jYXQoZSk6ZS5zcGxpdCgiLiIpO28ubGVuZ3RoPjE7KXtpZighdClyZXR1cm57fTt2YXIgaT1yKG8uc2hpZnQoKSk7IXRbaV0mJm4mJih0W2ldPW5ldyBuKSx0PXRbaV19cmV0dXJuIHQ%2Fe29iajp0LGs6cihvLnNoaWZ0KCkpfTp7fX1mdW5jdGlvbiBBZSh0LGUsbil7dmFyIHI9VGUodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIE9lKHQsZSl7dmFyIG49VGUodCxlKSxyPW4ub2JqLG89bi5rO2lmKHIpcmV0dXJuIHJbb119dmFyIENlPW5ldyBSZWdFeHAoInt7KC4rPyl9fSIsImciKTtmdW5jdGlvbiBqZSh0LGUsbil7dmFyIHIsbyxpO2Zvcig7cj1DZS5leGVjKHQpOykic3RyaW5nIiE9dHlwZW9mKG89clsxXS50cmltKCkpJiYobz1udWxsPT0oaT1vKT8iIjoiIitpKSxvfHwobz0iIiksbz1vLnJlcGxhY2UoL1wkL2csIiQkJCQiKSx0PXQucmVwbGFjZShyWzBdLGVbb118fG8pLENlLmxhc3RJbmRleD0wO3JldHVybiB0fWZ1bmN0aW9uIExlKHQsZSxuLHIsbyl7dHJ5e3ZhciBpPW5ldyhYTUxIdHRwUmVxdWVzdHx8QWN0aXZlWE9iamVjdCkoIk1TWE1MMi5YTUxIVFRQLjMuMCIpO2kub3BlbihyPyJQT1NUIjoiR0VUIix0LDEpLGUuY3Jvc3NEb21haW58fGkuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0IiksZS5hdXRob3JpemUmJmUuYXBpS2V5JiZpLnNldFJlcXVlc3RIZWFkZXIoIkF1dGhvcml6YXRpb24iLGUuYXBpS2V5KSwocnx8ZS5zZXRDb250ZW50VHlwZUpTT04pJiZpLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL2pzb24iKSxpLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2kucmVhZHlTdGF0ZT4zJiZuJiZuKGkucmVzcG9uc2VUZXh0LGkpfSxpLnNlbmQoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoKHQpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyh0KX19dmFyIFBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4scil7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksZSYmZS5wcm9qZWN0SWQ%2FdGhpcy5pbml0KG51bGwsZSx7fSxuKTp0aGlzLmluaXQobnVsbCxuLHt9LHIpLHRoaXMudHlwZT0iYmFja2VuZCJ9dmFyIGUsbixyO3JldHVybiBlPXQsKG49W3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30scj1hcmd1bWVudHMubGVuZ3RoPjI%2FYXJndW1lbnRzWzJdOnZvaWQgMCxvPWFyZ3VtZW50cy5sZW5ndGg%2BMz9hcmd1bWVudHNbM106dm9pZCAwO3RoaXMub3B0aW9ucz1rZSh7fSx7bG9hZFBhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iixwcml2YXRlUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3ByaXZhdGUve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIscHVsbFBhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby9wdWxsL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLGdldExhbmd1YWdlc1BhdGg6Imh0dHBzOi8vYXBpLmxvY2l6ZS5pby9sYW5ndWFnZXMve3twcm9qZWN0SWR9fSIsYWRkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL21pc3Npbmcve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsdXBkYXRlUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3VwZGF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixyZWZlcmVuY2VMbmc6ImVuIixjcm9zc0RvbWFpbjohMCxzZXRDb250ZW50VHlwZUpTT046ITEsdmVyc2lvbjoibGF0ZXN0IixwdWxsOiExLHByaXZhdGU6ITEsd2hpdGVsaXN0VGhyZXNob2xkOi45LGZhaWxMb2FkaW5nT25FbXB0eUpTT046ITEsYWxsb3dlZEFkZE9yVXBkYXRlSG9zdHM6WyJsb2NhbGhvc3QiXX0sdGhpcy5vcHRpb25zLG4pLHRoaXMuc2VydmljZXM9dCx0aGlzLm9wdGlvbnMucHVsbCYmY29uc29sZS53YXJuKCJkZXByZWNhdGVkOiBwdWxsIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMgYW5kIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGxvY2l6ZSBwcml2YXRlIHZlcnNpb25zIik7dmFyIGk9d2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7aT8odGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZD10aGlzLm9wdGlvbnMuYWxsb3dlZEFkZE9yVXBkYXRlSG9zdHMuaW5kZXhPZihpKT4tMSxyLnNhdmVNaXNzaW5nJiYhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZCYmdCYmdC5sb2dnZXImJnQubG9nZ2VyLndhcm4oJ2xvY2l6ZS1iYWNrZW5kOiB3aWxsIG5vdCBzYXZlIG1pc3NpbmdzIGJlY2F1c2UgdGhlIGhvc3QgIicuY29uY2F0KGksJyIgd2FzIG5vdCBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czogJykuY29uY2F0KHRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5qb2luKCIsICIpLCIgKG1hdGNoZXMgbmVlZCB0byBiZSBleGFjdCkuIikpKTp0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZ0aGlzLmdldE9wdGlvbnMoZnVuY3Rpb24odCxyKXtpZih0KXJldHVybiBvKHQpO2Uub3B0aW9ucy5yZWZlcmVuY2VMbmc9bi5yZWZlcmVuY2VMbmd8fHIucmVmZXJlbmNlTG5nfHxlLm9wdGlvbnMucmVmZXJlbmNlTG5nLG8obnVsbCxyKX0pLHRoaXMucXVldWVkV3JpdGVzPXt9LHRoaXMuZGVib3VuY2VkUHJvY2Vzcz1FZSh0aGlzLnByb2Nlc3MsMWU0KX19LHtrZXk6ImdldExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9amUodGhpcy5vcHRpb25zLmdldExhbmd1YWdlc1BhdGgse3Byb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkfSk7dGhpcy5sb2FkVXJsKGUse30sdCl9fSx7a2V5OiJnZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuZ2V0TGFuZ3VhZ2VzKGZ1bmN0aW9uKG4scil7aWYobilyZXR1cm4gdChuKTt2YXIgbz1PYmplY3Qua2V5cyhyKTtpZighby5sZW5ndGgpcmV0dXJuIHQobmV3IEVycm9yKCJ3YXMgdW5hYmxlIHRvIGxvYWQgbGFuZ3VhZ2VzIHZpYSBBUEkiKSk7dmFyIGk9by5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gcltlXS5pc1JlZmVyZW5jZUxhbmd1YWdlJiYodD1lKSx0fSwiIiksYT1vLnJlZHVjZShmdW5jdGlvbih0LG4pe3ZhciBvPXJbbl07cmV0dXJuIG8udHJhbnNsYXRlZFtlLm9wdGlvbnMudmVyc2lvbl0mJm8udHJhbnNsYXRlZFtlLm9wdGlvbnMudmVyc2lvbl0%2BPWUub3B0aW9ucy53aGl0ZWxpc3RUaHJlc2hvbGQmJnQucHVzaChuKSx0fSxbXSkscz1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBlLmluZGV4T2YoIi0iKT4tMXx8dH0sITEpO3QobnVsbCx7ZmFsbGJhY2tMbmc6aSxyZWZlcmVuY2VMbmc6aSx3aGl0ZWxpc3Q6YSxsb2FkOnM%2FImFsbCI6Imxhbmd1YWdlT25seSJ9KX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG89e307dGhpcy5vcHRpb25zLnByaXZhdGU%2FKHI9amUodGhpcy5vcHRpb25zLnByaXZhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPXthdXRob3JpemU6ITB9KTp0aGlzLm9wdGlvbnMucHVsbD8ocj1qZSh0aGlzLm9wdGlvbnMucHVsbFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnI9amUodGhpcy5vcHRpb25zLmxvYWRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSx0aGlzLmxvYWRVcmwocixvLG4pfX0se2tleToibG9hZFVybCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7TGUodCxrZSh7fSx0aGlzLm9wdGlvbnMsZSksZnVuY3Rpb24oZSxvKXtpZihvLnN0YXR1cz49NTAwJiZvLnN0YXR1czw2MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMCk7aWYoby5zdGF0dXM%2BPTQwMCYmby5zdGF0dXM8NTAwKXJldHVybiBuKCJmYWlsZWQgbG9hZGluZyAiK3QsITEpO3ZhciBpLGE7dHJ5e2k9SlNPTi5wYXJzZShlKX1jYXRjaChlKXthPSJmYWlsZWQgcGFyc2luZyAiK3QrIiB0byBqc29uIn1yZXR1cm4gYT9uKGEsITEpOnIub3B0aW9ucy5mYWlsTG9hZGluZ09uRW1wdHlKU09OJiYhT2JqZWN0LmtleXMoaSkubGVuZ3RoP24oImxvYWRlZCByZXN1bHQgZW1wdHkgZm9yICIrdCwhMSk6dm9pZCBuKG51bGwsaSl9KX19LHtrZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byBjcmVhdGUga2V5LiIpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmd9KS5sZW5ndGg8MSYmdGhpcy5zZXJ2aWNlcyYmdGhpcy5zZXJ2aWNlcy5sb2dnZXImJnRoaXMuc2VydmljZXMubG9nZ2VyLndhcm4oJ2xvY2l6ZS1iYWNrZW5kOiB3aWxsIG5vdCBzYXZlIG1pc3NpbmdzIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSAiJy5jb25jYXQodGhpcy5vcHRpb25zLnJlZmVyZW5jZUxuZywnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIHRvIHNhdmUgbGFuZ3VhZ2VzOiAnKS5jb25jYXQodC5qb2luKCIsICIpLCIgKG9wZW4geW91ciBzaXRlIGluIHRoZSByZWZlcmVuY2UgbGFuZ3VhZ2UgdG8gc2F2ZSBtaXNzaW5ncykuIikpLHQuZm9yRWFjaChmdW5jdGlvbih0KXt0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZyYmYS5xdWV1ZS5jYWxsKGEsYS5vcHRpb25zLnJlZmVyZW5jZUxuZyxlLG4scixvLGkpfSl9fSx7a2V5OiJ1cGRhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt2YXIgYT10aGlzO2lmKG98fChvPWZ1bmN0aW9uKCl7fSksIXRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQpcmV0dXJuIG8oImhvc3QgaXMgbm90IGFsbG93ZWQgdG8gdXBkYXRlIGtleS4iKTtpfHwoaT17fSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLGkuaXNVcGRhdGU9ITAsdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6IndyaXRlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIU9lKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0pKXt2YXIgcj1qZSh0aGlzLm9wdGlvbnMuYWRkUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz1qZSh0aGlzLm9wdGlvbnMudXBkYXRlUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksaT1PZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSk7aWYoQWUodGhpcy5xdWV1ZWRXcml0ZXMsW3QsZV0sW10pLGkubGVuZ3RoKXtBZSh0aGlzLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCEwKTt2YXIgYT0hMSxzPSExLHU9e30sYz17fTtpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5vcHRpb25zJiZ0Lm9wdGlvbnMudERlc2NyaXB0aW9uP3t2YWx1ZTp0LmZhbGxiYWNrVmFsdWV8fCIiLGNvbnRleHQ6e3RleHQ6dC5vcHRpb25zLnREZXNjcmlwdGlvbn19OnQuZmFsbGJhY2tWYWx1ZXx8IiI7dC5vcHRpb25zJiZ0Lm9wdGlvbnMuaXNVcGRhdGU%2FKHN8fChzPSEwKSxjW3Qua2V5XT1lKTooYXx8KGE9ITApLHVbdC5rZXldPWUpfSk7dmFyIGw9MDthJiZsKysscyYmbCsrO3ZhciBmPWZ1bmN0aW9uKCl7LS1sfHwoQWUobi5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSwhMSksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuY2FsbGJhY2smJnQuY2FsbGJhY2soKX0pLG4uZGVib3VuY2VkUHJvY2Vzcyh0LGUpKX07bHx8ZigpLGEmJkxlKHIsa2Uoe30se2F1dGhvcml6ZTohMH0sdGhpcy5vcHRpb25zKSxmdW5jdGlvbih0LGUpe2YoKX0sdSkscyYmTGUobyxrZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSxjKX19fX0se2tleToicHJvY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO09iamVjdC5rZXlzKHRoaXMucXVldWVkV3JpdGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJsb2NrcyIhPT1lJiZPYmplY3Qua2V5cyh0LnF1ZXVlZFdyaXRlc1tlXSkuZm9yRWFjaChmdW5jdGlvbihuKXt0LnF1ZXVlZFdyaXRlc1tlXVtuXS5sZW5ndGgmJnQud3JpdGUoZSxuKX0pfSl9fSx7a2V5OiJxdWV1ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpeyFmdW5jdGlvbih0LGUsbixyKXt2YXIgbz1UZSh0LGUsT2JqZWN0KSxpPW8ub2JqLGE9by5rO2lbYV09aVthXXx8W10sciYmKGlbYV09aVthXS5jb25jYXQobikpLHJ8fGlbYV0ucHVzaChuKX0odGhpcy5xdWV1ZWRXcml0ZXMsW3QsZV0se2tleTpuLGZhbGxiYWNrVmFsdWU6cnx8IiIsY2FsbGJhY2s6byxvcHRpb25zOml9KSx0aGlzLmRlYm91bmNlZFByb2Nlc3MoKX19XSkmJlNlKGUucHJvdG90eXBlLG4pLHImJlNlKGUsciksdH0oKTtQZS50eXBlPSJiYWNrZW5kIjt2YXIgUmU9UGUsTmU9big0Myk7ZnVuY3Rpb24gSWUoKXtyZXR1cm4oSWU9dSgpKGEuYS5tYXJrKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0LmFicnVwdCgicmV0dXJuIixuZXcgUnQuYShmdW5jdGlvbih0KXttZS5jaGFuZ2VMYW5ndWFnZShlLGZ1bmN0aW9uKCl7dCh2b2lkIDApfSl9KSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSx0KX0pKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIERlKCl7dmFyIHQ7cmV0dXJuIEx0KCkodD1tZS50KS5jYWxsKHQsbWUpfXZhciBfZT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQuYShmdW5jdGlvbih0LGUpe21lLnVzZShuZXcgeGUuYShudWxsLHtvcmRlcjpbIm5hdmlnYXRvciJdfSkpLnVzZShSZSkuaW5pdCh7ZmFsbGJhY2tMbmc6ImVuIixuczpbImRlZmF1bHQiXSxkZWZhdWx0TlM6ImRlZmF1bHQiLGJhY2tlbmQ6e3Byb2plY3RJZDpOZS5sb2NpemUucHJvZHVjdElkLHZlcnNpb246TmUubG9jaXplLnZlcnNpb24sYXBpS2V5Ok5lLmxvY2l6ZS5hcGlLZXkscmVmZXJlbmNlTG5nOiJlbiJ9fSxmdW5jdGlvbihuLHIpe3JldHVybiBuP2Uobik6dChyKX0pfSl9LGNoYW5nZUxhbmd1YWdlOmZ1bmN0aW9uKHQpe3JldHVybiBJZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGdldExhbmd1YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIG1lLmxhbmd1YWdlfSxnZXRUOkRlfTtmdW5jdGlvbiBNZSh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IW8uYSlyZXR1cm4hMTtpZihvLmEuc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8oKShEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUEoKSh0KTtpZihlKXt2YXIgaT1BKCkodGhpcykuY29uc3RydWN0b3I7bj1vKCkocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBFKCkodGhpcyxuKX19dmFyIFVlPXtieUl0ZW1Db2RlOntuYW1lOiJkYXRhIixjb2x1bW5zOlsicHJvZHVjdENvZGUiLCJkZW5pZWRDb3VudHJpZXMiXX19LEJlPXdpbmRvdy56aWd6YWcscWU9L1wvaXRlbVwvZGV0YWlsLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTt6Lm9uQ2hhbmdlc1JlYWR5KGZ1bmN0aW9uKHQpe3oub3ZlcnJpZGVDbGlja0V2ZW50KHQsJ2FbaHJlZio9IiNtb2RhbC1jYXJ0Il0sIGJ1dHRvbi5hZGQtY2FydCcsZnVuY3Rpb24oKXtCZS5wYWdlVG8oIml0ZW0iKX0pLHoub3ZlcnJpZGVDbGlja0V2ZW50KHQsJ2FbaHJlZio9Ii9jYXJ0LyJdJyxmdW5jdGlvbigpe0JlLnBhZ2VUbygiY2FydCIpfSl9KTt2YXIgRmU9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9TWUobik7ZnVuY3Rpb24gbigpe3JldHVybiB2KCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbSgpKG4sW3trZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PW5ldyBSZWdFeHAoIi8oWzAtOV0rKS8%2FJCIpLmV4ZWMod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtyZXR1cm4gdCYmdC5sZW5ndGg%2BMT90WzFdOiIifX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbz1CZS51dGlscy4kLGk9eCgpKEEoKShuLnByb3RvdHlwZSksImdldEl0ZW0iLHRoaXMpLmNhbGwodGhpcyksYT1kKCkodD1vKCIuZGV0YWlsIC5icmFuZCIpLnRleHQoKSkuY2FsbCh0KSxzPWQoKShlPW8oIi5nZW5kZXIgLmlzLWN1cnJlbnQiKS50ZXh0KCkpLmNhbGwoZSk7cmV0dXJuIGkuY2F0ZWdvcnk9cCgpKHI9IiIuY29uY2F0KGEsIiAoIikpLmNhbGwocixzLCIpIiksaX19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MCxlPXRoaXMuJCgiLmRldGFpbCAucHJpY2UgLmFmdGVyIik7cmV0dXJuIGUubGVuZ3RoPjA%2FVihZKGUpKTp0fX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kLG49W10scj1lKCJ1bC5jb2xvcj5saSIpO2lmKHIubGVuZ3RoPjApZm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKz0xKWZvcih2YXIgaT1lKHIuZ2V0KG8pKSxhPWwoKShpKS5jYWxsKGksIi50aHVtYiAubmFtZSIpLHM9bCgpKGkpLmNhbGwoaSwiLnNpemUgbGkiKSx1PTA7dTxzLmxlbmd0aDt1Kz0xKXt2YXIgYz1lKHMuZ2V0KHUpKSxmPWwoKShjKS5jYWxsKGMsIi5kYXRhIC5uYW1lIik7aWYobCgpKGMpLmNhbGwoYywiLmFkZC1jYXJ0IikubGVuZ3RoPjApe3ZhciBwLGgsZz17fTtnWyJza3UuY29sb3IiXT1kKCkocD1hLnRleHQoKSkuY2FsbChwKSxnWyJza3Uuc2l6ZSJdPWQoKShoPWYudGV4dCgpKS5jYWxsKGgpLGcucHJpY2U9dC5wcmljZSxnLnN0b2NrPTEsbi5wdXNoKGcpfX1yZXR1cm4gbn19LHtrZXk6ImdldFB1cmNoYXNhYmxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5za3VSb3dzLmxlbmd0aD4wfX1dKSxufShodCksSGU9ZnVuY3Rpb24odCl7aygpKG4sdCk7dmFyIGU9TWUobik7ZnVuY3Rpb24gbigpe3JldHVybiB2KCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQ3QpO0JlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmxvY2F0aW9uLG49dC5jYWxsYmFjazshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKCl7dmFyIHQ9dSgpKGEuYS5tYXJrKGZ1bmN0aW9uIHQocil7dmFyIG8saSxzO3JldHVybiBhLmEud3JhcChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZih0LnByZXY9MCxxZSl7dC5uZXh0PTM7YnJlYWt9cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG4oKSk7Y2FzZSAzOnJldHVybiBvPW5ldyB3dCh7ZGF0YTpCZS5zaG9wRGF0YXx8e30sc2hlZXRUeXBlOlVlfSkuZXhlY3V0ZSgpLCIuZGV0YWlsIC5uYW1lIiwiLmRldGFpbCAucHJpY2UiLGk9bmV3IEZlKHskOnIsbmFtZToiLmRldGFpbCAubmFtZSIscHJpY2U6Ii5kZXRhaWwgLnByaWNlIn0pLmV4ZWN1dGUoKSxzPW5ldyBIZSh7bG9jYXRpb246ZSxzY3JhcGVyUmVzdWx0OmksZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKSx0LmFicnVwdCgicmV0dXJuIixuKG51bGwse2l0ZW06aS5pdGVtLHNrdVJvd3M6aS5za3VSb3dzLGV4Y2x1c2lvbjpzfSkpO2Nhc2UgMTE6cmV0dXJuIHQucHJldj0xMSx0LnQwPXQuY2F0Y2goMCksdC5hYnJ1cHQoInJldHVybiIsbih0LnQwKSk7Y2FzZSAxNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0sdCxudWxsLFtbMCwxMV1dKX0pKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSl9KTt2YXIgemU9bmV3IERhdGUoIk1vbiBGZWIgMSAyMDIxIDAwOjAwOjAwIEdNVCswODAwIiksV2U9bmV3IERhdGUoIlN1biBGZWIgMTQgMjAyMSAyMzo1OTo1OSBHTVQrMDgwMCIpLCRlPW5ldyBEYXRlLFZlPSRlLmdldFRpbWUoKT49emUuZ2V0VGltZSgpJiYkZS5nZXRUaW1lKCk8PVdlLmdldFRpbWUoKSxZZT0vXnpoL2kudGVzdChMKCkpLEdlPSgwLEJlLnV0aWxzLiQpKCIuaXMtbW9iaWxlIikubGVuZ3RoPjA7aWYoVmUmJlllKXt2YXIgS2U9RGUoKTtCZS5ub3RpY2VNb2RhbChmdW5jdGlvbigpe3ZhciB0LGU7cmV0dXJuIEdlP3tqdW1ib3Ryb246e2h0bWw6cCgpKHQ9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDEgc3R5bGU9ImZvbnQtc2l6ZTogMzBweCAhaW1wb3J0YW50OyBjb2xvcjogIzMzMzMzNCAhaW1wb3J0YW50OyI%2BPHNwYW4%2BPGltZyBzcmM9Imh0dHBzOi8vY2hlY2tvdXQtc3RhdGljLndvcmxkc2hvcHBpbmcuanAvaW1hZ2VzL2NvbW1vbi9sb2dvLnN2ZyIgYWx0PSJXb3JsZFNob3BwaW5nIj48L3NwYW4%2BJy5jb25jYXQoS2UoImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgICAgICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50OyBjb2xvcjogIzMzMzMzNCAhaW1wb3J0YW50OyI%2BJykpLmNhbGwodCxLZSgiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1zcF8yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyI%2BXG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgJyl9fTp7anVtYm90cm9uOntodG1sOnAoKShlPSdcbiAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbjogNnB4IDAgMCAhaW1wb3J0YW50OyI%2BXG4gICAgICAgIDxkaXY%2BXG4gICAgICAgICAgPGgxIHN0eWxlPSJmb250LXNpemU6IDMwcHggIWltcG9ydGFudDsgY29sb3I6ICMzMzMzMzQgIWltcG9ydGFudDsiPjxzcGFuPjxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vbG9nby5zdmciIGFsdD0iV29ybGRTaG9wcGluZyI%2BPC9zcGFuPicuY29uY2F0KEtlKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgxIiksJzwvaDE%2BXG4gICAgICAgICAgPGgyIHN0eWxlPSJmb250LXNpemU6IDE2cHggIWltcG9ydGFudDsgY29sb3I6ICMzMzMzMzQgIWltcG9ydGFudDsiPicpKS5jYWxsKGUsS2UoImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwnPC9oMj5cbiAgICAgICAgPC9kaXY%2BXG4gICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1wY18yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDM4MHB4ICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvZGl2PlxuICAgICAgJyl9fX0pLEJlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3JldHVybiBHZT97Ym90dG9tOntodG1sOidcbiAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICA8aW1nIHNyYz0iaHR0cHM6Ly9zdGF0aWMtY29udGVudHMud29ybGRzaG9wcGluZy5qcC9zaG9wcy90b3dlcl9qcC9jYW1wYWlnbi1iYW5uZXItc3BfMjAyMTAxMjIucG5nIiBzdHlsZT0id2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPlxuICA8L2E%2BXG4gICd9fTp7Ym90dG9tOntodG1sOidcbiAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXBjXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiA4NSUgIWltcG9ydGFudDsgbWF4LXdpZHRoOiAyNDBweCAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAtMTVweCFpbXBvcnRhbnQ7Ij5cbiAgJ319fSksX2UuaW5pdGlhbGl6ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gQmUucnVuKCl9KX1lbHNlIEJlLnJ1bigpfV0pO30%3D&_u=aHjACEALBAAAAG~&jid=783204935&gjid=1105712975&cid=158121857.1614430449&tid=UA-53738514-61&_gid=1184467560.1614430464&_r=1&gtm=2wg2h0KC52B6&z=225110567

Verdicts & Comments Add Verdict or Comment

132 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| 0 object| 1 object| 2 object| ontransitionrun object| ontransitionstart object| ontransitioncancel object| cookieStore function| showDirectoryPicker function| showOpenFilePicker function| showSaveFilePicker object| trustedTypes boolean| crossOriginIsolated function| $ function| jQuery object| lazySizesConfig object| lazySizes string| getDevice undefined| script function| doSubmitWithCaptcha function| doSubmit function| setFormParam function| getFormParam function| goWithReturnPage function| numberFormat function| unNumberFormat function| setGenderTab function| unescapeDatalayerString object| load_personalized object| favorites boolean| removeFlg function| addCheckedFavorite function| deleteCheckedFavorite function| clickFavorite function| clickFavoriteId function| switchDisplay function| displayMessage function| doFavoriteAjax function| setFavoriteCookie function| addFavoriteShops object| dataLayer function| Treasure boolean| isPC string| BOOMR_API_key object| BOOMR number| BOOMR_lstart object| get_browsing_history object| BOOMR_mq object| JSON3 number| BOOMR_configt string| userId string| hashedEmail object| silverEggStorage object| silverEgg function| silverEggRecommendDefault function| silverEggRecommendDefaultSecondary undefined| _bt_url_prefix undefined| _bt_referrer undefined| _bt_site undefined| _bt_mode function| bt_log function| bt_eval function| bt_parameter function| bt_meta function| bt_cookie function| bt_data function| bt_handle_exception function| bt_data_escaped object| BrightTag function| btServe object| google_tag_manager string| campaignKey string| url undefined| campaignFound function| setCookieForWorldShopping object| google_tag_data string| GoogleAnalyticsObject function| ga undefined| transactionProducts undefined| items undefined| key undefined| in_cart_price undefined| cart_type undefined| getBaseSelector undefined| trackStatus undefined| baseSelector object| tracker object| s string| gtmUidVariable object| td function| TreasureJSONPCallback0 object| _ltq function| _lt object| gaplugins object| gaGlobal object| gaData function| onYouTubeIframeAPIReady object| _ltc object| smartica object| __karte_tracker boolean| __karte_loaded object| _karte_logs object| _karte_tracker object| yjDataLayer function| ytag number| zigzagLoadingStartedAt function| onLoadZigZag number| BOOMR_onload string| device object| result string| allcookies undefined| cookies undefined| cookie object| yahoo_retargeting_sent_urls_counter string| yahoo_retargeting_pv_id object| DataLayer function| fbq function| _fbq object| SmartnewsAds function| gtag function| retrieveUUID-0 function| retrieveUUID-1 object| ct_cl object| ___RMCMPW string| ycl_prefix string| ycl_cookie function| GooglemKTybQhCsO function| google_trackConversion object| GooglebQhCsO object| criteo_q object| cti115184 object| regeneratorRuntime object| zigzag

3 Cookies

Domain/Path Name / Value
.baycrews.jp/ Name: __lt__sid
Value: 1b4ef180-f193addd
.baycrews.jp/ Name: __lt__cid
Value: 7cad821a-10dd-4aec-9bb0-3c5cde5192cf
.baycrews.jp/ Name: _ts_yjad
Value: 1614430452232

Security Headers

This page lists any security headers set by the main page. If you want to understand what these mean and how to use them, head on over to this page

Header Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

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.

ad.as.amanad.adtdp.com
ad.caprofitx.adtdp.com
adgen.socdm.com
analytics.google.com
api.smartica.jp
b92.yahoo.co.jp
b97.yahoo.co.jp
baycrews.jp
baycrews.silveregg.net
c.bing.com
c.go-mpulse.net
cdn.smartnews-ads.com
cdn.treasuredata.com
checkout-api.worldshopping.jp
checkout-js.worldshopping.jp
cm.g.doubleclick.net
connect.facebook.net
consent.linksynergy.com
contextual.media.net
criteo-sync.teads.tv
cs.adingo.jp
cs.gssprt.jp
cw.addthis.com
d.line-scdn.net
dis.criteo.com
eb2.3lift.com
feature-tool.bcg.staff-start.com
googleads.g.doubleclick.net
gum.criteo.com
i.smartnews-ads.com
ib.adnxs.com
images.baycrews.jp
img-cf.karte.io
in.treasuredata.com
intljs.rmtag.com
js.smartica.jp
pixel.advertising.com
pixel.tapad.com
r.casalemedia.com
rtb-csync.smartadserver.com
s-cs.send.microad.jp
s.ad.smaato.net
s.go-mpulse.net
s.yimg.jp
s.yjtag.jp
secure.adnxs.com
simage2.pubmatic.com
sslwidget.criteo.com
ssp-sync.i-mobile.co.jp
static.criteo.net
static.karte.io
stats.g.doubleclick.net
sync-criteo.ads.yieldmo.com
sync-t1.taboola.com
sync-tag.karte.io
sync.ad-stir.com
sync.aralego.com
sync.e-planning.net
sync.outbrain.com
t.karte.io
tg.socdm.com
tr.line.me
ups.analytics.yahoo.com
us-u.openx.net
widget.as.criteo.com
www.baycrews.jp
www.facebook.com
www.google-analytics.com
www.google.com
www.google.de
www.googleadservices.com
www.googletagmanager.com
yjtag.yahoo.co.jp
www.google-analytics.com
103.142.125.192
104.109.78.166
104.75.88.112
124.146.215.49
13.114.70.18
13.231.67.24
13.32.24.51
130.211.31.19
141.226.228.48
142.250.185.66
142.250.186.130
143.204.97.111
143.204.97.88
162.210.196.208
178.250.0.163
18.156.0.31
18.177.106.11
182.161.73.211
182.22.24.252
182.22.30.220
183.79.113.122
183.79.248.252
185.64.189.110
185.86.137.133
2.18.232.182
2.18.232.62
2.18.232.7
2.18.234.21
2.18.235.93
202.241.208.4
203.104.153.77
23.37.57.111
2600:9000:206f:2800:c:6dc1:1600:93a1
2600:9000:20d7:1a00:d:5c6f:d380:93a1
2600:9000:20eb:d800:d:1369:bf40:93a1
2600:9000:2156:6000:8:dcbf:c740:93a1
2620:1ec:c11::200
2a00:1450:4001:802::2002
2a00:1450:4001:809::2002
2a00:1450:4001:80e::2004
2a00:1450:4001:80f::2003
2a00:1450:4001:80f::2008
2a00:1450:4001:80f::200e
2a00:1450:4001:811::200e
2a00:1450:4001:812::2004
2a00:1450:4001:827::2008
2a00:1450:4001:827::200e
2a00:1450:4001:82a::2003
2a00:1450:400c:c1b::9a
2a00:1450:400c:c1b::9d
2a02:2638:1::13
2a02:2638:1::3
2a02:26f0:6c00:19a::11a6
2a02:26f0:6c00:291::11a6
2a03:2880:f01c:8012:face:b00c:0:3
2a03:2880:f11c:8183:face:b00c:0:25de
3.114.17.118
3.227.99.154
34.102.147.248
35.227.248.159
35.241.23.116
35.244.159.8
37.252.172.36
46.249.52.249
52.204.47.1
52.28.254.214
52.57.162.23
54.150.1.233
54.250.85.92
54.65.185.147
54.65.94.198
61.213.187.248
65.9.187.60
65.9.58.75
65.9.61.33
70.42.32.159
029ed6daff2ac61d9d98ebf3b0c2b678099cb8c0db6580f16bcf5ca50611c5da
032009ee7a62418a5f969658f59c6888737e4f4779104a00ab57a922836d64de
0401d604913b926155dd9d7930f303c5fa0c32a231cb4060cec81fb0862fa019
057df4e0b56157e244331027c6572ab3abb5d26b8e1adec9c41c6364814d37a9
058ed961bfe422af7bfc65865f4c08531ec8ace995f8a1ec560a46581cb7712c
063d466430cc9d86a54c9ef90bbd4b918322cf5ac8cf557833dc9b4ae3b6b6c7
07debd9529f10df71890cd03639e00a930ac5225b7617601ba359776ed1319bb
09b99cd31de32440268984f9e53d616e2772dc8af49bdab1d0a7ff7d3fd4ae9e
0c4e944f147c56b68ec2f689668ea25e31b2d883db18b0f84ca5f703aacda6d0
0f3be44690ae9914ae3e47b7752e1bdea316f09938e9094f99e0de19ccd8987a
0f6204713c11eeb6d7648e3401617e22f8e88f96cd517a538dc018ac2ab7bdf2
0f7430df12c82ed5382b5302d8a736c6a495d7536a9029d0f22e05c06a08aa85
1050a06619ed9db5673831b49dbdaf6cd8c060f1da0ef8875f9c01f36e74c382
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
11f7c767ee892f2576e46aedbc22c9d8a2b6540b5666ee34d4fb820716d5055a
13a35b3b2cb1403c7ba4669932c79bfb30ef8d4f77c531ede63ec5d5f809f600
15716702afad352c018b7e0510adf21e0e0c6f556265ab4d77b23eb6d89da8c0
1657a8aa348883078cfe638f036b5a77a879a81f49ab4b15774382c50d653c99
17ec06cb0e9751f1cca2eb8515b75d00123b6f23e442a0dec8b4df3c124d39da
252ed9643f62ed6f6737b18933cbcdc547def634b5fa93bb31b19429ea0af653
261595338fd9066332abdbde9ab8f2cf826985e226e2d03904777799e54c9665
2c6247557a9e3c1fd209079f0591aab85b6509299d7c478cca28edd43a37a0f4
2e019bd226878c6bde4ebe330e11af03ce15ba1b221a9ce31e2d4fa6d8888d22
2f3b2d76269edaa148afb9989efa6cb4f2baf6941225da46f4fa6d092132ae9e
2fa3f8de3305324646d537eb888eec94a7390343562a87c7fa0e150f6ad5ed55
30983593c3b77d120a15d7333846e3e8764eb890adba33df63b3e4bcbd1bdf1d
32878d6b1ce14a906b475c0dd28e1d59f97ab6ca77981449182823758f600283
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
33cb1c6d9c3059872e8c6e5016cb752517d0997ae314f263dfeec8e2b85fe097
34416f24af9edc04d6fe32bf8b1d6d4c9b70332109a25b4f5cee13bb7fea7225
3aa9f235c06f8205b4b91091c02bbb8c8a23b12fafa257f68aecc4be22e8b7c0
3ea1d47e294e438851d775f2eca7352b4d03cf662e3ad9410f18bae663a380e5
3eb10792d1f0c7e07e7248273540f1952d9a5a2996f4b5df70ab026cd9f05517
419a8dcc6f3af9015af6256ec0711ef6a422fa222352df2372f33e0d8493c6e2
42b601bc0d93dfca6e350b46d113bf8e7ff9e40a87a0c57ab9b3c9c219062423
437570c34cbc68311166c45683a8dde9307db83c6aaeb6bba8277a50fbd41c97
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
44b0bd0cf2b728e4b93e471e52db57a08a2ed84b7e47766879197316c566ae80
451835c389e2e9f22a48a9d518f14662304b3348b591414d89ae05a5e37beb1b
465f78e8e233e11e3f5aa7c94f9d3c47916d72cc9888c15261bf8a255abd604e
46987c9cfaa8d9a900fffcc3cc414506347fb3b65eb98b4b73d98275652e5a16
476a2659ea0bbc84be8b7339cb36830920e6e922d7c90a4a65ce084006e0197b
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4cf9ee11774bed05ba076db70a18d27325eed3bced558a82a801c6847e254454
4df5a9a506463b0fa0ec80f59d02383f22608323c54f9e8d18f2e2024da896dc
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
4e9e987e00635d9c1c3b883806da3e8a1c225663d98d94ec5653107c9b637e6f
4edbece3e1a487ad5341880a4a6d8ca66e6091088a0a6e5e12725bae14394323
50002963bcf0d6cc08272bc01eea9bb29ededca5353c70f1aa06b3bb0ec62829
5059f7c263f88ed46ab73dbfc3402c95582342624f867a3bdd8af45d4890a431
51ac6c42931897c845964ce3df4507453ee0e90675bb7bcc4fb5086ab371a7ce
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
55114b2aff6696106fc192789f23627bc6edc647d0c50e6e43087785b3b3619b
579a172ca2c700734ebcfa06d105a134f31ec2357660e58e0874cfdee8472fd4
584562c217f2f84d27a9a1c7f27e59b207d7d23f61e7341cb1eacf1d018af76b
5894fceb165e6c06db0c9b198165581fade79422a7c4784bc5606027207fcdf3
59f61a2e07011d01fd5ed0e7e3e9adee9f515626807eb338fe095a180f024eaa
5f4514e4f4f8a20bf05dbd11e55aa5862331f9a5a6e8e1b3ca779795f954ee09
62432f03bfba535949c6b29a4cd2e1cad21d98ff35a4b9c93a8950e37e77b353
6564cbcc60bd5367e93280916b21fce8085ac8ee0cb692c08745c373e24ea7e7
675b227628ddf15bd4180a794ebceadacc3bb622bf4f45aa1539bd18ce166586
68a20e9893e64e59c6689cb8491903d19b733082f9a592cd27af694ef6ea03ec
69b837568c14e9b5dbde403030e1943097c859f8880c8dda285ff1f58a943e3d
6a0b3c4bc43c63864f113f9f8a5ff37c033a0f3a5ad912647df712a7b0b9909b
6a842ea462daca2a0b5a0f5f25bcfc8e0059ac811ca6c6a1bc54e4d9119621c3
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6f8945a31e0bb0eedeacadcc293d235df840e24368541ef48ab138fcfc2a14d8
70ae2b0eae4fc5838491c10f487e137e9377670ae1d61f67d27dc0c38e122a84
70d894770ceb1435685ac21716605fe3751e4c54b462317c202ab53d2f38db27
80e476c2f6fd2e8b30044ddf41ba2b41aad4cb1c512f54ce56f3fc27399769f0
81cbfaf57a918386ad3b1445b3fc958079457a07a1f26f4668f1e222d4496bf3
8211a66d98acea9b0cbdf87be9bef64a09f78a54c2b771669085fb9a84413cf8
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
84e01419bd81f32ac6df0f75f49c604fda9172000a3ae432b3c47b2a6a712d80
865d7d9466bcce8a31293867e16138344c5042592d6262801e5bfb50c68d92c8
87843ae8d6564b6103261f9d77ed90a3bfba705c8b2fccd7a725a4f8cfd5205f
879d5010159b99723bb423be6ec7a122c6e5893fa40d01d45a5e7243420ade20
88b4aa3596cfa55bd6269acf9fdffd1356aa3d362aa3839dcdb33b95e42a60a5
89fe0ee6020314794fc2cfeacf3d10c31050cfe56f8ebddf1ed0a33fbe941fa7
8a102873a33f24f7eb22221e6b23c4f718e29f85168ecc769a35bfaed9b12cce
8c0301b3dba5061632d7321cd8bb7bd527f48288d5cb15ff614ea0c1dcc1ad69
8cadf3c3a9253b0d06232619dc20082d865a3824667154df1429cd9bca7388ab
8f7329b940fb2b3640f385531cbb078d12756854a50e247023e79df8eabb5b12
93bd5a0e65a1897c0fd2a31ae368b65fe2d9aad13a2a5a186578d98f84eea6cc
94591a01594ad86b0d3cb165439e854ff5cacc52f6271ba2946c5cc55c032121
95a439c4e11ace2484e8d42c30ff56cf7db5ea7c6463df9ce2fdafa7f6ccbf54
99c2917ee5b2a01459a923bdd1c676f15ee73b62b87f696e6735312d26f51e12
9e7ea2b4ba8e2bcc4a964d6192e4671dc5f6863a1c7e35b52b229a3c1e67a68d
a36bdcd117dcfd22799e7757199ca27c12f56e21438123c99b3a4e6221e791c8
a7f4b7419c52c9adcc3d2dcc162e55ea64471e7924d0b8eecc33debd951a6f4f
ac195780e6b3c57034d94552b0f55c450879151bee089547f4de05b0db8b5a37
ae78949c343a51623421be03013bca62c8fccadefb9c88c8dead260b75b120bd
af10e93a231cfec5c9a51e15ab93cedd5f12f049109a7696f4d73da7d56efe37
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b0f6ed6203c6b84794084f41991dbc9fc608853a2cf1d097651314af3696ac0f
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b2de832c0c7bddff993b5fa453ecb26314dc4767346bebb2270cfd429b7bf249
b4ceacee581031a4014c658e33aa47874612b4c25c1aed8ef682cada98b99d6d
ba732a6d0b4db5e763fcba62ac2f0931e440fc10d1645597de4e3ec9890bcea9
bb229a48bee31f5d54ca12dc9bd960c63a671f0d4be86a054c1d324a44499d96
bebde36b7892da3491457af3c3f1987429fa81e07089052e4fa28d901130f20e
c02c210804f06662c5a864a0d8c62d27757a051183b74b1bbd50eedbb9759f66
c2e0b749ba98f3158f0bc25cf0ab517e36627bbb4eb791dbd04ecbe15e0e0539
c570f8ff21634cbcc068126a80a2a40e15323495b9a6fbd78ad67fe75df4cf18
c94593d4a67696ade36cf632c0ab6abfc55ddc7271a61e872cb8a641a1e7d17a
ca095159e8c36019251e797e4d225002779d43bd0ff515f7a0cdb7b6d6cdd3bb
caf2895706e04aa34cee3ccc13bb8f1acc48fef312337caa189be94508f9564a
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d1bbb32474281d29c10fe7d4bf4d8992937d209bad41108f1b62982fd5ea9d95
d37ef9a3466f44f368086ece3aef8b9da14b2bed9e3d4a810100770491f1b709
d81609c3625fcd1905e46062eef49194b3d529ae56e44854334d8ee9354ac1fa
e25beb2604f643113077c9c23574520e47407aa747c1bda940b064d6307c615a
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e47a4ae11cd9f9107548f55c7ea9a79d00dd659728dfd1d66804175e986f0ca9
e86c874d3c0982593342852a1e8513d2e7445688714c3a79cc5520abc71c5a60
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f73f6196f7af66ce888d6eeb5431242b1320baf1baeba6691ec7054c988da752
fa0490f5c30934a816fc2081786b09810a2892301d5d1f374b8b10218024cb2a
fcb5ee7a8fcec48a11b7adf420332a9ff2cf49f99558795d6b7b810618573e35