Submitted URL: https://userpage.fu-berlin.de/dammah97/msu.html
Effective URL: http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDax...
Submission: On April 07 via manual from US

Summary

This website contacted 3 IPs in 2 countries across 3 domains to perform 3 HTTP transactions. The main IP is 2606:4700:3036::681f:4e17, located in United States and belongs to CLOUDFLARENET, US. The main domain is d2l.msu.vnre.me.
This is the only time d2l.msu.vnre.me was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 130.133.4.196 680 (DFN Verei...)
1 1 2606:4700:303... 13335 (CLOUDFLAR...)
2 2606:4700:303... 13335 (CLOUDFLAR...)
3 3
Domain
Subdomains
Transfer
2 vnre.me
d2l.msu.vnre.me
176 KB
1 vnca.me
.vnca.me
574 B
1 fu-berlin.de
userpage.fu-berlin.de
424 B
3 3
Domain Requested by
2 d2l.msu.vnre.me text
1 vnca.me 1 redirects
1 userpage.fu-berlin.de
3 3

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

Domain
www.msu.edu
netid.msu.edu
tech.msu.edu
login.msu.edu
msu.edu
Subject Issuer Validity Valid
userpage.fu-berlin.de
DFN-Verein Global Issuing CA
2019-05-17 -
2021-08-18
2 years crt.sh

This page contains 1 frames:

Primary Page: http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
Frame ID: 086554585BB7DD219539B062F067C464
Requests: 15 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. https://userpage.fu-berlin.de/dammah97/msu.html Page URL
  2. http://vnca.me/dmsu87415 HTTP 301
    http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23Dt... Page URL

Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /Debian/i

Overall confidence: 100%
Detected patterns
  • headers server /(?:Apache(?:$|\/([\d.]+)|[^/-])|(?:^|\b)HTTPD)/i

Page Statistics

3
Requests

33 %
HTTPS

67 %
IPv6

3
Domains

3
Subdomains

3
IPs

2
Countries

214 kB
Transfer

650 kB
Size

5
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://userpage.fu-berlin.de/dammah97/msu.html Page URL
  2. http://vnca.me/dmsu87415 HTTP 301
    http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

3 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
msu.html
userpage.fu-berlin.de/dammah97/
70 B
424 B
Document
General
Full URL
https://userpage.fu-berlin.de/dammah97/msu.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
130.133.4.196 Berlin, Germany, ASN680 (DFN Verein zur Foerderung eines Deutschen Forschungsnetzes e.V., DE),
Reverse DNS
userpage.zedat.fu-berlin.de
Software
Apache/2.4.25 (Debian) /
Resource Hash
02a147d53d1f0457aab51bb1440d91925dd64b4c61dae0a0f402382c69b6f13d

Request headers

Host
userpage.fu-berlin.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
document
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,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
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/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
document

Response headers

Date
Tue, 07 Apr 2020 20:05:07 GMT
Server
Apache/2.4.25 (Debian)
Last-Modified
Mon, 06 Apr 2020 23:29:03 GMT
ETag
"46-5a2a7a1e60dc0-gzip"
Accept-Ranges
bytes
Vary
Accept-Encoding
Content-Encoding
gzip
Content-Length
88
Keep-Alive
timeout=15, max=100
Connection
Keep-Alive
Content-Type
text/html
Primary Request Cookie set /
d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
Redirect Chain
  • http://vnca.me/dmsu87415
  • http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
409 KB
175 KB
Document
General
Full URL
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
Protocol
HTTP/1.1
Server
2606:4700:3036::681f:4e17 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
c9b6b66ae13cf812bee633b79bb8f9719360243ec7866c60f7f8affa5e66033a

Request headers

Host
d2l.msu.vnre.me
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding
gzip, deflate
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/74.0.3729.169 Safari/537.36
Referer
https://userpage.fu-berlin.de/dammah97/msu.html

Response headers

Date
Tue, 07 Apr 2020 20:05:08 GMT
Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Set-Cookie
__cfduid=dfff639770ffdac765ee2cd5d8244ef301586289907; expires=Thu, 07-May-20 20:05:07 GMT; path=/; domain=.vnre.me; HttpOnly; SameSite=Lax
Last-Modified
Mon, 06 Apr 2020 23:17:26 GMT
CF-Cache-Status
DYNAMIC
Server
cloudflare
CF-RAY
58065c935fd697b4-FRA
Content-Encoding
gzip

Redirect headers

Date
Tue, 07 Apr 2020 20:05:07 GMT
Content-Type
text/html; charset=iso-8859-1
Transfer-Encoding
chunked
Connection
keep-alive
Set-Cookie
__cfduid=dedc088e2492030a89fedaacc22e3e9191586289907; expires=Thu, 07-May-20 20:05:07 GMT; path=/; domain=.vnca.me; HttpOnly; SameSite=Lax
Location
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
CF-Cache-Status
DYNAMIC
Server
cloudflare
CF-RAY
58065c929e0cd6d5-FRA
data:truncated
data:truncated
100 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
563e9371f5ba486bad247c8163ba4ffafe193d736a914bfd7e2bcadca7c7541c

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
text/javascript
data:truncated
data:truncated
1 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
120c5f2cc3853722adeab64b02fab342f33a95a86aca051e2bb7e067d4d42669

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
data:truncated
data:truncated
242 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
de9d449a930bfc8cf956b52e21d3f6c1cee4959cde3e1bd9d6f9da0141acc05f

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
data:truncated
data:truncated
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
494a9579a16355f2ad802bf339d57eb75e899daa15fbff4388e7cc5a0ea6f60d

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
data:truncated
data:truncated
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e452f2b9ee62499e93528edf2458315caa47234fed1e771ab333cc8175e7f0b7

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
data:truncated
data:truncated
242 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
2a987d187d000075706bef3e889df58b6e042c5212a524b3c5b1567aa92778e5

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
data:truncated
data:truncated
19 KB
19 KB
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4545eb1dec25fe868d19dc292d417d8a9e41c0276d75a4eaf524a9db21aa705a

Request headers

Origin
http://d2l.msu.vnre.me
Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
font/woff2
data:truncated
data:truncated
19 KB
19 KB
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8767f01caa430c5bd4e3b008a8e9dfe022156a4e91a23c394fdcb05c267f1b94

Request headers

Origin
http://d2l.msu.vnre.me
Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
font/woff2
data:truncated
data:truncated
94 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
0d6271f6c1c509d78ee10f14174542be0db49486fe7c23201c1b517a063f578e

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
application/javascript
data:truncated
data:truncated
503 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
641b6f566bb96b752c2809f770c3d450aebdf8a762f339fc60e45d81f2003409

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
application/javascript
dynaTraceMonitor?type=js&session=DEOSRD7THKTIBDPT8F75HC7QEVDLSQQ1&flavor=post&referer=http%3A%2F%2Fd2l.msu.vnre.me%2FUserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23Dtrues...
d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
315 B
516 B
XHR
General
Full URL
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/dynaTraceMonitor?type=js&session=DEOSRD7THKTIBDPT8F75HC7QEVDLSQQ1&flavor=post&referer=http%3A%2F%2Fd2l.msu.vnre.me%2FUserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT%2F&app=Default%20Application&format=lzw
Requested by
Host: text
URL: data:text/javascript;base64,KGZ1bmN0aW9uKCl7dmFyIHo9d2luZG93O2lmKCF6LmRUX3x8ei5kVF9bJ2luaXRpYWxpemVkJ118fCF6LmRUX1snaWNhJ10pe2lmKHouY29uc29sZSl6LmNvbnNvbGUubG9nKCdEdXBsaWNhdGUgYWdlbnQgaW5qZWN0aW9uIGRldGVjdGVkIG9yIG5vIGluaXRDb2RlIGF2YWlsYWJsZSwgdHVybmluZyBvZmYgcmVkdW5kYW50IGNvcmUuJyk7cmV0dXJuO30KaWYobmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJSdXhpdFN5bnRoZXRpYyIpPj0wKXtyZXR1cm47fQooZnVuY3Rpb24oKXtmdW5jdGlvbiBmYShhKXtmb3IodmFyIGI9W10sYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYltjLTFdPWFyZ3VtZW50c1tjXTtyZXR1cm4gVmI/VmIoYSxiKTpXYj9XYihmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KHRoaXMsYil9KTphLmFwcGx5KHRoaXMsYil9ZnVuY3Rpb24gcWEoKXtpZigic3RyaW5nIiE9PXR5cGVvZiBkb2N1bWVudC50aXRsZSl7dmFyIGE9eGEoInRpdGxlIilbMF07cmV0dXJuIGEuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50fXJldHVybiBkb2N1bWVudC50aXRsZX1mdW5jdGlvbiBYYigpe3JldHVybiBnYj9uZXcgZ2I6aGI/bmV3IGhiKCJNU1hNTDIuWE1MSFRUUC4zLjAiKTpsLlhNTEh0dHBSZXF1ZXN0P25ldyBsLlhNTEh0dHBSZXF1ZXN0Om5ldyBsLkFjdGl2ZVhPYmplY3QoIk1TWE1MMi5YTUxIVFRQLjMuMCIpfWZ1bmN0aW9uIFliKGEsYil7YS5zcGxpY2UoYixiLWIrMXx8YS5sZW5ndGgpfWZ1bmN0aW9uIGJmKCl7cmV0dXJuIHl9CmZ1bmN0aW9uIFpiKCl7dmFyIGE9ZG9jdW1lbnQubG9jYXRpb247cmV0dXJuIGE/MD09PXAoYS5ocmVmLCJmaWxlIik6ITF9ZnVuY3Rpb24gZGQoKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yfHxsLm9wZXJhO3JldHVybi8oYW5kcm9pZHxiYlxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWlub3xhbmRyb2lkfGlwYWR8cGxheWJvb2t8c2lsay9pLnRlc3QoYSl8fC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcLShufHUpfGM1NVwvfGNhcGl8Y2N3YXxjZG1cLXxjZWxsfGNodG18Y2xkY3xjbWRcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1wtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlwtNXxnXC1tb3xnbyhcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcLShtfHB8dCl8aGVpXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1wtY3xodChjKFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFwtfFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFwvKXxrbG9ufGtwdCB8a3djXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFwvKGt8bHx1KXw1MHw1NHxcLVthLXddKXxsaWJ3fGx5bnh8bTFcLXd8bTNnYXxtNTBcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFwtZ3xxYVwtYXxxYygwN3wxMnwyMXwzMnw2MHxcLVsyLTddfGlcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFwtfG9vfHBcLSl8c2RrXC98c2UoYyhcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcLXxzaGFyfHNpZShcLXxtKXxza1wtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXC18dlwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXC18dGRnXC18dGVsKGl8bSl8dGltXC18dFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cLXxtM3xtNSl8dHhcLTl8dXAoXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXC18eW91cnx6ZXRvfHp0ZVwtL2kudGVzdChhLnN1YnN0cigwLDQpKX1mdW5jdGlvbiAkYigpe3JldHVybiIxIj09PW5hdmlnYXRvci5kb05vdFRyYWNrfHwieWVzIj09PW5hdmlnYXRvci5kb05vdFRyYWNrfHwiMSI9PT1uYXZpZ2F0b3IubXNEb05vdFRyYWNrfHwiMSI9PT1sLmRvTm90VHJhY2t9ZnVuY3Rpb24gYWMoKXt2YXIgYT1lZCghMCk7aWYoMDxhLmxlbmd0aCl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLmZyYW1lSWQhPT1ZKCkmJnIoYixhW2NdKTtmZChiKX19ZnVuY3Rpb24gZ2QoYSl7YT1ZKCkrImgiK2E7dmFyIGI9cmEoaGQpO3JldHVybiBiJiYwPD1wKGIsYSkmJiFaYigpP251bGw6YX1mdW5jdGlvbiBjZihhKXthPXooYSk7LTE9PT1zYShiYyxhKSYmcihiYyxhKX1mdW5jdGlvbiBkZihhKXtyZXR1cm4tMSE9PXNhKGJjLGEpfWZ1bmN0aW9uIFIoKXt2YXIgYT10KCk7dHJ5e2Zvcih2YXIgYj12YTtiJiZiIT09c2VsZjspe2lmKGIuZFRfKXJldHVybiBiLmRUXy50ZHRvKCk7Yj1iIT09Yi5wYXJlbnQ/Yi5wYXJlbnQ6bnVsbH19Y2F0Y2goYyl7fXJldHVybiBhfWZ1bmN0aW9uIGVmKCl7cmV0dXJuIU5hfWZ1bmN0aW9uIGNjKGEpe2lmKGEpZm9yKHZhciBiPXhhKCJMQUJFTCIpLGM9eWEoYiksZD0wO2Q8YztkKyspe3ZhciBlPWJbZF07aWYoZS5odG1sRm9yPT09YSlyZXR1cm4gSyhlLmlubmVyVGV4dCxlLnRleHRDb250ZW50KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBLKCl7Zm9yKHZhciBhPVtdLGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7YisrKWFbYl09YXJndW1lbnRzW2JdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl07aWYoYyYmInN0cmluZyI9PT10eXBlb2YgYyYmaWIoYykpcmV0dXJuIGliKGMpfXJldHVybiBudWxsfWZ1bmN0aW9uIGlkKGEpe2lmKGEpe2lmKDA9PT1wKGEsImRhdGE6IikpcmV0dXJuIG51bGw7YT1hLnNwbGl0KCIvIik7aWYoMDxhLmxlbmd0aClyZXR1cm4gYVthLmxlbmd0aC0xXS5zcGxpdCgiLiIpWzBdfXJldHVybiBudWxsfWZ1bmN0aW9uIGpkKGEpe2lmKGEmJmEuc3BsaXQpe3ZhciBiPWEuc3BsaXQoIi8iKTtpZigwPGIubGVuZ3RoJiYoYj1pYihiW2IubGVuZ3RoLTFdKSxudWxsIT09YikpcmV0dXJuIGJ9cmV0dXJuIGF9ZnVuY3Rpb24ga2QoYSxiKXt2YXIgYz1iLm5vZGVOYW1lP2Iubm9kZU5hbWUudG9VcHBlckNhc2UoKToidW5rbm93biIsZD1iLnR5cGUmJiJzdHJpbmciPT09dHlwZW9mIGIudHlwZT9iLnR5cGUudG9VcHBlckNhc2UoKTpudWxsLGU9bnVsbDtzd2l0Y2goYSl7Y2FzZSBaLndhOiJJTlBVVCI9PT1jJiYiSElEREVOIiE9PWQmJihhPSFkfHwiQlVUVE9OIiE9PWQmJiJTVUJNSVQiIT09ZCYmIlJFU0VUIiE9PWQmJiJJTUFHRSIhPT1kP251bGw6Yi52YWx1ZSxjPWNjKGIuaWQpLGU9IWR8fCJCVVRUT04iIT09ZCYmIlNVQk1JVCIhPT1kJiYiUkVTRVQiIT09ZD9LKGMsYSk6SyhhLGMpKTtlfHwoZT1LKGIudGV4dENvbnRlbnQsYi5pbm5lclRleHQpKTticmVhaztjYXNlIFoueGE6aWYoIklOUFVUIj09PWMmJiJISURERU4iIT09ZHx8IkJVVFRPTiI9PT1jKWU9SyhiLm5hbWUsYi50aXRsZSxkJiYiSU1BR0UiPT09ZD9iLmFsdDpudWxsKTticmVhaztjYXNlIFoueWE6IklOUFVUIj09PWMmJiJJTUFHRSI9PT1kP2U9aWQoYi5zcmMpOiJBIj09PWM/ZT1LKGIudGl0bGUsamQoYi5ocmVmKSk6IklNRyI9PT1jP2U9SyhiLm5hbWUsYi50aXRsZSxiLmFsdCxpZChiLnNyYykpOiJGT1JNIj09PWMmJihlPUsoYi5uYW1lLGIuaWQsYi5hY3Rpb24pKTtlfHwoZT1LKGIudGl0bGUsYi5kYXRhLGIud2hvbGVUZXh0LGIuaWQpKTticmVhaztjYXNlIFoudmE6Im9iamVjdCI9PT10eXBlb2YgYi5jbGFzc05hbWU/ZT1iLmJhc2VWYWx8fGIuYW5pbVZhbDplPWIuY2xhc3NOYW1lO2JyZWFrO2Nhc2UgWi56YToiSU5QVVQiPT09YyYmIkhJRERFTiIhPT1kP2U9IklOUFVUOiAiK2Q6IkEiPT09Yz9lPSJMSU5LIjpPYXx8KE9hPWU9Yyl9cmV0dXJuIGV9ZnVuY3Rpb24gbGQoYSl7aWYoIWEpcmV0dXJuIG51bGw7dHJ5e2lmKHkuaWUmJmRjKGEpKXJldHVybiJWTUwgTm9kZSI7dmFyIGI9YS5ub2RlTmFtZT9hLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk6InVua25vd24iO2lmKCJIVE1MIj09PWJ8fCJCT0RZIj09PWJ8fCJIRUFEIj09PWJ8fCIjRE9DVU1FTlQiPT09YilyZXR1cm4gT2E7Zm9yKGI9MDs0Pj1iO2IrKyl7dmFyIGM9a2QoYixhKTtpZihjJiZjIT09T2EpcmV0dXJuIGN9cmV0dXJuIGxkKGEucGFyZW50Tm9kZSl9Y2F0Y2goZCl7fXJldHVybiBudWxsfWZ1bmN0aW9uIG1kKGEsYil7aWYoIWIpcmV0dXJuIG51bGw7dmFyIGM9eWEoYik7aWYoMD49Y3x8MjA8amIpcmV0dXJuIG51bGw7Zm9yKHZhciBkPTA7ZDxjO2QrKyl7dmFyIGU9YltkXTtpZih5LmllJiZkYyhlKSlyZXR1cm4iVk1MIE5vZGUiO3ZhciBmO2piKys7aWYoZj1tZChhLGUuY2hpbGROb2RlcykpcmV0dXJuIGY7amItLTtpZihmPWtkKGEsZSkpcmV0dXJuIGZ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZmYoYSl7T2E9bnVsbDt0cnl7aWYoeS5pZSYmZGMoYSkpcmV0dXJuIlZNTCBOb2RlIjtpZigic3RyaW5nIj09PXR5cGVvZiBhKXJldHVybiBhO3ZhciBiPWEuYXR0cmlidXRlcztpZihiKXt2YXIgYz1iWyJkYXRhLWR0bmFtZSJdO2N8fChjPWJbImRhdGEtZHROYW1lIl0pO2lmKGMmJmMudmFsdWUpcmV0dXJuIGMudmFsdWV9dmFyIGQ9YS5ub2RlTmFtZT9hLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk6InVua25vd24iO2lmKCJIVE1MIj09PWR8fCJCT0RZIj09PWR8fCJIRUFEIj09PWR8fCIjRE9DVU1FTlQiPT09ZClyZXR1cm4iUGFnZTogIituZDtpZigiU0VMRUNUIj09PWQpe2lmKGEpe3ZhciBlPWEubm9kZU5hbWU/YS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpOm51bGw7aWYoIlNFTEVDVCIhPT1lKXZhciBmPW51bGw7ZWxzZXt2YXIgaz1jYyhhLmlkKSxoPUsoayxhLm5hbWUsZSksYj1udWxsO2lmKCFhLm11bHRpcGxlKXt2YXIgZz1hLm9wdGlvbnMmJi0xPGEuc2VsZWN0ZWRJbmRleD9hLm9wdGlvbnNbYS5zZWxlY3RlZEluZGV4XTpudWxsO2cmJihiPUsoZy5sYWJlbCxnLmlubmVyVGV4dCxnLnRleHRDb250ZW50KSl9Zj1iPyJbIitoKyJdIHRvIHZhbHVlIFsiK2IrIl0iOmh9fWVsc2UgZj1udWxsO3JldHVybiBmfWlmKCJURVhUQVJFQSI9PT1kKXtpZihhKXt2YXIgdz1hLm5vZGVOYW1lP2Eubm9kZU5hbWUudG9VcHBlckNhc2UoKTpudWxsO2lmKCJURVhUQVJFQSIhPT13KXZhciBtPW51bGw7ZWxzZXt2YXIgbj1jYyhhLmlkKTttPUsobixhLm5hbWUsdyl8fGEubm9kZU5hbWV9fWVsc2UgbT1udWxsO3JldHVybiBtfXZhciBhYT1pYihLKGEuaW5uZXJUZXh0LGEudGV4dENvbnRlbnQpKTtpZihhYSlyZXR1cm4gYWE7amI9MDtpZihhLmNoaWxkTm9kZXMmJjA8eWEoYS5jaGlsZE5vZGVzKSlyZXR1cm4gWi5DYShtZCxbYV0pfWNhdGNoKHYpe31yZXR1cm4gbGQoYSl9ZnVuY3Rpb24gZ2YoYSl7dmFyIGI9TDt0cnl7Zm9yKDtiOyl7dmFyIGM7aWYoYz1hLkchPT1iLkcpYTp7dHJ5e2Zvcih2YXIgZD1hLkcucGFyZW50Tm9kZTtkOyl7aWYoZD09PWIuRyl7Yz0hMDticmVhayBhfWQ9ZC5wYXJlbnROb2RlfX1jYXRjaChlKXt9Yz0hMX1jJiYoYT1iKTtiPWIubmV4dH19Y2F0Y2goZSl7fUw9YX1mdW5jdGlvbiBoZihhLGIsYyxkLGUpe3JldHVybntpZDphLEc6YixuYW1lOm51bGwsdHlwZTpjLGluZm86ZHx8Ii0iLHN0YXJ0OnEoKSxrYTohMSx1YTpxKCkrKGV8fDMwKSx1cmw6Z2EoKSx0aXRsZTpxYSgpLGdldE5hbWU6ZnVuY3Rpb24oKXtpZighdGhpcy5uYW1lKXt2YXIgYTsoYT14KCJ1YW0iKT8iZFRNYXNrZWRfIit0aGlzLkcubm9kZU5hbWU6UyhmZih0aGlzLkcpKSl8fChhPSItIik7dGhpcy5uYW1lPWE9a2IoYSl9cmV0dXJuIHRoaXMubmFtZX0sU2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sSWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2RvIGEua2E9ITAsYT1hLm5leHQ7d2hpbGUoYSl9fX1mdW5jdGlvbiBvZChhLGIsYyxkKXtpZih0KCkhPT1IKXJldHVybiBILmJpKGEsYixjLGQpO3RyeXt2YXIgZT1oZihqZisrLGEsYixjLGQpO3BkJiYoZS5uZXh0PUwsZS5uZXh0JiYoZS5uZXh0Llg9ZSksZ2YoZSkpO3JldHVybiBlfWZpbmFsbHl7RyhmdW5jdGlvbigpe3FkKGUpfSxlLnVhLXEoKSl9fWZ1bmN0aW9uIHdhKCl7cmV0dXJuIHQoKSE9PUg/SC5nY2koKTpMfHxudWxsfWZ1bmN0aW9uIHJkKCl7aWYodCgpIT09SClyZXR1cm4gSC5jaSgpO3ZhciBhPXdhKCk7cmV0dXJuIGE/YS5nZXROYW1lKCk6bnVsbH1mdW5jdGlvbiBrZigpe3JldHVybiB0KCkhPT1IP0guY2l0KCk6d2EoKT9MLnR5cGU6bnVsbH1mdW5jdGlvbiBsZigpe2lmKHQoKSE9PUgpcmV0dXJuIEguY2loKCk7dmFyIGE9d2EoKTtyZXR1cm4gYT9hLkc6bnVsbH1mdW5jdGlvbiBzZCgpe3JldHVybiB0KCkhPT1IP0guZ3BpKCk6aGF9ZnVuY3Rpb24gdGQoKXtyZXR1cm4gdCgpIT09SD9ILnBpKCk6aGE/aGEuZ2V0TmFtZSgpOm51bGx9ZnVuY3Rpb24gbWYoKXtyZXR1cm4gdCgpIT09SD9ILnBpdCgpOmhhP2hhLnR5cGU6bnVsbH1mdW5jdGlvbiB1ZCgpe3JldHVybiB0KCkhPT1IP0gucGl2KCk6aGE/aGEudWE6bnVsbH1mdW5jdGlvbiB2ZCgpe2Zvcih2YXIgYT1MO2E7KWEuRz1udWxsLGE9YS5uZXh0O0w9dm9pZCAwfWZ1bmN0aW9uIHFkKGEpe2lmKHQoKSE9PUgpSC5laShhKTtlbHNlIGlmKEwpe2Zvcih2YXIgYj1MO2IubmV4dCYmYiE9PWE7KWI9Yi5uZXh0O2I9PT1hJiYocmQoKSYmKGhhPUwpLGIuRz1udWxsLGIuWCYmKGIuWC5uZXh0PWIubmV4dCksYi5uZXh0JiYoYi5uZXh0Llg9Yi5YKSxiPT09TCYmKEw9Yi5uZXh0KSl9fWZ1bmN0aW9uIGlhKGEsYixjKXt2YXIgZD0hMSxlPUMoImRvTm90RGV0ZWN0Iik/QygiZG9Ob3REZXRlY3QiKS5zcGxpdCgiLCIpOm51bGw7aWYoYyYmZSlmb3IodmFyIGY9MDtmPGUubGVuZ3RoO2YrKyllW2ZdPT09YyYmKGQ9ITApO2R8fChifHwoYj1hKSx6YShkb2N1bWVudCxhLGZ1bmN0aW9uKGEpe2lmKCJib29sZWFuIiE9PXR5cGVvZiBhLmlzVHJ1c3RlZHx8IXgoIm90ZSIpfHxhLmlzVHJ1c3RlZCl7dmFyIGM9YS50YXJnZXR8fGEuY3VycmVudFRhcmdldHx8YS5zcmNFbGVtZW50fHxudWxsLGQ9YjtpZigoIktEIj09PWR8fCJLVSI9PT1kKSYmYyYmInBhc3N3b3JkIiE9PWMudHlwZSYmKGE9YS5rZXlDb2RlfHxhLmNoYXJDb2RlKSlpZih4KCJ1YW0iKSl7dmFyIGU9U3RyaW5nLmZyb21DaGFyQ29kZShhKTsiYSI8PWUmJiJ6Ij49ZXx8IkEiPD1lJiYiWiI+PWV8fCIwIjw9ZSYmIjkiPj1lfHwoZCs9YSl9ZWxzZSBkKz1hO29kKGMsZCx2b2lkIDAsMzApfX0pKX1mdW5jdGlvbiBuZihhKXsocGQ9YSl8fHZkKCl9ZnVuY3Rpb24gb2YoKXtyZXR1cm4gd2R9ZnVuY3Rpb24gbGIoKXt2YXIgYT1lYztpZihNKXt2YXIgYj1NLmRvbUxvYWRpbmc7aWYoIXQoKS5zeW4mJjZFNDxNYXRoLmFicyhiLWEpKXJldHVybiBhO3ZhciBiPU0ubmF2aWdhdGlvblN0YXJ0LGM9TS5yZWRpcmVjdFN0YXJ0LGQ9TS5mZXRjaFN0YXJ0LGU9Yis2RTQ7YiYmKGM/YT1lPmM/YjpjOmQmJihhPWU+ZD9iOmQpKX1yZXR1cm4gTWF0aC5mbG9vcihhKX1mdW5jdGlvbiBwZigpe3ZhciBhPU0/TS5sb2FkRXZlbnRTdGFydDowO3JldHVybiBhPGxiKCk/MDphfWZ1bmN0aW9uIGZjKCl7cmV0dXJuIE0/TS5sb2FkRXZlbnRFbmQ6MH1mdW5jdGlvbiB4ZChhKXtBYS0tO2lmKCFBYSYmTylmb3IodmFyIGI9MDtiPGdjLmxlbmd0aDtiKyspdHJ5e2djW2JdKCl9Y2F0Y2goYyl7fTA+PUFhJiZxZihhKTthPVIoKTthIT09dCgpJiZhLnNvbGUoKX1mdW5jdGlvbiBoYyhhLGIpe2lmKGphKXt2YXIgYz0wO21iJiYhYSYmKGM9Ynx8ZmMoKSk7Y3x8KGM9cSgpKTtrYShqYS5pZCxjKTt3ZD1jO2phPW51bGw7YmEoKX19ZnVuY3Rpb24gcmYoKXtoYygxKX1mdW5jdGlvbiBzZigpe0FhKyt9ZnVuY3Rpb24gdGYoKXt5ZD0hMH1mdW5jdGlvbiB6ZCgpe2phJiYhTyYmKE89bmIoIl9vbmxvYWRfIiwiX2xvYWRfIixudWxsLGphKSl9ZnVuY3Rpb24gQWQoYSl7cihnYyxhKX1mdW5jdGlvbiB1ZihhKXtyKGljLGEpfWZ1bmN0aW9uIHFmKGEpe2E9YT9NYXRoLm1heChmYygpLGEpOmZjKCk7dmFyIGI9cGYoKSxjPXQoKTtpZihPKXtpZihhJiZiJiZhPmIpe3ZhciBkPXEoKS1hOzVFMzwoMD5kPy0xKmQ6ZCkmJihhKz1kKTtrYShPLmlkLGEsYil9ZWxzZSBrYShPLmlkKTtPPSExfXlkfHwoeCgibG11dCIpJiZjLmFWQ0wmJmphP2MuYVZDTChmdW5jdGlvbigpeyFqYXx8bGF8fGMuc1VBfHxUfHxoYygwLGMuZ1ZDUCgpKX0pOmhjKCkpfWZ1bmN0aW9uIHZmKCl7aWYoIUJkfHwwPEFhKUJkPSEwLGJhKCkseGQoKX1mdW5jdGlvbiBDZCgpe2JhKCk7aWYoIWpjKXt2YXIgYT1SKCk7YSE9PXQoKSYmYS5pb2xtKCk7emQoKTtqYz0hMDtHKHZmLDApfX1mdW5jdGlvbiBEZCgpeyJsb2FkZWQiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmYmEoKTsiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmQ2QoKX1mdW5jdGlvbiBrYygpe2JhKCk7amN8fCgiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9FZD9tYSghMSwhMCk6KEVkPSEwLEcoa2MsM0UzKSk6RyhrYywzRTMpKX1mdW5jdGlvbiB3Zigpe2xjKCExKTtpZigwPG9iLmxlbmd0aClmb3IodmFyIGE9RmQmJiF4KCJkc25kYiIpJiYhQmEoKSxiPTA7YjxvYi5sZW5ndGg7YisrKXRyeXt2YXIgYz1vYltiXTthP0dkKGMucGF0aCxjLmRhdGEpOkhkKGMucGF0aCwhMSxjLmRhdGEsbnVsbCl9Y2F0Y2goZil7fWlmKCFJZCl0cnl7dmQoKTtmb3IodmFyIGE9VSxkPWEubGVuZ3RoOzA8PS0tZDspe3ZhciBlPWFbZF07SmQoZS5vYmplY3QsZS5ldmVudCxlLmJhKX1VPVtdO21iPU09aGI9Z2I9bnVsbDtJZD0hMH1jYXRjaChmKXt9cGJ8fChwYj0hMCxhYygpKX1mdW5jdGlvbiB4Zigpe2xjKCEwKTtwYnx8KHBiPSEwLGFjKCkpfWZ1bmN0aW9uIHFiKGEpe3goImRzc3MiKT9tYygiZHRTYSIsYSk6Q2EoImR0U2EiLGEsdm9pZCAwLHgoInNzYyIpKX1mdW5jdGlvbiBuYyhhLGIsYyxkKXt2YXIgZT1yYighMCk7Yz1jfHxxKCk7dmFyIGY9QixrPVtdOyFlJiZhJiZiJiZjP2s9WyJ0cnVlIix6KGIpLCItMSIseihhKSx6KGR8fCItIiksYyxZKCkseihvYyhLZCgpKSkseihTKHFhKCkpLnN1YnN0cmluZygwLDEwMCkpLERhLHooTGQoKSldOmYmJihrPVsiZmFsc2UiLHooZi50eXBlKSxmLmlkLHooZi5uYW1lKSx6KGYuaW5mb3x8Ii0iKSxmLnN0YXJ0LFkoKSx6KG9jKEtkKCkpKSx6KFMocWEoKSkuc3Vic3RyaW5nKDAsMTAwKSksRGEseihMZCgpKV0pO3JldHVybiBrfWZ1bmN0aW9uIHlmKCl7dmFyIGE9bnVsbCxiPSExO3RyeXtyZXR1cm4oYT13YSgpKSYmYS5HJiYhcGMmJihiPU1kKGEuRykpJiYocGM9ITAsRyhmdW5jdGlvbigpe3BjPSExfSwxKSksYn1jYXRjaChjKXtyZXR1cm4gYn19ZnVuY3Rpb24gTWQoYSl7dmFyIGI7aWYoYj1hKXtpZihiPWEuaHJlZilhOntiPWEuaHJlZi5yZXBsYWNlKCIgIiwiIikudG9Mb3dlckNhc2UoKTt2YXIgYz1bIm1haWx0bzoiXTtpZigxMT55LmllKWMucHVzaCgiamF2YXNjcmlwdDoiKTtlbHNlIGlmKC0xPT09cCgiamF2YXNjcmlwdDoiLGIpKXtiPSExO2JyZWFrIGF9Yjp7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspaWYoLTE8cChiLGNbZF0pKXtjPSEwO2JyZWFrIGJ9Yz0hMX1jP2I9ITA6KGI9Yi5zcGxpdCgiOi8vIiksYj0hKCJodHRwIj09PWJbMF18fCJodHRwcyI9PT1iWzBdfHwiZmlsZSI9PT1iWzBdKSl9Yj1ifHxNZChhLnBhcmVudE5vZGUpfXJldHVybiBifWZ1bmN0aW9uIE5kKCl7eWYoKXx8bGMoITEsITApfWZ1bmN0aW9uIHpmKGEsYixjKXt2YXIgZD0hMTt0cnl7ZD1SKCkuaVNBQygpfWNhdGNoKGspe31pZighZHx8bC50b3A9PT1sLnNlbGYpe2EmJihxYigiLSIpLHFjPVtdKTtkPXdhKCk7aWYoIWQpe3ZhciBlPXNkKCk7ZSYmT2QodGQoKSkmJjNFMz49cSgpLXVkKCkmJihkPWUpfXZhciBlPVtdLGY9cWM7ZCYmIWQua2E/KGQuSWEoKSxlPW5jKGQuZ2V0TmFtZSgpLGQudHlwZSxkLnN0YXJ0LGQuaW5mbykpOmI/ZT1uYyhudWxsLG51bGwsYi5zdGFydCxudWxsKTphJiYoZT1uYyhudWxsLG51bGwsYyxudWxsKSk7MTxmLmxlbmd0aCYmMTxlLmxlbmd0aCYmZlszXT09PWVbM10mJihmWzJdPWVbMl0sZlswXT1lWzBdLGU9Zik7ZS5sZW5ndGgmJihxYihlLmpvaW4oInwiKSkscWM9ZSwoYT1SKCkuc1NBQykmJmEoITAsITApKX19ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1xKCk7aWYoIWxhfHxQKXthfHwobGE9ITAsRyhmdW5jdGlvbigpe0coZnVuY3Rpb24oKXtyYz1sYT0hMTtQZCghMSk7bWEoITEsITAsITApO1A9ITF9LDJFMyl9LDEpKTtmb3IoYT0wO2E8aWMubGVuZ3RoO2ErKylpY1thXShsYSk7YT1udWxsO3ZhciBkPUo7UCYmZC5sZW5ndGgmJihhPWRbMF0pO3ZhciBkPUhhLmlhKCExLCEwLCEwKSxlPWQuSSYmIXJjO3NiJiYhZXx8emYoYixhLGMpO2lmKHkuc2YmJmwuZnJhbWVzKWZvcihiPTA7YjxsLmZyYW1lcy5sZW5ndGg7YisrKXRyeXtsLmZyYW1lc1tiXS5kVF8mJmwuZnJhbWVzW2JdLmRUXy5vYmMoKX1jYXRjaChmKXt9ZSYmKHNjKCEwLCExLGQpLHJjPSEwKTtQPSExfX1mdW5jdGlvbiBBZigpe3JldHVybiAwPj1BYX1mdW5jdGlvbiBCZihhLGIpe2lmKFR8fGlzTmFOKGEpfHwxMDA+YXx8MUUzPGEpcmV0dXJuITE7UGE9e3Jlc3BvbnNlQ29kZTphLG1lc3NhZ2U6YisiIn07cmV0dXJuITB9ZnVuY3Rpb24gQ2YoKXtyZXR1cm4gc2J9ZnVuY3Rpb24gUGQoYSxiKXtzYj1hO2NsZWFyVGltZW91dChRZCk7YiYmKFFkPUcoZnVuY3Rpb24oKXtzYj0hMX0sMkUzKSl9ZnVuY3Rpb24gRGYoKXtyZXR1cm4gamEmJmphLmlkfHwtMX1mdW5jdGlvbiBFZihhLGIsYyxkLGUsZixrLGgpe3ZhciBnPXEoKTtpZihlKXt2YXIgdz1mdW5jdGlvbihiKXtyZXR1cm4gZnVuY3Rpb24oZCl7aWYoUWEpZm9yKHZhciBlPVFhKCksZj0wO2Y8ZS5sZW5ndGg7ZisrKWVbZl0oYSwic3VjY2VzcyIsZCk7Zj1xKCktYjt0YyhjKXx8dGIoZi8yKTtlPWQmJmQuc3BsaXQoInwiKTtmb3IoZj0xO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdLnNwbGl0KCI9Iik7aWYoZ1swXT09PUVhfHxnWzBdPT09dWMpe2lmKGc9ZGVjb2RlVVJJQ29tcG9uZW50KGdbMV0pLHZjKGcpJiYod2MoZyksMD09PUUpKXtsLkpTQWdlbnRUZXN0RnJhbWV3b3JrQVBJJiZsLkpTQWdlbnRUZXN0RnJhbWV3b3JrQVBJLm5vdGlmeUFzc2VydE9LKCJSZWNlaXZlZCBhIG5ldyBjb29raWUgb24gdGhlIGJlYWNvbjogIitnKTt0cnl7UmQmJlJkLnJlbW92ZUl0ZW0oRWEpfWNhdGNoKEZmKXt9fX1lbHNlIGlmKCJuYW1lIj09PWdbMF0pe2lmKGc9ZCxsLmxvY2FsU3RvcmFnZSl0cnl7dmFyIGg9eGMoKSxrPWwubG9jYWxTdG9yYWdlLmdldEl0ZW0oaCksbj0wO2lmKGspe3ZhciBtPXljKGspLHc9emMobS5jb25maWcsbSk7bS5uYW1lJiYody5hZ2VudG5hbWU9bS5uYW1lKTtuPUYody5sYXN0TW9kaWZpY2F0aW9ufHwiMCIpfXZhciBhYT15YyhnKSxwPXpjKGFhLmNvbmZpZyk7cC5hZ2VudG5hbWU9YWEubmFtZTt2YXIgcj1GKHAubGFzdE1vZGlmaWNhdGlvbnx8IjAiKTtpZihyPm4pe2wubG9jYWxTdG9yYWdlLnNldEl0ZW0oaCxnKTtTZChwKTtUZChwLCEwKTtVZChwKTt2YXIgeD1DKCJyaWQiKSx1PUMoInJwaWQiKTt4JiYocC5yaWQ9eCk7dSYmKHAucnBpZD11KTtyPihWLmxhc3RNb2RpZmljYXRpb258fDApJiYoVj1WZChwKSl9fWNhdGNoKEZmKXt9fWVsc2UiZW5hYmxlZCI9PT1nWzBdJiYiZmFsc2UiPT09Z1sxXSYmKG1jKCJkdERpc2FibGVkIiwhMCksdCgpLmRpc2FibGVkPSEwKX19fShnKTt2YXIgbT1mdW5jdGlvbihiKXtpZihRYSlmb3IodmFyIGU9UWEoKSxmPTA7ZjxlLmxlbmd0aDtmKyspZVtmXShhLCJmYWlsIixiKTtpZihsYSYmeS5zZilyKG9iLHtwYXRoOmMsZGF0YTpkfSk7ZWxzZSB0cnl7aWYobC5sb2NhbFN0b3JhZ2Upe3ZhciBnPXhjKCk7bC5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShnKX19Y2F0Y2god2gpe319fWlmKCJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gYil7aWYoYi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZnVuY3Rpb24oKXtpZihhKXtpZig0PT09YS5yZWFkeVN0YXRlKXRyeXsyMDA9PT1hLnN0YXR1cz93KGEucmVzcG9uc2VUZXh0KTptKGEuc3RhdHVzKX1jYXRjaCh2KXttKDApfWZpbmFsbHl7RyhmdW5jdGlvbigpe2E9bnVsbH0sMil9aWYoYyl0cnl7Yy5KYShiLnJlYWR5U3RhdGUsYi5zdGF0dXMsayxoKX1jYXRjaCh2KXt9fX19KGIsYSksZiYmInRpbWVvdXQiaW4gYiYmIm9udGltZW91dCJpbiBiJiYoZT1BKCJ4dCIpKSliLnRpbWVvdXQ9ZSxiLm9udGltZW91dD1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7YS5hYm9ydCgpfWNhdGNoKGFhKXt9fX0oYixlKX1lbHNlIGIub25sb2FkPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3coYS5yZXNwb25zZVRleHQpfX0oYil9ZnVuY3Rpb24gSGQoYSxiLGMsZCxlLGYsayxoLGcpe3ZvaWQgMD09PWQmJihkPW51bGwpO3ZvaWQgMD09PWUmJihlPSIiKTt2b2lkIDA9PT1mJiYoZj0hMCk7dm9pZCAwPT09ayYmKGs9MCk7dm9pZCAwPT09aCYmKGg9MSk7dm9pZCAwPT09ZyYmKGc9ITEpO2Zvcih2YXIgdz0zLG09ITE7MDx3Oyl0cnl7dmFyIG49eCgiY29ycyIpO2lmKG4pe3ZhciBhYT1YYigpOyJ3aXRoQ3JlZGVudGlhbHMiaW4gYWF8fChsLlhEb21haW5SZXF1ZXN0P2FhPW5ldyBsLlhEb21haW5SZXF1ZXN0OmFhPW51bGwpO3ZhciB2PWFhfWVsc2Ugdj1YYigpO2lmKCF2KXJldHVybiExOyJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gdj92Lm9wZW4oIlBPU1QiLGEsYik6di5vcGVuKCJQT1NUIixhKTsic2V0UmVxdWVzdEhlYWRlciJpbiB2JiYodi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLEJhKCl8fGc/ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI6InRleHQvcGxhaW47Y2hhcnNldD1VVEYtOCIpLGUmJmUhPT1nYSgpJiYhbiYmdi5zZXRSZXF1ZXN0SGVhZGVyKHViLHZiKGUsQSgibWhsIikpKSk7RWYoZCx2LGEsYyxmLGIsayxoKTt2LnNlbmQoYyk7dz0wO209ITB9Y2F0Y2godmgpe3ctLX1yZXR1cm4gbX1mdW5jdGlvbiBHZihhLGIsYyxkLGUsZixrLGgsZyx3KXthPVdkKGEpO3ZhciBtPSExO2ImJihtPSFHZChjLGEpKTtpZighYnx8bSliPUhkKGMsZSxhLGssZiwhMCxoLGcsdyksZD1kJiZiO3JldHVybiBkfWZ1bmN0aW9uIEdkKGEsYil7dHJ5e3ZhciBjPW5hdmlnYXRvci5zZW5kQmVhY29uKGEsYnx8IiIpfWNhdGNoKGQpe2M9IkVycm9yIHNlbmRpbmcgc2lnbmFsIHZpYSBzZW5kQmVhY29uOiAiK2QrIjogIithfXJldHVybiBjfWZ1bmN0aW9uIHdiKGEsYil7ZnVuY3Rpb24gYygpe3RoaXMuY29uc3RydWN0b3I9YX1IZihhLGIpO2EucHJvdG90eXBlPW51bGw9PT1iP09iamVjdC5jcmVhdGUoYik6KGMucHJvdG90eXBlPWIucHJvdG90eXBlLG5ldyBjKX1mdW5jdGlvbiBYZChhLGIsYyl7aWYoIWIpe2I9WWQoKTt2YXIgZD1aZCgpO2EuYShjLCJ2SUQiLCJ2aXNpdG9ySWQiLGQsZCk7YiYmYS5hKGMsIm5WIiwiaXNOZXdWaXNpdG9yIiwiMSIsYil9fWZ1bmN0aW9uIElmKGEsYil7aWYoImNoaWxkTGlzdCI9PT1hLnR5cGUpe2Zvcih2YXIgYz1hLnJlbW92ZWROb2RlcyxkPVtdLGU9MDtlPGMubGVuZ3RoO2UrKylkLnB1c2goe246Y1tlXX0pO2M9YS5hZGRlZE5vZGVzO2lmKChlPVJhLmlnbm9yZSkmJmUubGVuZ3RoKXtmb3IodmFyIGY9W10saz0wO2s8Yy5sZW5ndGg7aysrKXt2YXIgaD1jW2tdOy0xPT09c2EoZSxoLmlkKSYmZi5wdXNoKGgpfWM9Zn0kZChiLGMsZCxhLnRhcmdldCl9ZWxzZSJhdHRyaWJ1dGVzIj09PWEudHlwZSYmeGIucHVzaCh7dGltZTpTYSx0YXJnZXQ6YS50YXJnZXQsbmFtZTphLmF0dHJpYnV0ZU5hbWUsb2xkVmFsdWU6YS5vbGRWYWx1ZX0pfWZ1bmN0aW9uIEpmKGEsYil7ImNoaWxkTGlzdCI9PT1hLnR5cGUmJiRkKGIsYS5hZGRlZE5vZGVzKX1mdW5jdGlvbiAkZChhLGIsYyxkKXtpZihiJiZiLmxlbmd0aHx8YyYmYy5sZW5ndGgpe3ZhciBlPSExO2ImJmIubGVuZ3RoJiYoU2E9YSxlPSEwKTtmb3IoYT0wO2E8VGEubGVuZ3RoO2ErKyl7dmFyIGY9VGFbYV0saz17dGltZTpTYSxub2RlczpifTtpZihlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHliW2ZdKXliW2ZdKGYsayk7YyYmYy5sZW5ndGgmJihrLnJOb2Rlcz1jLGsudGFyZ2V0PWQpO1dbZl0ucHVzaChrKX19fWZ1bmN0aW9uIGFlKGEsYil7Y2EmJihjYSYmIXpiJiYoUmEmJihBYz1SYS5jb25mfHxBYyksQWIub2JzZXJ2ZShkb2N1bWVudCxBYyksemI9ITApLFdbYV18fChXW2FdPVtdLFRhPU9iamVjdC5rZXlzKFcpLHliW2FdPWIpKX1mdW5jdGlvbiBCYyhhKXtjYSYmKFdbYV0mJihSYXx8KGRlbGV0ZSBXW2FdLHhiPVtdKSxkZWxldGUgeWJbYV0sYmVbYV09U2EpLFRhPU9iamVjdC5rZXlzKFcpLCFUYS5sZW5ndGgmJkFiJiZ6YiYmKEFiLmRpc2Nvbm5lY3QoKSx6Yj0hMSkpfWZ1bmN0aW9uIEtmKGEpe3JldHVybiBXW2FdP1dbYV06W119ZnVuY3Rpb24gTGYoYSxiKXtXW2FdPWJ9ZnVuY3Rpb24gTWYoKXtyZXR1cm4geGJ9ZnVuY3Rpb24gTmYoYSl7eGI9YX1mdW5jdGlvbiBPZihhKXtyZXR1cm4gYSYmYmVbYV18fFNhfWZ1bmN0aW9uIFBmKCl7KGNhPSEhbC5NdXRhdGlvbk9ic2VydmVyKSYmKEFiPW5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGEpe3ZhciBiPTA7dHJ5e2I9TWF0aC5mbG9vcihsLnBlcmZvcm1hbmNlLm5vdygpKX1jYXRjaChkKXt9Yj0wPj1ifHxpc05hTihiKXx8IWlzRmluaXRlKGIpPyhuZXcgRGF0ZSkuZ2V0VGltZSgpLWxiKCk6Yjtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyljZShhW2NdLGIpfSkpO2NlPShSYT10KCkuUk1PRCk/SWY6SmZ9ZnVuY3Rpb24gUWYoKXtpZighcGVyZm9ybWFuY2V8fCFwZXJmb3JtYW5jZS50aW1pbmcpcmV0dXJuW107dmFyIGE9cGVyZm9ybWFuY2UudGltaW5nLGI9cGVyZm9ybWFuY2UubmF2aWdhdGlvbnx8e3R5cGU6IiJ9LGM9e307aWYocGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSl7dmFyIGQ9cGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgibmF2aWdhdGlvbiIpO2lmKGQubGVuZ3RoJiYwPGQubGVuZ3RoKXt2YXIgZD1kWzBdO2ZvcihmIGluIGQpe3ZhciBlPWY7ZFtlXSYmIWFbZV0mJihjW2VdPWRbZV0pfX19dmFyIGY9YS5uYXZpZ2F0aW9uU3RhcnQ7cmV0dXJuKCF0KCkuZ29vZ2xlQm90fHx0KCkuc3luKSYmMDxmPyhiPVsiYSIsYi50eXBlLCJiIixmXSxiPUJiKGEsYix2b2lkIDAsYykpOltdfWZ1bmN0aW9uIEJiKGEsYixjLGQpe2M9Yz9hLnN0YXJ0VGltZTphLm5hdmlnYXRpb25TdGFydDtDYz10KCkuZ0ZVP3QoKS5nRlUoKTp7fTtkPWR8fHt9O2Zvcih2YXIgZSBpbiBEYylpZihEYy5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIGY9RGNbZV07aWYoZj1hW2ZdfHxkW2ZdKXt2YXIgaz1mPj1jOyJqIj09PWUmJmY9PT1jJiYoaz0hMSk7dmFyIGg9MDw9cCgidXZ3eHlBIixlKSxnPWY7aD9rPTA8PWZ8fCJ5Ij09PWUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIGY6Zz1NYXRoLnJvdW5kKGYtYyk7ayYmKGIucHVzaChlKSxiLnB1c2goZykpfX0wPT09RSYmKGEuaW5pdGlhdG9yVHlwZT8oInhtbGh0dHByZXF1ZXN0Ij09PWEuaW5pdGlhdG9yVHlwZT8oYi5wdXNoKCJ6IiksdGFbYS5uYW1lXT8oYi5wdXNoKCIxMSIpLGRlbGV0ZSB0YVthLm5hbWVdKTpiLnB1c2goIjEiKSk6dGFbYS5uYW1lXSYmKGIucHVzaCgieiIpLGIucHVzaCgiMDEiKSxkZWxldGUgdGFbYS5uYW1lXSksImZyYW1lIj09PWEuaW5pdGlhdG9yVHlwZT8oYi5wdXNoKCJCIiksYi5wdXNoKCJmIikpOiJpZnJhbWUiPT09YS5pbml0aWF0b3JUeXBlfHwic3ViZG9jdW1lbnQiPT09YS5pbml0aWF0b3JUeXBlPyhiLnB1c2goIkIiKSxpc05hTihDY1thLm5hbWVdKT9iLnB1c2goImkiKTpiLnB1c2goImkiK0NjW2EubmFtZV0pKTowPD1hLmZyYW1lSWQmJihiLnB1c2goIkIiKSxiLnB1c2goInIiK2EuZnJhbWVJZCkpKTp0YVthLm5hbWVdJiYoYi5wdXNoKCJ6IiksYi5wdXNoKCIwMSIpLGRlbGV0ZSB0YVthLm5hbWVdKSk7cmV0dXJuIGJ9ZnVuY3Rpb24gZGUoYSl7Zm9yKHZhciBiPXtuOi0xLG5zOi0xLHJzOi0xLHJlOi0xLGZzOi0xLGRzOi0xLGRlOi0xLGNzOi0xLGNlOi0xLHNzOi0xLHJxczotMSxyc3M6LTEscnNlOi0xLGRsOi0xLGRpOi0xLGRjczotMSxkY2U6LTEsZGM6LTEsbHM6LTEsbGU6LTEsdDotMSxlYnM6LTEsZGJzOi0xLHM6LTEsaTpudWxsLGl0Oi0xLGZyOi0xLGY6LTF9LGM9MDtjPGEubGVuZ3RoO2MrPTIpaWYoYVtjXSl7dmFyIGQ9YVtjKzFdLGU9UmZbYVtjXV07ZSYmKGJbZV09RihkKXx8ZCl9cmV0dXJuIGJ9ZnVuY3Rpb24gU2YoKXt4KCJudGQiKXx8Q2IoZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWImJiFlZSYmVCl7ZWU9ITA7dmFyIGU9UWYoKTthLmEoZCwibnQiLCJuYXZpZ2F0aW9uVGltaW5nIixmdW5jdGlvbigpe3JldHVybiBlLmpvaW4oIiIpfHwiMCJ9LGUpfX0pfWZ1bmN0aW9uIEVjKGEsYixjLGQsZSxmKXthLmRvbU5vZGVzfHwoYS5kb21Ob2Rlcz15YSh4YSgiKiIpKSk7dmFyIGs9W107aWYoYS5uZXh0JiYwPGEubmV4dC5sZW5ndGgpe3ZhciBoO2ZvcihoPTA7aDxhLm5leHQubGVuZ3RoO2grKyl7dmFyIGc9YS5uZXh0W2hdO2c9RWMoZyxiKzEsYyxkLGUpO3ZhciB3PWcucmVzdWx0O2lmKHcpay5wdXNoKHcpO2Vsc2UgaWYoIWcuYWEpcmV0dXJue2FhOiExLHJlc3VsdDpudWxsfX1pZihjKWZvcihoPTA7aDxhLm5leHQubGVuZ3RoO2grKylpZihnPWEubmV4dFtoXSxnLnN0b3ApYS5zdG9wJiZnLnN0b3A+YS5zdG9wJiYoRGIoImwiLGEuaWQsZy5zdG9wKSxhLnN0b3A9Zy5zdG9wKTtlbHNle2Euc3RvcD0hMTticmVha319aWYoIWQmJiFlJiYoIWEuc3RvcHx8Y2EmJmEuTCkpcmV0dXJuIGEuTCYmZmUoYSkse2FhOiExLHJlc3VsdDpudWxsfTtmJiYoRmM9YS5zdG9wLWEuc3RhcnQpO2M9W107Y1swXT1iLnRvU3RyaW5nKCk7Y1sxXT1hLmlkO2NbMl09eihhLnNhfHxhLm5hbWUpO2NbM109eihhLnR5cGUpO2NbNF09YS5pbmZvP3ooYS5pbmZvKToiLSI7Y1s1XT1hLnN0YXJ0O2NbNl09YS5zdG9wfHwwO2NbN109YS5kb21Ob2RlcztjWzhdPSItIjtjWzldPSItIjtjWzEwXT0iLSI7Y1sxMV09Ii0iO2NbMTJdPSItIjtjWzEzXT0iLSI7Y1sxNF09Ii0iO2NbMTVdPSItIjtjWzE2XT0iLSI7ZT04OzE9PT1iJiZhLmNoaWxkRnJhbWVBY3Rpb25zJiYoY1s4XT1hLmNoaWxkRnJhbWVBY3Rpb25zLGU9OSk7YS5ZJiYoY1s5XT1hLlksZT0xMCk7YS54aHJVcmwmJihjWzEwXT16KGEueGhyVXJsKSxlPTExKTthLm9hJiYoY1sxMV09IjEiLGU9MTIpO2lmKDA9PT1FJiZhLnhoclVybCl7YTp7aWYoYj1HYyhhLnhoclVybCxhLnN0YXJ0KSlpZihmPWIuc3RhcnRUaW1lLDA8Zil7Yj1CYihiLFsiYiIsdWEoKS50aW1pbmcubmF2aWdhdGlvblN0YXJ0K01hdGgucm91bmQoZildLCEwKS5qb2luKCIiKTticmVhayBhfWI9bnVsbH1iJiYheCgibnRkIikmJihjWzEyXT1iLGU9MTMpfWI9ZG9jdW1lbnQucmVmZXJyZXI7Il9sb2FkXyI9PT1hLm5hbWUmJmImJihjWzEzXT16KGIpLGU9MTQpO2EuUCYmYS5UJiYoY1sxNF09YS5QLWEuc3RhcnQsY1sxNV09YS5ULWEuc3RhcnQsZT0xNik7YS52aXN1YWxseUNvbXBsZXRlJiYwPGEudmlzdWFsbHlDb21wbGV0ZSYmKGNbMTZdPWEudmlzdWFsbHlDb21wbGV0ZS1hLnN0YXJ0LGU9MTcpO2Muc3BsaWNlKGUsYy5sZW5ndGgtZSk7Yj0hMTthLnN0b3B8fGR8fGEubmV4dCYmYS5uZXh0Lmxlbmd0aHx8IUhjKGEpPyhrLnVuc2hpZnQoYy5qb2luKCJ8IikpLEljKyspOkhjKGEpJiYoYj0hMCk7YT17YWE6YixyZXN1bHQ6bnVsbH07MTxrLmxlbmd0aD9hLnJlc3VsdD1rLmpvaW4oIiwiKTprWzBdJiYoYS5yZXN1bHQ9a1swXSk7cmV0dXJuIGF9ZnVuY3Rpb24gZ2UoYSxiLGMsZCl7dmFyIGU9Il9sb2FkXyI9PT1hLnR5cGU7aWYoYS5wYXJlbnRGcmFtZUFjdGlvbk5hbWUpe3ZhciBmPVtdLGs9WyIwIl07a1sxXT1hLnBhcmVudEFjdGlvbklkO2tbMl09eihhLnBhcmVudEZyYW1lQWN0aW9uTmFtZSk7a1szXT1hLnBhcmVudEFjdGlvbkxpbmtUeXBlO2ZbMF09ay5qb2luKCJ8Iik7ZlsxXT1FYyhhLDEsYixjLGQsZSkucmVzdWx0O3JldHVybiBmWzFdP2Yuam9pbigiLCIpOm51bGx9cmV0dXJuIEVjKGEsMSxiLGMsZCxlKS5yZXN1bHR8fG51bGx9ZnVuY3Rpb24gVGYoYSl7Zm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBKYyhhLGIpe3ZhciBjPVtdLGQ9W10sZT0wLGY7Zm9yKGYgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGYpKXtlKys7dmFyIGs9YVtmXTtrPyJvYmplY3QiPT09dHlwZW9mIGsmJihUZihrKXx8Im51bWJlciI9PT10eXBlb2Ygay5sZW5ndGgmJiFrLmxlbmd0aD9yKGMsZik6cihkLGZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBKYyhiLGEpfX0oaykpKTpyKGMsZil9Zm9yKGY9MDtmPGMubGVuZ3RoO2YrKylkZWxldGUgYVtjW2ZdXTtjLmxlbmd0aD09PWUmJnIoZCxmdW5jdGlvbigpe3JldHVybiBKYyhiLGIpfSk7cmV0dXJuIGR9ZnVuY3Rpb24gS2MoYSxiLGMsZCxlKXswPD1zYShoZSxhLnR5cGUpfHxhLnN0b3B8fGUuZGErKzt2YXIgZj1udWxsO2lmKGEueGhyVXJsKXthOntpZihmPUdjKGEueGhyVXJsLGEuc3RhcnQpKXt2YXIgaz1mLnN0YXJ0VGltZTtpZigwPGspe2Y9QmIoZixbImIiLHVhKCkudGltaW5nLm5hdmlnYXRpb25TdGFydCtNYXRoLnJvdW5kKGspXSwhMCk7Zj1kZShmKTticmVhayBhfX1mPW51bGx9ZiYmeCgibnRkIil9Zm9yKHZhciBrPVtdLGg9MDtoPGEubmV4dC5sZW5ndGg7aCsrKXt2YXIgZz1hLm5leHRbaF07aWYoTGMoZSxnKSl7aWYoIWllKGssS2MoZyxiLGMsZCxlKSkpcmV0dXJuIG51bGw7aWYoYilpZihnLnN0b3ApYS5zdG9wJiZnLnN0b3A+YS5zdG9wJiYoRGIoImwiLGEuaWQsZy5zdG9wKSxhLnN0b3A9Zy5zdG9wKTtlbHNle2Euc3RvcD1udWxsO2JyZWFrfX1lbHNlIGJyZWFrfWlmKCFjJiYhZCYmKCFhLnN0b3B8fGNhJiZhLkwpKXJldHVybiBhLkwmJmZlKGEpLG51bGw7Il9sb2FkXyI9PT1hLnR5cGUmJihGYz1hLnN0b3AtYS5zdGFydCk7RWIoYSk7cmV0dXJue2lkOmEuaWQsdHlwZTphLnR5cGUsbmFtZTphLnNhfHxhLm5hbWUsdGltaW5nOntzdGFydDphLnN0YXJ0LHN0b3A6YS5zdG9wfSxkb21Ob2RlczphLmRvbU5vZGVzfHx5YSh4YSgiKiIpKSxpbmZvOmEuaW5mbyx4aHJVcmw6YS54aHJVcmwsbG9hZEFjdGlvblJlZmVycmVyOiJfbG9hZF8iPT09YS5uYW1lP2RvY3VtZW50LnJlZmVycmVyOiIiLHNvdXJjZTp7dGl0bGU6YS5XKCksdXJsOmEuSygpfSxjaGlsZEZyYW1lQWN0aW9uczphLmNoaWxkRnJhbWVBY3Rpb25zLHdlYlNvY2tldFJlcXVlc3RJZDphLlksaXNDdXN0b21BY3Rpb246YS5vYSx4aHJDYWxsYmFja1RpbWluZzp7c3RvcDphLlQsc3RhcnQ6YS5QfSx2aXN1YWxseUNvbXBsZXRlOmEudmlzdWFsbHlDb21wbGV0ZS1hLnN0YXJ0LHBhcmVudEFjdGlvbklkOmEucGFyZW50QWN0aW9uSWQscGFyZW50RnJhbWVBY3Rpb25OYW1lOmEucGFyZW50RnJhbWVBY3Rpb25OYW1lLHBhcmVudEFjdGlvbkxpbmtUeXBlOmEucGFyZW50QWN0aW9uTGlua1R5cGUsZXJyb3JzOmEuZXJyb3JzLHJlc291cmNlVGltaW5nOmYsc3ViQWN0aW9uczowPGsubGVuZ3RoP2s6bnVsbH19ZnVuY3Rpb24gTGMoYSxiKXtyZXR1cm4gYS5kYTxBKCJtb2EiKXx8MDw9c2EoaGUsYi50eXBlKX1mdW5jdGlvbiBpZShhLGIpe3JldHVybiBiPyhyKGEsYiksITApOiExfWZ1bmN0aW9uIFVmKCl7cmV0dXJuIEhhfWZ1bmN0aW9uIG1hKGEsYixjLGQpe1VhPSExO2E9SGEuaWEoYSxiLGMpO3JldHVybiBhLkk/c2MoISFjLCEhZCxhKTowfQpmdW5jdGlvbiBGYihhLGIsYyxkKXtmb3IodmFyIGU9TWMoKSxmPTA7ZjxlLmxlbmd0aDtmKyspdHJ5e2VbZl0oYSxiLGMsZCl9Y2F0Y2goayl7fX1mdW5jdGlvbiBzYyhhLGIsYyxkLGUpe2lmKHQoKS5kaXNhYmxlZClyZXR1cm4gMDt2YXIgZj1jLnJlZmVycmVyfHxnYSgpO2YhPT1nYSgpfHx4KCJjb3JzIil8fDEhPT1BKCJicCIpfHwoZj0iIik7dmFyIGs9cSgpO0hhLmEoYy5JLCJ0aW1lIiwidGltZXN0YW1wIixrLGspO3ZhciBoPXksZz0hMDsoaz1hJiZGZCYmIXgoImRzbmRiIikmJiFCYSgpJiYhZHx8eCgic3ZOQiIpKXx8KGI/Zz0hMTphJiYoaC5zZnx8aC5tc2Y/Zz0hMTp4KCJsYWIiKT9nPSExOihoLmllfHxoLmVkZ2UpJiZQJiYoZz0hMSkpKTthPWc7dmFyIHc9ZjtiPUMoInJlcG9ydFVybCIpO3ZhciBoPVtdLGc9MTxBKCJicCIpLG09eCgiY29ycyIpPyJjb3JzIjoicG9zdCIsbj1FYSxsPUZhO2cmJihuPXVjLDA9PT1FJiYobD0ibGF0ZW5jeSIpKTt2YXIgdj1uLHA9bCxsPXt9LHU9QSgiYnAiKTtsW3BdPWVuY29kZVVSSUNvbXBvbmVudChyYShGYSkpO2xbR2JdPWplKGVuY29kZVVSSUNvbXBvbmVudCh3fHwiIiksQSgibWhsIikpWzBdO2wuZmxhdm9yPW07bFt2XT1lbmNvZGVVUklDb21wb25lbnQoSGIoKSk7bC5icD11O2wuYXBwPWVuY29kZVVSSUNvbXBvbmVudChDKCJhcHAiKSk7bC5mb3JtYXQ9QmEoKT8ibHp3IjoiIjtsLnR5cGU9Mz51PyJqcyI6ImpzIit1O2wuZHRBZGs9ZW5jb2RlVVJJQ29tcG9uZW50KHJhKGtlKSk7bC5jb250ZW50VHlwZT1lOzA9PT1FJiYobC5zdnJpZD1WYSgpLGxbV2FdPWVuY29kZVVSSUNvbXBvbmVudChJYighMCkpKTsxIT09dXx8SGIoKXx8KGxbdl09Im51bGwiKTtlPW47bT1bXTtuPUEoImJwIik7dj14KCJjb3JzIik7aWYoMTxuKW09WyJ0eXBlIixlLCJzdnJpZCIsImZsYXZvciIsR2IsV2FdO2Vsc2UgaWYodnx8ayYmdyltPVtlLEZhLEdiXSwwPT09RSYmcihtLFdhKTt2JiZyKG0sImR0QWRrIik7MjxuJiZyKG0sImJwIik7QygiYXBwIikmJnIobSwiYXBwIik7QmEoKSYmcihtLCJmb3JtYXQiKTtyKG0sImNvbnRlbnRUeXBlIik7ZT1tO2Zvcih6IGluIGUpZS5oYXNPd25Qcm9wZXJ0eSh6KSYmKHc9ZVt6XSxsW3ddJiZyKGgsdysiPSIrbFt3XSkpO3ZhciB6PWguam9pbigiOyIpO2cmJih6PWguam9pbigiJiIpKTt6JiYoYis9Ij8iK3opO3o9YjtiPWMuSS50YSgpO2g9dCgpLnN5bj8xNDVFNDpBKCJtc2wiKTtoPWIubGVuZ3RoJWg/TWF0aC5mbG9vcihiLmxlbmd0aC9oKSsxOk1hdGguZmxvb3IoYi5sZW5ndGgvaCk7ISgxPGgpfHwxPmh8fDEwMDxoP2I9W2JdOihoPXQoKS5zeW4/MTQ1RTQ6QSgibXNsIiksZz0ic2lkPSIrcSgpKyImcCNpbmRleCNfI3RvdGFsIz0iLDE9PT1BKCJicCIpJiYoMD09PUUmJihnPSJzdnJpZD0iK1ZhKCkrIiYiK2cpLEMoImFwcCIpJiYoZz0iYXBwPSIrQygiYXBwIikrIiYiK2cpKSxiPWplKGIsaCxnKSk7aD0hMDtmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWg9ZmEoR2YsYltnXSxrLHosaCxhLGYsYy5JLGcsYi5sZW5ndGgsZCksRGE9cSgpO3JldHVybiBoPzI6MX1mdW5jdGlvbiBsZSgpe3ZhciBhPXVhKCksYj1hP2EudGltaW5nOiExO3JldHVybiBhJiZiJiYoYT1iLmRvbUNvbXBsZXRlLGI9Yi5kb21Db250ZW50TG9hZGVkRXZlbnRFbmQsYXx8Yik/YT9hOmI6TmN9ZnVuY3Rpb24gVmYoKXtYYXx8KFhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRvYzpyZHkiKSk7aWYoWGEuZG9TY3JvbGwpe3ZhciBhPWZ1bmN0aW9uKCl7dHJ5e1hhLmRvU2Nyb2xsKCJsZWZ0IiksWGE9bnVsbCxOYz1xKCksYmEoKX1jYXRjaChiKXtHKGEsMCl9fTthKCl9ZWxzZSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmdW5jdGlvbigpe05jPXEoKTtiYSgpfSwhMSl9ZnVuY3Rpb24gV2YoYSl7bmEoYSl9ZnVuY3Rpb24gbmEoYSl7aWYoVWEpe3ZhciBiPSExO2E/cSgpK2E8bWUmJihiPSEwKTpiPSEwO2ImJihjbGVhclRpbWVvdXQobmUpLFVhPSExKX1VYXx8KG1lPXEoKSsoYXx8MCksYT8obmU9RyhtYSxhKSxVYT0hMCk6bWEoKSl9ZnVuY3Rpb24gWGYoYSxiLGMpe3JldHVybiBtYShiLGMsITEsYSl9ZnVuY3Rpb24gWWYoKXtyZXR1cm4gdCgpLmRpc2FibGVkfWZ1bmN0aW9uIFpmKGEpe3IoTWMoKSxmdW5jdGlvbihiLGMsZCxlKXthKGUsYyxkLGUuSil9KX1mdW5jdGlvbiAkZihhLGIsYyl7b2UobnVsbCxudWxsLG51bGwsbnVsbCxhLGIsY3x8ITEpfWZ1bmN0aW9uIFlhKGEsYixjLGQpe2FbYl0mJk9jKCJfIitjKyJfIiwiIithW2JdLGQpfWZ1bmN0aW9uIGFnKCl7dmFyIGE9eSxiPWEuaWUsYz1iZy5kb2N1bWVudE1vZGUsZD1hLnRyaWRlbnQrNDtpZihhLmllKXtpZihiIT09ZClyZXR1cm4gZCsiX2FzXyIrYjtpZihjJiZjIT09YilyZXR1cm4gZCsiX2FzXyIrY31yZXR1cm4hMX1mdW5jdGlvbiBvZShhLGIsYyxkLGUsZixrKXtpZigoYXx8ZSkmJmRhKzE8PUEoIm1lcHAiKSl7ZGErKzt2YXIgaD17bWVzc2FnZTpudWxsLG5hbWU6bnVsbH07InN0cmluZyI9PT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFN0cmluZz9hfHwoYT1lKTpoPWV8fGwuZXZlbnR8fHt9O2U9d2EoKTt2YXIgZztlJiYoZz17bmFtZTplLmdldE5hbWUoKSx0eXBlOmUudHlwZX0pO2c9e21lc3NhZ2U6aC5tZXNzYWdlfHxoLm5hbWV8fGguVGF8fGguZGVzY3JpcHRpb258fGF8fGguUWF8fGguS2F8fGguZGF0YXx8aC5NYXx8IkluZGV0ZXJtaW5hYmxlIGVycm9yIG5hbWUiLGZpbGU6aC5maWxlTmFtZXx8aC5maWxlbmFtZXx8aC5zb3VyY2VVUkx8fGguTmF8fGguZmlsZXx8Ynx8IiIsbGluZTpoLmxpbmVOdW1iZXJ8fGgubGluZW5vfHxoLmxpbmV8fGguUGF8fGN8fC0xLGNvbHVtbjooaC5jb2x1bW5OdW1iZXI/aC5jb2x1bW5OdW1iZXIrMTp2b2lkIDApfHxoLk9hfHxoLmNvbG5vfHxoLmNvbHVtbnx8ZHx8LTEsc3RhY2s6cGUoaCl8fGNnKCksdXNlcklucHV0OmcsY29kZTpoLlVhfHxoLmNvZGV8fGguZXJyb3JDb2RlfHxoLnN0YXR1cyx0aW1lc3RhbXA6cSgpLWVjLGVtdWxhdGlvbk1vZGU6YWcoKSxkZWJ1Z0luZm86IiJ9OyJJbmRldGVybWluYWJsZSBlcnJvciBuYW1lIj09PWcubWVzc2FnZSYmKGE9WmEoIm1zZyIsYSksYSs9WmEoImZpbGUiLGIpLGErPVphKCJsaW5lIixjKSxhKz1aYSgiY29sdW1uIixkKSxhKz1aYSgiZXJyb3IiLGgpLGcuZGVidWdJbmZvPWEpO2cuc3RhY2smJmsmJihnLnN0YWNrPSI8d3JhcHBlcj4iK2cuc3RhY2spO2lmKGcuc3RhY2spe2lmKDEyMDA8Zy5zdGFjay5sZW5ndGgpe2I9Zy5zdGFjay5zcGxpdCgvKFxyXG58XG58XHIpL2dtKTtjPSIiO2ZvcihkPTA7ZDxiLmxlbmd0aCYmIShrPWJbZF0udHJpbSgpLDA8ay5sZW5ndGgmJihjPTI1MDxrLmxlbmd0aD9jKyhrLnN1YnN0cmluZygwLDE1MCkrIlsuLi5dIitrLnN1YnN0cmluZyhrLmxlbmd0aC0xMDApKyJcbiIpOmMrKGsrIlxuIikpLDEyMDA8Yy5sZW5ndGgpO2QrKyk7Zy5zdGFjaz1jfWcuc3RhY2s9Zy5zdGFjay5yZXBsYWNlKCJ8IiwiXnAiKS5yZXBsYWNlKC8oXHJcbnxcbnxccikvZ20sInwiKX01MDExIT09Zy5jb2RlJiYoMzAwPGcubWVzc2FnZS5sZW5ndGgmJihnLm1lc3NhZ2U9Zy5tZXNzYWdlLnN1YnN0cmluZygwLDMwMCkpLDQ9PT1BKCJicCIpPyhiPXEoKSxmPSRhKGYpfHxCLChjPSFmKSYmKGY9TigiX2Vycm9yXyIsUyhnLm1lc3NhZ2UpLGIsYiwtMSkpLHIoZi5lcnJvcnMsZyksYyYmKG9hKGYpLG5hKCkpKTooYj1xKCksYj1OKCJfZXJyb3JfIixTKGcubWVzc2FnZSksYixiLC0xKSxmPW9hKGIsZiksYiYmKDA9PT1FJiZmYShQYyksZy5maWxlJiYoYz1nLmZpbGUsMDw9Zy5saW5lJiYoYys9InwiK2cubGluZSksMDw9Zy5jb2x1bW4mJihjKz0ifCIrZy5jb2x1bW4pLE9jKCJfbG9jYXRpb25fIixjLGIpKSxZYShnLCJzdGFjayIsInN0YWNrIixiKSxZYShnLCJjb2RlIiwiY29kZSIsYiksWWEoZywidGltZXN0YW1wIiwidHMiLGIpLFlhKGcsImVtdWxhdGlvbk1vZGUiLCJlbXUiLGIpLFlhKGcsImRlYnVnSW5mbyIsImRlYnVnIixiKSxnLnVzZXJJbnB1dCYmT2MoIl91c2VyYWN0aW9uXyIsZy51c2VySW5wdXQudHlwZSsifCIrZy51c2VySW5wdXQubmFtZSxiKSxmJiZuYSgpKSkpfX1mdW5jdGlvbiBjZygpe3RyeXt0aHJvdyBFcnJvcigiIik7fWNhdGNoKGUpe3ZhciBhPXBlKGUpO2lmKGEmJjQ8YS5zcGxpdCgvXHJcbnxccnxcbi8pLmxlbmd0aClyZXR1cm4iPGdlbmVyYXRlZD5cbiIrYX1pZigoYT15LmllKSYmOT5hKXt2YXIgYT1bXSxiPTA7dHJ5e2Zvcih2YXIgYz1hcmd1bWVudHMuY2FsbGVlLmNhbGxlci5jYWxsZXI7YyYmMTA+YS5sZW5ndGg7KXt2YXIgZD1kZy5leGVjKGMudG9TdHJpbmcoKSk7YS5wdXNoKGQ/ZFsxXXx8IlthXSI6IlthXSIpO2M9Yy5jYWxsZXI7YisrfX1jYXRjaChlKXt9aWYoMzxiKXJldHVybiI8Z2VuZXJhdGVkLWllPlxuIithLmpvaW4oIlxuIil9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcGUoYSl7aWYoIWEpcmV0dXJuIG51bGw7dmFyIGI9YS5zdGFja3x8YS5MYXx8YS5WYXx8bnVsbDtyZXR1cm4hYiYmYS5lcnJvcj9hLmVycm9yLnN0YWNrOmJ9CmZ1bmN0aW9uIE9jKGEsYixjKXt2YXIgZD1xKCk7YT1OKGEsUyhiKSxkLGQsLTEpO29hKGEsYy5pZCl9ZnVuY3Rpb24gWmEoYSxiKXt2YXIgYz10eXBlb2YgYjthPSIiKyhhKyJ8IikrKGMrInwiKTtpZihudWxsPT09YilhKz0ibnVsbHwiO2Vsc2UgaWYoIm9iamVjdCI9PT1jKWZvcih2YXIgZCBpbiBiKXtpZihiLmhhc093blByb3BlcnR5KGQpJiYic3RhY2siIT09ZCYmImVycm9yIiE9PWQpe2M9ZDthKz1kKyJ8Ijt2YXIgZT10eXBlb2YgYltjXTthKz1lKyJ8Ijsib2JqZWN0IiE9PWUmJiJmdW5jdGlvbiIhPT1lJiYoYSs9YltjXSsifCIpfX1lbHNlIGErPWIrInwiO3JldHVybiBhfWZ1bmN0aW9uIGVnKGEpe3IoUWMsYSl9ZnVuY3Rpb24gYmEoKXtmb3IodmFyIGE9MDthPFFjLmxlbmd0aDthKyspUWNbYV0oKX1mdW5jdGlvbiBxZSgpe3JldHVybiBJfWZ1bmN0aW9uIE4oYSxiLGMsZCxlLGYsayxoLGcsbCxtKXttPW18fHt1cmw6bnVsbCx0aXRsZTpudWxsfTt2YXIgbj17aWQ6cmUoKSxzdGFydDpjLHN0b3A6ZCx0eXBlOmEsbmFtZTpiLGluZm86ayxkb21Ob2RlczplLG5leHQ6W10sTzpudWxsLGphOm51bGwscGFyZW50QWN0aW9uSWQ6bnVsbCxwYXJlbnRBY3Rpb25MaW5rVHlwZTpudWxsLHBhcmVudEZyYW1lQWN0aW9uTmFtZTpudWxsLHNhOm51bGwsY2hpbGRGcmFtZUFjdGlvbnM6bnVsbCxUOm51bGwsUDpudWxsLHZpc3VhbGx5Q29tcGxldGU6bnVsbCxZOmY/c2UoMSwyMTQ3NDgzNjQ3KTowLHBhcmVudDpudWxsLEdhOm0udXJsfHxsb2NhdGlvbi5ocmVmLHRpdGxlOm0udGl0bGV8fHFhKCkseGhyVXJsOmgsb2E6ZyxuYTpsLGVycm9yczpbXSxtYTotMSxyYTohMSxLOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyZW50P24ucGFyZW50LksoKTpuLkdhfSxXOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyZW50P24ucGFyZW50LlcoKTpuLnRpdGxlfSxhZGQ6ZnVuY3Rpb24oYSl7YSYmYS5uYW1lJiZyKG4ubmV4dCxhKX19O24ubWE9RyhmdW5jdGlvbigpe2lmKG4mJihuLnJhPSEwLCFuLnN0b3AmJiFSYyhuKSkpe3ZhciBhPSJBY3Rpb24gd2l0aCBpZCAiK24uaWQrIiAnIituLm5hbWUrIicgdGltZWQgb3V0ISBDaGVjayBmdWxsIHZpc2l0IGZvciByZWxhdGVkIGFjdGlvbi4gUmVjb3JkZWQgd2l0aCB2ZXJzaW9uICIrSWEoKTtuLm5hJiYoYSs9Ii4gUmVhZHlzdGF0ZTogIituLm5hLnJlYWR5U3RhdGUrIiwgeGhyIHVybDogIituLnhoclVybCsiLCBzdGF0dXM6ICIrbi5uYS5zdGF0dXMpO0phKGEsLTEpO2thKG4uaWQpfX0sMUUzKkEoIm9hdCIpKTtyZXR1cm4gbn1mdW5jdGlvbiBSYyhhKXtmb3IodmFyIGI9MDtiPGEubmV4dC5sZW5ndGg7YisrKWlmKCFhLm5leHRbYl0uc3RvcHx8UmMoYS5uZXh0W2JdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBmZyhhKXtTYy5wdXNoKGEpfWZ1bmN0aW9uIHRlKCl7Zm9yKHZhciBhPSExLGI9W10sYz0wO2M8SS5sZW5ndGg7YysrKXt2YXIgZD1JW2NdOzA8ZC5qYSYmKHEoKT5kLk8mJihkLk8rPTZFNCxyKGIsZCkpLGE9ITApfTA8Yi5sZW5ndGgmJm1hKCEwLCEwKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uamEtLTthJiZHKHRlLDFFMyl9ZnVuY3Rpb24gdWUoYSxiKXtpZihhJiYwPGIpZm9yKHZhciBjLGQ9MDtkPGEubGVuZ3RoO2QrKyl7Yz1hW2RdO2lmKGMuaWQ9PT1iKXJldHVybiBjO2lmKGMubmV4dCYmKGM9dWUoYy5uZXh0LGIpLG51bGwhPT1jKSlyZXR1cm4gY31yZXR1cm4gbnVsbH1mdW5jdGlvbiAkYShhKXt2YXIgYj1udWxsO0omJihiPXVlKEosYSkpO3JldHVybiBifWZ1bmN0aW9uIERiKGEsYixjKXtmb3IodmFyIGQ9MDtkPEpiW2FdLmxlbmd0aDtkKyspSmJbYV1bZF0oYixjKX1mdW5jdGlvbiBuYihhLGIsYyxkLGUsZixrLGgsZyxsKXtjfHwoYz1xKCkpO2E9TihiLGEsYyxudWxsLG51bGwsZSxmLGssaCxnLGwpO0RiKCJlIixhLmlkLGMpOyJib29sZWFuIj09PXR5cGVvZiBkJiZkJiYoZD1CKTtpZihkKXtpZihjPW51bGwsIm51bWJlciI9PT10eXBlb2YgZD9jPSRhKGQpOiJvYmplY3QiPT09dHlwZW9mIGQ/Yz1kOmM9QixjKWZvcihjLmFkZChhKSxhLnBhcmVudD1jLFRjKGEpLGQ9MDtkPEkubGVuZ3RoO2QrKyljPUlbZF0sYy5PPmEuc3RhcnQrMUU0JiYoYy5PPWEuc3RhcnQrMUU0KX1lbHNle1RjKGEpO3ZlKGEpO3IoSSxhKTtLYj1CO0I9YTtyKEosYSk7Zm9yKGQ9MDtkPFNjLmxlbmd0aDtkKyspU2NbZF0oYSk7YS5PPWEuc3RhcnQrMUU0O2EuamE9MTAwO0codGUsNUUzKX1yZXR1cm4gYX1mdW5jdGlvbiBUYyhhLGIpe0IhPT1hJiYoKEI9YSk/ZmEod2UsYS5pZCxiKTphYygpKX1mdW5jdGlvbiBrYShhLGIsYyl7IWImJjE9PT1hJiZ0KCkuZ1ZDUCYmKGI9dCgpLmdWQ1AoKSk7Ynx8KGI9cSgpKTt2YXIgZD1EW2FdO2QmJiFkLkwmJkJjKGEpO0RiKCJsIixhLGIpO2Q9W107aWYoSilmb3IodmFyIGU9MDtlPEoubGVuZ3RoO2UrKyl7dmFyIGY9eGUoSltlXSxhLGIsYyk7InN0cmluZyIhPT10eXBlb2YgZiYmKGRbZV09Zil9YT1udWxsO2I9W107Zm9yKGM9MDtjPEoubGVuZ3RoO2MrKylkW2NdP2E9ZFtjXTpSYyhKW2NdKXx8cihiLEpbY10uaWQpO2ZvcihjPTA7YzxJLmxlbmd0aDtjKyspZD1JW2NdLDA8PXNhKGIsZC5pZCk/KFliKEksYyksYy0tKTpYJiYoZT1LYS5nY2EoKSxkLnBhcmVudEFjdGlvbkxpbmtUeXBlPXZhJiZlW2UubGVuZ3RoLTFdPT09WD8iUyI6IkEiLFg9bnVsbCk7ZD1hO25hKCk7VGMoZCwhMCl9ZnVuY3Rpb24geGUoYSxiLGMsZCl7dmFyIGUsZixrPWEuaWQ9PT1iO2lmKGspe2Euc3RvcD1jO2QmJihhLnN0YXJ0PWQpO2EuZG9tTm9kZXM9eWEoeGEoIioiKSk7YS5tYSYmbC5jbGVhclRpbWVvdXQmJmwuY2xlYXJUaW1lb3V0KGEubWEpO3ZhciBoPWEucGFyZW50O2lmKGgmJiFoLnN0b3AmJmgucmEpe3ZhciBnPSExO2ZvcihmPTA7ZjxoLm5leHQubGVuZ3RoO2YrKylpZighaC5uZXh0W2ZdLnN0b3AmJmgubmV4dFtmXS5pZCE9PWIpe2c9ITA7YnJlYWt9Z3x8RyhmdW5jdGlvbigpe2guc3RvcHx8a2EoaC5pZCxjKX0sMCl9fWVsc2UgYS5zdG9wfHwoZT1hKTtnPSExO2lmKGEubmV4dCYmYS5uZXh0Lmxlbmd0aClmb3IoZj0xO2Y8PWEubmV4dC5sZW5ndGg7ZisrKXt2YXIgdz14ZShhLm5leHRbYS5uZXh0Lmxlbmd0aC1mXSxiLGMsZCksbT0ic3RyaW5nIj09PXR5cGVvZiB3LGc9Z3x8bXx8dyYmdy5EYT09PWI7bXx8KGU9d3x8ZSk7aWYoKGd8fGspJiZlKWJyZWFrfWlmKGt8fGcpIm9iamVjdCI9PT10eXBlb2YgZT9lLkRhPWI6ZT0iZm91bmQiO3JldHVybiBlfWZ1bmN0aW9uIGdnKCl7cmV0dXJuIEZjfWZ1bmN0aW9uIGhnKGEsYil7ZnVuY3Rpb24gYyhhKXtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylrPWQoYVtiXSwiSU1HIil8fGt9ZnVuY3Rpb24gZChhLGIpe3ZhciBjPWEuc3JjfHxhLmhyZWYsZDtpZighKGQ9IWN8fCJhYm91dDpibGFuayI9PT1jfHxjPT09bG9jYXRpb24uaHJlZnx8IklNRyI9PT1iJiZhLm5hdHVyYWxXaWR0aCkpe2lmKGI9IkxJTksiPT09YikoYj11YSgpKSYmYi5nZXRFbnRyaWVzQnlOYW1lPyhiPWIuZ2V0RW50cmllc0J5TmFtZShjKSxiPWIubGVuZ3RoJiYwIT09YlswXS5kdXJhdGlvbik6Yj0hMDtkPWJ9aWYoZClyZXR1cm4hMTtpZighUVtmXSlRW2ZdPVtdO2Vsc2UgaWYoLTEhPT1wKFFbZl0sYykpcmV0dXJuITE7UVtmXS5wdXNoKGMpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSk7cmV0dXJuITB9ZnVuY3Rpb24gZShhKXthPWEudGFyZ2V0O3ZhciBiPWEuc3JjfHxhLmhyZWYsYz1hLnRhZ05hbWV8fGEubm9kZU5hbWU7YiYmUVtmXSYmKGI9cChRW2ZdLGIpLC0xIT09YiYmKFFbZl0uc3BsaWNlKGIsMSksYj1udWxsLHJbZl18fChyW2ZdPVtdKSwhZ3x8IklNRyIhPT1jJiYiSUZSQU1FIiE9PWN8fChiPXEoKSxyW2ZdLnB1c2goe2U6YSx0OmJ9KSksUVtmXS5sZW5ndGh8fChoLnN0b3A9Ynx8cSgpLGcmJihoLnZpc3VhbGx5Q29tcGxldGU9dCgpLnhWQyhyW2ZdKSxyW2ZdPW51bGwpLHllKGYpKSkpfXZhciBmPU51bWJlcihhKSxrPSExLGg9RFtmXTtpZihoKXt2YXIgZz10KCkueFZDO3RyeXtpZihiKXt2YXIgbD1iLm5vZGVzO2ZvcihhPTA7YTxsLmxlbmd0aDthKyspe3ZhciBtPWxbYV0sbj1tLnRhZ05hbWV8fG0ubm9kZU5hbWU7IklNRyI9PT1ufHwiSUZSQU1FIj09PW58fCJMSU5LIj09PW4mJm0ucmVsJiYic3R5bGVzaGVldCI9PT1tLnJlbD9rPWQobSxuKXx8azptLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihjKG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIklNRyIpKSxjKG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIklGUkFNRSIpKSl9fX1jYXRjaCh2KXt9dmFyIHI9e319fWZ1bmN0aW9uIHllKGEpe3ZhciBiPWFiW2FdO2ImJihkZWxldGUgYWJbYV0sZGVsZXRlIFFbYV0sYi52aXN1YWxseUNvbXBsZXRlJiYtMSE9PWIudmlzdWFsbHlDb21wbGV0ZXx8KGIudmlzdWFsbHlDb21wbGV0ZT1iLnN0b3ApLGIuTD0hMSxuYSgpKX1mdW5jdGlvbiBmZShhKXt2YXIgYj1hLmlkO2EuTCYmIVFbYl0mJkcoZnVuY3Rpb24oKXtRW2JdfHx5ZShiKTtCYyhiKX0sNTApfWZ1bmN0aW9uIEhjKGEpe3ZhciBiPUEoIm1vYSIpLGM9WyJfd2FybmluZ18iLCJfZXJyb3JfIiwiX2xvZ18iLCJfcnZfIiwiX3JzXyJdO3JldHVybiBJYysxPmImJi0xPT09c2EoYyxhLnR5cGUpfWZ1bmN0aW9uIHJiKGEpe2lmKDA8TGJ8fGEmJjA8ZWEubGVuZ3RoKWlmKGE9ZWEubGVuZ3RoLDA8YSlyZXR1cm4gZWFbYS0xXTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBVYyhhKXt2YXIgYj16ZTtyZXR1cm4hIShiJiZiLmV4ZWMmJmEmJmIuZXhlYyhhKSl9ZnVuY3Rpb24gQWUoYSxiLGMsZCxlLGYsayl7aWYoZCYmVWMoZCkpcmV0dXJuIG51bGw7bGEmJihQPSEwKTt2YXIgaD1udWxsO2J8fChiPTMpO3ZhciBnPXdhKCksbD1hfHwiLSI7ZyYmKGcuaW5mbz0iLSI9PT1nLmluZm8/bDpnLmluZm8rIiwgIitsKTt2YXIgbT1yYighMSk7IW0mJmcmJmcuUiYmKG09Zy5SKTt2YXIgbj1NYihkKTt0YVtuXT0hMDtkPWQ/QmUoZCk6bnVsbDttP2t8fChoPUNlKG0sYSxxKCksYyxsLGQsZSxmKSk6Zz8zPD1iJiYoaD17dXJsOmcudXJsLHRpdGxlOmcudGl0bGV9LGg9VmMoZy5nZXROYW1lKCksZy50eXBlLGcuc3RhcnQsbnVsbCxjLGcuaW5mbyxkLGUsZixoKSxnLlI9aCxjPSEhdCgpLnhWQywxPj1MYiYmeCgieG11dCIpJiZjJiZhZShoLGhnKSk6Qj8xPD1iJiYhayYmKGg9Q2UoQi5pZCxhLHEoKSxjLGwsZCxlLGYpKTpWLmN1eCYmKGg9VmMoIlVubGlua2VkIFhIUiIsInhociIscSgpLG51bGwsYyxsLGQsZSxmKSk7cmV0dXJuIGh9ZnVuY3Rpb24gVmMoYSxiLGMsZCxlLGYsayxoLGcsbCl7dmFyIG09cGEubGVuZ3RoJiZwYVtwYS5sZW5ndGgtMV07aWYoZyYmbSYmbS54aHJVcmw9PT0oayYmay5zcGxpdD9rLnNwbGl0KCI/IilbMF06bnVsbCkmJm0uUj09PUIuaWQmJmImJmJbMF0hPT1tLkJhKXJldHVybiBtLlI7YT1uYihhLGIsYyxkLGUsZixrLGgsZyxsKTthLlA9bnVsbDthLlQ9bnVsbDtEW2EuaWRdPWE7cmV0dXJuIGEuaWR9ZnVuY3Rpb24gQ2UoYSxiLGMsZCxlLGYsayxoKXthPURbYV07dmFyIGc9MDthJiYoIWZ8fGEueGhyVXJsJiYwIT09YS54aHJVcmwuaW5kZXhPZigiaHR0cCIpfHwhZi5pbmRleE9mKCJodHRwIil8fChhLnhoclVybD1mKSxnPWEuaWQpO3JldHVybiBWYyhiLCJ4aHIiLGMsIWcmJkI/Qi5pZDpnLGQsZSxmLGssaCl9ZnVuY3Rpb24gdGMoYSl7dHJ5e3ZhciBiPUdjKGEpO2lmKGIpe3ZhciBjPShiLnJlcXVlc3RTdGFydC0oYi5yZWRpcmVjdEVuZHx8Yi5zdGFydFRpbWUpKS8yOzA8YyYmdGIoYyk7cmV0dXJuITB9fWNhdGNoKGQpe31yZXR1cm4hMX1mdW5jdGlvbiBHYyhhLGIpe3RyeXtpZihhJiZwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSl7dmFyIGMsZD1NYihhKTswPT09cChkLCIvIik/ZD1sb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QrZDowIT09cChkLCJodHRwIikmJihkPWxvY2F0aW9uLmhyZWYuc3Vic3RyKDAsbG9jYXRpb24uaHJlZi5sYXN0SW5kZXhPZigiLyIpKzEpK2QpO3ZhciBlPXBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUoZCk7YT1udWxsO3ZhciBmPU51bWJlci5NQVhfVkFMVUU7aWYoZS5sZW5ndGgpe2lmKGIpe2ZvcihjPTA7YzxlLmxlbmd0aDtjKyspe3ZhciBrPWwucGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCtNYXRoLnJvdW5kKGVbY10uc3RhcnRUaW1lKS1iOzA8PWsmJihudWxsPT1hfHxrPGYpJiYoYT1lW2NdLGY9ayl9cmV0dXJuIGF9cmV0dXJuIGVbZS5sZW5ndGgtMV19ZT1wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKCJyZXNvdXJjZSIpO2E9bnVsbDtmPU51bWJlci5NQVhfVkFMVUU7LTE9PT1kLmluZGV4T2YoIj8iKSYmKGQrPSI/Iik7Zm9yKGM9ZS5sZW5ndGgtMTswPD1jO2MtLSlpZigwPT09ZVtjXS5uYW1lLmxhc3RJbmRleE9mKGQsMCkpaWYoYilrPWwucGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCtNYXRoLnJvdW5kKGVbY10uc3RhcnRUaW1lKS1iLDA8PWsmJihudWxsPT1hfHxrPGYpJiYoYT1lW2NdLGY9ayk7ZWxzZSByZXR1cm4gZVtjXTtyZXR1cm4gYX19Y2F0Y2goaCl7fXJldHVybiBudWxsfWZ1bmN0aW9uIGlnKGEsYixjLGQsZSl7dmFyIGY9RFthXTtpZihmJiYhKGUmJjA+cChmLmluZm8sZSkmJmYubmFtZSE9PWUpJiYoYz9HKGZ1bmN0aW9uKCl7dGMoYil9LDApOnRjKGIpLGQ9ZHx8cSgpLEcoZnVuY3Rpb24oKXshUCYmRFthXSYmKGthKGEsZCksRFthXT1udWxsLGRlbGV0ZSBEW2FdKX0sRGUpLGJhKCksYz10KCkueFZDLHgoInhtdXQiKSYmYyYmIVApKWZvcihjPTA7YzxJLmxlbmd0aDtjKyspaWYoZT1JW2NdLGUuaWQ9PT1hKXtlLkw9ITA7YWJbZS5pZF09ZTticmVha319ZnVuY3Rpb24gamcoYSxiKXtpZihhKXt2YXIgYz1EW2FdO2MmJihjLlB8fGImJjQhPT1ifHwoYy5QPXEoKSkscihlYSxhKSxMYisrKX19ZnVuY3Rpb24ga2coYSl7aWYoYSl7dmFyIGI9RFthXTtiJiYoYi5UPXEoKSxMYi0tLEcoZnVuY3Rpb24oKXtmb3IodmFyIGI9LTEsZD1lYS5sZW5ndGgtMTstMT09PWImJjA8PWQ7KWVhW2RdPT09YSYmKGI9ZCksZC0tOy0xIT09YiYmKGI9PT1lYS5sZW5ndGgtMT9lYS5wb3AoKTplYS5zcGxpY2UoYiwxKSl9LDApKX19ZnVuY3Rpb24gdmUoYSl7WD1udWxsO2lmKEthKXt2YXIgYj1LYS5nY2EoKTtpZihYPWJbYi5sZW5ndGgtMV0pYS5wYXJlbnRBY3Rpb25JZD1YLmlkLGEucGFyZW50RnJhbWVBY3Rpb25OYW1lPVgubmFtZSxYLmNoaWxkRnJhbWVBY3Rpb25zP1guY2hpbGRGcmFtZUFjdGlvbnMrKzpYLmNoaWxkRnJhbWVBY3Rpb25zPTF9fWZ1bmN0aW9uIExhKGEsYixjKXt2YXIgZD1xKCk7YT1XYyhiLFMoYSksZCxkLGMpOzA9PT1FJiZmYShQYyk7YSYmbmEoKTtyZXR1cm4gYX1mdW5jdGlvbiBXYyhhLGIsYyxkLGUpe2E9TihhLGIsYyxkLC0xKTtyZXR1cm4gb2EoYSxlKX1mdW5jdGlvbiBvYShhLGIpe2lmKGI9InVuZGVmaW5lZCI9PT10eXBlb2YgYnx8bnVsbD09PWI/QjokYShiKSlyZXR1cm4gYi5hZGQoYSksITE7dmUoYSk7cihKLGEpO3JldHVybiEwfWZ1bmN0aW9uIGxnKCl7TGEoInZpc2l0IGVuZCIsIl9lbmRWaXNpdF8iLC0xKX1mdW5jdGlvbiBtZygpe0xhKCJ2aXNpdCBlbmQiLCJfZW5kVmlzaXRfIiwtMSk/RWUoITEsITEpOkZlKCl9ZnVuY3Rpb24gbmcoYSxiKXtkYTw9QSgibWVwcCIpJiYoZGErKyxMYShhLCJfZXJyb3JfIixiKSl9ZnVuY3Rpb24gSmEoYSxiKXtMYShhLCJfd2FybmluZ18iLGIpfWZ1bmN0aW9uIG9nKGEsYil7TGEoYSwiX2xvZ18iLGIpfWZ1bmN0aW9uIHBnKGEpe3JldHVybihhPUFlKGEsMywhMCkpPyRhKGEpOm51bGx9ZnVuY3Rpb24gcWcoYSl7cmV0dXJuIGEuWX1mdW5jdGlvbiBHZShhKXtpc05hTihhKXx8KGE9RFthXSk7cmV0dXJuIGE/YS5LKCk6bnVsbH1mdW5jdGlvbiByZyhhLGIpe3ZhciBjPXEoKTthPU4oIl9ydl8iLGtiKGErIj0iK2IpLGMsYywwKTtvYShhKTtuYSgpfWZ1bmN0aW9uIHNnKGEsYixjKXt2YXIgZD1xKCk7YT1OKCJfcnNfIixrYihhKyI9IitiKSxkLGQsMCk7b2EoYSxjKTtuYSgpfWZ1bmN0aW9uIHRnKCl7cmV0dXJuIEJ9ZnVuY3Rpb24gSGUoKXtyZXR1cm4gQj9CLm5hbWU6bnVsbH1mdW5jdGlvbiBPZChhKXt2YXIgYj1hPT09SGUoKTtpZighS2IpcmV0dXJuIWI7YT1hPT09S2IubmFtZSYmM0UzPj1xKCktS2Iuc3RhcnQ7cmV0dXJuIWImJiFhfWZ1bmN0aW9uIHVnKCl7cmV0dXJuIUJ8fDA8Qi5zdG9wfWZ1bmN0aW9uIHZnKGEpe3JldHVybiBEW2FdfWZ1bmN0aW9uIHdnKGEsYixjLGQsZSxmLGspe2lmKDQ+YXJndW1lbnRzLmxlbmd0aHx8InVuZGVmaW5lZCI9PT10eXBlb2YgZClkPSEwO3JldHVybiBuYihrYihhKSxiLGMsZCxudWxsLGUsZixrKS5pZH1mdW5jdGlvbiB4ZyhhLGIsYyl7YmEoKTtrYShhLGIsYyl9ZnVuY3Rpb24geWcoKXtyZXR1cm4gVH1mdW5jdGlvbiB6ZyhhKXtyZXR1cm4gYS5pZH1mdW5jdGlvbiBHYShhLGIsYyxkKXtpZihpc05hTihhKXx8MTAwPmF8fDFFMzxhKXJldHVybiExO2ImJihiKz0iIik7Yz1jPyRhKGMpOkI7aWYoIWN8fGMuRmF8fCFkJiYhYy54aHJVcmwpcmV0dXJuITE7ZD1xKCk7V2MoIl9yQ18iLGErIiIsZCxkLGMuaWQpO2ImJjA8Yi5sZW5ndGgmJldjKCJfck1fIixiLGQsZCxjLmlkKTtyZXR1cm4gYy5GYT0hMH1mdW5jdGlvbiBBZyhhLGIpe3JldHVybiBHYSg5NzAsYXx8IlhIUiBFcnJvciIsYil9ZnVuY3Rpb24gQmcoYSl7cmV0dXJuIEdhKDk3MSwiWEhSIENhbmNlbGVkIixhKX1mdW5jdGlvbiBDZyhhKXtyZXR1cm4gR2EoOTcyLCJYSFIgVGltZW91dCIsYSl9ZnVuY3Rpb24gRGcoYSxiKXtyZXR1cm4gR2EoOTczLGF8fCJQYXJzZXIgRXJyb3IiLGIpfWZ1bmN0aW9uIEVnKGEsYil7cmV0dXJuIEdhKDk3NCxhfHwiU2V0dXAgRXJyb3IiLGIpfWZ1bmN0aW9uIEZnKGEsYil7cmV0dXJuIEdhKDk3OSxhP2E6IlVua25vd24gRXJyb3IiLGIpfWZ1bmN0aW9uIEdnKCl7cmV0dXJuIXgoImRpc2FibGVYaHJGYWlsdXJlcyIpfWZ1bmN0aW9uIEhnKGEpe3IoSmIuZSxhKX1mdW5jdGlvbiBJZyhhKXtyKEpiLmwsYSl9ZnVuY3Rpb24gSmcoYSxiLGMsZCxlLGYpe2lmKGQpe3ZhciBrPUtnKys7cGEucHVzaCh7eGhyVXJsOkJlKGUmJmUuc3BsaXQ/ZS5zcGxpdCgiPyIpWzBdOm51bGwpLFI6ZCxpbmRleDprLEJhOmZ9KTthPWEuYXBwbHkoYixjfHxbXSk7ImciPT09Zj9HKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxwYS5sZW5ndGg7YSsrKWlmKHBhW2FdLmluZGV4PT09ayl7WWIocGEsYSk7YnJlYWt9fSwwKTpwYS5wb3AoKX1lbHNlIGE9YS5hcHBseShiLGN8fFtdKTtyZXR1cm4gYX1mdW5jdGlvbiBFYihhKXt0KCkuaXJ0eCYmdCgpLmlydHgoYS5pZCxhLnN0YXJ0LGEuc3RvcCxhLnhoclVybCk7Zm9yKHZhciBiPTA7YjxhLm5leHQubGVuZ3RoO2IrKylFYihhLm5leHRbYl0pfWZ1bmN0aW9uIHJlKCl7dmFyIGE9UigpO3JldHVybiBhIT09dCgpJiZhLmdJVEFJRD9hLmdJVEFJRCgpOkxnKyt9ZnVuY3Rpb24gaWIoYSl7cmV0dXJuIGE/YS50cmltP2EudHJpbSgpOmEucmVwbGFjZSgvXlxzK3xccyskL2csIiIpOm51bGx9ZnVuY3Rpb24gc2EoYSxiKXtpZihhLmluZGV4T2YpcmV0dXJuIGEuaW5kZXhPZihiKTtmb3IodmFyIGM9YS5sZW5ndGg7Yy0tOylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX1mdW5jdGlvbiBiYihhLGIpe3ZhciBjPSExO3RyeXtpZihOYiYmLTE8c2EoTWcsYSkpe3ZhciBkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2M9ITB9fSk7TmIoInRlc3QiLG51bGwsZCl9fWNhdGNoKGUpe31yZXR1cm4gYz97cGFzc2l2ZTohMCxjYXB0dXJlOmJ9OmJ9ZnVuY3Rpb24gemEoYSxiLGMsZCl7InVuZGVmaW5lZCI9PT10eXBlb2YgZCYmKGQ9YmIoYiwhMCkpOyJib29sZWFuIj09PXR5cGVvZiBkJiYoZD1iYihiLGQpKTthPT09bD9OYj9OYihiLGMsZCk6WGMmJlhjKCJvbiIrYixjKTpPYiYmYSBpbnN0YW5jZW9mIE9iP05nLmNhbGwoYSxiLGMsZCk6YS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsZCk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib24iK2IsYyk7ZD0hMTtmb3IodmFyIGU9VS5sZW5ndGg7MDw9LS1lOyl7dmFyIGY9VVtlXTtpZihmLm9iamVjdD09PWEmJmYuZXZlbnQ9PT1iJiZmLmJhPT09Yyl7ZD0hMDticmVha319ZHx8cihVLHtvYmplY3Q6YSxldmVudDpiLGJhOmN9KX1mdW5jdGlvbiBKZChhLGIsYyxkKXtmb3IodmFyIGU9VS5sZW5ndGg7MDw9LS1lOyl7dmFyIGY9VVtlXTtpZihmLm9iamVjdD09PWEmJmYuZXZlbnQ9PT1iJiZmLmJhPT09Yyl7VS5zcGxpY2UoZSwxKTticmVha319InVuZGVmaW5lZCI9PT10eXBlb2YgZCYmKGQ9YmIoYiwhMCkpOyJib29sZWFuIj09PXR5cGVvZiBkJiYoZD1iYihiLGQpKTthPT09bD9JZT9JZShiLGMsZCk6T2cmJlhjKCJvbiIrYixjKTphLnJlbW92ZUV2ZW50TGlzdGVuZXI/YS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyxkKTphLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKX1mdW5jdGlvbiBkYyhhKXt0cnl7dmFyIGI9YS50YWdVcm47cmV0dXJuIGImJi0xIT09cChiLCJzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIil9Y2F0Y2goYyl7cmV0dXJuITB9fWZ1bmN0aW9uIEplKGEpe2lmKCFhfHwtMT09PWEuaW5kZXhPZigiOi8vIikpcmV0dXJuIG51bGw7YT1hLnNwbGl0KCIvIilbMl0uc3BsaXQoIjoiKVswXS50b0xvd2VyQ2FzZSgpO3JldHVybi9eW148PiUvXFwoKXt9XFtcXSBdKyQvLnRlc3QoYSk/YTpudWxsfWZ1bmN0aW9uIEtlKGEpe3ZhciBiPTA7aWYoYSlmb3IodmFyIGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspYj0zMSpiK2EuY2hhckNvZGVBdChkKSxiJj1iO3JldHVybiBifWZ1bmN0aW9uIG1jKGEsYixjKXt0cnl7bC5zZXNzaW9uU3RvcmFnZVthXT1ifWNhdGNoKGQpe2N8fENhKGEsYix2b2lkIDAseCgic3NjIikpfX1mdW5jdGlvbiBQZyhhLGIpe3RyeXtsLmxvY2FsU3RvcmFnZVthXT1ifWNhdGNoKGMpe0NhKGEsYix2b2lkIDAseCgic3NjIikpfX1mdW5jdGlvbiBMZShhLGIpe3RyeXtyZXR1cm4gbC5zZXNzaW9uU3RvcmFnZVthXX1jYXRjaChjKXt9aWYoIWIpcmV0dXJuIHJhKGEpfQpmdW5jdGlvbiBRZyhhKXt0cnl7cmV0dXJuIGwubG9jYWxTdG9yYWdlW2FdfWNhdGNoKGIpe31yZXR1cm4gcmEoYSl9ZnVuY3Rpb24geihhKXt2YXIgYj1bXTtpZihhKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hLmNoYXJBdChjKSxlPVBiW2RdO2U/cihiLGUpOnIoYixkKX1yZXR1cm4gYi5qb2luKCIiKX1mdW5jdGlvbiBvYyhhKXthPWEucmVwbGFjZSgvXy9nLCJfNUYiKS5yZXBsYWNlKC8lL2csIl8yNSIpLnJlcGxhY2UoL1x8L2csIl83QyIpO3JldHVybiB6KGEpfWZ1bmN0aW9uIFMoYSl7aWYoYSl7Zm9yKHZhciBiPVtdLGM9Qygic3BjIikrUmcsZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hLmNoYXJBdChkKTstMT09PXAoYyxlKSYmcihiLGUpfWE9Yi5qb2luKCIiKX1yZXR1cm4gYXx8IiJ9ZnVuY3Rpb24gS2QoKXt2YXIgYT1kb2N1bWVudC5sb2NhdGlvbjtpZihhKXt2YXIgYT1hLmhyZWYsYj1wKGEsIiMiKTswPD1iJiYoYT1hLnN1YnN0cigwLGIpKTtyZXR1cm4gYX1yZXR1cm4iLSJ9CmZ1bmN0aW9uIExkKCl7dmFyIGE9ZG9jdW1lbnQubG9jYXRpb247aWYoYSl7dmFyIGE9YS5ocmVmLGI9cChhLCIjIik7aWYoMDw9YilyZXR1cm4gYT1hLnN1YnN0cihiKzEpfXJldHVybiIifWZ1bmN0aW9uIHRiKGEsYil7YT1NYXRoLmZsb29yKGEpOyhifHxUKSYmMDxhJiZDYShGYSxTdHJpbmcoYSksdm9pZCAwLHgoInNzYyIpKTtyZXR1cm4gYX1mdW5jdGlvbiB1YSgpeyFZYyYmbC5wZXJmb3JtYW5jZSYmbC5wZXJmb3JtYW5jZS50aW1pbmcmJih0KCkuc3lufHwheS5mZnx8OTx5LmZmKSYmKFljPWwucGVyZm9ybWFuY2UpO3JldHVybiBZY31mdW5jdGlvbiBTZyhhLGIsYyxkLGUpe3JldHVybiBNZShhLGIsYyxkLCExLGUpfWZ1bmN0aW9uIE1lKGEsYixjLGQsZSxmKXt0cnl7Zj1mfHwid2luIjt2YXIgaz1RYltmXXx8e307a1tiXT1hW2JdO1FiW2ZdPWs7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmN8fGZ1bmN0aW9uKCl7cmV0dXJuIGtbYl19LHNldDpmdW5jdGlvbihjKXtpZihjfHxlKWtbYl09YyxkJiZkLmFwcGx5KGEsW2NdKX0sY29uZmlndXJhYmxlOiEwfSk7cmV0dXJuITB9Y2F0Y2goaCl7fXJldHVybiExfWZ1bmN0aW9uIFRnKGEsYixjLGQpe2lmKChkPWR8fGFbYl0pJiZPYmplY3QuZGVmaW5lUHJvcGVydHkmJigheS5pZXx8ODx5LmllKSl7Yz1jfHwid2luIjt0cnl7ZGVsZXRlIGFbYl0mJihhW2JdPWQsUWJbY11bYl09bnVsbCl9Y2F0Y2goZSl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2dldDpmdW5jdGlvbigpe3JldHVybiBRYltjXVtiXX0sY29uZmlndXJhYmxlOiEwfSl9Y2F0Y2goZil7fX19fWZ1bmN0aW9uIFVnKGEsYixjLGQpe2lmKHgoImZmaSIpKXJldHVybiEwO2I9U3RyaW5nKGIpO2M9U3RyaW5nKGMpO2Zvcih2YXIgZT0hMSxmPWUsaz1lLGgsZz0wO2c8YS5sZW5ndGgmJighZXx8IWYpO2crKylmPWFbZ10uc3BsaXQoIi4iKSxlPWZbMF0saD1mWzFdLGU9ZT09PWIsZj1oPT09YywhayYmZSYmYz5oJiYoaz0hMCk7YT1lJiZmfHxrO2UmJmZ8fChrP0phKGQrIiB2ZXJzaW9uICgiK2IrIi4iK2MrIikgb2ZmaWNpYWxseSBub3Qgc3VwcG9ydGVkLiBJbnN0cnVtZW50YXRpb24gYWN0aXZlIG5vbmV0aGVsZXNzLCBiZWNhdXNlIG1ham9yIHZlcnNpb24gaXMgc3VwcG9ydGVkIGFuZCBtaW5vciBpcyBuZXdlciB0aGFuIHN1cHBvcnRlZCB2ZXJzaW9ucy4iKTpKYShkKyIgbm90IGluc3RydW1lbnRlZCBiZWNhdXNlIHZlcnNpb24gKCIrYisiLiIrYysiKSBub3Qgc3VwcG9ydGVkLiIpKTtyZXR1cm4gYX1mdW5jdGlvbiBWZyhhKXtDYSgiZHRVc2VEZWJ1Z0FnZW50IixhLHZvaWQgMCx4KCJzc2MiKSl9ZnVuY3Rpb24gV2coYSl7Q2EoImR0X2RiZ19jb25zb2xlIixhLHZvaWQgMCx4KCJzc2MiKSl9ZnVuY3Rpb24gWmMoYSl7cmV0dXJuKDA9PT1wKGEsImh0dHAiKXx8MD09PXAoYSwiLy8iKSkmJnAobG9jYXRpb24uaHJlZixsb2NhdGlvbi5ob3N0KSE9PXAoYSxsb2NhdGlvbi5ob3N0KX1mdW5jdGlvbiBNYihhKXtpZihaYyhhKSlyZXR1cm4gYTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Yi5ocmVmPWE7cmV0dXJuIGIuY2xvbmVOb2RlKCEwKS5ocmVmfWZ1bmN0aW9uIGdhKCl7dHJ5e3JldHVybiB5LmllfHx5LmVkZ2U/ZW5jb2RlVVJJKGwubG9jYXRpb24uaHJlZik6bC5sb2NhdGlvbi5ocmVmfWNhdGNoKGEpe31yZXR1cm4iIn1mdW5jdGlvbiBCZShhKXt0cnl7dmFyIGI9TWIoYSk7aWYoIWwubG9jYXRpb24pcmV0dXJuIGI7dmFyIGM9bC5sb2NhdGlvbixkPWMub3JpZ2luO2lmKCFkKXtpZighYy5wcm90b2NvbHx8IWMuaG9zdClyZXR1cm4gYjtkPWMucHJvdG9jb2wrIi8vIitjLmhvc3R9dmFyIGU9Yi5zdWJzdHIoMCxkLmxlbmd0aCsxKS50b0xvd2VyQ2FzZSgpPT09KGQrIi8iKS50b0xvd2VyQ2FzZSgpP2Iuc3Vic3RyKGQubGVuZ3RoKTpifWNhdGNoKGYpe2U9YSwwPT09cChhLCI/IikmJihlPWwubG9jYXRpb24ucGF0aG5hbWUrYSl9cmV0dXJuIHZiKGUsWGcpfWZ1bmN0aW9uIHZiKGEsYil7YSYmYS5sZW5ndGg+YiYmYS5zdWJzdHImJihhPWEuc3Vic3RyKDAsYikrIi4uLiIpO3JldHVybiBhfWZ1bmN0aW9uIGtiKGEpe3ZhciBiPUEoInNsIik7cmV0dXJuIHZiKGEsYil9ZnVuY3Rpb24gWWcoYSxiLGMpe3JldHVybiBhLmFwcGx5KGIsY3x8W10pfWZ1bmN0aW9uIFpnKGEsYixjLGQpe2E9YXx8e307Yj1ifHxhLnVybDtpZighWmMoYikpe2Q9ZHx8ImhlYWRlcnMiO2FbZF09YVtkXXx8e307aWYoYS5hY3Rpb25JZHx8Yyl7Yz1jfHxhLmFjdGlvbklkO3ZhciBlPWdhKCksZj1nZChjKTtmJiYoY2IoYSwkYyxmLGQpLFpiKCkmJihjYihhLHViLGUsZCksY2IoYSwieC1ob3N0IixKZShiKSxkKSkpOyhjPUdlKGMpKSYmYyE9PWUmJmNiKGEsdWIsYyxkKX1VYyhiKSYmY2IoYSwkYywiaWdub3JlIixkKX1yZXR1cm4gYX1mdW5jdGlvbiBjYihhLGIsYyxkKXtpZihjKWlmKGM9dmIoYyxBKCJtaGwiKSksYVtkXS5zZXQpe3ZhciBlPWFbZF0uc2V0KGIsYyk7ZSYmZS5nZXQmJmUuZ2V0KGIpPT09YyYmKGFbZF09ZSl9ZWxzZSBhW2RdW2JdPWN9ZnVuY3Rpb24gTmUoYSl7LTE8cChhLCJeIikmJihhPWEuc3BsaXQoIl5eIikuam9pbigiXiIpLGE9YS5zcGxpdCgiXmRxIikuam9pbignIicpLGE9YS5zcGxpdCgiXnJiIikuam9pbigiPiIpLGE9YS5zcGxpdCgiXmxiIikuam9pbigiPCIpLGE9YS5zcGxpdCgiXnAiKS5qb2luKCJ8IiksYT1hLnNwbGl0KCJeZSIpLmpvaW4oIj0iKSxhPWEuc3BsaXQoIl5zIikuam9pbigiOyIpLGE9YS5zcGxpdCgiXmMiKS5qb2luKCIsIiksYT1hLnNwbGl0KCJeYnMiKS5qb2luKCJcXCIpKTtyZXR1cm4gYX1mdW5jdGlvbiBPZShhKXtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZihhKTpPYmplY3QuX19wcm90b19fPT09T2JqZWN0LnByb3RvdHlwZSYmQXJyYXkuX19wcm90b19fPT09QXJyYXkucHJvdG90eXBlP2EuX19wcm90b19fOmEuY29uc3RydWN0b3I/YS5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6dm9pZCAwfWZ1bmN0aW9uICRnKGEpe3JldHVybiBhLmhhc093blByb3BlcnR5KCJwcm90b3R5cGUiKT9hLnByb3RvdHlwZTpPZShhKX1mdW5jdGlvbiBXZChhKXtpZighYXx8IUJhKCkpcmV0dXJuIGE7dHJ5e2Zvcih2YXIgYj17fSxjPShhKyIiKS5zcGxpdCgiIiksZD1bXSxlPWNbMF0sZj0yNTYsaz0xO2s8Yy5sZW5ndGg7aysrKXt2YXIgaD1jW2tdO251bGwhPWJbZStoXT9lKz1oOihkLnB1c2goMTxlLmxlbmd0aD9iW2VdOmUuY2hhckNvZGVBdCgwKSksYltlK2hdPWYsZisrLGU9aCl9ZC5wdXNoKDE8ZS5sZW5ndGg/YltlXTplLmNoYXJDb2RlQXQoMCkpO3JldHVybiBuZXcgVWludDE2QXJyYXkoZCl9Y2F0Y2goZyl7cmV0dXJuIGF9fWZ1bmN0aW9uIEJhKCl7cmV0dXJuIDA9PT1FPyEheCgibHp3ZSIpOiF4KCJsendkIikmJjE8QSgiYnAiKSYmIXgoImNvcnMiKSYmbC5VaW50MTZBcnJheSYmISg0LjQ+eS5hYil9ZnVuY3Rpb24gYWgoYSl7cmV0dXJuIHVhKCkmJnVhKCkudGltaW5nP3VhKCkudGltaW5nW2FdOi0xfWZ1bmN0aW9uIGJoKCl7dmFyIGE9MD09PUU/UGUoKTpRZSgpO2lmKGEpe2Zvcih2YXIgYj0iIixjPTA7YysxPGEubGVuZ3RoO2MrPTIpYis9IiIrKGEuY2hhckNvZGVBdChjKSthLmNoYXJDb2RlQXQoYysxKSk7YT1NYXRoLmZsb29yKE1hdGguYWJzKDFFNypNYXRoLnNpbihwYXJzZUludChiLDEwKSkpKX1lbHNlIGE9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gY2goKXtyZXR1cm4gQSgicmRudCIpJiYkYigpfWZ1bmN0aW9uIGplKGEsYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8YS5sZW5ndGg7ZSs9Yil7aWYoZStiPD1hLmxlbmd0aCl7dmFyIGY9YS5zbGljZShlLGUrYik7IiUiPT09Zi5jaGFyQXQoZi5sZW5ndGgtMSkmJmEubGVuZ3RoPj1lK2IrMSYmKGYrPWEuY2hhckF0KGUrYiksZis9YS5jaGFyQXQoZStiKzEpLGUrPTIpOyIlIj09PWYuY2hhckF0KGYubGVuZ3RoLTIpJiZhLmxlbmd0aD49ZStiKzImJihmKz1hLmNoYXJBdChlK2IpLGUrPTEpfWVsc2UgZj1hLnNsaWNlKGUpO2QucHVzaChmKX1pZihjKWZvcihhPWQubGVuZ3RoLGI9MDtiPGE7YisrKWRbYl09Yy5yZXBsYWNlKC8jaW5kZXgjLyxTdHJpbmcoYisxKSkucmVwbGFjZSgvI3RvdGFsIy8sU3RyaW5nKGEpKStkW2JdO3JldHVybiBkfWZ1bmN0aW9uIGRoKGEpe3JldHVybiBhJiYxPT09YS5sZW5ndGg/LTEhPT1wKEMoImZlYXR1cmVIYXNoIiksYSk6ITF9ZnVuY3Rpb24gZWgoYSl7dmFyIGI9bC5kVF87aWYoYi5pc20oYSkmJi0xPT09cChiLmlNb2QoKSxhKSlyZXR1cm4gYi5pTW9kKGEpLCEwO2IuaXNtKGEpJiZsLmNvbnNvbGUmJmwuY29uc29sZS5sb2coIldBUk5JTkc6ICIrKCdNb2R1bGUgIicrYSsnIiBhbHJlYWR5IGVuYWJsZWQhJykpO3JldHVybiExfWZ1bmN0aW9uIGZoKGEpe2EmJihWLmluaXRpYWxpemVkTW9kdWxlcys9YSk7cmV0dXJuIFYuaW5pdGlhbGl6ZWRNb2R1bGVzfWZ1bmN0aW9uIGdoKGEpe3JldHVybiBWW2FdfWZ1bmN0aW9uIGhoKGEsYil7VlthXT1ifWZ1bmN0aW9uIGloKCl7cmV0dXJuIFYuY3N1fWZ1bmN0aW9uIFVkKGEpe2lmKGEueGIpe2E9TmUoYS54Yik7dHJ5e3plPW5ldyBSZWdFeHAoYSl9Y2F0Y2goYil7fX19CmZ1bmN0aW9uIGpoKGEpe1JlP2EodCgpLmJ3c1csdCgpLmJ3c0gpOnIoTWEsYSl9ZnVuY3Rpb24ga2goYSl7Zm9yKHZhciBiPU1hLmxlbmd0aC0xOzA8PWI7LS1iKWlmKGE9PT1NYVtiXSl7TWEuc3BsaWNlKGIsMSk7YnJlYWt9fWZ1bmN0aW9uIFNlKCl7dmFyIGE9ZG9jdW1lbnQsYj1hLmRvY3VtZW50RWxlbWVudCxjPTAsZD0wLGU9YS5ib2R5OyJudW1iZXIiPT09dHlwZW9mIHNlbGYuaW5uZXJXaWR0aD8oYz1zZWxmLmlubmVyV2lkdGgsZD1zZWxmLmlubmVySGVpZ2h0KTphJiYoYi5jbGllbnRXaWR0aHx8Yi5jbGllbnRIZWlnaHQpPyhjPWIuY2xpZW50V2lkdGgsZD1iLmNsaWVudEhlaWdodCk6ZSYmKGUuY2xpZW50V2lkdGh8fGUuY2xpZW50SGVpZ2h0KSYmKGM9ZS5jbGllbnRXaWR0aCxkPWUuY2xpZW50SGVpZ2h0KTtpZigwPmN8fDA+ZClhPXkuaWU/MTQwOjEwLGM9TWF0aC5tYXgoYyxhKSxkPU1hdGgubWF4KGQsMTApO3QoKS5id3NXPWM7dCgpLmJ3c0g9ZDtSZT0hMDtmb3IoYT0wO2E8TWEubGVuZ3RoO2ErKylNYVthXShjLGQpfWZ1bmN0aW9uIGxoKCl7dmFyIGE9dCgpO0FkKFNlKTthLmFid3NsfHwoYS5hYndzbD1qaCxhLnJid3NsPWtoKTt2YXIgYj0hMTtDYihmdW5jdGlvbihjLGQsZSxmKXtpZighZCYmIWImJihUfHxlKSl7Yj0hMDtkPWZ1bmN0aW9uKGEpe3JldHVybiAwPmF8fDIxNDc0ODM2NDc8PWF8fGlzTmFOKGEpPzA6YX07dmFyIGs9UigpO2U9ay5id3NXfHxhLmJ3c1c7az1rLmJ3c0h8fGEuYndzSDswPmUmJihTZSgpLGU9YS5id3NXLGs9YS5id3NIKTtlPXt3aWR0aDpkKGUpLGhlaWdodDpkKGspfTtrPXt3aWR0aDowLGhlaWdodDowfTtjLmEoZiwidyIsIndpbmRvdyIsZS53aWR0aCxlLCEwKTtjLmEoZiwiaCIsdm9pZCAwLGUuaGVpZ2h0LHZvaWQgMCwhMCk7aWYoZT1sLnNjcmVlbilrPXt3aWR0aDpkKGUud2lkdGgpLGhlaWdodDpkKGUuaGVpZ2h0KX0sYy5hKGYsInN3Iiwic2NyZWVuIixrLndpZHRoLGssITApLGMuYShmLCJzaCIsdm9pZCAwLGsuaGVpZ2h0LHZvaWQgMCwhMCl9fSl9ZnVuY3Rpb24gbWgoKXtDYihmdW5jdGlvbigpe2lmKCFWLmRpc2FibGVDb29raWVNYW5hZ2VyKXt2YXIgYT1IYigpO2lmKCFhfHxhJiYwIT09cChhLCItIikmJi0xPT09cChhLCI9c3J2PS0iKSl0cnl7aWYobC5zZXNzaW9uU3RvcmFnZSl7dmFyIGI9VGUoRWEpfHwiIjt2YyhiKXx8KGI9IiIpO2lmKGImJiJudWxsIiE9PWIpe2lmKDA9PT1FKWE6e3ZhciBjPWE7aWYoYyl7dmFyIGQ9cChjLCIkIiksZT1jLmxhc3RJbmRleE9mKCIkIik7aWYoLTE8ZCYmZCE9PWUpe2E9Yy5zdWJzdHJpbmcoMCxkKStjLnN1YnN0cmluZyhlKTticmVhayBhfX1hPWN9aWYoYSE9PWIpeyhjPWIpJiYoYz0wPT09cChjLCI9Iik/VWUoYykuc2Vzc2lvbklkOlZlKGMpLnNlc3Npb25JZCk7dmFyIGY9YztpZigidW5kZWZpbmVkIiE9PXR5cGVvZiBhJiYiIiE9PWEpe2lmKChiPWEpJiZmKXtpZigwPT09cChiLCI9Iikpe3ZhciBrPWIsaD1wKGssIj1zbj0iKTtpZigtMSE9PWgpe3ZhciBnPWsuaW5kZXhPZigiPSIsaCs0KSx3Oy0xIT09ZyYmKHc9LTEhPT1nP2suc3Vic3RyaW5nKGgsZyk6ay5zdWJzdHJpbmcoaCkpO3cmJihrPWsucmVwbGFjZSh3LCI9c249IitmKSl9dmFyIG09a31lbHNle3ZhciBoPWIsaz1wKGgsInwiKTtpZigtMSE9PWspaWYoMD09PUUpe3ZhciBuPXAoaCwiJCIpO2g9LTEhPT1uP2guc3Vic3RyaW5nKDAsbisxKStmK2guc3Vic3RyaW5nKGspOmYraC5zdWJzdHJpbmcoayl9ZWxzZSBoPWYraC5zdWJzdHJpbmcoayk7ZWxzZSAwPT09RT8obj1wKGgsIiQiKSwtMSE9PW4/aD1oLnN1YnN0cmluZygwLG4rMSkrZjpoPWYpOmg9ZjttPWh9Yj1tfXZhciByPWJ9ZWxzZSByPWI7YT1yfX1hJiYoV2UoRWEpLHdjKGEpLFhlKEVhLGEpKX19Y2F0Y2godil7fX19KX1mdW5jdGlvbiBuaCgpe3JldHVybiBIYS5OKCl9ZnVuY3Rpb24gb2goYSxiLGMsZCxlKXt2b2lkIDA9PT1iJiYoYj0hMSk7dm9pZCAwPT09YyYmKGM9ITEpO3ZvaWQgMD09PWQmJihkPSExKTtzYyhiLGMse3JlZmVycmVyOmdhKCksSTphfSxkLGUpfWZ1bmN0aW9uIElhKCl7cmV0dXJuIjEwMTUxMTkwMzE5MTQwNTIwIn1mdW5jdGlvbiB0KCl7cmV0dXJuIGwuZFRffXZhciBkYj13aW5kb3c7aWYoIWRiLmRUX3x8ZGIuZFRfLmluaXRpYWxpemVkfHwhZGIuZFRfLmljYSlkYi5jb25zb2xlJiZkYi5jb25zb2xlLmxvZygiRHVwbGljYXRlIGFnZW50IGluamVjdGlvbiBkZXRlY3RlZCBvciBubyBpbml0Q29kZSBhdmFpbGFibGUsIHR1cm5pbmcgb2ZmIHJlZHVuZGFudCBjb3JlLiIpO2Vsc2UgaWYoIShuYXZpZ2F0b3IudXNlckFnZW50JiYwPD1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlJ1eGl0U3ludGhldGljIikpKXt2YXIgbD13aW5kb3csRyxxLEYscCxyLENhLHJhLFdlLGViLHhjLGVkLGZkLHZjLFVlLFZlLEhiLHdjLEliLHdlLEVlLFRlLFhlLHNlLHhhLHlhLGhkLCRjLEZhLGtlLHljLHpjLFNkLFRkLHgsQSxDLFJiLFZkLENiLE1jLFFhLFksV2IsVmIsUGUsWWQsWmQsYWQsUGMsRmUsUWUsVmEsYmQsU2IsRWEsdWIsV2EsR2IsdWMsZWMsRGEsZ2IsaGIsdmE9bC5wYXJlbnQseT17fSx1PW5hdmlnYXRvci51c2VyQWdlbnQsTmE9bnVsbCxUYixLYSxiYz1bXSxuZCxPYT1udWxsLFo9e3dhOjAseGE6MSx5YToyLHZhOjMsemE6NCxDYTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wOzQ+PWM7YysrKXt2YXIgZD1hKGMsYik7aWYoZClyZXR1cm4gZH1yZXR1cm4gbnVsbH19LGpiPTAsTCxoYT1udWxsLGpmPTAscGQ9ITAsSCxqYz0hMSxCZD0hMSxFZD0hMSxBYT0xLGZiPW51bGwsamEscWM9W10sTz1udWxsLHBiPSExLGdjPVtdLGljPVtdLGxhPSExLElkPSExLHJjPSExLHdkPTAsUGE9bnVsbCxNPW51bGwseWQsc2I9ITEsUWQ9LTEsbWIscGM9ITEsb2I9W10sRmQ9bmF2aWdhdG9yJiYic2VuZEJlYWNvbiJpbiBuYXZpZ2F0b3IsWWUsWmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dGhpcy5pZD0rK1llO3RoaXMuUz1bXTt0aGlzLnBhPXRoaXMuSj0hMX1hLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLlMucHVzaChhKX07YS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlMubGVuZ3RoO2IrKylpZih0aGlzLlNbYl09PT1hKXtZYih0aGlzLlMsYik7YnJlYWt9fTthLnByb3RvdHlwZS5KYT1mdW5jdGlvbihhLGMsZCxlKXtmb3IodmFyIGI9MCxrPXRoaXMuUztiPGsubGVuZ3RoO2IrKykoMCxrW2JdKShhLGMsZCxlKX07YS5wcm90b3R5cGUuRD1mdW5jdGlvbihhLGMsZCl7dGhpcy5KPXRoaXMuSnx8ISFkOzA8PXAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGMpLCJBcnJheUJ1ZmZlciIpJiYodGhpcy5wYT0hMCl9O2EucHJvdG90eXBlLnY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX07cmV0dXJuIGF9KCksSGY9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGEsYil7YS5fX3Byb3RvX189Yn18fGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShjKSYmKGFbY109YltjXSl9LCRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31hLnByb3RvdHlwZS5hQlJMPWZ1bmN0aW9uKGEsYyl7YS5BYShjKX07YS5wcm90b3R5cGUuckJSTD1mdW5jdGlvbihhLGMpe2EuSGEoYyl9O3JldHVybiBhfSgpLHBoPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYj1hLmNhbGwodGhpcyl8fHRoaXM7Yi5xYT0wO2IuSD1bXTtiLko9ITE7Yi5wYT0hMTtyZXR1cm4gYn13YihiLGEpO2IucHJvdG90eXBlLkQ9ZnVuY3Rpb24oYixkLGUpe3ZvaWQgMD09PWUmJihlPSExKTthLnByb3RvdHlwZS5ELmNhbGwodGhpcyxiLGQsZSk7cih0aGlzLkgsW2IsZF0pfTtiLnByb3RvdHlwZS5NPWZ1bmN0aW9uKGEsYixlKXtiJiZ0aGlzLkQoYSxiLGUpfTtiLnByb3RvdHlwZS5WPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5ILmxlbmd0aDtiKyspaWYodGhpcy5IW2JdWzBdPT09YSlyZXR1cm4gdGhpcy5IW2JdWzFdfTtiLnByb3RvdHlwZS50YT1mdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPTA7Yjx0aGlzLkgubGVuZ3RoO2IrKylyKGEsIiQiLHRoaXMuSFtiXVswXSwiPSIsdGhpcy5IW2JdWzFdKTtyZXR1cm4gYS5qb2luKCIiKX07Yi5wcm90b3R5cGUucmF3PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSH07cmV0dXJuIGJ9KFplKSxTYT0tMSxBYz17Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9LGJlPXt9LEFiLHpiPSExLGNhLFc9e30seGI9W10seWI9e30sVGE9W10sUmEsY2UsRGM9bmV3KGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5jPSJyZWRpcmVjdFN0YXJ0Ijt0aGlzLmQ9InJlZGlyZWN0RW5kIjt0aGlzLmU9ImZldGNoU3RhcnQiO3RoaXMuZj0iZG9tYWluTG9va3VwU3RhcnQiO3RoaXMuZz0iZG9tYWluTG9va3VwRW5kIjt0aGlzLmg9ImNvbm5lY3RTdGFydCI7dGhpcy5pPSJjb25uZWN0RW5kIjt0aGlzLmo9InNlY3VyZUNvbm5lY3Rpb25TdGFydCI7dGhpcy5rPSJyZXF1ZXN0U3RhcnQiO3RoaXMubD0icmVzcG9uc2VTdGFydCI7dGhpcy5tPSJyZXNwb25zZUVuZCI7dGhpcy5uPSJkb21Mb2FkaW5nIjt0aGlzLm89ImRvbUludGVyYWN0aXZlIjt0aGlzLnA9ImRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0Ijt0aGlzLnE9ImRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCI7dGhpcy5yPSJkb21Db21wbGV0ZSI7dGhpcy5zPSJsb2FkRXZlbnRTdGFydCI7dGhpcy50PSJsb2FkRXZlbnRFbmQiO3RoaXMudT0idHJhbnNmZXJTaXplIjt0aGlzLnY9ImVuY29kZWRCb2R5U2l6ZSI7dGhpcy53PSJkZWNvZGVkQm9keVNpemUiO3RoaXMueD0ic3RhdHVzY29kZSI7dGhpcy55PSJpcCI7dGhpcy5BPSJmYWlsZWRSZXNvdXJjZSI7dGhpcy5DPSJyZXF1ZXN0SWQifX0oKSksdGE9e30sQ2M9e30sZWU9ITEsUmY9bmV3KGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5hPSJuIjt0aGlzLmI9Im5zIjt0aGlzLmM9InJzIjt0aGlzLmQ9InJlIjt0aGlzLmU9ImZzIjt0aGlzLmY9ImRzIjt0aGlzLmc9ImRlIjt0aGlzLmg9ImNzIjt0aGlzLmk9ImNlIjt0aGlzLmo9InNzIjt0aGlzLms9InJxcyI7dGhpcy5sPSJyc3MiO3RoaXMubT0icnNlIjt0aGlzLm49ImRsIjt0aGlzLm89ImRpIjt0aGlzLnA9ImRjcyI7dGhpcy5xPSJkY2UiO3RoaXMucj0iZGMiO3RoaXMucz0ibHMiO3RoaXMudD0ibGUiO3RoaXMudT0idCI7dGhpcy52PSJlYnMiO3RoaXMudz0iZGJzIjt0aGlzLng9InMiO3RoaXMueT0iaSI7dGhpcy56PSJpdCI7dGhpcy5BPSJmciI7dGhpcy5CPSJmIjt0aGlzLkM9InJJZCJ9fSgpKSxxaD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIG51bGwhPT1hJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc313YihiLGEpO2IucHJvdG90eXBlLk49ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHBofTtiLnByb3RvdHlwZS5nYT1mdW5jdGlvbihhLGIpe2lmKFViKXJldHVybiBudWxsO3ZhciBjPXRoaXMuTigpOzA9PT1FJiYxPT09QSgiYnAiKSYmYy5EKCJzdnJpZCIsVmEoKSwhMSk7eCgiYnMiKSYmYy5EKCJicyIsIjEiLCExKTtmYShGYix0aGlzLGEsYixjKTtyZXR1cm4gYy5KP2M6bnVsbH07Yi5wcm90b3R5cGUuVT1mdW5jdGlvbihhLGIsZSxmKXtlLk0oImlzVW5sb2FkIixmPyIxIjoiIiwhMSk7ZS5NKCJsYXRDIixyYShGYSksITEpO2UuTSgiYXBwIixDKCJhcHAiKSwhMSk7MD09PUUmJmUuRChXYSxJYighMCksITEpO2UuTSgiZG50IiwkYigpPyIxIjoiIiwhMSk7ZS5EKCJmSWQiLFkoKSwhMSk7ZS5EKCJ2IixJYSgpLCExKTswPT09RSYmKFhkKHRoaXMsYSxlKSwhYSYmYiYmYWQoKSYmZS5EKCJuVkFUIiwiMSIsITEpKX07Yi5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt2YXIgYj1QYTtiJiZUJiYoYS5EKCJyZXNwb25zZUNvZGUiLGIucmVzcG9uc2VDb2RlLCExKSxhLk0oInJlc3BvbnNlTWVzc2FnZSIsZWIoYi5tZXNzYWdlKSwhMSksUGE9bnVsbCl9O2IucHJvdG90eXBlLmlhPWZ1bmN0aW9uKGEsYixlKXtpZihhKXt2YXIgYz0iIjtJYz0wO3ZhciBkPSExLGg9IiIsZz0iIixsPSIiLG09STtmb3IodiBpbiBtKWlmKG0uaGFzT3duUHJvcGVydHkodikpe3ZhciBuPW1bdl07aWYoSGMobikpZHx8KGQ9ITAsSmEoIk1heGltdW0gb3BlbiBhY3Rpb25zIGV4Y2VlZGVkIGNvbmZpZ3VyZWQgYW1vdW50IG9mICIrQSgibW9hIikrIiwgZHJvcHBpbmcgYWN0aW9uICIrbikpO2Vsc2V7Yz1jP2MrIiwiOmM7dmFyIHA9Z2UobVt2XSwhMSwhMSwhMCk7cCYmIWgmJihoPW4uSygpKTtnPW4uSygpO2w9bi5XKCk7Yys9cH19Yz17YWN0aW9uczpjLHJlZmVyZXI6aCxzb3VyY2VVcmw6Zyxzb3VyY2VUaXRsZTpsfX1lbHNle2g9IiI7dmFyIHY9SjtnPUk7bD12Lmxlbmd0aDtiJiYoZz1bXSxJPVtdKTtuPW09ZD0iIjtpZigwPGwpe2ZvcihwPTA7cDxsO3ArKyl7dmFyIHU9Z2UodltwXSwhMCxlLCExKTtpZih1JiYwPHUubGVuZ3RoKXtkfHwoZD12W3BdLksoKSk7bT12W3BdLksoKTtuPXZbcF0uVygpO2lmKCJfbG9hZF8iPT09dltwXS50eXBlKXtUPSEwO3ZhciBxPWZiO3EmJihxLmlzRGVsYXllZD8oaD0iIixxLmFuY2hvciYmKGg9IiMiK3EuYW5jaG9yKSxoPSJkfCIrcS5pZCsifCIrcS5uYW1lKyJ8IitxLnR5cGUrInwiK3EuaW5mbysifCIrcS5mcmFtZUlkKyJ8IitxLnN0YXJ0VGltZSsifCIrcS5sb2NhdGlvbitoKyJ8IitxLnRpdGxlKTpoPSJzfCIrcS5pZCsifCIrcS5uYW1lKyJ8IitxLnR5cGUrInwiK3EuaW5mbysifCIrcS5mcmFtZUlkKyJ8IitxLnN0YXJ0VGltZSxtPXEubG9jYXRpb24sbj1xLnRpdGxlLGZiPW51bGwpfTA8aC5sZW5ndGgmJihoKz0iLCIpO2grPXU7RWIodltwXSl9fXY9W107Zm9yKGMgaW4gZylnLmhhc093blByb3BlcnR5KGMpJiZyKHYsZ1tjXSk7Zz1hYjtmb3IoYyBpbiBnKWcuaGFzT3duUHJvcGVydHkoYykmJnIodixnW2NdKX1KPXY7Yz17YWN0aW9uczpoLHJlZmVyZXI6ZCxzb3VyY2VVcmw6bSxzb3VyY2VUaXRsZTpufX1oPWM7Yz1oLmFjdGlvbnM7dj1oLnJlZmVyZXI7ZD1oLnNvdXJjZVVybDtoPWguc291cmNlVGl0bGU7MDxjLmxlbmd0aD8oZz10aGlzLk4oKSxnLkQoImEiLGViKGMpLCEwKSwwPT09RSYmKDE9PT1BKCJicCIpJiZnLkQoInN2cmlkIixWYSgpLCExKSxDKCJkb21haW5PdmVycmlkZSIpJiYoZy5EKCJkTyIsQygiZG9tYWluT3ZlcnJpZGUiKSwhMSksUmIoImRvbWFpbk92ZXJyaWRlIiwiIikpLHgoImJzIikmJmcuRCgiYnMiLCIxIiwhMSkpLGEmJmcuRCgiUFYiLCIxIiwhMSksdCgpLnBhZ2VJZCE9PVkoKSYmZy5EKCJwSWQiLHQoKS5wYWdlSWQsITEpLFRiJiZnLkQoInBGSWQiLFRiLCExKSxnLkQoInJJZCIsQygicmlkIiksITEpLGcuRCgicnBJZCIsQygicnBpZCIpLCExKSxhfHwoKGw9bGUoKSkmJmcuRCgiZG9tUiIsbCwhMSksdGhpcy5aKGcpKSxyYihlKSYmZy5EKCJ1bmxvYWQiLCJ4aHIiLCExKSxmYShGYix0aGlzLGEsYixnKSxVYj0hMSk6Zz10aGlzLmdhKGEsYik7ZyYmKHRoaXMuJCh7dXJsOmQsdGl0bGU6aH0sZyksdGhpcy5VKGEsMDxjLmxlbmd0aCxnLGUpKTtyZXR1cm57STpnLHJlZmVycmVyOnZ9fTtiLnByb3RvdHlwZS4kPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS51cmw7YT1hLnRpdGxlO3ZhciBkPWdhKCk7Yi5EKCJ1cmwiLGVuY29kZVVSSUNvbXBvbmVudChkKSwhMSk7Yi5EKCJ0aXRsZSIsZWIoUyhxYSgpKS5zdWJzdHJpbmcoMCwxMDApKSwhMSk7dmFyIGs9Yi5WKCJhIiksaD1rJiYoInMiPT09ay5jaGFyQXQoMCl8fCJkIj09PWsuY2hhckF0KDApKTsoaHx8ayYmLTE9PT1rLmluZGV4T2YoIl9sb2FkXyIpKSYmYi5EKCJ2ZCIsU3RyaW5nKHEoKS1EYSksITEpO2MmJmMhPT1kJiYhaCYmKGIuRCgic1VybCIsZW5jb2RlVVJJQ29tcG9uZW50KGMpLCExKSxiLkQoInNUaXRsZSIsYSYmYSE9PXFhKCk/ZWIoUyhhKS5zdWJzdHJpbmcoMCwxMDApKToiLSIsITEpKX07Yi5wcm90b3R5cGUuYT1mdW5jdGlvbihhLGIsZSxmLGssaCl7ZT0iZnVuY3Rpb24iPT09dHlwZW9mIGY/ZigpOmY7InVuZGVmaW5lZCIhPT10eXBlb2YgYiYmInVuZGVmaW5lZCIhPT10eXBlb2YgZSYmbnVsbCE9PWUmJiIiIT09ZSYmYS5EKGIsZSxoKX07Yi5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oYSl7cmV0dXJuISFhLlYoImEiKX07Yi5wcm90b3R5cGUuaGxhPWZ1bmN0aW9uKGEpe3JldHVybiAwPD1wKGEuVigiYSIpLCJfbG9hZF8iKX07cmV0dXJuIGJ9KCRlKSxoZT1bIl93YXJuaW5nXyIsIl9lcnJvcl8iLCJfbG9nXyIsIl9ydl8iLCJfcnNfIl0scmg9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3ZhciBiPWEuY2FsbCh0aGlzKXx8dGhpcztiLnFhPTQ7Yi5GPXtmcmFtZUlkOlkoKSx2ZXJzaW9uOkYoSWEoKSksdGltZXN0YW1wOnEoKX07cmV0dXJuIGJ9d2IoYixhKTtiLnByb3RvdHlwZS5EPWZ1bmN0aW9uKGIsZCxlKXthLnByb3RvdHlwZS5ELmNhbGwodGhpcyxiLGQsZSk7dGhpcy5GW2JdPWR9O2IucHJvdG90eXBlLk09ZnVuY3Rpb24oYSxiLGUpe2ImJnRoaXMuRChhLGIsZSl9O2IucHJvdG90eXBlLlY9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRlthXX07Yi5wcm90b3R5cGUudGE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GLGE9SmMoYSxhKSxiPTA7YjxhLmxlbmd0aDtiKyspYT1hLmNvbmNhdChhW2JdKCkpO3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLkYpfTtiLnByb3RvdHlwZS5yYXc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfTtyZXR1cm4gYn0oWmUpLGNkLHNoPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gbnVsbCE9PWEmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXdiKGIsYSk7Yi5wcm90b3R5cGUuTj1mdW5jdGlvbigpe3JldHVybiBuZXcgcmh9O2IucHJvdG90eXBlLmdhPWZ1bmN0aW9uKGEsYil7aWYoVWIpcmV0dXJuIG51bGw7dmFyIGM9dGhpcy5OKCk7eCgiYnMiKSYmYy5EKCJpc0Jvb3RzdHJhcHBlZCIsITApO2ZhKEZiLHRoaXMsYSxiLGMpO3JldHVybiBjLko/KHRoaXMuVShhLCExLGMpLGMpOm51bGx9O2IucHJvdG90eXBlLlU9ZnVuY3Rpb24oYSxiLGUsZil7dm9pZCAwPT09ZiYmKGY9ITEpO2UuRCgiaXNVbmxvYWQiLGYpO2UuRCgibGF0ZW5jeSIsRihyYShGYSkpKTtlLkQoImFwcGxpY2F0aW9uIixDKCJhcHAiKSk7MD09PUUmJmUuRCgidmlzaXRJZCIsSWIoITApKTtlLkQoImRvTm90VHJhY2siLCRiKCkpO2UuRCgiZnJhbWVJZCIsWSgpKTtjZHx8KGNkPUYoSWEoKSkpO2UuRCgidmVyc2lvbiIsY2QpOzA9PT1FJiYoWGQodGhpcyxhLGUpLCFhJiZiJiZhZCgpJiZlLkQoImlzTmV3VmlzaXRBZnRlclRpbWVvdXQiLCEwKSl9O2IucHJvdG90eXBlLlo9ZnVuY3Rpb24oYSl7dmFyIGI9UGE7YiYmVCYmKGEuRCgicmVzcG9uc2VDb2RlIixiLnJlc3BvbnNlQ29kZSksYS5EKCJyZXNwb25zZU1lc3NhZ2UiLGIubWVzc2FnZXx8IiIpLFBhPW51bGwpfTtiLnByb3RvdHlwZS5pYT1mdW5jdGlvbihhLGIsZSl7aWYoYSl7dmFyIGM9W107Zm9yKHZhciBkPXtkYTowfSxoPSExLGc9SSxsPTA7bDxnLmxlbmd0aDtsKyspe3ZhciBtPWdbbF07TGMoZCxtKT9pZShjLEtjKGdbbF0sITEsITEsITAsZCkpOmh8fChoPSEwLEphKCJNYXhpbXVtIG9wZW4gYWN0aW9ucyBleGNlZWRlZCBjb25maWd1cmVkIGFtb3VudCBvZiAiK0EoIm1vYSIpKyIsIGRyb3BwaW5nIGFjdGlvbiAiK20pKX19ZWxzZXtjPVtdO2Q9SjtnPUk7bD1kLmxlbmd0aDtiJiYoZz1bXSxJPVtdKTttPXtkYTowfTtpZigwPGwpe2Zvcih2YXIgbj0wO248bDtuKyspe3ZhciBwPWRbbl0scT1LYyhwLCEwLGUsITEsbSk7cSYmTGMobSxwKSYmKCJfbG9hZF8iPT09cC50eXBlJiYoVD0hMCkscihjLHEpKTtFYihwKX1kPVtdO2ZvcihoIGluIGcpZy5oYXNPd25Qcm9wZXJ0eShoKSYmcihkLGdbaF0pO2c9YWI7Zm9yKGggaW4gZylnLmhhc093blByb3BlcnR5KGgpJiZyKGQsZ1toXSl9Sj1kfWQ9IiI7aD17fTtpZigwPGMubGVuZ3RoKXt2YXIgaD1jW2MubGVuZ3RoLTFdLnNvdXJjZXx8e30sZD1jWzBdLnNvdXJjZSYmY1swXS5zb3VyY2UudXJsO2lmKChnPWZiKSYmIWEpe2cuc291cmNlPXt1cmw6Zy5sb2NhdGlvbix0aXRsZTpnLnRpdGxlfTtkZWxldGUgZy5sb2NhdGlvbjtkZWxldGUgZy50aXRsZTtnLmlzRGVsYXllZCYmKGcuc291cmNlLnVybCs9Zy5hbmNob3J8fCIiKTt2YXIgdT1nO2ZiPW51bGx9Zz10aGlzLk4oKTtnLkQoInNvdXJjZUFjdGlvbiIsdSk7Zy5EKCJhY3Rpb25zIixjLCEwKTtnLkQoImRvbWFpbk92ZXJyaWRlIixDKCJkb21haW5PdmVycmlkZSIpKTtnLkQoImlzQm9vdHN0cmFwcGVkIix4KCJicyIpKTtnLkQoImlzUHJldmlldyIsYSk7Zy5EKCJwYXJlbnRGcmFtZUlkIixUYik7Zy5EKCJyZXF1ZXN0SWQiLEMoInJpZCIpKTtnLkQoInJlc3BvbnNlSWQiLEYoQygicnBpZCIpKSk7Zy5EKCJwYWdlSWQiLHQoKS5wYWdlSWQhPT1ZKCkmJnQoKS5wYWdlSWQpO2cuRCgidW5sb2FkVHJpZ2dlciIsISFyYihlKSYmInhociIpO1JiKCJkb21haW5PdmVycmlkZSIsIiIpO2F8fChnLkQoImRvbVJlYWR5VGltZSIsbGUoKSksdGhpcy5aKGcpKTtmYShGYix0aGlzLGEsYixnKTtVYj0hMX1lbHNlIGc9dGhpcy5nYShhLGIpO2cmJih0aGlzLiQoaCxnKSx0aGlzLlUoYSwwPGMubGVuZ3RoLGcsZSkpO3JldHVybntyZWZlcnJlcjpkLEk6Z319O2IucHJvdG90eXBlLiQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1nYSgpO2IuRCgidGFyZ2V0Iix7dXJsOmMsdGl0bGU6UyhxYSgpLnN1YnN0cmluZygwLDEwMCkpfSk7dmFyIGQ9Yi5GLmFjdGlvbnMmJmIuRi5hY3Rpb25zWzBdLGs9ISFiLkYuc291cmNlQWN0aW9uOyhrfHxkJiYiX2xvYWRfIiE9PWQudHlwZSkmJmIuRCgidmlld0R1cmF0aW9uIixxKCktRGEpO2EudXJsJiZhLnVybCE9PWMmJiFrJiZiLkQoInNvdXJjZSIse3VybDphLnVybCx0aXRsZTphLnRpdGxlJiZhLnRpdGxlIT09cWEoKT9TKGEudGl0bGUpLnN1YnN0cmluZygwLDEwMCk6IiJ9KX07Yi5wcm90b3R5cGUuYT1mdW5jdGlvbihhLGIsZSxmLGssaCl7aCYmKGEuSj0hMCk7Yj0iZnVuY3Rpb24iPT09dHlwZW9mIGs/aygpOms7InVuZGVmaW5lZCIhPT10eXBlb2YgZSYmYS5EKGUsYil9O2IucHJvdG90eXBlLmhhPWZ1bmN0aW9uKGEpe3JldHVybiEoIWEuRi5hY3Rpb25zfHwhYS5GLmFjdGlvbnMubGVuZ3RoKX07Yi5wcm90b3R5cGUuaGxhPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2EuRi5hY3Rpb25zJiZiPGEuRi5hY3Rpb25zLmxlbmd0aDtiKyspaWYoIl9sb2FkXyI9PT1hLkYuYWN0aW9uc1tiXS50eXBlKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4gYn0oJGUpLFVhPSExLE5jLFViPSEwLFhhPW51bGwsbmUsbWUsSGEsYmc9ZG9jdW1lbnQsZGc9L2Z1bmN0aW9uXHMqKFtcd1wtJF0rKT9ccypcKC9pLGRhPTA7c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXswPGRhJiZkYS0tfSwzRTQpO3ZhciBCPW51bGwsS2I9bnVsbCxKPVtdLEk9W10sYWI9W10sSWM9MCxMYj0wLGVhPVtdLEQ9e30sWCxUPSExLEZjPS0xLFA9ITEsRGUsTGc9MSxKYj17ZTpbXSxsOltdfSxTYz1bXSxRYz1bXSxLZz0wLHBhPVtdLFE9e30sUmc9Ilx0XG5cciIsUmQ9bC5zZXNzaW9uU3RvcmFnZSxYZz01MDAsTmI9bC5hZGRFdmVudExpc3RlbmVyLFhjPWwuYXR0YWNoRXZlbnQsSWU9bC5yZW1vdmVFdmVudExpc3RlbmVyLE9nPWwuZGV0YWNoRXZlbnQsT2I9bC5Xb3JrZXIsTmc9T2ImJk9iLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLE1nPVsidG91Y2hzdGFydCIsInRvdWNoZW5kIiwic2Nyb2xsIl0sVT1bXSxQYj1uZXcoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzWyJeIl09Il5eIjt0aGlzWyJ8Il09Il5wIjt0aGlzWyIsIl09Il5jIjt0aGlzWyI7Il09Il5zIn19KCkpLFljLFFiPXt9LFYsemUsTWE9W10sUmU9ITEsdGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7fWEucHJvdG90eXBlLnNldEF1dG9tYXRpY0FjdGlvbkRldGVjdGlvbj1mdW5jdGlvbihhKXt3aW5kb3cuZFRfLmFhZChhKX07YS5wcm90b3R5cGUuc2V0TG9hZEVuZE1hbnVhbGx5PWZ1bmN0aW9uKCl7d2luZG93LmRUXy5zbGVtKCl9O2EucHJvdG90eXBlLnNpZ25hbExvYWRFbmQ9ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLnNsZSgpfTthLnByb3RvdHlwZS5zZW5kU2lnbmFsPWZ1bmN0aW9uKGEsYyxkKXt3aW5kb3cuZFRfLnNzKGEsYyxkKX07YS5wcm90b3R5cGUuZW50ZXJBY3Rpb249ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHdpbmRvdy5kVF8uZWEoYSxjLGQsZSl9O2EucHJvdG90eXBlLmxlYXZlQWN0aW9uPWZ1bmN0aW9uKGEsYyxkKXt3aW5kb3cuZFRfLmxhKGEsYyxkKX07YS5wcm90b3R5cGUucmVwb3J0RXJyb3I9ZnVuY3Rpb24oYSxjKXt3aW5kb3cuZFRfLnJleChhLGMpfTthLnByb3RvdHlwZS5yZXBvcnRXYXJuaW5nPWZ1bmN0aW9uKGEsYyl7d2luZG93LmRUXy5wdyhhLGMpfTthLnByb3RvdHlwZS5yZXBvcnRFdmVudD1mdW5jdGlvbihhLGMpe3dpbmRvdy5kVF8ucGwoYSxjKX07YS5wcm90b3R5cGUucmVwb3J0VmFsdWU9ZnVuY3Rpb24oYSxjKXt3aW5kb3cuZFRfLnJ2KGEsYyl9O2EucHJvdG90eXBlLnJlcG9ydFN0cmluZz1mdW5jdGlvbihhLGMpe3dpbmRvdy5kVF8ucnMoYSxjKX07YS5wcm90b3R5cGUudGFnVmlzaXQ9ZnVuY3Rpb24oYSl7d2luZG93LmRUXy5zTlQoKXx8d2luZG93LmRUXy5ycygiZHRfdmlzaXR0YWciLGEpfTthLnByb3RvdHlwZS5zdGFydFRoaXJkUGFydHk9ZnVuY3Rpb24oYSxjKXt3aW5kb3cuZFRfLnRwc3RyJiZ3aW5kb3cuZFRfLnRwc3RyKGEsYyl9O2EucHJvdG90eXBlLnN0b3BUaGlyZFBhcnR5PWZ1bmN0aW9uKGEsYyxkLGUpe3dpbmRvdy5kVF8udHBzdG8mJndpbmRvdy5kVF8udHBzdG8oYSxjLGQsZSl9O2EucHJvdG90eXBlLmFkZFBhZ2VMZWF2aW5nTGlzdGVuZXI9ZnVuY3Rpb24oYSl7d2luZG93LmRUXy5hcGxsKGEpfTthLnByb3RvdHlwZS5hZGRTdHJlYW1pbmdOb2RlPWZ1bmN0aW9uKGEsYyxkLGUsZixrLGgsZyxsKXt2YXIgYj1bXSxuPTA7YltuKytdPWE7YltuKytdPWM7YltuKytdPSEwPT09ZD8xOjA7YltuKytdPSEwPT09ZT8xOjA7YltuKytdPWY7YltuKytdPWs7YltuKytdPWg7YltuKytdPWc7d2luZG93LmRUXy5wY24oYi5qb2luKCJ8IiksbCxudWxsKX07YS5wcm90b3R5cGUuYmVnaW5Vc2VySW5wdXQ9ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHdpbmRvdy5kVF8uYmkoYSxjLGQsZSl9O2EucHJvdG90eXBlLmVuZFVzZXJJbnB1dD1mdW5jdGlvbihhKXt3aW5kb3cuZFRfLmVpKGEpfTthLnByb3RvdHlwZS5lbnRlclhockFjdGlvbj1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHdpbmRvdy5kVF8uZXgoYSxjLGQpfTthLnByb3RvdHlwZS5sZWF2ZVhockFjdGlvbj1mdW5jdGlvbihhKXt3aW5kb3cuZFRfLmx4KGEpfTthLnByb3RvdHlwZS5lbnRlclhockNhbGxiYWNrPWZ1bmN0aW9uKGEpe3dpbmRvdy5kVF8uZWMoYSl9O2EucHJvdG90eXBlLmxlYXZlWGhyQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7d2luZG93LmRUXy5sYyhhKX07YS5wcm90b3R5cGUuc2lnbmFsT25Mb2FkU3RhcnQ9ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLnNvbGIoKX07YS5wcm90b3R5cGUuaW5jcmVtZW50T25Mb2FkRW5kTWFya2Vycz1mdW5jdGlvbigpe3dpbmRvdy5kVF8uaW9sbSgpfTthLnByb3RvdHlwZS5zaWduYWxPbkxvYWRFbmQ9ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLnNvbGUoKX07YS5wcm90b3R5cGUuZW5kVmlzaXQ9ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLmVWKCl9O2EucHJvdG90eXBlLnNldEFwcFZlcnNpb249ZnVuY3Rpb24oYSl7d2luZG93LmRUXy5ycygiZHRfYXBwdmVyc2lvbiIsYSl9O2EucHJvdG90eXBlLnNldE1ldGFEYXRhPWZ1bmN0aW9uKGEsYyl7d2luZG93LmRUXy5zTUQmJndpbmRvdy5kVF8uc01EKGEsYyl9O2EucHJvdG90eXBlLmdldEFuZEV2YWx1YXRlTWV0YURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmRUXy5nRU1EP3dpbmRvdy5kVF8uZ0VNRCgpOltdfTtyZXR1cm4gYX0oKSx1aD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt9YS5wcm90b3R5cGUuc2V0QXV0b21hdGljQWN0aW9uRGV0ZWN0aW9uPWZ1bmN0aW9uKGEpe3dpbmRvdy5kVF8uYWFkKGEpfTthLnByb3RvdHlwZS5zZXRMb2FkRW5kTWFudWFsbHk9ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLnNsZW0oKX07YS5wcm90b3R5cGUuc2lnbmFsTG9hZEVuZD1mdW5jdGlvbigpe3dpbmRvdy5kVF8uc2xlKCl9O2EucHJvdG90eXBlLm1hcmtBc0Vycm9yUGFnZT1mdW5jdGlvbihhLGMpe3JldHVybiB3aW5kb3cuZFRfLm1hZXAoYSxjKX07YS5wcm90b3R5cGUubWFya1hIUkZhaWxlZD1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHdpbmRvdy5kVF8ubXhmKGEsYyxkLCEwKX07YS5wcm90b3R5cGUuc2VuZFNpZ25hbD1mdW5jdGlvbihhLGMsZCl7d2luZG93LmRUXy5zcyhhLGMsZCl9O2EucHJvdG90eXBlLmVudGVyQWN0aW9uPWZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiB3aW5kb3cuZFRfLmVhKGEsYyxkLG51bGwsZSxudWxsLCEwKX07YS5wcm90b3R5cGUubGVhdmVBY3Rpb249ZnVuY3Rpb24oYSxjLGQpe3dpbmRvdy5kVF8ubGEoYSxjLGQpfTthLnByb3RvdHlwZS5yZXBvcnRFcnJvcj1mdW5jdGlvbihhLGMpe3dpbmRvdy5kVF8ucmV4KGEsYyl9O2EucHJvdG90eXBlLmlkZW50aWZ5VXNlcj1mdW5jdGlvbihhKXt3aW5kb3cuZFRfLnNOVCgpfHx3aW5kb3cuZFRfLnJzKCJyeF92aXNpdHRhZyIsYSwtMSl9O2EucHJvdG90eXBlLnN0YXJ0VGhpcmRQYXJ0eT1mdW5jdGlvbihhLGMpe3dpbmRvdy5kVF8udHBzdHImJndpbmRvdy5kVF8udHBzdHIoYSxjKX07YS5wcm90b3R5cGUuc3RvcFRoaXJkUGFydHk9ZnVuY3Rpb24oYSxjLGQsZSl7d2luZG93LmRUXy50cHN0byYmd2luZG93LmRUXy50cHN0byhhLGMsZCxlKX07YS5wcm90b3R5cGUuYWRkUGFnZUxlYXZpbmdMaXN0ZW5lcj1mdW5jdGlvbihhKXt3aW5kb3cuZFRfLmFwbGwoYSl9O2EucHJvdG90eXBlLmJlZ2luVXNlcklucHV0PWZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiB3aW5kb3cuZFRfLmJpKGEsYyxkLGUpfTthLnByb3RvdHlwZS5lbmRVc2VySW5wdXQ9ZnVuY3Rpb24oYSl7d2luZG93LmRUXy5laShhKX07YS5wcm90b3R5cGUuZW50ZXJYaHJBY3Rpb249ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB3aW5kb3cuZFRfLmV4KGEsYyxudWxsLGQsITApfTthLnByb3RvdHlwZS5sZWF2ZVhockFjdGlvbj1mdW5jdGlvbihhKXt3aW5kb3cuZFRfLmx4KGEpfTthLnByb3RvdHlwZS5lbnRlclhockNhbGxiYWNrPWZ1bmN0aW9uKGEpe3dpbmRvdy5kVF8uZWMoYSl9O2EucHJvdG90eXBlLmxlYXZlWGhyQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7d2luZG93LmRUXy5sYyhhKX07YS5wcm90b3R5cGUuc2lnbmFsT25Mb2FkU3RhcnQ9ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLnNvbGIoKX07YS5wcm90b3R5cGUuaW5jcmVtZW50T25Mb2FkRW5kTWFya2Vycz1mdW5jdGlvbigpe3dpbmRvdy5kVF8uaW9sbSgpfTthLnByb3RvdHlwZS5zaWduYWxPbkxvYWRFbmQ9ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLnNvbGUoKX07YS5wcm90b3R5cGUuYWN0aW9uTmFtZT1mdW5jdGlvbihhKXt3aW5kb3cuZFRfLnJzKCJhbiIsYSl9O2EucHJvdG90eXBlLmVuZFNlc3Npb249ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLmVWKCl9O2EucHJvdG90eXBlLm5vdz1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuZFRfLm53KCl9O2EucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbigpe3dpbmRvdy5kVF8uZUEoKX07YS5wcm90b3R5cGUuZGlzYWJsZT1mdW5jdGlvbigpe3dpbmRvdy5kVF8uZEEoKX07YS5wcm90b3R5cGUuYWRkVmlzaXRUaW1lb3V0TGlzdGVuZXI9ZnVuY3Rpb24oYSl7d2luZG93LmRUXy5hTlZMKGEpfTthLnByb3RvdHlwZS5lbmFibGVTZXNzaW9uUmVwbGF5PWZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuZFRfLnNyZWwmJndpbmRvdy5kVF8uc3JlbCgpfTthLnByb3RvdHlwZS5kaXNhYmxlU2Vzc2lvblJlcGxheT1mdW5jdGlvbigpeyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LmRUXy5zcmRsJiZ3aW5kb3cuZFRfLnNyZGwoKX07YS5wcm90b3R5cGUuZ2V0QW5kRXZhbHVhdGVNZXRhRGF0YT1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuZFRfLmdFTUQ/d2luZG93LmRUXy5nRU1EKCk6W119O2EucHJvdG90eXBlLmVuYWJsZVBlcnNpc3RlbnRWYWx1ZXM9ZnVuY3Rpb24oKXt3aW5kb3cuZFRfLmVQVigpfTthLnByb3RvdHlwZS5kaXNhYmxlUGVyc2lzdGVudFZhbHVlcz1mdW5jdGlvbihhKXt3aW5kb3cuZFRfLmRQVihhKX07YS5wcm90b3R5cGUucmVnaXN0ZXJQcmVEaWZmTWV0aG9kPWZ1bmN0aW9uKGEpe3dpbmRvdy5kVF8uc3JwZG0gaW5zdGFuY2VvZgpBcnJheSYmd2luZG93LmRUXy5zcnBkbS5wdXNoKGEpfTtyZXR1cm4gYX0oKSxFOyhmdW5jdGlvbihhKXt0cnl7RT1hO3ZhciBiPWwuZFRfO2IuaW5pdGlhbGl6ZWQ9ITE7Yi5wYWdlSWQ9bnVsbDtiLmZhPW51bGw7Yi5FYT0wO2IuYndzVz0tMTtiLmJ3c0g9LTE7Yi5zeW49ITE7Yi5nb29nbGVCb3Q9ITE7Yi5neD1YYjtiLnRwPWVmO2IudGR0bz1SO2IuYUZVPWNmO2IuaVJPPWRmO2IuZ0JJPWJmO2IuaHliPVpiO2IuaU1EPWRkO2IuY2ZnPWdoO2IuYWNmZ1A9aGg7Yi5nQU49aWg7Yi5zbWJpPWVoO2IuaXNtPWRoO2IuaU1vZD1maDtiLnRhdT1NYjtiLmljcj1aYztiLmFJT2Y9c2E7Yi5zdXA9YmI7Yi5hZWw9emE7Yi5yZWw9SmQ7Yi5sdj1MZTtiLnN2PW1jO2IubHZsPVFnO2Iuc3ZsPVBnO2IuZ2g9SmU7Yi5jdnM9VWc7Yi5hZXNjPXo7Yi5yc2M9UztiLnRwZXNjPW9jO2IudWxjPXRiO2IuZ1A9dWE7Yi5hZnBsPVNnO2IuYXBsPU1lO2IucnBsPVRnO2IuZGJnPVZnO2IuZGJjPVdnO2IucnhhcHBseT1ZZztiLmxvYz1nYTtiLnNjaD1aZztiLmRlPU5lO2IuZ1BPPU9lO2IuZ0NQTz0kZztiLmx6dz1XZDtiLmx6d2U9QmE7Yi5nTlY9YWg7Yi5jVkluPWJoO2Iuc05UPWNoO2IuZ1BBSD1nZDtiLmlkPVlmO2Iuc3M9WGY7Yi5hc2w9WmY7Yi5zTVBTPVdmO2IuZ0JQPVVmO2IuY0I9bmg7Yi5zQj1vaDtiLmdpZD16ZztiLmVhPXdnO2IubGE9eGc7Yi5seD1pZztiLmV4PUFlO2IuZWM9amc7Yi5sYz1rZztiLmVWPTA9PT1FP21nOmxnO2IucGU9bmc7Yi5wdz1KYTtiLnBsPW9nO2IucnY9cmc7Yi5ycz1zZztiLnBjbj1MYTtiLnJybD1mZztiLmV3YT1wZztiLmdXUkk9cWc7Yi5jYT10ZztiLmNhbj1IZTtiLmlzY2k9T2Q7Yi5ub2E9dWc7Yi50aT1iYTtiLmxhcz15ZztiLmdjYT1xZTtiLmdBUj1HZTtiLmdBQT12ZztiLnN4YmU9VWM7Yi5hQ0Y9Smc7Yi5teD1HZztiLm14Zj1HYTtiLm14Zz1BZztiLm14Yz1CZztiLm14dD1DZztiLm14cD1EZztiLm14cz1FZztiLm14dT1GZztiLmFlYWw9SGc7Yi5hbGFsPUlnO2IuZ0xBRD1nZztiLmdJVEFJRD1yZTtiLlJhPXFlO2IucmU9b2U7Yi5yZXg9JGY7Yi5iaT1vZDtiLmVpPXFkO2IuZ2NpPXdhO2IuY2k9cmQ7Yi5jaXQ9a2Y7Yi5jaWg9bGY7Yi5ncGk9c2Q7Yi5waT10ZDtiLnBpdD1tZjtiLnBpdj11ZDtiLmFhZD1uZjtiLnNvbGU9eGQ7Yi5pb2xtPXNmO2Iuc29sYj16ZDtiLnNsZW09dGY7Yi5sc3Q9bGI7Yi5hbGw9QWQ7Yi5haWw9ZWc7Yi5hcGxsPXVmO2Iuc2xlPXJmO2Iub2JjPU5kO2IuaWxlPUFmO2IuZ0xBZXQ9b2Y7Yi5pU0FDPUNmO2Iuc1NBQz1QZDtiLmxBSUQ9RGY7Yi5tYWVwPUJmO2IubU5UVE89ZGU7Yi5zbnQ9QmI7Yi5hTU89YWU7Yi5yTU89QmM7Yi5nTU49S2Y7Yi5zTU49TGY7Yi5nTUE9TWY7Yi5zTUE9TmY7Yi5sQU09T2Y7bC5kVF8udmVyc2lvbj0iMTAxNTExOTAzMTkxNDA1MjAiO2lmKG5hdmlnYXRvci5jb29raWVFbmFibGVkKXt2YXIgYz1sLmRUXyxkPUlhKCk7ZCE9PWMudmVyc2lvbiYmbC5jb25zb2xlJiZsLmNvbnNvbGUubG9nKCJXQVJOSU5HOiBpbml0Q29kZSBbIitjLnZlcnNpb24rIl0gYW5kIGFzeW5jQ29yZSBbIitkKyJdIHZlcnNpb25zIGRvIG5vdCBtYXRjaCEgUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgc25pcHBldCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eS4iKTtjLnZlcnNpb249IjEwMTUxMTkwMzE5MTQwNTIwIjtnYj1sLlhNTEh0dHBSZXF1ZXN0O2hiPWwuQWN0aXZlWE9iamVjdDtHPWMuc3Q7cT1jLm53O0Y9Yy5wbjtwPWMuaW87cj1jLmFwdXNoO0NhPWMuc0M7cmE9Yy5nQztXZT1jLmRDO2ViPWMuZXNjO3hjPWMuY0xTQ0s7ZWQ9Yy5nUEM7ZmQ9Yy5zUEM7dmM9Yy5pVlNDO1VlPWMucDNTQztWZT1jLnBMU0M7SGI9Yy5nU0M7d2M9Yy5zU0M7SWI9Yy5nVkk7d2U9Yy5jUEM7RWU9Yy5nTlZJZDtUZT1jLmdTU1Y7WGU9Yy5zU1NWO3NlPWMuY1JOO3hhPWMuZ0VCVE47eWE9Yy5nRUw7aGQ9Yy5wYWdlQ29udGV4dENvb2tpZU5hbWV8fGMuZ1BDQ04oKTskYz1jLmdQQ0hOKCk7RmE9Yy5sYXRlbmN5Q29va2llTmFtZXx8Yy5nTENOKCk7a2U9Yy5tb2JpbGVTZXNzaW9uSURDb29raWVOYW1lfHxjLmdNU0lEQ04oKTt5Yz1jLnBDZmc7emM9Yy5wQ1NBQTtTZD1jLmNGSEZBVTtUZD1jLnNDRDt4PWMuYmN2O0E9Yy5uY3Y7Qz1jLnNjdjtSYj1jLnN0Y3Y7VmQ9Yy5ycGxDO0NiPWMuYUJQU0w7TWM9Yy5nQlBTTDtRYT1jLmdCUFNDQztZPWMuZ0ZJZDtXYj1jLm9FSUU7VmI9Yy5vRUlFV0E7UGU9Yy5yVklEO1lkPWMuaU5WO1pkPWMuZ1ZJRDthZD1jLmdBUm5WRjtQYz1jLmNBVVY7RmU9Yy5zVklkVVA7UWU9Yy5nRHRjO1ZhPWMuZ2NTSWQ7YmQ9Yy5jZmdPO1NiPUEoImJwIik7V2E9MjxTYj8idmkiOiJ2aXNpdElEIjtHYj0yPFNiPyJyZiI6InJlZmVyZXIiO3VjPTI8U2I/InNuIjoic2Vzc2lvbiI7RWE9Yy5nU0NOKCk7dWI9Yy5nUkhOKCk7RGE9ZWM9Yy5hZ2VudFN0YXJ0VGltZXx8Yy5nQVNUKCk7dmFyIGU9IWN8fGMuaW5pdGlhbGl6ZWQ/ITE6ITB9ZWxzZSBlPSExO2lmKCFlKXJldHVybiExO3RyeXt2YSYmdmEhPT1zZWxmJiZ2YS5kVF8mJnZhLmRUXy52ZXJzaW9uPT09SWEoKSYmKEthPXZhLmRUXyxOYT12YS5kVF8udGR0bygpKX1jYXRjaChhZil7fXZhciBmPXQoKTtOYT8oZi5wYWdlSWQ9TmEucGFnZUlkLGYuZmE9TmEuZmEsVGI9S2EuZ0ZJZCgpLEthLkVhKyspOihmLnBhZ2VJZD1ZKCksZi5mYT1xYSgpKTt0cnl7YT0vRmlyZWZveFtcL1xzXShcZCtcLlxkKykvO2I9LyhpUG9kfGlQaG9uZXxpUGFkKS87ZT0vQXBwbGVXZWJLaXQvO2lmKDA8PXAodSwiTVNJRSIpKXkuaWU9Rih1LnN1YnN0cih1Lmxhc3RJbmRleE9mKCJNU0lFIikrNSwzKSkseS50cmlkZW50PUYodS5zdWJzdHIodS5sYXN0SW5kZXhPZigiVHJpZGVudCIpKzgsMSkpO2Vsc2UgaWYoMDw9cCh1LCJUcmlkZW50IikpeS50cmlkZW50PUYodS5zdWJzdHIodS5sYXN0SW5kZXhPZigiVHJpZGVudCIpKzgsMSkpLDA8PXAodSwicnY6Iik/eS5pZT1GKHUuc3Vic3RyKHUubGFzdEluZGV4T2YoInJ2OiIpKzMsMikpOjA8PXAodSwicnYgIikmJih5LmllPUYodS5zdWJzdHIodS5sYXN0SW5kZXhPZigicnYgIikrMywyKSkpO2Vsc2UgaWYoMDw9cCh1LCJFZGdlIikpeS5lZGdlPUYodS5zdWJzdHIodS5sYXN0SW5kZXhPZigiRWRnZSIpKzUsMikpO2Vsc2UgaWYoMDw9cCh1LCJBbmRyb2lkIikpeS5hYj1wYXJzZUZsb2F0KHUuc3Vic3RyKHAodSwiQW5kcm9pZCIpKzgsMykpO2Vsc2UgaWYodS5tYXRjaChiKSYmdS5tYXRjaChlKSl7dmFyIGs9L1ZlcnNpb25cLyhbMC05XSpcLlswLTldKikvO3UubWF0Y2goayl8fChrPS9PUyAoWzAtOV0qX1swLTldKikvKTt5Lm1zZj1wYXJzZUZsb2F0KHUubWF0Y2goaylbMV0pfWVsc2UgaWYoKCJTYWZhcmkiPT09bmF2aWdhdG9yLmFwcE5hbWV8fC0xPHAodSwiU2FmYXJpIikpJiYtMT09PXAodSwiQ2hyb20iKSkoaz11LnN1YnN0cih1Lmxhc3RJbmRleE9mKCJWZXJzaW9uLyIpKS5tYXRjaCgvVmVyc2lvblwvKFswLTldKyhcLlswLTldKik/KS8pKSYmKHkuc2Y9RihrWzFdKSk7ZWxzZSBpZihsLm9wZXJhKXkub3A9RihsLm9wZXJhLnZlcnNpb24oKS5zcGxpdCgiLiIpWzBdKTtlbHNlIGlmKDA8PXAodSwiT1BSLyIpKXkub3A9Rih1Lm1hdGNoKC9PUFJcLyhbMC05XSpcLlswLTldKikvKVsxXSk7ZWxzZSBpZihhLnRlc3QodSkpe3ZhciBoPUYodS5tYXRjaChhKVsxXSk7eS5mZj0tMT09PWg/MDpofWVsc2V7dmFyIGc9cCh1LCJDaHJvbSIpOy0xPGcmJih5LmNoPUYodS5zdWJzdHJpbmcoZys3LGcrOSkpKX10KCkuc3luPTA8cCh1LCJSdXhpdFN5bnRoZXRpYyIpO3QoKS5nb29nbGVCb3Q9MDw9cCh1LCJHb29nbGVib3QiKX1jYXRjaChhZil7fVY9YmQ/YmQoKTp0KCkuY2ZnO1VkKFYpO0hhPTQhPT1BKCJicCIpP25ldyBxaDpuZXcgc2g7WWU9MDtEZT15Lm1zZj8xRTM6MDtuZD1qZChnYSgpKTtIPVIoKTt4KCJpbW0iKSYmZGQoKXx8KGlhKCJjbGljayIsIkMiLCJjbGsiKSxpYSgibW91c2Vkb3duIiwiRCIsIm1kdyIpLGlhKCJtb3VzZXVwIiwiVSIsIm11cCIpKTtpYSgiZGJsY2xpY2siLCJDQyIsImRjbCIpO2lhKCJrZXlkb3duIiwiS0QiLCJreWQiKTtpYSgia2V5dXAiLCJLVSIsImt5dSIpO2lhKCJzY3JvbGwiLCJTIiwic2NyIik7aWEoInRvdWNoc3RhcnQiLCJUUyIsInRjcyIpO2lhKCJ0b3VjaGVuZCIsIlRFIiwidGNlIik7aWYoQygiYWRlIikpe3ZhciB3PUMoImFkZSIpLnNwbGl0KCIsIik7aWYodyYmMDx3Lmxlbmd0aClmb3Ioaz0wO2s8dy5sZW5ndGg7aysrKWlhKHdba10pfXZhciBtPVIoKS5zU0FDO20mJm0oITEpO2Zvcih2YXIgbj14KCJkc3NzIik/TGUoImR0U2EiKTpyYSgiZHRTYSIpLEI9eGEoIm1ldGEiKSx2LEk9QSgibXJ0Iiksdz0wO3c8Qi5sZW5ndGgmJiF2O3crKyl7dmFyIEo9Qlt3XSxLPUouZ2V0QXR0cmlidXRlKCJodHRwLWVxdWl2Iik7aWYoSyYmInJlZnJlc2giPT09Sy50b0xvd2VyQ2FzZSgpKXt2YXIgTD1KLmdldEF0dHJpYnV0ZSgiY29udGVudCIpO3Y9RigoTCYmTC5zcGxpdCgiOyIpKVswXSk8PUl9fXY/QWErKzpxYigiLSIpO2lmKG4mJiItIiE9PW4pe3ZhciBEPW4uc3BsaXQoInwiKTtpZigxMT09PUQubGVuZ3RoKXt2YXIgUT0idHJ1ZSI9PURbMF0sVD1EWzFdLFc9RihEWzJdKSxYPURbM10sZWE9RFs0XSxmYT1GKERbNV0pLGhhPURbNl0sVT1EWzddLFA7Zm9yKFAgaW4gUGIpaWYoUGIuaGFzT3duUHJvcGVydHkoUCkpdmFyIG5hPW5ldyBSZWdFeHAoUGJbUF0ucmVwbGFjZSgvXF4vZywiXFxeIiksImciKSxVPVUucmVwbGFjZShuYSxQKTt2YXIgcGE9VS5yZXBsYWNlKC9fNUYvZywiXyIpLnJlcGxhY2UoL18yNS9nLCIlIikucmVwbGFjZSgvXzdDL2csInwiKTt2YXIgTz17aXNEZWxheWVkOlEsdHlwZTpULGlkOlcsbmFtZTpYLGluZm86ZWEsc3RhcnRUaW1lOmZhLGZyYW1lSWQ6aGEsbG9jYXRpb246cGEsdGl0bGU6RFs4XSx2aWV3RHVyYXRpb25TdGFydDpGKERbOV0pLGFuY2hvcjpEWzEwXX0sQj0hMTt0KCkhPT1SKCkmJihCPVIoKS5pUk8oTy5sb2NhdGlvbikpOyFkb2N1bWVudC5yZWZlcnJlcnx8Ty5sb2NhdGlvbj09PXooZG9jdW1lbnQucmVmZXJyZXIpfHxPLmxvY2F0aW9uPT09eihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8Qj8oZmI9TyxEYT1PLnZpZXdEdXJhdGlvblN0YXJ0KTpxYihuKX19dmFyIGthPWRvY3VtZW50LmxvY2F0aW9uO2thJiZSKCkuYUZVKGthLmhyZWYpO2lmKCFDKCJyaWQiKSl7dmFyIG49UmIsbGE9QygicmlkUGF0aCIpLHRhPWxhP2xhOmwubG9jYXRpb24ucGF0aG5hbWUsTj1sLmxvY2F0aW9uLnNlYXJjaDtOJiZOLmxlbmd0aCYmIj8iPT09Ti5jaGFyQXQoMCkmJihOPU4uc3Vic3RyaW5nKDEpKTt2YXIgWj0zMStLZSh0YSk7Wj0zMSpaK0tlKE4pO24oInJpZCIsIlJJRF8iKyhaJlopKX0obWI9dWEoKSkmJihNPW1iLnRpbWluZykmJnRiKChNLnJlcXVlc3RTdGFydC0oTS5yZWRpcmVjdEVuZHx8TS5uYXZpZ2F0aW9uU3RhcnQpKS8yLCEwKTt6YShsLCJiZWZvcmV1bmxvYWQiLE5kKTt6YShsLCJ1bmxvYWQiLHdmKTt6YShsLCJwYWdlaGlkZSIseGYpO3phKGRvY3VtZW50LCJyZWFkeXN0YXRlY2hhbmdlIixEZCk7RyhrYywzRTMpO3phKGwsImxvYWQiLENkKTtWZigpO2wuZG9Ob3RDcmVhdGVMb2FkQWN0aW9ufHwoamE9bmIoIl9sb2FkXyIsIl9sb2FkXyIsbGIoKSxudWxsKSxiYSgpLERkKCkpO2xoKCk7bWgoKTtTZigpO1BmKCk7dmFyIG1hLGNhO2lmKGNhPTA9PT1FKSJ1bmRlZmluZWQiPT09dHlwZW9mIHdpbmRvdy5kVF8/Y2E9ITE6KCJ1bmRlZmluZWQiPT09dHlwZW9mIHdpbmRvdy5kdHJ1bSYmKHdpbmRvdy5kdHJ1bT1uZXcgdWgpLGNhPSEwKTtpZighKG1hPWNhKSl7dmFyIGRhO2lmKGRhPTE9PT1FKSJ1bmRlZmluZWQiPT09dHlwZW9mIHdpbmRvdy5kVF8/ZGE9ITE6KCJ1bmRlZmluZWQiPT09dHlwZW9mIHdpbmRvdy5keW5hVHJhY2UmJih3aW5kb3cuZHluYVRyYWNlPW5ldyB0aCksZGE9ITApO21hPWRhfWlmKCFtYSlyZXR1cm4hMTt2YXIgb2E9dCgpO29hLmluaXRpYWxpemVkPSEwOyJmdW5jdGlvbiI9PT10eXBlb2Ygb2EuaW5pdENhbGxiYWNrJiZvYS5pbml0Q2FsbGJhY2soKX1jYXRjaChhZil7cmV0dXJuITF9cmV0dXJuITB9KSgxKXx8KGRlbGV0ZSBsLmRUXyxsLmNvbnNvbGUmJmwuY29uc29sZS5sb2coIkpzQWdlbnQgYXN5bmNDb3JlIGluaXRpYWxpemF0aW9uIGZhaWxlZCEiKSl9fSkoKTt9KSgpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIHEoYSxjKXtmb3IodmFyIGI9MjtiPGFyZ3VtZW50cy5sZW5ndGg7YisrKTtmb3IoYj0yO2I8YXJndW1lbnRzLmxlbmd0aDtiKyspYS5wdXNoKGFyZ3VtZW50c1tiXSksKGI8YXJndW1lbnRzLmxlbmd0aC0xfHxjKSYmYS5wdXNoKCJ8Iil9ZnVuY3Rpb24gUChhLGMpe3JldHVybiBhLmIuZHVyYXRpb248Yy5iLmR1cmF0aW9uPzE6YS5iLmR1cmF0aW9uPT09Yy5iLmR1cmF0aW9uPzA6LTF9ZnVuY3Rpb24gRihhLGMpe3JldHVybiBhPmM/YTpjfWZ1bmN0aW9uIFEoYSxjKXtmb3IodmFyIGI9ZS5udygpLGY9MDtmPHIubGVuZ3RoO2YrKylpZihyW2ZdLnVybD09PWMpcmV0dXJuO2Y9ZS5jYSgpfHx7fTtxKHIsITEse3R5cGU6YSxiOnt0aW1pbmc6e3N0YXJ0OmIsc3RvcDowfSxkdXJhdGlvbjowfSxnOnt0aW1pbmc6e3N0YXJ0OjAsc3RvcDowfSxkdXJhdGlvbjowfSx1cmw6YyxGOmYubmFtZXx8Ii0iLEc6ITEsbTohMSx2OiExLEg6ITF9KX1mdW5jdGlvbiBSKGEsYyxiLGYpe2Zvcih2YXIgaD0wO2g8ci5sZW5ndGg7aCsrKXt2YXIgZD1yW2hdO2lmKGQudXJsPT09YSl7ZC5iLnRpbWluZy5zdGFydD1ifHxkLmIudGltaW5nLnN0YXJ0O2QuYi50aW1pbmcuc3RvcD1mfHxlLm53KCk7ZC5tPWM7Y3x8KGQuRz0hMSxkLkg9ITApO2JyZWFrfX19ZnVuY3Rpb24gUyhhKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGI9YVtjXSxmPWIuYjshZi50aW1pbmcuc3RvcCYmZi50aW1pbmcuc3RhcnQmJigiaSI9PT1iLnR5cGU/KGIudj0hMCxiLm09ITEsZi50aW1pbmcuc3RvcD1lLm53KCkpOihiLmcudGltaW5nLnN0YXJ0fHwoYi5tPSEwKSxmLnRpbWluZy5zdG9wPWYudGltaW5nLnN0YXJ0KSk7Yj1mLnRpbWluZztmLmR1cmF0aW9uPWIuc3RvcD9iLnN0b3AtYi5zdGFydDpmLmR1cmF0aW9ufX1mdW5jdGlvbiBJKGEsYyl7YS5jKys7dmFyIGI9aXNOYU4oYS5sKT9OdW1iZXIuTUFYX1ZBTFVFOmEubDthLmw9YjxjP2I6YzthLmg9RihhLmgsYyk7YS5hPWUucG4oU3RyaW5nKChhLmEqKGEuYy0xKStjKS9hLmMpLDEwKX1mdW5jdGlvbiBKKGEsYyl7YT1hW2NdO2EuZD1hLmouSSgpO2RlbGV0ZSBhLmp9ZnVuY3Rpb24gVChhLGMsYixlKXtmb3IodmFyIGYgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGYpKXt2YXIgZD1hW2ZdO2lmKGUpe2lmKGNbYl0uZD1iLCJpIj09PWZ8fCJjIj09PWZ8fCJzIj09PWZ8fCJvIj09PWZ8fCJ5Ij09PWYpY1tiXVtmXT1kLEooZCwidyIpLEooZCwiaW0iKX1lbHNle3ZhciBtPWMsZz1mLHA9YixrPWQuaW0sbD1kLnc7ImkiPT09Z3x8InMiPT09Zz9tW3BdW2ddPVtkLnMsZC5mLGQuaSxkLmMsay5jLGwuYyxrLmouRCgpLGsuYSxrLmM/ay5sOiIwIixrLmgsbC5qLkQoKSxsLmEsbC5jP2wubDoiMCIsbC5oXS5qb2luKCJ8Iik6Im8iPT09Z3x8ImMiPT09Zz9tW3BdW2ddPVtkLnMsZC5mLGQuaSxkLmMsbC5qLkQoKSxsLmEsbC5sfHwiMCIsbC5oXS5qb2luKCJ8Iik6InkiPT09ZyYmKG1bcF1bZ109W2QucyxrLmouRCgpLGsuYSxrLmx8fCIwIixrLmhdLmpvaW4oInwiKSl9fX1mdW5jdGlvbiBLKCl7cmV0dXJuIGE9e2o6bmV3IFV9LGEuYT0wLGEuaD0wLGEuYz0wLGEuZD1bXSxhO3ZhciBhfWZ1bmN0aW9uIFYoYSxjLGIsZil7dmFyIGU9KG49e30sbi5kPWMsbik7YS5zb3J0KFApO2JbY109YltjXXx8e2Q6YyxDOjB9O2UuZD1jO2Uuc2w9KGQ9e30sZC50PSIiLGQuaT0iIixkLmltPXtzdGFydDowLHN0b3A6MH0sZC53PXtzdGFydDowLHN0b3A6MH0sZC5hPSIiLGQudT0iIixkKTtmb3Iobj0wO248YS5sZW5ndGg7bisrKXt2YXIgZD1hW25dLG09ZC50eXBlLGc9ZVttXTtnfHwoZz17czowLGk6MCxmOjAsYzowfSxnLnc9SygpLGcuaW09SygpLGVbbV09Zyk7dmFyIHA9ZC5iLnRpbWluZyxtPWQuZy50aW1pbmc7aWYocC5zdGFydCYmcC5zdG9wKXt2YXIgaz1nLGw9ZjtJKGsuaW0scC5zdG9wLXAuc3RhcnQpO2suaW0uai5hZGQocC5zdGFydC1sLHAuc3RvcC1sKX1pZihtLnN0YXJ0JiZtLnN0b3Ape3A9ZDtrPWc7bD1wLmcuZHVyYXRpb247MD5sJiYobD1tLnN0b3AtbS5zdGFydCk7aWYoMD5sfHwzRTU8bClsPTA7SShrLncsbCk7ay53LmouYWRkKHAuZy50aW1pbmcuc3RhcnQscC5nLnRpbWluZy5zdG9wKX1nLnMrPStkLm07Zy5jKz0rZC5HO2QubXx8KGcuaSs9TnVtYmVyKGQudiksZy5mKz1OdW1iZXIoIWQudikpO2JbY10uQz1GKGJbY10uQyxGKGcudy5oLGcuaW0uaCkpfXJldHVybiBlO3ZhciBuLGR9ZnVuY3Rpb24gVyhhLGMsYixlLGgpe2Zvcih2YXIgZD1bXSxmLGc9MDtnPGEubGVuZ3RoO2crKyl7Zj1hW2ddO3ZhciBwPWNbZl0saz1iW2ZdO2RlbGV0ZSBrLkM7Zm9yKHZhciBsPTA7bDxwLmxlbmd0aCYmbDx4JiYocFtsXS5iLmR1cmF0aW9uPj12fHxwW2xdLmcuZHVyYXRpb24+PXYpO2wrKyl7dmFyIG49dm9pZCAwLHE9cFtsXSxyPXEuYi50aW1pbmcsdD1xLmcudGltaW5nLHU9IiI7cS5tfHwodT1xLnY/ImkiOiJmIik7ay5zbD0obj17fSxuLmk9dSxuLnU9cS51cmwsbi5hPXEuRnx8IiIsbi53PXQuc3RvcD90OntzdGFydDotMSxzdG9wOi0xfSxuLmltPXIuc3RvcD9yOntzdGFydDotMSxzdG9wOi0xfSxuLnQ9cS50eXBlLG4pfX1mb3IoZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJmQucHVzaChiW2ZdKTtyZXR1cm4gZC5sZW5ndGg/KHc9e30sdy5yPWQsdy5uPWUsdy5pPWgsdyk6bnVsbDt2YXIgd31mdW5jdGlvbiBYKGEsYyxiLGYsaCl7Zm9yKHZhciBkPVtdLG09MDttPGEubGVuZ3RoO20rKyl7dmFyIGc9YVttXSxwPWNbZ10saz1iW2ddOzA8ZC5sZW5ndGgmJnEoZCwhMSwiOyIpO3EoZCwhMCxlLmFlc2MoZyksImZlYXR1cmVIYXNoIik7dmFyIGc9MCxsPWQubGVuZ3RoLTI7ay5pJiYocShkLCEwLGsuaSksZys9Mik7ay5zJiYocShkLCEwLGsucyksZys9NCk7ay5jJiYocShkLCEwLGsuYyksZys9OCk7ay5vJiYocShkLCEwLGsubyksZys9MTYpO2sueSYmKHEoZCwhMCxrLnkpLGcrPTMyKTtkLnBvcCgpO2RbbF09Zy50b1N0cmluZygzMik7az1kO2c9Zjtmb3IobD0wO2w8cC5sZW5ndGgmJmw8eCYmKHBbbF0uYi5kdXJhdGlvbj49dnx8cFtsXS5nLmR1cmF0aW9uPj12KTtsKyspe3ZhciBuPXBbbF0scj1uLmIudGltaW5nO3EoaywhMSwiLCIpO3ZhciB0PSIiO24ubXx8KHQ9bi52PyJpIjoiZiIpO3EoaywhMSxuLnR5cGUrdCxyLnN0YXJ0P3Iuc3RhcnQtZzowLHIuc3RvcD9yLnN0b3AtZzowLGUuYWVzYyhuLkYpLGUudHBlc2Mobi51cmwpKTtuPW4uZy50aW1pbmc7bi5zdGFydCYmcShrLCExLCIiLG4uc3RhcnQsbi5zdG9wKX19aWYoMD49ZC5sZW5ndGgpcmV0dXJuIG51bGw7YT1kLmpvaW4oIiIpO2gmJihhPWgrIi0iK2YrIjsiK2EpO3JldHVybiBlLmVzYyhhKX1mdW5jdGlvbiB0KGEsYyxiKXt2YXIgZj17fSxoPWUubHN0KCk7ZS5yZV90JiZTKGEpO2lmKCFhLmxlbmd0aHx8MD49aClyZXR1cm4gbnVsbDtmb3IodmFyIGQ9e30sbSxnPTA7ZzxhLmxlbmd0aDtnKyspe3ZhciBwPWFbZ107aWYobT1lLmdoKHAudXJsKSlkW21dPWRbbV18fFtdLHEoZFttXSwhMSxwKX1mb3IobSBpbiBkKWQuaGFzT3duUHJvcGVydHkobSkmJmRbbV0ubGVuZ3RoJiZUKFYoZFttXSxtLGYsaCksZixtLGIpO2E9W107Zm9yKG0gaW4gZilmLmhhc093blByb3BlcnR5KG0pJiZxKGEsITEsbSk7MDx1JiZhLmxlbmd0aD51JiYoYT1hLnNvcnQoZnVuY3Rpb24oYSxjKXtyZXR1cm4gZltjXS5DLWZbYV0uQ30pLnNsaWNlKDAsdSkpO3JldHVybiBiP1coYSxkLGYsaCxjKTpYKGEsZCxmLGgsYyl9ZnVuY3Rpb24gTChhKXtpZighR3x8YS5sZW5ndGg+eSYmMj09PUcpYT1hLnNwbGl0KCI/IilbMF07aWYoYS5sZW5ndGg+eSl7dmFyIGM9ZS5naChhKTthPWEuc3BsaXQoIi8iKTt2YXIgYj1hW2EubGVuZ3RoLTFdO2E9YysiLy4uLyIrYjt2YXIgZj1hLmxlbmd0aC15OzA8ZiYmYi5sZW5ndGg+ZiYmKGE9YysiLy4uLy4uIitiLnN1YnN0cmluZyhmLGIubGVuZ3RoKSl9cmV0dXJuIGUudHBlc2MoYSl9ZnVuY3Rpb24gWShhLGMsYixmLGgpe2YmJihoLnczY1Jlc291cmNlcy5BLnB1c2goZnVuY3Rpb24oKXt2YXIgYj1IKCk7aWYoIWEubGVuZ3RofHwwPj1iKWI9bnVsbDtlbHNle2Zvcih2YXIgZj1bXSxnPSEwLGg9MDtoPGEubGVuZ3RoJiYoaCE9PXp8fCFoKTtoKyspe3ZhciBrPWFbaF0sbD1rLnN0YXJ0VGltZTswPj1sfHxrLmFjdGlvbklkJiZrLmFjdGlvbklkIT09Y3x8KGw9ZS5zbnQoayxsP1siYiIsTWF0aC5yb3VuZChsKV06W10sITApLGd8fHEoZiwhMSwifCIpLGc9ITEscShmLCExLEwoay5uYW1lKSxsLmpvaW4oIiIpKSl9Zj1mLmpvaW4oIiIpO2I9ZS5lc2MoYz9jKyItIitiKyI7IitmOiItIitiKyI7IitmKX1yZXR1cm4gYn0pLGgudzNjUmVzb3VyY2VzLkIucHVzaChmdW5jdGlvbigpe2E6e3ZhciBiPVtdO3ZhciBmPUgoKTtpZighYS5sZW5ndGh8fDA+PWYpYj1udWxsO2Vsc2V7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aCYmKGchPT16fHwhZyk7ZysrKXt2YXIgaD1hW2ddLGs9aC5zdGFydFRpbWU7MDxrJiYoIWguYWN0aW9uSWR8fGguYWN0aW9uSWQ9PT1jKSYmKGs9ZS5zbnQoaCxrP1siYiIsTWF0aC5yb3VuZChrKV06W10sITApLGs9ZS5tTlRUTyhrKSxoPShsPXt9LGwudT1MKGgubmFtZSksbC50PWssbCksYi5wdXNoKGgpKX1iPShuPXt9LG4uaT1jLG4ubj1mLG4ucj1iLG4pO2JyZWFrIGE7dmFyIGwsbn19cmV0dXJuIGJ9KSk7aC5yZXNvdXJjZVN1bW1hcmllcy5BLnB1c2goZnVuY3Rpb24oKXtyZXR1cm4gdChiLGMsITEpfSk7aC5yZXNvdXJjZVN1bW1hcmllcy5CLnB1c2goZnVuY3Rpb24oKXtyZXR1cm4gdChiLGMsITApfSl9ZnVuY3Rpb24gWihhKXt2YXIgYz0hMDtlLnJlX3ImJmUuZ1NpZ3x8KGM9ITEpO0E9SCgpOzA+PUEmJihjPSExKTt2YXIgYj1lLmdMQWV0KCk7IWEmJigwPj1ifHwzRTM+ZS5udygpLWIpJiYoZS5zTVBTKDJFMyksYz0hMSk7cmV0dXJuIGN9ZnVuY3Rpb24gYWEoYSxjLGIpe3ZhciBmPWEucmVzb3VyY2VzO2E9YS5hY3Rpb25JZDtpZihlLmdCSSgpLm9wKXtmb3IodmFyIGg9W10sZD17fSxtPTA7bTxmLmxlbmd0aDttKyspe3ZhciBnPWZbbV07ZFtnLm5hbWVdfHwoaC5wdXNoKGcpLGRbZy5uYW1lXT0hMCl9Zj1ofWUuYWFpJiZlLmFhaShmKTtoPVtdO2ZvcihkPTA7ZDxmLmxlbmd0aDtkKyspdHJ5e2gucHVzaChiYShmW2RdKSl9Y2F0Y2gocCl7fWg9aC5jb25jYXQocik7cj1bXTtZKGYsYSxoLGMsYil9ZnVuY3Rpb24gY2EoYSxjLGIsZil7aWYoIWMmJmUubGFzKCkmJighZS5zeW58fGIpKWlmKGUucmVfdCYmZS5nSUEmJiFNKWUuZ0lBKCkmJiFiP2Uuc01QUygxRTMpOihNPSEwLGEuYShmLCIzcCIsInJlc291cmNlU3VtbWFyaWVzIixmdW5jdGlvbigpe3JldHVybiB0KHIsdm9pZCAwLCExKX0sZnVuY3Rpb24oKXtyZXR1cm5bdChyLHZvaWQgMCwhMCldfSwhMCkscj1bXSk7ZWxzZSBpZihaKGIpKXtpZihjPWRhKCkpdT0tMSx4PTAsQj0hMDtiPWUuZ1NpZyhiKTt2YXIgaD17dzNjUmVzb3VyY2VzOntBOltdLEI6W119LHJlc291cmNlU3VtbWFyaWVzOntBOltdLEI6W119fTtpZihiJiYwPGIubGVuZ3RoKWZvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKWFhKGJbZF0sYyxoKTtlbHNlIDA8ci5sZW5ndGgmJihoLnJlc291cmNlU3VtbWFyaWVzLkEucHVzaChmdW5jdGlvbigpe3JldHVybiB0KHIsdm9pZCAwLCExKX0pLGgucmVzb3VyY2VTdW1tYXJpZXMuQi5wdXNoKGZ1bmN0aW9uKCl7cmV0dXJuIHQocix2b2lkIDAsITApfSkpO04oYSxoLCIzcCIsInJlc291cmNlU3VtbWFyaWVzIixmKTtOKGEsaCwicnQiLCJ3M2NSZXNvdXJjZXMiLGYpfX1mdW5jdGlvbiBOKGEsYyxiLGYsZSl7dmFyIGQ9Y1tmXTtmb3IoYz0wO2M8ZC5BLmxlbmd0aDtjKyspYS5hKGUsYisoMDxjP2M6IiIpLHZvaWQgMCxkLkFbY10sdm9pZCAwLCEwKTthLmEoZSx2b2lkIDAsZix2b2lkIDAsZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj0wO2I8ZC5CLmxlbmd0aDtiKyspYS5wdXNoKGQuQltiXSgpKTtyZXR1cm4gYX0sITApfWZ1bmN0aW9uIGRhKCl7aWYoMUU0PT09QylyZXR1cm4hMDt2YXIgYT1lLmNWSW4oKTtyZXR1cm4gMD09PWF8fGE/TnVtYmVyKGEpJTFFNDxDOiExfWZ1bmN0aW9uIGVhKGEpe3ZhciBjPWUuZ2goYSksYj0tMSE9PWEuaW5kZXhPZigiY2hyb21lLWV4dGVuc2lvbjovLyIpfHwtMSE9PWEuaW5kZXhPZigiY2hyb21lOi8vIil8fC0xIT09YS5pbmRleE9mKCJkYXRhOiIpfHwtMSE9PWEuaW5kZXhPZigiamF2YXNjcmlwdDoiKXx8LTEhPT1hLmluZGV4T2YoImFib3V0OiIpfHwtMSE9PWEuaW5kZXhPZigicmVzOi8vIik7YT0tMSE9PWEuaW5kZXhPZigiOi8vbG9jYWxob3N0LyIpfHwtMSE9PWEuaW5kZXhPZigiOi8vbG9jYWxob3N0OiIpfHxjJiYtMSE9PWMuaW5kZXhPZigiLmxvY2FsIixjLmxlbmd0aC02KTtyZXR1cm4gQj8hYjohYiYmIWEmJmMmJmMhPT1EfWZ1bmN0aW9uIGJhKGEpe3ZhciBjPWZhKGEpLGI9YS5kdXJhdGlvbjtifHwoYj1hLnJlc3BvbnNlRW5kLWEuc3RhcnRUaW1lKTt2YXIgYj1iP01hdGgucm91bmQoYik6MCxmPU8oYSk7aWYoMDxhLnJlc3BvbnNlRW5kKXt2YXIgaD1BK2EucmVzcG9uc2VFbmQ7aC09ZS5sc3QoKTtoPU1hdGgucm91bmQoaCl9ZWxzZSBoPU1hdGgucm91bmQoZS5udygpLWUubHN0KCkpO2I9e2R1cmF0aW9uOmIsdGltaW5nOntzdGFydDpmLHN0b3A6aH19O2Y9YS5uYW1lO2g9TyhhKTw9ZS5nTEFldCgpPyJfbG9hZF8iOiItIjt2YXIgZD0hYS5yZXNwb25zZUVuZDt2YXIgbT1hLmZhaWxlZFJlc291cmNlPyExOmUuZ2goYS5uYW1lKT09PUQmJmUuZ0JJKCkuaWU/MCE9PWEucmVxdWVzdFN0YXJ0OjA8YS5yZXNwb25zZUVuZDthPWUuZ0JJKCkuY2g/MCE9PWEuZG9tYWluTG9va3VwU3RhcnQmJjA9PT1hLnJlcXVlc3RTdGFydDplLmdoKGEubmFtZSkhPT1EJiYwPT09YS5yZXF1ZXN0U3RhcnQmJjI+YS5kdXJhdGlvbj8hMDowPj1hLnJlc3BvbnNlRW5kPyExOmEucmVxdWVzdFN0YXJ0PT09YS5mZXRjaFN0YXJ0JiZhLnJlcXVlc3RTdGFydD09PWEucmVzcG9uc2VTdGFydCYmYS5yZXNwb25zZVN0YXJ0IT09YS5yZXNwb25zZUVuZDtyZXR1cm57dHlwZTpjLGc6YixiOntkdXJhdGlvbjowLHRpbWluZzp7c3RhcnQ6MCxzdG9wOjB9fSx1cmw6ZixGOmgsdjpkLG06bSxHOmEsSDohMX19ZnVuY3Rpb24gZmEoYSl7YT1hLm5hbWUudG9Mb3dlckNhc2UoKTstMTxhLmluZGV4T2YoIlNjcmlwdFJlc291cmNlLmF4ZCIpP2E9ImpzIjooYT1hLnN1YnN0cigxK2EubGFzdEluZGV4T2YoIi8iKSksMDxhLmluZGV4T2YoIj8iKSYmKGE9YS5zcGxpdCgiPyIpWzBdKSwwPGEuaW5kZXhPZigiIyIpJiYoYT1hLnNwbGl0KCIjIilbMF0pLGE9MDxhLmluZGV4T2YoIi4iKT9hLnN1YnN0cmluZyhhLmxhc3RJbmRleE9mKCIuIikrMSk6Ii0iKTtzd2l0Y2goYSl7Y2FzZSJqcyI6cmV0dXJuInMiO2Nhc2UiZ2lmIjpjYXNlInBuZyI6Y2FzZSJqcGciOmNhc2UianBlZyI6Y2FzZSJpY28iOmNhc2UidGlmZiI6Y2FzZSJibXAiOmNhc2UieGJtIjpjYXNlInN2ZyI6cmV0dXJuImkiO2Nhc2UiY3NzIjpyZXR1cm4iYyI7ZGVmYXVsdDpyZXR1cm4ibyJ9fWZ1bmN0aW9uIEgoKXtyZXR1cm4gRSYmRS50aW1pbmc/RS50aW1pbmcubmF2aWdhdGlvblN0YXJ0Oi0xfWZ1bmN0aW9uIE8oYSl7YT1BK2Euc3RhcnRUaW1lO2EtPWUubHN0KCk7cmV0dXJuIE1hdGgucm91bmQoYSl9dmFyIGU9d2luZG93LmRUXyxFLEE9bnVsbCxNPSExLHY9NTAwLHg9MyxCPSEwLHU9LTEsQyx6LHksRyxELFU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dGhpcy5oZWFkPW51bGx9YS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYil7aWYoIShhPmIpKXtiPXtzdGFydDphLHN0b3A6YixuZXh0Om51bGx9O3ZhciBjPXRoaXMuaGVhZCxlPW51bGw7aWYoYyl7Zm9yKDtjJiZhPmMuc3RhcnQ7KWU9YyxjPWMubmV4dDtlPyhiLm5leHQ9ZS5uZXh0LGUubmV4dD1iKTooYi5uZXh0PXRoaXMuaGVhZCx0aGlzLmhlYWQ9Yil9ZWxzZSB0aGlzLmhlYWQ9YixiLm5leHQ9bnVsbH19O2EucHJvdG90eXBlLnJlZHVjZT1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmhlYWQ7YSYmYS5uZXh0Oyl7Zm9yKDthLm5leHQmJmEuc3RvcCsxPj1hLm5leHQuc3RhcnQ7KWEuc3RvcDw9YS5uZXh0LnN0b3AmJihhLnN0b3A9YS5uZXh0LnN0b3ApLGEubmV4dD1hLm5leHQubmV4dDthPWEubmV4dH19O2EucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXt0aGlzLnJlZHVjZSgpO3ZhciBhPVtdO2lmKHRoaXMuaGVhZCl7dmFyIGI9dGhpcy5oZWFkO2RvIDA8YS5sZW5ndGgmJnEoYSwhMSwiXyIpLHEoYSwhMSxiLnN0YXJ0KSxxKGEsITEsIl8iKSxxKGEsITEsYi5zdG9wKSxiPWIubmV4dDt3aGlsZShiKX1yZXR1cm4gYS5qb2luKCIiKX07YS5wcm90b3R5cGUuST1mdW5jdGlvbigpe3RoaXMucmVkdWNlKCk7dmFyIGE9W107aWYodGhpcy5oZWFkKXt2YXIgYj10aGlzLmhlYWQ7ZG8gYS5wdXNoKFtiLnN0YXJ0LGIuc3RvcF0pLGI9Yi5uZXh0O3doaWxlKGIpfXJldHVybiBhfTtyZXR1cm4gYX0oKSxyPVtdOyhmdW5jdGlvbigpe2lmKGUmJmUuc21iaSYmKGUuc21iaSgiMiIpfHxlLnN5biYmIWUudHBpaCkpe0U9ZS5nUCgpO3ZhciBhPWUuc2N2KCJ0cCIpLnNwbGl0KCIsIiksYz1hLmxlbmd0aDtpZighKDM+Y3x8NTxjKSl7dj1lLnBuKGFbMF0sMTApO3g9ZS5wbihhWzJdLDEwKTs0PD1jJiYoQj0hIWUucG4oYVszXSwxMCkpOzU8PWMmJih1PWUucG4oYVs0XSwxMCkpO2lmKEM9ZS5uY3YoInJ0Iikpej1lLm5jdigicnRsIikseT1lLm5jdigicnR1IiksRz1lLm5jdigicnRwIik7ZS5zeW4mJihDPTFFNCx6PTAsdT0tMSxCPSEwKTtEPWUuZ2goZS5sb2MoKSl9cmV0dXJuITB9cmV0dXJuITF9KSgpJiYoZS50cGloPWVhLGUudHBzdHI9USxlLnRwc3RvPVIsZS5hQlBTTChjYSkpfSkoKTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBxKGEpe2IudHBzdG8oYS50YXJnZXQuc3JjLCEwKX1mdW5jdGlvbiByKCl7YyYmYy5ldmVudCYmYy5ldmVudC5zcmNFbGVtZW50JiYoImxvYWRlZCI9PT1jLmV2ZW50LnNyY0VsZW1lbnQucmVhZHlTdGF0ZXx8ImNvbXBsZXRlIj09PWMuZXZlbnQuc3JjRWxlbWVudC5yZWFkeVN0YXRlKSYmYi50cHN0byhjLmV2ZW50LnNyY0VsZW1lbnQuc3JjLCEwKX1mdW5jdGlvbiBoKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxkPWIuZ0VMKGEpLGM9MDtjPGQ7YysrKXRyeXt2YXIgZT1hW2NdO2UuYnx8KGUuYj1iLm53KCksIiI9PT1lLnNyY3x8IWIudHBpaChlLnNyYyl8fGUuYXR0cmlidXRlcyYmZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiZGF0YS1kdGNvbmZpZyIpfHwoYi50cHN0cigicyIsZS5zcmMpLGIuZ0JJKCkuaWUmJjExPmIuZ0JJKCkuaWU/Yi5hZWwoZSwicmVhZHlzdGF0ZWNoYW5nZSIscik6Yi5hZWwoZSwibG9hZCIscSkpKX1jYXRjaCh3KXt9fWZ1bmN0aW9uIHQoYSl7dmFyIGQ9bnVsbDthP2EudGFyZ2V0P2Q9YS50YXJnZXQ6YS5zcmNFbGVtZW50JiYoZD1hLnNyY0VsZW1lbnQpOmMmJmMuZXZlbnQmJihkPWMuZXZlbnQuc3JjRWxlbWVudCk7ZCYmYi50cHN0byhkLnNyYywhMCl9ZnVuY3Rpb24gdShhKXt2YXIgZD1udWxsO2E/YS50YXJnZXQ/ZD1hLnRhcmdldDphLnNyY0VsZW1lbnQmJihkPWEuc3JjRWxlbWVudCk6YyYmYy5ldmVudCYmKGQ9Yy5ldmVudC5zcmNFbGVtZW50KTtkJiZkLnNyYyE9PWIubG9jKCkmJmIudHBzdG8oZC5zcmMsITEpfWZ1bmN0aW9uIGsoYSl7aWYoIWEuYil7YS5iPWIubncoKTt0cnl7IiIhPT1hLnNyYyYmYi50cGloKGEuc3JjKSYmKGIudHBzdHIoImkiLGEuc3JjKSwhYS5jb21wbGV0ZXx8InVuZGVmaW5lZCIhPT10eXBlb2YgYS5uYXR1cmFsV2lkdGgmJjA9PT1hLm5hdHVyYWxXaWR0aD8oYi5hZWwoYSwibG9hZCIsdCksYi5hZWwoYSwiZXJyb3IiLHUpKTpiLnRwc3RvKGEuc3JjLCEwKSl9Y2F0Y2goZCl7fX19ZnVuY3Rpb24gbCgpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKSxkPWIuZ0VMKGEpLGM7Zm9yKGM9MDtjPGQ7YysrKXt2YXIgZT1hW2NdO2soZSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTtkPWIuZ0VMKGEpO2ZvcihjPTA7YzxkO2MrKyllPWFbY10sZS50eXBlJiYiU1VCTUlUIj09PWUudHlwZS50b1VwcGVyQ2FzZSgpJiZrKGUpfWZ1bmN0aW9uIG0oKXswPGYmJjJFMzxiLm53KCktZj8oZz0hMSxiLnNNUFMoNUUzKSk6KGIucmVfdCYmKGwoKSxoKCkpLGIuc3QobSxuKSl9ZnVuY3Rpb24gcCgpe2IudHBzdG8/KGwoKSxoKCksYi5jYSgpJiYhZyYmKGY9Yi5udygpLGc9ITAsbSgpKSk6Yi5zdChwLDEpfWZ1bmN0aW9uIHYoKXtyZXR1cm4gZ312YXIgYz13aW5kb3csYj1jLmRUXyxuPTMwLGYsZzsoZnVuY3Rpb24oKXtpZihiJiZiLnNtYmkmJmIuc21iaSgiMyIpKXt2YXIgYT1iLnNjdigidHAiKS5zcGxpdCgiLCIpLGM9YS5sZW5ndGg7Mzw9YyYmNT49YyYmKG49Yi5wbihhWzFdLDEwKSk7Yi5yZV90PSEwOyhhPWIuZ1AoKSkmJmEudGltaW5nJiYoYz1hLmdldEVudHJpZXNCeU5hbWV8fGEud2Via2l0R2V0RW50cmllc0J5TmFtZSwoYS5nZXRFbnRyaWVzQnlUeXBlfHxhLndlYmtpdEdldEVudHJpZXNCeVR5cGUpJiZjJiYoYi5yZV90PSExKSk7Yi5yZV90JiYoYi5nSUE9dixiLmFsbChmdW5jdGlvbigpe2Y9Yi5udygpfSksYi5hQlBTTChmdW5jdGlvbigpey0xPT09ZiYmKGY9Yi5udygpKX0pLGY9LTEscCgpKTtyZXR1cm4hMH1yZXR1cm4hMX0pKCl9KSgpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIHAocixsLHQscCl7ZnVuY3Rpb24gcSgpe2Zvcih2YXIgYj1sLmxlbmd0aC0xOzA8YjtiLS0pZm9yKHZhciBmPWxbYl0saD1iLTE7MDw9aDtoLS0pe3ZhciBlPWxbaF0sYz1lLmFyZWEsZD1mLmFyZWE7aWYoZCYmYyYmMjUwMDxjJiYwPGMpe3ZhciBjPWYub2Zmc2V0LGE9ZS5vZmZzZXQ7ZS5hcmVhLT1NYXRoLm1pbihNYXRoLm1heCgwLE1hdGgubWluKGMubGVmdCtjLndpZHRoLGEubGVmdCthLndpZHRoKS1NYXRoLm1heChjLmxlZnQsYS5sZWZ0KSkqTWF0aC5tYXgoMCxNYXRoLm1pbihjLnRvcCtjLmhlaWdodCxhLnRvcCthLmhlaWdodCktTWF0aC5tYXgoYy50b3AsYS50b3ApKSxkKTswPmUuYXJlYSYmKGUuYXJlYT0wKX19fWZ1bmN0aW9uIHYoKXt3KGZ1bmN0aW9uKGIsZil7az1iLnRpbWU7ZFtrXXx8KGRba109e2I6MCxub2RlczpbXX0pO2IudiYmKG09Yi5hcmVhLGRba10uYis9bSk7ZFtrXS5ub2Rlcy5wdXNoKHtuOmYsdjpiLnYsaTpiLml9KX0pfQpmdW5jdGlvbiB4KCl7Zm9yKHZhciBiIGluIGQpaWYoZC5oYXNPd25Qcm9wZXJ0eShiKSl7bT1kW2JdLmI7dmFyIGY9bS95LGg9e3RpbWU6cGFyc2VJbnQoYiwxMCksYjptLG5vZGVzOmRbYl0ubm9kZXN9O2guYVA9ZjtuLnB1c2goaCk7dSs9Zn1uLnNvcnQoZnVuY3Rpb24oYixjKXtyZXR1cm4gYi50aW1lLWMudGltZX0pO2EudE1BPW59ZnVuY3Rpb24geigpe2Zvcih2YXIgYj0wLGY9MCxhPTAsZT0wO2U8bi5sZW5ndGg7ZSsrKXt2YXIgYz1uW2VdLGY9Yy50aW1lLWY7MDxmJiYxPmEmJihiKz0oMS1hKSpmKTthKz1jLmFQL3U7Zj1jLnRpbWV9cmV0dXJuIE1hdGguZmxvb3IoYil9ZnVuY3Rpb24gdyhiKXtmb3IodmFyIGE9MDthPGwubGVuZ3RoO2ErKyl7dmFyIGQ9bFthXSxlPWQubm9kZSxjPWU/ZS50YWdOYW1lfHxlLm5vZGVOYW1lOm51bGw7KGQuaXx8YyYmIkJPRFkiIT09YyYmIklNRyIhPT1jKSYmYihkLGUsYyxhKX19dmFyIGQ9e30seT1hLnZXVygpKmEudldIKCksayxtLG49W10sdT0wOy0xPT09ZyYmKHEoKSx2KCkseCgpLGc9eigpLGc+dCYmKGc9dCkpO3ImJnIuYShwLCJTIiwic3BlZWRJbmRleCIsZyxnLCEwKX1mdW5jdGlvbiBxKCl7cmV0dXJuIGd9dmFyIGE9d2luZG93LmRUXyxnPS0xO2EmJmEuc21iaSYmYS5zbWJpKCJTIikmJihhLmNTST1wLGEuZ1NJPXEpfSkoKTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGIsYyl7Zi5wdXNoKHtpZDpiLGI6Yy1rfSl9ZnVuY3Rpb24gbShiLGMpe3ZhciBhPWYuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlkPT09Yn0pO2FbMF0mJihhWzBdLmc9Yy1rKX1mdW5jdGlvbiBuKGIpe3ZhciBjPU1hdGguZmxvb3IoYi5zdGFydFRpbWUpO3JldHVybiBmLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4haXNOYU4oYS5iKSYmIWlzTmFOKGEuZykmJmEuYjw9YyYmYS5nPj1jfSl9ZnVuY3Rpb24gbChiLGMpe2IuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uKGEpWzBdO2ImJmMucHVzaChbZC5hZXNjKGEubmFtZSksKGEuc3RhcnRUaW1lLWIuYikudG9GaXhlZCgyKSxhLmR1cmF0aW9uLnRvRml4ZWQoMildKX19KX12YXIgZD13aW5kb3cuZFRfLGU9ZC5nUCgpLGY9W10saz1lJiZlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQ7KGZ1bmN0aW9uKCl7cmV0dXJuIGQuc21iaSgiVCIpJiZlJiZlLm1hcmsmJmUubWVhc3VyZT8oaCgxLGQubHN0KCkpLGQuYWVhbChoKSxkLmFsYWwobSksZC5hQlBTTChmdW5jdGlvbihiLGMsYSxkKXt2YXIgZz1bXTtsKGUuZ2V0RW50cmllc0J5VHlwZSgibWFyayIpLGcpO2woZS5nZXRFbnRyaWVzQnlUeXBlKCJtZWFzdXJlIiksZyk7Zj1mLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gaXNOYU4oYS5iKXx8aXNOYU4oYS5nKX0pO2cubGVuZ3RoJiZiLmEoZCwidXQiLCJ1c2VyVGltaW5ncyIsZnVuY3Rpb24oKXtyZXR1cm4gZy5qb2luKCI7Iil9LGZ1bmN0aW9uKCl7cmV0dXJuIGcubWFwKGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmFbMF0sc3RhcnRUaW1lOmFbMV0sZHVyYXRpb246YVsyXX19KX0pfSksITApOiExfSkoKX0pKCk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYWEoKXtyZXR1cm4gSX1mdW5jdGlvbiB5KGEpe3JldHVybiAwPGEubGVmdCthLndpZHRoJiZhLmxlZnQ8cCgpJiYwPGEudG9wK2EuaGVpZ2h0JiZhLnRvcDxyKCl9ZnVuY3Rpb24gYmEoYSxkLGMpe2M9Y3x8ZC50YWdOYW1lfHxkLm5vZGVOYW1lO3JldHVybih6KCl8fGEmJjA8YS53aWR0aCYmMDxhLmhlaWdodCYmeShhKSkmJiJCT0RZIiE9PWN9ZnVuY3Rpb24gcigpe0F8fChBPW0uaW5uZXJIZWlnaHR8fEouY2xpZW50SGVpZ2h0KTtyZXR1cm4gdC5id3NIfHxBfWZ1bmN0aW9uIHAoKXtCfHwoQj1tLmlubmVyV2lkdGh8fEouY2xpZW50V2lkdGgpO3JldHVybiB0LmJ3c1d8fEJ9ZnVuY3Rpb24gSyhhKXt2YXIgZD1wKCksYz1yKCk7cmV0dXJue3dpZHRoOmEubGVmdCthLndpZHRoPmQ/ZC1hLmxlZnQ6YS53aWR0aCxoZWlnaHQ6YS50b3ArYS5oZWlnaHQ+Yz9jLWEudG9wOmEuaGVpZ2h0fX1mdW5jdGlvbiBDKGEsZCl7cmV0dXJuIGEgaW5zdGFuY2VvZgpIVE1MRWxlbWVudD8oZD1kfHxtLmdldENvbXB1dGVkU3R5bGUoYSksImhpZGRlbiI9PT1kLnZpc2liaWxpdHl8fCJub25lIj09PWQuZGlzcGxheSk6ITF9ZnVuY3Rpb24gTChhKXtyZXR1cm4gYS53aWR0aCphLmhlaWdodH1mdW5jdGlvbiBEKGEsZCxjLGgpe3RyeXtpZighYyYmKGM9dShhLGgpLCFiLmlWRXx8IWIuaVZFKGMsYSkpKXJldHVybiBudWxsO3ZhciBmPXkoYyk7cmV0dXJuIGc9e30sZy51cmw9bnVsbCxnLnRpbWU9MCxnLm5vZGU9YSxnLnY9ZiYmIUMoYSxkKSxnLmFyZWE9Zj9MKEsoYykpOi0xLGcub2Zmc2V0PXt0b3A6Yy50b3AsbGVmdDpjLmxlZnQsd2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9LGd9Y2F0Y2goY2Epe31yZXR1cm4gbnVsbDt2YXIgZ31mdW5jdGlvbiB1KGEsZCl7YTp7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCl0cnl7dmFyIGM9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgYj17dG9wOmMudG9wK20ucGFnZVlPZmZzZXQtYS5jbGllbnRUb3AsbGVmdDpjLmxlZnQrbS5wYWdlWE9mZnNldC1hLmNsaWVudExlZnR9O2JyZWFrIGF9Y2F0Y2goZil7fWI9bnVsbH1pZighYilyZXR1cm4gbnVsbDtkJiYoYi50b3ArPWQudG9wLGIubGVmdCs9ZC5sZWZ0KTtyZXR1cm57d2lkdGg6YS5vZmZzZXRXaWR0aCxoZWlnaHQ6YS5vZmZzZXRIZWlnaHQsdG9wOmIudG9wLGxlZnQ6Yi5sZWZ0fX1mdW5jdGlvbiBFKCl7cmV0dXJuIGIuZ05WKCJuYXZpZ2F0aW9uU3RhcnQiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGIuZ05WKCJsb2FkRXZlbnRFbmQiKX1mdW5jdGlvbiBNKGEpe3ZhciBkPU51bWJlcihiLmxBTSgiViIpKStFKCksYz12KCk7cmV0dXJuIDA8YyYmKC0xIT09ZCYmYS1kPk58fGEtYz5PKX1mdW5jdGlvbiBQKCl7Rnx8KE0oYi5udygpKT9sLmRpc2Nvbm5lY3QoImMiKTpiLnN0KFAsMUUzKSl9ZnVuY3Rpb24gUShhLGQpe2Q/YSgpOmIuc3QoYSwwKX1mdW5jdGlvbiBSKGEsZCxjLGIpe2Z1bmN0aW9uIGgoKXtpZihkLmxlbmd0aCl7Zm9yKHZhciBmPWcrMTAwLGs9ZztrPE1hdGgubWluKGYsZC5sZW5ndGgpO2srKylhKGRba10sZnVuY3Rpb24oKXtlKys7ZT09PWQubGVuZ3RoJiZjKCl9LGspO2c9ZjtlIT09ZC5sZW5ndGgmJlEoaCxiKX1lbHNlIGMoKX12YXIgZz0wLGU9MDtRKGgsYil9ZnVuY3Rpb24gZGEoYSxkLGMsaCxlKXt2YXIgZz0hMTt0cnl7aWYoeigpfHxhJiY1MDxhLm9mZnNldFdpZHRoKmEub2Zmc2V0SGVpZ2h0KXt2YXIgZj11KGEpO2lmKGIuaVZFJiZiLmlWRShmLGEpKXt2YXIgdz1kLmdldENvbXB1dGVkU3R5bGUoYSk7dy5iYWNrZ3JvdW5kSW1hZ2UmJiJub25lIiE9PXcuYmFja2dyb3VuZEltYWdlJiZlYShhLHcsZixjKTsiSUZSQU1FIj09PWEudGFnTmFtZSYmKGc9ITAsZmEoYSx3LGYsZnVuY3Rpb24oYSl7QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoaCxhKTtlKCl9KSk7aWYoIklNRyI9PT1hLnRhZ05hbWUpe3RyeXt2YXIgaz1hLnNyY31jYXRjaChnYSl7dHJ5e2s9Yi50YXUoYS5nZXRBdHRyaWJ1dGUoInNyYyIpKX1jYXRjaChxYSl7az0iIn19dmFyIHE9UyhhLGssdGhpcy5vZmZzZXQpO3EmJmgucHVzaChxKX19fX1jYXRjaChnYSl7fWZpbmFsbHl7Z3x8ZSgpfX1mdW5jdGlvbiBUKGEsZCxjKXt2YXIgaD1bXTt0cnl7dmFyIGY9YS5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpfWNhdGNoKGcpe2QoaCk7cmV0dXJufVIoZnVuY3Rpb24oZCxiKXtyZXR1cm4gZGEoZCxhLGMsaCxiKX0sZixmdW5jdGlvbigpe2Zvcih2YXIgYz1hLnBlcmZvcm1hbmNlLGI9TWF0aC5tYXgoVShhLnBlcmZvcm1hbmNlKS1VKHdpbmRvdy5wZXJmb3JtYW5jZSksMCksZj0wO2Y8aC5sZW5ndGg7ZisrKXt2YXIgaz1oW2ZdO2lmKCFrLnRpbWUpe3ZhciBxPWMuZ2V0RW50cmllc0J5TmFtZShrLnVybCwicmVzb3VyY2UiKVswXTtxP2sudGltZT1iK3EucmVzcG9uc2VFbmR8MDooay50aW1lPTAsZS5CLnB1c2goaykpfX1kKGgpfSwhIWIuUk1PRHx8ZS5DKX1mdW5jdGlvbiBlYShhLGQsYyxiKXtWLmxhc3RJbmRleD0wO3ZhciBlPVYuZXhlYyhkLmJhY2tncm91bmRJbWFnZSl8fFtdLGg7aWYoaD0xPGUubGVuZ3RoKWg9KGg9ZVsxXSkmJjA9PT1oLmluZGV4T2YoImh0dHAiKTtoJiZTKGEsZVsxXSxiLGQsYyl9ZnVuY3Rpb24gZmEoYSxkLGIsZSl7dmFyIGM9ITE7dHJ5e3ZhciBoPUQoYSxkLGIpO2gmJihjPSEwLFQoYS5jb250ZW50V2luZG93LGZ1bmN0aW9uKGEpe2UoYSl9LGgub2Zmc2V0KSl9Y2F0Y2goY2Epe31maW5hbGx5e2N8fGUoW10pfX1mdW5jdGlvbiBTKGEsZCxiLGUsZil7cmV0dXJuIGQmJihiPUQoYSxlLGYsYikpPyhiLnVybD1kLGIubm9kZT1hLGIuaT0hMCxiKTpudWxsfWZ1bmN0aW9uIFUoYSl7cmV0dXJuIGEmJmEudGltaW5nJiYoYT1hLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsIWlzTmFOKGEpJiZpc0Zpbml0ZShhKSk/YTowfWZ1bmN0aW9uIEcoKXtyZXR1cm4gcCgpJiZyKCk/d2luZG93LnRvcD09PXdpbmRvdyYmYj09PXQ6ITF9ZnVuY3Rpb24gaGEoYSxkLGMsaCl7aWYoRygpJiYhRiYmIWQpe2Q9Yi5sYXMoKTt2YXIgZj12KCk7dmFyIGc9Yi5udygpO2Y9MDxmJiZnLWY+SHx8ZS5iJiZlLmd8fE0oZyk7Y3x8ZiYmZD8oZS5ifHwoZz0iYyIsYyYmIWYmJihnPVc/ImwiOiJmIiksZS5DPWMsbC5kaXNjb25uZWN0KGcpKSxlLmcmJihjPWUuQSgpLGEuYShoLCJWIiwidmlzdWFsbHlDb21wbGV0ZSIsYysifCIrZS5qLHt0aW1lOmMsdHJpZ2dlcjplLmp9LCFiLmNTSSksYi5jU0kmJmIuY1NJKGEsZS5tLGMsaCksZS5tPVtdLEY9ITApKTpiLnNNUFMoMkUzKTtXPWR9fWZ1bmN0aW9uIGlhKGEpe2Zvcih2YXIgYj0tMSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBlPWFbY107RChlLmUpJiZiPGUudCYmKGI9ZS50KX1yZXR1cm4gYn1mdW5jdGlvbiBqYShhKXtYP2EoKTp4LnB1c2goYSl9ZnVuY3Rpb24ga2EoKXtlLkM9ITA7ZS5ifHxsLmRpc2Nvbm5lY3QoImYiKTt2YXIgYT1FKCksYj12KCksYz1lLkEoKSxhPWMrYTtyZXR1cm4tMT09PWN8fGI+YT9iOmF9ZnVuY3Rpb24gbGEoKXtsJiZsLmRpc2Nvbm5lY3QoImMiKX1mdW5jdGlvbiBtYSgpe3ZhciBhPVtdO2lmKGUmJmUuZyl7Zm9yKHZhciBiPTA7YjxlLkIubGVuZ3RoO2IrKylhLnB1c2goe25hbWU6ZS5CW2JdLnVybCxmYWlsZWRSZXNvdXJjZToxLHN0YXJ0VGltZToxLHJlc3BvbnNlRW5kOjF9KTtlLkI9W119cmV0dXJuIGF9ZnVuY3Rpb24gbmEoKXt2YXIgYT13aW5kb3cucGVyZm9ybWFuY2UsZD1iLmJjdigiZG1vIikmJmIuZ0JJKCkuaWU7cmV0dXJuISF3aW5kb3cuTXV0YXRpb25PYnNlcnZlciYmISFhJiYhIWEuZ2V0RW50cmllc0J5VHlwZSYmIWR9ZnVuY3Rpb24geigpe3JldHVybiBiLmJjdigidmNmaSIpJiZZfXZhciBWPS91cmxcKFsnIl0/KFteIicpXSspL2dpLEgsTj0xRTMsTz0xNUUzLG09d2luZG93LEo9bS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsQSxCLEk9LTEsWj0tMSxvYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtiLlJNT0QmJndpbmRvd1tiLlJNT0QuSURdfHwoYi5hTU8oIlYiKSxiLnN0KFAsMUUzKSl9YS5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbihhKXtlLmJ8fChlLmo9YSxlLmI9ITAsdGhpcy5JKCksYi5yTU8oIlYiKSl9O2EucHJvdG90eXBlLkk9ZnVuY3Rpb24oKXtaPWIubncoKTtUKHdpbmRvdyxmdW5jdGlvbihhKXtyZXR1cm4gZS5IKGEpfSk7dmFyIGE9Yi5nTU4oIlYiKTt0aGlzLkwoYSxmdW5jdGlvbihhKXtlLkcoYSl9KX07YS5wcm90b3R5cGUuTD1mdW5jdGlvbihhLGMpe3ZhciBkPVtdO1IoZnVuY3Rpb24oYSxjKXt0cnl7dmFyIGU9YS5ub2RlcyxoPWEudGltZTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgZj1lW2FdO2lmKGYmJjUwPGYub2Zmc2V0V2lkdGgqZi5vZmZzZXRIZWlnaHQpe3ZhciBnPXUoZiksbD1mLnRhZ05hbWV8fGYubm9kZU5hbWU7aWYoIklGUkFNRSIhPT1sJiYiSU1HIiE9PWwmJmIuaVZFJiZiLmlWRShnLGYsbCkpe3ZhciBtPXkoZykscD0obj17fSxuLnVybD1udWxsLG4udGltZT1wYXJzZUludChoKyIiLDEwKSxuLm5vZGU9ZixuLnY9bSYmIUMoZiksbi5hcmVhPW0/TChLKGcpKTotMSxuLm9mZnNldD17dG9wOmcudG9wLGxlZnQ6Zy5sZWZ0LHdpZHRoOmcud2lkdGgsaGVpZ2h0OmcuaGVpZ2h0fSxuKTtkLnB1c2gocCl9fX12YXIgbn1jYXRjaChyYSl7fWZpbmFsbHl7YygpfX0sYSxmdW5jdGlvbigpe2MoZCl9LCEhYi5STU9EfHxlLkMpfTtyZXR1cm4gYX0oKSxwYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7dGhpcy5NPWE7dGhpcy52aXN1YWxseUNvbXBsZXRlPS0xO3RoaXMuaj1udWxsO3RoaXMuYj0hMTt0aGlzLm09W107dGhpcy5CPVtdO3RoaXMuQz10aGlzLmc9ITE7dGhpcy5GPTA7dGhpcy5KPTJ9YS5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3ZhciBhPTFFMypiLm5jdigib2F0IiksYz12KCktRSgpO3RoaXMudmlzdWFsbHlDb21wbGV0ZT5hJiYodGhpcy52aXN1YWxseUNvbXBsZXRlPWMsdGhpcy52aXN1YWxseUNvbXBsZXRlPmEmJih0aGlzLnZpc3VhbGx5Q29tcGxldGU9LTEpKTt0aGlzLmcmJi0xPT09dGhpcy52aXN1YWxseUNvbXBsZXRlJiYwPGMmJih0aGlzLnZpc3VhbGx5Q29tcGxldGU9Yyx0aGlzLmo9ImUiKTtyZXR1cm4gdGhpcy52aXN1YWxseUNvbXBsZXRlfTthLnByb3RvdHlwZS5IPWZ1bmN0aW9uKGEpe3RoaXMuRChhKX07YS5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXt0aGlzLkQoYSl9O2EucHJvdG90eXBlLkQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl07NTA8ZC5hcmVhJiZ0aGlzLnZpc3VhbGx5Q29tcGxldGU8ZC50aW1lJiZkLnYmJih0aGlzLnZpc3VhbGx5Q29tcGxldGU9ZC50aW1lKTt0aGlzLm0ucHVzaChkKX10aGlzLksoKX07YS5wcm90b3R5cGUuSz1mdW5jdGlvbigpe3RoaXMuRisrO3RoaXMuRj49dGhpcy5KJiYoST1iLm53KCktWix0aGlzLmc9ITAsdGhpcy5tLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS50aW1lLWIudGltZX0pLHRoaXMuTSh0aGlzLmopKX07cmV0dXJuIGF9KCksYix0LGUsbCxGPSExLFk9ITEsVz0hMSx4PVtdLFg9ITE7KGZ1bmN0aW9uKCl7cmV0dXJuKGI9d2luZG93LmRUXykmJmIuc21iaSYmYi5zbWJpKCJWIikmJm5hKCk/KFk9IWIuZ0JJKCkuaWUmJiFiLmdCSSgpLmZmJiYhYi5nQkkoKS5lZGdlLHQ9Yi50ZHRvKCksYi5STU9EPyhIPThFMyxOPTFFMyxPPThFMyk6SD1iLm5jdigidHZjIiksRygpJiYobD1uZXcgb2EsZT1uZXcgcGEoZnVuY3Rpb24oYSl7dmFyIGQ9ZS5BKCk7Yi5jU0kmJmIuY1NJKHZvaWQgMCxlLm0sZCx2b2lkIDApO2Zvcih2YXIgYz0wO2M8eC5sZW5ndGg7YysrKXhbY10oYSxkKTt4PVtdO1g9ITA7Yi5zTVBTKDJFMyl9KSxiLnJybChmdW5jdGlvbigpe2UuYnx8bC5kaXNjb25uZWN0KCJ1Iil9KSxiLmFCUFNMKGhhKSksITApOiExfSkoKSYmKHooKSYmKGIuZ0ZJPW1hKSxHKCkmJihiLmdERT11LGIueFZDPWlhLGIudldXPXAsYi52V0g9cixiLmdWQ1A9a2EsYi5pRUg9QyxiLmlWRT1iYSxiLmdWQz1lLkEsYi5hVkNMPWphLGIuZ1ZDTUQ9YWEsYi5tdFZDPWxhKSl9KSgpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIHcoYSxiKXt2YXIgZD17eDotMSx5Oi0xfTtpZighYSlyZXR1cm4gZDthLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQueD1hLmxlZnQsZC55PWEudG9wKTprLmdldEJveE9iamVjdEZvciYmKGE9ay5nZXRCb3hPYmplY3RGb3IoYSksZC54PWEueCxkLnk9YS55KTtiJiZnLnNlbGYhPT1nLnRvcCYmKGI9eChyKCkpLGQueCs9Yi54LGQueSs9Yi55KTtyZXR1cm4gZH1mdW5jdGlvbiB5KCl7Yy5nRUwoay5pbWFnZXMpPnEmJkYoKTt6fHxjLnN0KHksMTApfWZ1bmN0aW9uIEYoKXtmb3IodmFyIGE9ay5pbWFnZXMsYj1jLmdFTChhKSxkPTA9PT1xPzA6cS0xO2Q8YjtkKyspYVtkXS5jb21wbGV0ZT9jLmFid3NsKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7QShhLGIpfX0oYVtkXSxjLm53KCkpKTpHKGFbZF0pO3E9Yn1mdW5jdGlvbiBHKGEpe2MuYWVsKGEsImxvYWQiLHQpO2MuYWVsKGEsImVycm9yIix0KTtjLmFlbChhLCJhYm9ydCIsdCl9ZnVuY3Rpb24gdChhKXt2YXIgYj1hLnRhcmdldHx8YS5zcmNFbGVtZW50LGQ9Yy5udygpO2MuYWJ3c2woZnVuY3Rpb24oKXtBKGIsZCl9KX1mdW5jdGlvbiBIKCl7Qj0hMDtmb3IodmFyIGE9MCxiPXUubGVuZ3RoO2E8YjsrK2EpdVthXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gQShhLGIpe2Z1bmN0aW9uIGQoKXt2YXIgZD13KGEsITApLGM9dihhLGQpLGM9YyYmZi5pd3MoYSxkKTtmLmFDUihjLGIsYSYmYS5zcmN8fCIiKX1pZihjIT09ZilsfHwobD1ILGYuYWJ3c2wobCkpLEI/ZCgpOmMuYXB1c2godSxkKTtlbHNle3ZhciBoPXYoYSksZT0iIjthJiYoZT1jLmlvKGEuc3JjLCJkYXRhOiIpP2Euc3JjfHxhLmFsdHx8IiI6YS5hbHR8fCJkYXRhLWltYWdlIik7QyhoLGIsZSl9fWZ1bmN0aW9uIEMoYSxiLGQpe2EmJmMudmkrKzthJiZiPm0mJihuPWQsbT1iKX1mdW5jdGlvbiB2KGEsYil7aWYoIWEpcmV0dXJuITE7Ynx8KGI9dyhhKSk7aWYoMDw9Yi54JiY1Pj1iLngmJjA8PWIueSYmNT49Yi55KXJldHVybiEwO3ZhciBkPWYuYndzVyxjPWYuYndzSCxlPWEud2lkdGh8fGEuc2Nyb2xsV2lkdGg7YT1hLmhlaWdodHx8YS5zY3JvbGxIZWlnaHQ7aWYoMD49Yi54JiYwPj1iLnkmJjA8PWIueCtlJiYwPD1iLnkrYSlyZXR1cm4hMDtpZigwPmV8fDA+YXx8MD5kfHwwPmMpcmV0dXJuITE7dmFyIGc9Yi54O2I9Yi55O2UrPWc7YSs9YjtkKz0wO2MrPTA7cmV0dXJuKGU8Z3x8MDxlKSYmKGE8PWJ8fDA8PWEpJiYoMD5kfHxkPmcpJiYoMD5jfHxjPmIpfWZ1bmN0aW9uIEQoKXt2YXIgYT1jLmdQKCk7YSYmYS50aW1pbmcmJiFwJiYocD1hLnRpbWluZy5sb2FkRXZlbnRFbmQpOzA9PT1wJiYocD1jLm53KCkpO3JldHVybiBwfWZ1bmN0aW9uIEkoKXt6PSEwO3ZhciBhPUQoKTswIT09bSYmay5pbWFnZXMubGVuZ3RofHwobT1hKX1mdW5jdGlvbiB4KGEpe2Zvcih2YXIgYj0wLGM9MCxoPWcuc2VsZjtudWxsIT09aCYmZiE9PWguZFRfOyl7Yis9YT9hLm9mZnNldExlZnQ6MDtjKz1hP2Eub2Zmc2V0VG9wOjA7dHJ5e2E9cihnLnBhcmVudCksaD1oLnBhcmVudH1jYXRjaChlKXtoPW51bGx9fWE9e3g6LTEseTotMX07YS54PWI7YS55PWM7cmV0dXJuIGF9ZnVuY3Rpb24gcihhKXthfHwoYT1nKTtpZihmPT09YylyZXR1cm4gbnVsbDt0cnl7Zm9yKHZhciBiPWEucGFyZW50LmZyYW1lcyxkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBoPWJbZF07aWYoaD09PWEpcmV0dXJuIGguZnJhbWVFbGVtZW50fXJldHVybiBudWxsfWNhdGNoKGUpe3JldHVybiBudWxsfX1mdW5jdGlvbiBKKCl7aWYoIWMuYndzV3x8IWMuYndzSHx8IW4pcmV0dXJuITE7aWYoYz09PWYpcmV0dXJuITA7dmFyIGE9cigpO3JldHVybiBudWxsPT09YT8wPGMudml8fDA9PT1nLmZyYW1lcy5sZW5ndGg6MD09PWMudml8fDA9PT1jLmdFTChrLmltYWdlcykmJjA8Zy5mcmFtZXMubGVuZ3RoPyExOmYuaXdzKGEseChhKSl9ZnVuY3Rpb24gSygpe2wmJiJyYndzbCJpbiBmJiZmLnJid3NsKGwpfQp2YXIgZz13aW5kb3csaz1kb2N1bWVudCxjLHo9ITEscT0wLG09MCxuPSIiLHA9MCxmPW51bGwsbD1udWxsLEI9ITEsdT1bXSxFPSExOyhmdW5jdGlvbigpe3JldHVybihjPWcuZFRfKSYmYy5zbWJpJiZjLnNtYmkoInAiKT8oYy52aT0wLGMuaXdzPXYsZj1jLnRkdG8oKSxjLmFlbChnLCJ1bmxvYWQiLEspLHkoKSwiaXdzImluIGYmJihjLmFsbChJKSxjLmFCUFNMKGZ1bmN0aW9uKGEsYixkLGYpe2lmKCFiJiYhRSYmKGMubGFzKCl8fGQpKXtFPSEwO2I9Yy5sc3QoKTtkPUQoKTt2YXIgZT1tLWI7MD49ZSYmKGU9ZC1iKTtpZigwPmV8fDIxNDc0ODM2NDc8PWUpZT0wO2I9ZTtKKCkmJmEuYShmLCJwIiwicGVyY2VpdmVkUmVuZGVyVGltZSIsYisobj8ifCIrYy5lc2Mobik6IiIpLHt0aW1lOmIsaW1hZ2U6bn0sITApfX0pKSwhMCk6ITF9KSgpJiYoYy5hQ1I9Qyl9KSgpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGgoYSxlLGMsYixxKXt2YXIgaz0hMTtpZighbCYmIW0pe209ITA7dHJ5e3RyeXtmJiZmIT09aCYmImZ1bmN0aW9uIj09PXR5cGVvZiBmJiYoaz1mKGEsZSxjLGIscSkpfWNhdGNoKHIpe2QucmV4KHIsbnVsbCwhMCl9a3x8ZC5yZShhLGUsYyxiLHEpfWNhdGNoKHIpe31tPSExfXJldHVybiBrfWZ1bmN0aW9uIHQoYSxlLGMpe2FbZV09YyhhW2VdKX1mdW5jdGlvbiBuKGEpe3RyeXtpZighcChhKSlyZXR1cm4gYTthLmJ8fChhLmI9ZnVuY3Rpb24oZSl7aWYoZyl0cnl7aWYocChhKSlyZXR1cm4gdS5lcnJvckNhbGxiYWNrKGEsdGhpcyxhcmd1bWVudHMpfWNhdGNoKGMpe2lmKC0yMTQ2ODIzMjc3IT09Yy5udW1iZXIpdGhyb3cgZC5yZXgoYyxudWxsLCEwKSx2KCksYzt9ZWxzZSB0cnl7aWYocChhKSlyZXR1cm4gdS5lcnJvckNhbGxiYWNrKGEsdGhpcyxhcmd1bWVudHMpfWNhdGNoKGMpe2lmKC0yMTQ2ODIzMjc3IT09Yy5udW1iZXIpdGhyb3cgYzt9fSxhLmIuYj1hLmIpO3JldHVybiBhLmJ9Y2F0Y2goZSl7cmV0dXJuIGF9fWZ1bmN0aW9uIHYoKXtsKz0xO2Quc3QoZnVuY3Rpb24oKXstLWx9KX1mdW5jdGlvbiBwKGEpe3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24gdygpe2Iub25lcnJvciE9PWgmJihkLnJ4ZWhhbmRsZXI9aCxiLm9uZXJyb3ImJihmPWIub25lcnJvciksYi5vbmVycm9yPWQucnhlaGFuZGxlcik7dHJ5e2QuYXBsKGIsIm9uZXJyb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIGh9LGZ1bmN0aW9uKGEpe2Y9YX0pfWNhdGNoKGUpe31kLmFlbChiLCJ1bmxvYWQiLGZ1bmN0aW9uKCl7ZC5ycGwoYiwib25lcnJvciIpO2Iub25lcnJvcj1udWxsfSk7aWYoIWIuYXRvYilnPSExO2Vsc2UgaWYoYi5FcnJvckV2ZW50KXRyeXsobmV3IGIuRXJyb3JFdmVudCgidGVzdCIpKS5jb2xub3x8KGc9ITEpfWNhdGNoKGUpe31kLmdCSSgpLmcmJihnPSEwKTtpZihnKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaHRtbCIpOyghYS5sZW5ndGh8fDA8YS5sZW5ndGgmJiFhWzBdLmhhc0F0dHJpYnV0ZXx8MDxhLmxlbmd0aCYmIWFbMF0uaGFzQXR0cmlidXRlKCJ3ZWJkcml2ZXIiKSkmJiJFdmVudFRhcmdldCBXaW5kb3cgTW9kYWxXaW5kb3ciLnJlcGxhY2UoL1x3Ky9nLGZ1bmN0aW9uKGEpeyhhPWJbYV0mJmJbYV0ucHJvdG90eXBlKSYmYS5oYXNPd25Qcm9wZXJ0eSYmYS5oYXNPd25Qcm9wZXJ0eSgiYWRkRXZlbnRMaXN0ZW5lciIpJiYodChhLCJhZGRFdmVudExpc3RlbmVyIixmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQsZSl7YyYmYy5oYW5kbGVFdmVudCYmKGMuaGFuZGxlRXZlbnQ9bihjLmhhbmRsZUV2ZW50KSk7cmV0dXJuIGEuY2FsbCh0aGlzLGIsbihjKSxkLGUpfX0pLHQoYSwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGMsYixkLGUpe2EuY2FsbCh0aGlzLGMsYixkLGUpO3JldHVybiBhLmNhbGwodGhpcyxjLG4oYiksZCxlKX19KSk7cmV0dXJuIG51bGx9KX19dmFyIGI9d2luZG93LGQ9Yi5kVF8sZixtPSExLGw9MCxnPSEwLHU9e2Vycm9yQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmFwcGx5KGIsYyl9fTtkJiZkLnNtYmkmJmQuc21iaSgicSIpJiZ3KCl9KSgpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIEQoYSxsLGMsZSl7ZC5iW2FdP2QuYlthXS5zdG9wPWM6KGQuYlthXT17dHlwZToieCIsc3RhcnQ6bCxzdG9wOmMseGhyVXJsOmUsZzpbXX0sZC5jb3VudCsrLGQuYlthXS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblthLHRoaXMuc3RhcnQsdGhpcy5zdG9wLHRoaXMueGhyVXJsLHRoaXMuZy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0pLmpvaW4oIiwiKV0uam9pbigifCIpfSk7Yi5zTVBTKDVFMyl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gelthLm5hbWUrYS5zdGFydFRpbWUrYS5yZXNwb25zZUVuZF19ZnVuY3Rpb24gRSgpe3JldHVybiB3fWZ1bmN0aW9uIEYoYSl7dmFyIGI9YS5jb250ZW50V2luZG93O2E6e2Zvcih2YXIgYz0wO2M8cS5sZW5ndGg7YysrKWlmKGE9PT1xW2NdKXthPWM7YnJlYWsgYX1jPXEubGVuZ3RoO3EucHVzaChhKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBhLnNyYyYmKHdbYS5zcmNdPWMpO2E9Y31pZihiLmRUXylyZXR1cm5bXTtmb3IodmFyIGM9W10sZT1iLnBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoInJlc291cmNlIiksYj1iLnBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQtZy50aW1pbmcubmF2aWdhdGlvblN0YXJ0LGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGg9dm9pZCAwO3ZhciBkPWVbZl0saz1iO2lmKDA8ayl7dmFyIHI9e2Nvbm5lY3RFbmQ6MSxjb25uZWN0U3RhcnQ6MSxkZWNvZGVkQm9keVNpemU6MCxkb21haW5Mb29rdXBFbmQ6MSxkb21haW5Mb29rdXBTdGFydDoxLGR1cmF0aW9uOjAsZW5jb2RlZEJvZHlTaXplOjAsZW50cnlUeXBlOiIiLGZldGNoU3RhcnQ6MSxpbml0aWF0b3JUeXBlOiIiLG5hbWU6IiIsbToiIixyZWRpcmVjdEVuZDoxLHJlZGlyZWN0U3RhcnQ6MSxyZXF1ZXN0U3RhcnQ6MSxyZXNwb25zZUVuZDoxLHJlc3BvbnNlU3RhcnQ6MSxzZWN1cmVDb25uZWN0aW9uU3RhcnQ6MSxzdGFydFRpbWU6MSx0cmFuc2ZlclNpemU6MCx3b3JrZXJTdGFydDowfTtmb3IoaCBpbiBkKXJbaF09cltoXSYmMDxkW2hdP2RbaF0razpkW2hdO2g9cn1lbHNlIGg9ZDt2KGgpfHwoaC5mcmFtZUlkPWEsYy5wdXNoKGgpKX1yZXR1cm4gY31mdW5jdGlvbiBHKCl7dmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIik7aWYoIWIubGVuZ3RoKXJldHVybiBhO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdO3RyeXthPWEuY29uY2F0KEYoZSkpfWNhdGNoKGYpe319cmV0dXJuIGF9ZnVuY3Rpb24gSCgpe3ZhciBhPVtdO2lmKCFiLmdXUilyZXR1cm4gYTt0cnl7Zm9yKHZhciBsPWIuZ1dSKCksYz0wO2M8bC5sZW5ndGg7YysrKXt2YXIgZT1sW2NdO3YoZSl8fGEucHVzaChlKX19Y2F0Y2goZil7fXJldHVybiBhfWZ1bmN0aW9uIEkoKXtmb3IodmFyIGE9W10sYj1nLmdldEVudHJpZXNCeVR5cGUoInJlc291cmNlIiksYz0wO2M8Yi5sZW5ndGg7KytjKXt2YXIgZT1iW2NdO3YoZSl8fGEucHVzaChlKX1yZXR1cm4gYX1mdW5jdGlvbiBKKCl7dmFyIGE9W107aWYoIWIuU2dBUilyZXR1cm4gYTtmb3IodmFyIGQ9Yi5TZ0FSKCksYz0wO2M8ZC5sZW5ndGg7KytjKXt2YXIgZT1kW2NdO3YoZSl8fGEucHVzaChlKX1yZXR1cm4gYX1mdW5jdGlvbiBBKCl7dHJ5e2Zvcih2YXIgYT1bXS5jb25jYXQoRygpLEgoKSxJKCksSigpKSxsPTA7bDxhLmxlbmd0aDtsKyspdHJ5e3ZhciBjPWFbbF0sZT1jLm5hbWUsZj1iLnJlc1tlXT1jLGg9Zi5uYW1lO2lmKCEoYi5naChmLm5hbWUpPT09Yi5naChiLmxvYygpKSYmYi5nQkkoKS5jaCYmZi5kb21haW5Mb29rdXBTdGFydDxmLmZldGNoU3RhcnR8fC0xPGguaW5kZXhPZihiLmdBTigpKXx8LTE8aC5pbmRleE9mKGIuc2N2KCJyZXBvcnRVcmwiKSl8fC0xPGguaW5kZXhPZigianMucnV4aXQuY29tIil8fGYuc3RhcnRUaW1lPmYucmVzcG9uc2VFbmQpJiZiLnRwaWgoZSkpe3ZhciBmPXZvaWQgMCxtPWM7aWYoIXYobSkpe3ZhciBrPW51bGwscj1JbmZpbml0eSxwPW0ud29ya2VyTmF2aWdhdGlvblN0YXJ0fHxiLmdOVigibmF2aWdhdGlvblN0YXJ0IikscT1iLmdMQWV0KCl8fGIubncoKSxuPXArbS5zdGFydFRpbWU7Zm9yKGYgaW4gZC5iKWlmKGQuYi5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIHk9ZC5iW2ZdLHQ9ImwiPT09eS50eXBlLHU9dD9wOnkuc3RhcnQseD10P3E6eS5zdG9wLHc9bi11O3U8PW4mJm48PXgrKGIuc3luPzFFMzpiLm5jdigicnR0IikpJiZyPncmJihkLmJbMV0mJms9PT1kLmJbMV18fGsmJi0xIT09Yi5pbyhtLm5hbWUsay54aHJVcmwpfHwoaz15KSxyPXcpfWsmJihrLmcucHVzaChtKSx6W20ubmFtZSttLnN0YXJ0VGltZSttLnJlc3BvbnNlRW5kXT0hMCl9fX1jYXRjaChLKXt9fWNhdGNoKEspe305MDA8Zy5nZXRFbnRyaWVzQnlUeXBlKCJyZXNvdXJjZSIpLmxlbmd0aCYmKEwoKSx6PXt9KX1mdW5jdGlvbiBMKCl7dHJ5eyJmdW5jdGlvbiI9PT10eXBlb2YgdCYmdC5jYWxsKGcpLGIuc3QoZnVuY3Rpb24oKXt1LmNhbGwoZyl9LDApfWNhdGNoKGEpe319ZnVuY3Rpb24gTShhKXtBKCk7dmFyIGc9W10sYz1bXSxlO2ZvcihlIGluIGQuYilpZihkLmIuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBmPU51bWJlcihlKSxoPWQuYltmXSxtPWguc3RvcDtiLm53KCk+bSsxMkU0P2MucHVzaChmKTooTihoLmcsZiksYXx8aC5zdG9wPyhoLmcubGVuZ3RoJiYoaD0oaz17cmVzb3VyY2VzOmguZ30say5hY3Rpb25JZD1mLGspLGcudW5zaGlmdChoKSksYy5wdXNoKGYpKTpiLnN0KGZ1bmN0aW9uKCl7Yi5zTVBTKDJFMyl9LDApKX1mb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKWRlbGV0ZSBkLmJbY1thXV07ZC5jb3VudC09Yy5sZW5ndGg7cmV0dXJuIGc7dmFyIGt9ZnVuY3Rpb24gTihhLGQpe2lmKGIuU2dBUil7dmFyIGM9Yi5TZ0FSKCksZTtmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKXt2YXIgZj1uW2VdO2YuYWN0aW9uSWQ9PT1kJiYoYS5wdXNoKGYpLG4uc3BsaWNlKGUsMSkpfWZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZj1jW2VdLGYuYWN0aW9uSWQ9PT1kP2EucHVzaChmKTpuLnB1c2goZil9ZWxzZSBiLmdGSSYmKGQ9Yi5nRkkoKSxBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShhLGQpKX1mdW5jdGlvbiBPKCl7ZnVuY3Rpb24gYSgpe30KQj1nLmdldEVudHJpZXNCeVR5cGU7Qz1nLmdldEVudHJpZXNCeU5hbWU7eD1nLnNldFJlc291cmNlVGltaW5nQnVmZmVyU2l6ZTsodT1nLmNsZWFyUmVzb3VyY2VUaW1pbmdzKSYmKGcuY2xlYXJSZXNvdXJjZVRpbWluZ3M9YSk7Zy53ZWJraXRDbGVhclJlc291cmNlVGltaW5ncyYmKGcud2Via2l0Q2xlYXJSZXNvdXJjZVRpbWluZ3M9YSk7cmV0dXJuIEImJkMmJngmJnV9ZnVuY3Rpb24gUChhKXsiZnVuY3Rpb24iPT09dHlwZW9mIGcuYWRkRXZlbnRMaXN0ZW5lcj9nLmFkZEV2ZW50TGlzdGVuZXIoInJlc291cmNldGltaW5nYnVmZmVyZnVsbCIsYSk6InVuZGVmaW5lZCIhPT10eXBlb2YgZy5vbnJlc291cmNldGltaW5nYnVmZmVyZnVsbCYmKHQ9Zy5vbnJlc291cmNldGltaW5nYnVmZmVyZnVsbCxnLm9ucmVzb3VyY2V0aW1pbmdidWZmZXJmdWxsPWEpfWZ1bmN0aW9uIFEoKXt4LmNhbGwoZywxRTMpO1AoQSk7dmFyIGE9Yi5sc3QoKSxsPWIubEFJRCgpO2QuYltsXT17dHlwZToibCIsc3RhcnQ6YSxnOltdfTtkLmNvdW50Kys7ZC5iW2xdLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuW2wsdGhpcy5zdGFydCx0aGlzLnN0b3AsImxvYWQiLHRoaXMuZy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0pLmpvaW4oIiwiKV0uam9pbigifCIpfX12YXIgcD13aW5kb3csYj1wLmRUXyx4LEIsQyx1LHQsZD17Y291bnQ6MCxiOnt9fSx6PXt9LHE9W10sdz17fSxuPVtdO2lmKGImJmIuc21iaSYmKGIuc21iaSgiciIpfHxiLnN5biYmIWIucmVfcikpe3ZhciBnPWIuZ1AoKTtiLnJlcz17fTtwLmo/Yi5yZV9yPSExOihiLnJlX3I9ZyYmZy50aW1pbmcmJk8oKSxiLnJlX3ImJlEoKSk7cD0hMH1lbHNlIHA9ITE7cCYmKGIuaXJ0eD1ELGIuZ1NpZz1NLGIuZ0ZVPUUpfSkoKTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGEpe2Z1bmN0aW9uIGIoYSxiLGcpe2EuYi5vbnJlYWR5c3RhdGVjaGFuZ2UhPT1kJiYoYS5iLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKTthLm09ZS5leCgieCIsdm9pZCAwLHZvaWQgMCxhLnVybCxudWxsLGEpO3RyeXthLmFzeW5jJiYoYS5iLnRpbWVvdXQ9YS50aW1lb3V0KX1jYXRjaChKKXt9dHJ5e2EuYXN5bmMmJihhLmIucmVzcG9uc2VUeXBlPWEucmVzcG9uc2VUeXBlKX1jYXRjaChKKXt9IWcmJmImJmIubm9kZVR5cGUmJihiPWIueG1sfHwobmV3IGguWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcoYikpO3cmJihoLmNsZWFyVGltZW91dCh3KSx3PXZvaWQgMCk7RHx8KEUoYyxjLmIsQSksRD0hMCk7dmFyIHQ9e30sdD1lLnNjaCh0LGEudXJsLGEubSksbTtmb3IobSBpbiB0LmhlYWRlcnMpdC5oZWFkZXJzLmhhc093blByb3BlcnR5KG0pJiZhLmIuc2V0UmVxdWVzdEhlYWRlcihtLHQuaGVhZGVyc1ttXSk7YS5iLndpdGhDcmVkZW50aWFscyE9PWEud2l0aENyZWRlbnRpYWxzJiYoYS5iLndpdGhDcmVkZW50aWFscz1hLndpdGhDcmVkZW50aWFscyk7dmFyIHQ9ITA7MTE+ZS5nQkkoKS5pZSYmIWEuQSYmSChhKTt0cnl7aWYoZyl2YXIgZj1hLmIuc2VuZEFzQmluYXJ5KGIpO2Vsc2V7dmFyIHI9cChhLCJzZW5kIik7Zj1yP2suc2VuZENhbGxiYWNrKHIsYSxbYl0pOmEuYi5zZW5kKGIpfXQ9ITF9ZmluYWxseXtCKGEpLHQmJmUubHgoYS5tLHZvaWQgMCx2b2lkIDAsdm9pZCAwLCJ4Iil9IWEuYXN5bmMmJmEucmVhZHlTdGF0ZSYmInVuZGVmaW5lZCIhPT10eXBlb2YgYS5tJiZlLmx4KGEubSx2b2lkIDAsdm9pZCAwLHZvaWQgMCwieCIpO3JldHVybiBmfWZ1bmN0aW9uIGQoKXtjLnJlYWR5U3RhdGU9Yy5iLnJlYWR5U3RhdGU7aWYoYy5yZWFkeVN0YXRlIT09Yy5HfHwxMDA8ZS5udygpLWMuRil7Zm9yKHZhciBhPTA7YTxjLkIubGVuZ3RoO2ErKyljbGVhclRpbWVvdXQoYy5CW2FdKTtjLkI9W107QihjKTs0PT09Yy5yZWFkeVN0YXRlJiZmKCk7SChjKTtjLkY9ZS5udygpfWVsc2UgYy5CLnB1c2goZS5zdChkLDEwMCkpO2MuRz1jLnJlYWR5U3RhdGV9ZnVuY3Rpb24gZigpe2MuYi5vbnJlYWR5c3RhdGVjaGFuZ2U9eTt3fHwodz1lLnN0KHosMCkpO20mJihlLnJlbChoLCJ1bmxvYWQiLG0pLG09bnVsbCl9ZnVuY3Rpb24geigpe2lmKHcpe3c9dm9pZCAwO0Q9ITE7Zm9yKHZhciBhPWMuYixiPUEubGVuZ3RoOzA8PS0tYjspdHJ5e0FbYl1pbiBhJiYoYVtBW2JdXT15KX1jYXRjaChLKXt9fX1mdW5jdGlvbiBxKCl7ZnVuY3Rpb24gYSgpe20mJihtPW51bGwsZigpLGMuYWJvcnQoKSl9bXx8KG09YSxlLmFlbChoLCJ1bmxvYWQiLG0pKX1mb3IodmFyIGc9MTtnPGFyZ3VtZW50cy5sZW5ndGg7ZysrKTt2YXIgYz10aGlzO2lmKGMuY29uc3RydWN0b3Ipe3ZhciByPW47dSgpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYywiY29uc3RydWN0b3IiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sc2V0OmZ1bmN0aW9uKGEpe3I9YX19KX1jLkM9ITA7Yy5nPXt9O2ZvcihnPTA7ZzxDLmxlbmd0aDtnKyspYy5nW0NbZ11dPXZvaWQgMDt2YXIgbT1udWxsLEQ9ITEsdz12b2lkIDA7Yy5BPSExO2MuYj1hcmd1bWVudHMubGVuZ3RoP25ldyBsKGEpOm5ldyBsO2Zvcih2YXIgdiBpbiBjLmIpaWYoKCFjLmIuaGFzT3duUHJvcGVydHl8fGMuYi5oYXNPd25Qcm9wZXJ0eSh2KSkmJiFjLmhhc093blByb3BlcnR5KHYpKWlmKHUoKSkidXBsb2FkIj09PXY/T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsInVwbG9hZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7Yy5nLnVwbG9hZHx8KGMuZy51cGxvYWQ9bmV3IEYoYy5iLnVwbG9hZCkpO3JldHVybiBjLmcudXBsb2FkfX0pOmZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLGEse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWUuaW8oYSwicmVzcG9uc2UiKT90aGlzLmJbYV06dGhpcy5nW2FdfSxzZXQ6ZnVuY3Rpb24oYyl7dGhpcy5nW2FdPWN9fSl9KHYpO2Vsc2UgdHJ5e2Nbdl09Yy5iW3ZdfWNhdGNoKHQpe31jLmo9W107Yy51cmw9IiI7Yy5yZWFkeVN0YXRlPTA7Yy5HPS0xO2MuRj1lLm53KCk7Yy52PTA7Yy5CPVtdO3RyeXt2PXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5iLnJlc3BvbnNlVHlwZX0sc2V0OmZ1bmN0aW9uKGEpe2MuYi5yZXNwb25zZVR5cGU9YX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJyZXNwb25zZVR5cGUiLHYpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLmcsInJlc3BvbnNlVHlwZSIsdil9Y2F0Y2godCl7fWMucmVzcG9uc2VYTUw9bnVsbDtCKGMpO2Mub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7IndpdGhDcmVkZW50aWFscyJpbiBjLmImJihjLndpdGhDcmVkZW50aWFscz1jLmIud2l0aENyZWRlbnRpYWxzKTtjLnRpbWVvdXQ9MDtjLm9wZW49ZnVuY3Rpb24oYSxiLGUsZyxtKXtmdW5jdGlvbiBmKGMsZCxmKXsiYXBwbHkiaW4gYz9rLmNhbGxPcGVuQ2FsbGJhY2soYyxmLGQpOjQ8ZC5sZW5ndGg/YyhhLGIsZSxnLG0pOjM8ZC5sZW5ndGg/YyhhLGIsZSxnKTpjKGEsYixlKX1jLkg9ITE7Mz5hcmd1bWVudHMubGVuZ3RoJiYoZT0hMCk7Yy5hc3luYz1lO3gmJmUmJnEoKTtjLmIub25yZWFkeXN0YXRlY2hhbmdlPWQ7Yy51cmw9IiIrYjt2YXIgcj1wKGMsIm9wZW4iKTtyP2Yocixhcmd1bWVudHMsYyk6ZihjLmIub3Blbixhcmd1bWVudHMsYy5iKTtjLnJlYWR5U3RhdGU9Yy5iLnJlYWR5U3RhdGV9O2Muc2VuZD1mdW5jdGlvbihhKXtyZXR1cm4gYihjLGEsITEpfTsic2VuZEFzQmluYXJ5ImluIGMuYiYmKGMuc2VuZEFzQmluYXJ5PWZ1bmN0aW9uKGEpe3JldHVybiBiKGMsYSwhMCl9KTtjLmFib3J0PWZ1bmN0aW9uKCl7MDxjLnJlYWR5U3RhdGUmJihjLkg9ITApO3ZhciBhPXAoYywiYWJvcnQiKTthP2EuYXBwbHkoYyxhcmd1bWVudHMpOmMuYi5hYm9ydCgpO2YoKTtpZihjLm0pe2Zvcig7MDxjLnY7KWMudi0tLGUubGMoYy5tKTtlLmx4KGMubSx2b2lkIDAsdm9pZCAwLHZvaWQgMCwieCIpO2MubT1udWxsfX07Yy5nZXRBbGxSZXNwb25zZUhlYWRlcnM9ZnVuY3Rpb24oKXt2YXIgYT1wKGMsImdldEFsbFJlc3BvbnNlSGVhZGVycyIpO3JldHVybiBhP2suZ2V0UmVzcG9uc2VIZWFkZXJzQ2FsbGJhY2soYSxjLGFyZ3VtZW50cyk6Yy5iLmdldEFsbFJlc3BvbnNlSGVhZGVycygpfTtjLmdldFJlc3BvbnNlSGVhZGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXAoYywiZ2V0UmVzcG9uc2VIZWFkZXIiKTtyZXR1cm4gYj9rLmdldFJlc3BvbnNlSGVhZGVyQ2FsbGJhY2soYixjLGFyZ3VtZW50cyk6Yy5iLmdldFJlc3BvbnNlSGVhZGVyKGEpfTtjLnNldFJlcXVlc3RIZWFkZXI9ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnRvTG93ZXJDYXNlKCk7aWYoZCE9PWUuZ1BDSE4oKSYmZCE9PWUuZ1JITigpJiYiWC1Ib3N0IiE9PWQpcmV0dXJuKGQ9cChjLCJzZXRSZXF1ZXN0SGVhZGVyIikpP2suc2V0UmVxdWVzdEhlYWRlckNhbGxiYWNrKGQsYyxhcmd1bWVudHMpOmMuYi5zZXRSZXF1ZXN0SGVhZGVyKGEsYil9O2MuYi5vdmVycmlkZU1pbWVUeXBlJiYoYy5vdmVycmlkZU1pbWVUeXBlPWZ1bmN0aW9uKGEpe3ZhciBiPXAoYywib3ZlcnJpZGVNaW1lVHlwZSIpO3JldHVybiBiP2sub3ZlcnJpZGVNaW1lVHlwZUNhbGxiYWNrKGIsYyxhcmd1bWVudHMpOmMuYi5vdmVycmlkZU1pbWVUeXBlKGEpfSk7aC5FdmVudFRhcmdldHx8KGMuYi5hZGRFdmVudExpc3RlbmVyJiYoYy5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixkKXt2YXIgZT1wKGMsImFkZEV2ZW50TGlzdGVuZXIiKTtrLkFFTENhbGxiYWNrKGUsYyxhcmd1bWVudHMpfSxjLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXAoYywicmVtb3ZlRXZlbnRMaXN0ZW5lciIpO2suUkVMQ2FsbGJhY2soZSxjLGFyZ3VtZW50cyl9KSxjLmRpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9cChjLCJkaXNwYXRjaEV2ZW50Iik7aWYoYiYmInJlYWR5c3RhdGVjaGFuZ2UiIT09YS50eXBlKXJldHVybiBrLmRpc3BhdGNoQ2FsbGJhY2soYixjLGFyZ3VtZW50cyk7RyhjLGEpfSk7Yy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbWE1MSHR0cFJlcXVlc3RdIn19ZnVuY3Rpb24gRihhKXt2YXIgYj10aGlzLGQ9ITEsZT0ib25sb2Fkc3RhcnQgb25wcm9ncmVzcyBvbmFib3J0IG9uZXJyb3Igb25sb2FkIG9udGltZW91dCBvbmxvYWRlbmQiLnNwbGl0KCIgIik7aWYoYi5jb25zdHJ1Y3Rvcil7dmFyIGg9Rjt1KCkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJjb25zdHJ1Y3RvciIse2dldDpmdW5jdGlvbigpe3JldHVybiBofSxzZXQ6ZnVuY3Rpb24oYSl7aD1hfX0pfWIuZz17fTtiLmo9W107Yi5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGcsYyxyKXtpZihjKXtmb3IodmFyIG0sZj1iLmoscT0wO3E8Zi5sZW5ndGg7cSsrKWlmKG09ZltxXSxtWzBdPT09ZyYmbVsxXT09PWMmJm1bMl09PT1yKXJldHVybjtkfHwoZD0hMCxFKGIsYSxlKSk7Zi5wdXNoKFtnLGMscl0pfX07Yi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYyxkKXtmb3IodmFyIGUsZj1iLmosZz0wO2c8Zi5sZW5ndGg7ZysrKWlmKGU9ZltnXSxlWzBdPT09YSYmZVsxXT09PWMmJmVbMl09PT1kKXtmLnNwbGljZShnLDEpO2JyZWFrfX07Yi5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmosZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdO2VbMF0hPT1hLnR5cGV8fGVbMl18fCgib2JqZWN0Ij09PXR5cGVvZiBlWzFdJiZlWzFdLmhhbmRsZUV2ZW50P2suZGlzcGF0Y2hFdmVudENhbGxiYWNrKGVbMV0uaGFuZGxlRXZlbnQsZVsxXSxbYV0pOmsuZGlzcGF0Y2hFdmVudENhbGxiYWNrKGVbMV0sYixbYV0pKX19O2Zvcih2YXIgcT0wO3E8ZS5sZW5ndGg7KytxKShmdW5jdGlvbihmKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYixmLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBiLmdbZl19LHNldDpmdW5jdGlvbihjKXtkfHwoZD0hMCxFKGIsYSxlKSk7Yi5nW2ZdPWN9fSl9KShlW3FdKTtiLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltYTUxIdHRwUmVxdWVzdFVwbG9hZF0ifX1mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIHUoKXtpZighdS5oYXNDYWNoZSl7dS5oYXNDYWNoZT0hMDtpZigiZGVmaW5lUHJvcGVydHkiaW4gT2JqZWN0KXt2YXIgYT17RDo0MX07dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJaIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuRD1hfX0pO2EuWj00Mjt2YXIgYj00Mj09PWEuRH1jYXRjaChkKXtiPSExfX1lbHNlIGI9ITE7dS5jYWNoZWRWYWw9Yn1yZXR1cm4gdS5jYWNoZWRWYWx9ZnVuY3Rpb24gQihhKXt0cnl7dmFyIGI9YS5iLGQ9Yi5yZXNwb25zZVhNTDtpZih4KXtpZih4JiZkJiYhZC5kb2N1bWVudEVsZW1lbnQmJmIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpLm1hdGNoKC9bXlwvXStcL1teXCtdK1wreG1sLykpe3ZhciBmPW5ldyBoLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKTtmLmxvYWRYTUwoYi5yZXNwb25zZVRleHQpfWlmKGYpaWYoeCYmZi5wYXJzZUVycm9yJiYwIT09Zi5wYXJzZUVycm9yLmVycm9yQ29kZXx8Zi5kb2N1bWVudEVsZW1lbnQmJiJwYXJzZXJlcnJvciI9PT1mLmRvY3VtZW50RWxlbWVudC50YWdOYW1lKXtpZihlLm14KCkpdHJ5e2UubXhwKGYucGFyc2VFcnJvci5yZWFzb24pfWNhdGNoKHope319ZWxzZSBkPWZ9YS5yZXNwb25zZVhNTD1kfWNhdGNoKHope31iPSJyZXNwb25zZVRleHQgcmVzcG9uc2Ugc3RhdHVzIHN0YXR1c1RleHQgcmVzcG9uc2VCb2R5IHJlc3BvbnNlU3RyZWFtIHJlc3BvbnNlVVJMIi5zcGxpdCgiICIpO2ZvcihkPTA7ZDxiLmxlbmd0aDsrK2Qpe2Y9YltkXTt0cnl7ZiBpbiBhLmImJihhW2ZdPWEuYltmXSl9Y2F0Y2goeil7fX19ZnVuY3Rpb24gRShhLGIsZCl7ZnVuY3Rpb24gZihkKXtmdW5jdGlvbiBmKGMsYil7dHJ5e2UuZWMoYS5tKSxhLnYrKyxkIGlue29uZXJyb3I6MCxvbmxvYWQ6MSxvbnByb2dyZXNzOjJ9JiZCKGEpLCJvYmplY3QiPT09dHlwZW9mIGImJmIuaGFuZGxlRXZlbnQ/ay5oYW5kbGVFdmVudENhbGxiYWNrKGIuaGFuZGxlRXZlbnQsYixjKTprLmhhbmRsZUV2ZW50Q2FsbGJhY2soYixhLGMpfWZpbmFsbHl7YS52LS0sZS5sYyhhLm0pfX10cnl7YltkXT1mdW5jdGlvbigpe3ZhciBjPVtdO2lmKGEuailmb3IodmFyIGI9ZC5zdWJzdHJpbmcoMiksZz0wO2c8YS5qLmxlbmd0aDtnKyspYS5qW2ddWzBdPT09YiYmYy5wdXNoKGEualtnXVsxXSk7Yj17b25lcnJvcjpmdW5jdGlvbigpe2UubXhmKGEuYi5zdGF0dXMsYS5iLnN0YXR1c1RleHQpfSxvbmFib3J0OmUubXhjLG9udGltZW91dDplLm14dH07aWYoZS5teCgpJiZkIGluIGIpYltkXSgpO2EuZyYmInVuZGVmaW5lZCIhPT10eXBlb2YgYS5nW2RdP2EuZ1tkXSYmZihhcmd1bWVudHMsYS5nW2RdKTohdSgpJiZhW2RdJiZmKGFyZ3VtZW50cyxhW2RdKTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKWYoYXJndW1lbnRzLGNbYl0pfX1jYXRjaChjKXt9fQpmb3IodmFyIGg9MDtoPGQubGVuZ3RoO2grKyl0cnl7ZFtoXWluIGImJmYoZFtoXSl9Y2F0Y2gocSl7fX1mdW5jdGlvbiBIKGEpe3ZhciBiPWEubTt0cnl7ZS5lYyhiLGEucmVhZHlTdGF0ZSksYS52KyssRyhhLHt0eXBlOiJyZWFkeXN0YXRlY2hhbmdlIixidWJibGVzOiExLGNhbmNlbGFibGU6ITEsdGltZVN0YW1wOmUubncoKX0pfWZpbmFsbHl7YS52LS0sZS5sYyhiKSw0PT09YS5yZWFkeVN0YXRlJiZiJiYoMjAwIT09YS5zdGF0dXMmJmUubXgoKSYmZS5teGYoYS5zdGF0dXMsYS5zdGF0dXNUZXh0LGIpLGUubHgoYixhLnVybCwhMCx2b2lkIDAsIngiKSxhLm09bnVsbCl9fWZ1bmN0aW9uIEcoYSxiKXtiPXt0eXBlOmIudHlwZSx0YXJnZXQ6YSxjdXJyZW50VGFyZ2V0OmEsZXZlbnRQaGFzZToyLGJ1YmJsZXM6Yi5idWJibGVzLGNhbmNlbGFibGU6Yi5jYW5jZWxhYmxlLHRpbWVTdGFtcDpiLnRpbWVTdGFtcCxzdG9wUHJvcGFnYXRpb246eSxwcmV2ZW50RGVmYXVsdDp5LGluaXRFdmVudDp5fTsicmVhZHlzdGF0ZWNoYW5nZSI9PT1iLnR5cGUmJighZS5nQkkoKS5pZXx8MTA8ZS5nQkkoKS5pZXx8MTE+ZS5nQkkoKS5pZSYmKCFhLkF8fDEhPT1hLnJlYWR5U3RhdGUpKSYmKGEuZyYmInVuZGVmaW5lZCIhPT10eXBlb2YgYS5nLm9ucmVhZHlzdGF0ZWNoYW5nZT9hLmcub25yZWFkeXN0YXRlY2hhbmdlJiYoYS5BPSEwLGsub25yZWFkeXN0YXRlY2hhbmdlQ2FsbGJhY2soYS5nLm9ucmVhZHlzdGF0ZWNoYW5nZSxhLFtiXSkpOiF1KCkmJmEub25yZWFkeXN0YXRlY2hhbmdlJiYoYS5BPSEwLGsub25yZWFkeXN0YXRlY2hhbmdlQ2FsbGJhY2soYS5vbnJlYWR5c3RhdGVjaGFuZ2UsYSxbYl0pKSk7Zm9yKHZhciBkPTA7ZDxhLmoubGVuZ3RoO2QrKyl7dmFyIGY9YS5qW2RdO2ZbMF0hPT1iLnR5cGV8fGZbMl18fCgib2JqZWN0Ij09PXR5cGVvZiBmWzFdJiZmWzFdLmhhbmRsZUV2ZW50P2suZGlzcGF0Y2hYSFJDYWxsYmFjayhmWzFdLmhhbmRsZUV2ZW50LGZbMV0sW2JdKTprLmRpc3BhdGNoWEhSQ2FsbGJhY2soZlsxXSxhLFtiXSkpfX1mdW5jdGlvbiBwKGEsYil7dHJ5e3ZhciBkPWUuZ1BPKGEpLGY9ZS5nUE8oYS5iKTtmfHwoZj1sLnByb3RvdHlwZSk7cmV0dXJuIWR8fCFmfHwiX19kdFByb3RvImluIGRbYl0/bnVsbDpkW2JdfWNhdGNoKHope3JldHVybiBudWxsfX1mdW5jdGlvbiBJKGEpe2EuVU5TRU5UPTA7YS5PUEVORUQ9MTthLkhFQURFUlNfUkVDRUlWRUQ9MjthLkxPQURJTkc9MzthLkRPTkU9NH12YXIgaD13aW5kb3csZT13aW5kb3cuZFRfLGw9aC5YTUxIdHRwUmVxdWVzdCx4LEE9Im9uYWJvcnQgb25lcnJvciBvbmxvYWQgb25sb2FkZW5kIG9ubG9hZHN0YXJ0IG9ucHJvZ3Jlc3Mgb250aW1lb3V0Ii5zcGxpdCgiICIpLGs9e2hhbmRsZUV2ZW50Q2FsbGJhY2s6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBhLmFwcGx5KGIsZCl9LGRpc3BhdGNoRXZlbnRDYWxsYmFjazpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGEuYXBwbHkoYixkKX0sY2FsbE9wZW5DYWxsYmFjazpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGEuYXBwbHkoYixkKX0sb25vcGVuQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBhLmFwcGx5KGIsZCl9LG9uc2VuZENhbGxiYWNrOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYS5hcHBseShiLGQpfSxzZW5kQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBhLmFwcGx5KGIsZCl9LGdldFJlc3BvbnNlSGVhZGVyc0NhbGxiYWNrOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYS5hcHBseShiLGQpfSxnZXRSZXNwb25zZUhlYWRlckNhbGxiYWNrOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYS5hcHBseShiLGQpfSxzZXRSZXF1ZXN0SGVhZGVyQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBhLmFwcGx5KGIsZCl9LG92ZXJyaWRlTWltZVR5cGVDYWxsYmFjazpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGEuYXBwbHkoYixkKX0sUkVMQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBhLmFwcGx5KGIsZCl9LEFFTENhbGxiYWNrOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYS5hcHBseShiLGQpfSxkaXNwYXRjaENhbGxiYWNrOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYS5hcHBseShiLGQpfSxvbnJlYWR5c3RhdGVjaGFuZ2VDYWxsYmFjazpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGEuYXBwbHkoYixkKX0sZGlzcGF0Y2hYSFJDYWxsYmFjazpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGEuYXBwbHkoYixkKX0sWE1MSHR0cFJlcXVlc3RDYWxsYmFjazpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGEuYXBwbHkoYixkKX19LEM9W107KGZ1bmN0aW9uKCl7aWYoZSYmZS5zbWJpJiZlLnNtYmkoIngiKSl7eD1lLmdCSSgpLmllJiYxMT5lLmdCSSgpLmllO2lmKGguWE1MSHR0cFJlcXVlc3QmJihoLlhNTEh0dHBSZXF1ZXN0PW4sbC5wcm90b3R5cGUpKXtPYmplY3QuY3JlYXRlP24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpOm4ucHJvdG90eXBlLl9fcHJvdG9fXz1lLmdQTyhsLnByb3RvdHlwZSk7bi5wcm90b3R5cGUuQz0hMTtuLnByb3RvdHlwZS5nPXt9O0kobik7SShuLnByb3RvdHlwZSk7Qz1bXTt2YXIgYT10eXBlb2YgbC5wcm90b3R5cGUuc2VuZCxiO2ZvcihiIGluIGwucHJvdG90eXBlKWlmKCFoLkV2ZW50VGFyZ2V0fHwiYWRkRXZlbnRMaXN0ZW5lciIhPT1iJiYicmVtb3ZlRXZlbnRMaXN0ZW5lciIhPT1iJiYiZGlzcGF0Y2hFdmVudCIhPT1iKXRyeXtoLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZVtiXT1hPT09dHlwZW9mIGwucHJvdG90eXBlW2JdP2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe2lmKHRoaXMgaW5zdGFuY2VvZiBuKXsib3BlbiIhPT1hfHx0aGlzLnVybHx8KHRoaXMudXJsPWFyZ3VtZW50c1sxXSsiIik7dmFyIGM9dGhpcy5ifWVsc2UgYz10aGlzO3JldHVybiBrLlhNTEh0dHBSZXF1ZXN0Q2FsbGJhY2soYixjLGFyZ3VtZW50cyl9Yy5fX2R0UHJvdG89ITA7cmV0dXJuIGN9KGIsbC5wcm90b3R5cGVbYl0pOmwucHJvdG90eXBlW2JdfWNhdGNoKHEpe2lmKEMucHVzaChiKSx1KCkpInVwbG9hZCI9PT1iP2Z1bmN0aW9uKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGguWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCJ1cGxvYWQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZighdGhpcy5DKXJldHVybiBsLnByb3RvdHlwZS51cGxvYWQ7dGhpcy5nLnVwbG9hZHx8KHRoaXMuZy51cGxvYWQ9bmV3IEYodGhpcy5iLnVwbG9hZCkpO3JldHVybiB0aGlzLmcudXBsb2FkfX0pfSgpOmZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShoLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSxhLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DPzA8PWUuaW8oYSwicmVzcG9uc2UiKT90aGlzLmJbYV06dGhpcy5nW2FdOmwucHJvdG90eXBlW2FdfSxzZXQ6ZnVuY3Rpb24oYyl7dGhpcy5DP3RoaXMuZ1thXT1jOmwucHJvdG90eXBlW2FdPWN9fSl9KGIpO2Vsc2UgdHJ5e2guWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlW2JdPXZvaWQgMH1jYXRjaChnKXt9fXRyeXtpZihhPW51bGwsaC5FdmVudFRhcmdldCYmKGE9RXZlbnRUYXJnZXQucHJvdG90eXBlKSxhJiZhLmFkZEV2ZW50TGlzdGVuZXJ8fCFoLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR8fChhPWUuZ1BPKGguWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldC5wcm90b3R5cGUpKSxhJiZhLmFkZEV2ZW50TGlzdGVuZXJ8fChhPVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSksYSYmYS5hZGRFdmVudExpc3RlbmVyKXt2YXIgZD1hLmFkZEV2ZW50TGlzdGVuZXI7YS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtpZih0aGlzIGluc3RhbmNlb2YgbilhOnt2YXIgZT1jO3ZvaWQgMD09PWUmJihlPSExKTtmb3IodmFyIGYsZz0wO2c8dGhpcy5qLmxlbmd0aDtnKyspaWYoZj10aGlzLmpbZ10sZlswXT09PWEmJmZbMV09PT1iJiZmWzJdPT09ZSlicmVhayBhO3RoaXMuai5wdXNoKFthLGIsZV0pfWVsc2UgcmV0dXJuIGsuQUVMQ2FsbGJhY2soZCx0aGlzLGFyZ3VtZW50cyl9O3ZhciBmPWEucmVtb3ZlRXZlbnRMaXN0ZW5lcjthLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMgaW5zdGFuY2VvZiBuKXt2YXIgZD1hLGU9YixnPWM7dm9pZCAwPT09ZyYmKGc9ITEpO2Zvcih2YXIgaCxsPTA7bDx0aGlzLmoubGVuZ3RoO2wrKylpZihoPXRoaXMualtsXSxoWzBdPT09ZCYmaFsxXT09PWUmJmhbMl09PT1nKXt0aGlzLmouc3BsaWNlKGwsMSk7YnJlYWt9fWVsc2UgcmV0dXJuIGsuUkVMQ2FsbGJhY2soZix0aGlzLGFyZ3VtZW50cyl9O3ZhciBwPWEuZGlzcGF0Y2hFdmVudDthLmRpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oYSl7aWYodGhpcyBpbnN0YW5jZW9mIG4pRyh0aGlzLGEpO2Vsc2UgcmV0dXJuIGsuZGlzcGF0Y2hDYWxsYmFjayhwLHRoaXMsYXJndW1lbnRzKX19fWNhdGNoKHEpe319ZS5hZWwoaCwidW5sb2FkIixmdW5jdGlvbigpe2guWE1MSHR0cFJlcXVlc3Q9bDt4PWw9bnVsbH0pO3JldHVybiEwfXJldHVybiExfSkoKX0pKCk7
Protocol
HTTP/1.1
Server
2606:4700:3036::681f:4e17 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
d5a89e26beae0bc03ad18a0b0d1d3d75f87c32047879d25da11970cb5c4662a3

Request headers

Referer
http://d2l.msu.vnre.me/UserDhttps2253A2252F2252FblacksenNe2ztVYqoYiH8bTkiya90PsrtTab226globalLd23DtruesiiH8y1oJA4fwnDaxZtGg0D8nYZiyJSMogoutEnablejMm8yNe8HtopHdtHdtHT/
Origin
http://d2l.msu.vnre.me
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/octet-stream

Response headers

Date
Tue, 07 Apr 2020 20:05:10 GMT
Content-Encoding
gzip
CF-Cache-Status
DYNAMIC
Server
cloudflare
Transfer-Encoding
chunked
Content-Type
text/html; charset=iso-8859-1
Connection
keep-alive
CF-RAY
58065ca4fbde97b4-FRA

8 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| onformdata object| onpointerrawupdate object| dT_ function| prepareSubmit function| $ function| jQuery object| dynaTrace object| jQuery111309701630639801104

5 Cookies

Domain/Path Name / Value
d2l.msu.vnre.me/ Name: dtPC
Value: 489908130_6h1
d2l.msu.vnre.me/ Name: dtLatC
Value: 71
d2l.msu.vnre.me/ Name: dtCookie
Value: DEOSRD7THKTIBDPT8F75HC7QEVDLSQQ1
d2l.msu.vnre.me/ Name: dtSa
Value: -
.vnre.me/ Name: __cfduid
Value: dfff639770ffdac765ee2cd5d8244ef301586289907