URL: http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afed...
Submission: On July 13 via manual from DK

Summary

This website contacted 6 IPs in 3 countries across 5 domains to perform 10 HTTP transactions. The main IP is 2606:4700:3034::ac43:ac56, located in United States and belongs to CLOUDFLARENET, US. The main domain is moodle.ucl.rrnn.me.
This is the only time moodle.ucl.rrnn.me was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
3 2606:4700:303... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
2 2 193.60.250.82 786 (JANET Jis...)
2 193.60.250.24 786 (JANET Jis...)
1 151.101.114.110 54113 (FASTLY)
2 162.247.242.19 23467 (NEWRELIC-...)
10 6
Domain Requested by
3 moodle.ucl.rrnn.me application
2 bam.nr-data.net js-agent.newrelic.com
moodle.ucl.rrnn.me
2 www.ucl.ac.uk moodle.ucl.rrnn.me
2 moodle.ucl.ac.uk 2 redirects
2 www.google-analytics.com application
moodle.ucl.rrnn.me
1 js-agent.newrelic.com moodle.ucl.rrnn.me
10 6
Subject Issuer Validity Valid
*.google-analytics.com
GTS CA 1O1
2020-06-17 -
2020-09-09
3 months crt.sh
www.ucl.ac.uk
QuoVadis EV SSL ICA G3
2020-07-13 -
2022-07-13
2 years crt.sh
f4.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2020-05-29 -
2021-05-07
a year crt.sh
*.nr-data.net
DigiCert SHA2 Secure Server CA
2020-02-05 -
2022-02-08
2 years crt.sh

This page contains 1 frames:

Primary Page: http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Frame ID: C343ACC767CF82C9CF2E2AD9846E76A6
Requests: 33 HTTP requests in this frame

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /^cloudflare$/i

Page Statistics

10
Requests

70 %
HTTPS

33 %
IPv6

5
Domains

6
Subdomains

6
IPs

3
Countries

1313 kB
Transfer

5628 kB
Size

4
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 25
  • https://moodle.ucl.ac.uk/theme/yui_combo.php?m/1583791301/core/event/event-min.js&m/1583791301/core/widget/widget-focusafterclose-min.js&3.17.2/plugin/plugin-min.js&m/1583791301/core/lockscroll/lockscroll-min.js&m/1583791301/core/notification/notification-dialogue-min.js&m/1583791301/core/notification/notification-alert-min.js&m/1583791301/core/notification/notification-exception-min.js&m/1583791301/core/notification/notification-ajaxexception-min.js&m/1583791301/filter_glossary/autolinker/autolinker-min.js HTTP 302
  • https://www.ucl.ac.uk/isd/news/2020/jul/moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm?m/1583791301/core/event/event-min.js&m/1583791301/core/widget/widget-focusafterclose-min.js&3.17.2/plugin/plugin-min.js&m/1583791301/core/lockscroll/lockscroll-min.js&m/1583791301/core/notification/notification-dialogue-min.js&m/1583791301/core/notification/notification-alert-min.js&m/1583791301/core/notification/notification-exception-min.js&m/1583791301/core/notification/notification-ajaxexception-min.js&m/1583791301/filter_glossary/autolinker/autolinker-min.js
Request Chain 26
  • https://moodle.ucl.ac.uk/lib/requirejs.php/1583791301/core/first.js HTTP 302
  • https://www.ucl.ac.uk/isd/news/2020/jul/moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm

10 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
4 MB
1 MB
Document
General
Full URL
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Protocol
HTTP/1.1
Server
2606:4700:3034::ac43:ac56 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
7ff92f6245d134ec1746843c28b1710e468bf6d5731024426938e17680122c7e

Request headers

Host
moodle.ucl.rrnn.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/83.0.4103.61 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/83.0.4103.61 Safari/537.36

Response headers

Date
Mon, 13 Jul 2020 21:35:36 GMT
Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Set-Cookie
__cfduid=d4c90a0cf2f6d9e7068c59ffe78a317571594676136; expires=Wed, 12-Aug-20 21:35:36 GMT; path=/; domain=.rrnn.me; HttpOnly; SameSite=Lax
Last-Modified
Wed, 08 Jul 2020 15:54:06 GMT
Vary
Accept-Encoding
CF-Cache-Status
DYNAMIC
cf-request-id
03ebb3e0510000bf05d3003200000001
Server
cloudflare
CF-RAY
5b26227a1b40bf05-FRA
Content-Encoding
gzip
truncated
/
57 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
f69a13217482dc43f25e74cfcb9391d0f06d22501f10f5cb5e413d2d98a5cd23

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
text/javascript
truncated
/
26 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
f4ae8a2c83e0a851fd331bbf34d7a6f9184b3e31b6f2e681e8377fb8a8edc10f

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
44 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
text/javascript
truncated
/
23 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
15ac14c1ca8764c893d3d9afb8363d40e2ad97ef775d4c74122a6896e892a070

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
1 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c84ccd409bc5fb9c6775ac51687454412823f821965d0cf80fc8f51986485dec

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
62 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9ef249bfdc162849bcf2abe8425f5e90bd89fa4fd1588b1a492731c65b2bbfc9

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
15 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
26d1a45d173703f01ca9bb8be4335bae6005c3bc0a5f78b380ad18fb152b8835

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
78 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
0c86543afe1a6bbdb9a74fba061e2ca664557ddda1f299edf8ac8c5a25adeba8

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
analytics.js
www.google-analytics.com/
45 KB
18 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: application
URL: data:application/javascript;base64,Ci8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCihmdW5jdGlvbigpewoKdmFyIGRhdGEgPSB7CiJyZXNvdXJjZSI6IHsKICAidmVyc2lvbiI6IjEiLAogIAogICJtYWNyb3MiOlt7CiAgICAgICJmdW5jdGlvbiI6Il9fZSIKICAgIH0sewogICAgICAiZnVuY3Rpb24iOiJfX2NpZCIKICAgIH1dLAogICJ0YWdzIjpbewogICAgICAiZnVuY3Rpb24iOiJfX3JlcCIsCiAgICAgICJvbmNlX3Blcl9ldmVudCI6dHJ1ZSwKICAgICAgInZ0cF9jb250YWluZXJJZCI6WyJtYWNybyIsMV0sCiAgICAgICJ0YWdfaWQiOjEKICAgIH1dLAogICJwcmVkaWNhdGVzIjpbewogICAgICAiZnVuY3Rpb24iOiJfZXEiLAogICAgICAiYXJnMCI6WyJtYWNybyIsMF0sCiAgICAgICJhcmcxIjoiZ3RtLmpzIgogICAgfV0sCiAgInJ1bGVzIjpbCiAgICBbWyJpZiIsMF0sWyJhZGQiLDBdXV0KfSwKInJ1bnRpbWUiOltdCgoKCgp9OwovKgoKIENvcHlyaWdodCBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgYWEsYmE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZTpmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbigpe307Yi5wcm90b3R5cGU9YTtyZXR1cm4gbmV3IGJ9LGVhO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YpZWE9T2JqZWN0LnNldFByb3RvdHlwZU9mO2Vsc2V7dmFyIGZhO2E6e3ZhciBoYT17eWY6ITB9LGlhPXt9O3RyeXtpYS5fX3Byb3RvX189aGE7ZmE9aWEueWY7YnJlYWsgYX1jYXRjaChhKXt9ZmE9ITF9ZWE9ZmE/ZnVuY3Rpb24oYSxiKXthLl9fcHJvdG9fXz1iO2lmKGEuX19wcm90b19fIT09Yil0aHJvdyBuZXcgVHlwZUVycm9yKGErIiBpcyBub3QgZXh0ZW5zaWJsZSIpO3JldHVybiBhfTpudWxsfXZhciBqYT1lYSxrYT10aGlzfHxzZWxmLGxhPS9eW1x3Ky9fLV0rWz1dezAsMn0kLyxuYT1udWxsO3ZhciBvYT1mdW5jdGlvbigpe30scGE9ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGF9LGc9ZnVuY3Rpb24oYSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhfSxxYT1mdW5jdGlvbihhKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGEmJiFpc05hTihhKX0scmE9ZnVuY3Rpb24oYSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKE9iamVjdChhKSl9LHE9ZnVuY3Rpb24oYSxiKXtpZihBcnJheS5wcm90b3R5cGUuaW5kZXhPZil7dmFyIGM9YS5pbmRleE9mKGIpO3JldHVybiJudW1iZXIiPT10eXBlb2YgYz9jOi0xfWZvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKGFbZF09PT1iKXJldHVybiBkO3JldHVybi0xfSx2YT1mdW5jdGlvbihhLGIpe2lmKGEmJnJhKGEpKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGFbY10mJmIoYVtjXSkpcmV0dXJuIGFbY119LHdhPWZ1bmN0aW9uKGEsYil7aWYoIXFhKGEpfHwKIXFhKGIpfHxhPmIpYT0wLGI9MjE0NzQ4MzY0NztyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihiLWErMSkrYSl9LHlhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPW5ldyB4YSxkPTA7ZDxhLmxlbmd0aDtkKyspYy5zZXQoYVtkXSwhMCk7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYy5nZXQoYltlXSkpcmV0dXJuITA7cmV0dXJuITF9LEM9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmYihjLGFbY10pfSx6YT1mdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChOdW1iZXIoYSkpfHwwfSxBYT1mdW5jdGlvbihhKXtyZXR1cm4iZmFsc2UiPT1TdHJpbmcoYSkudG9Mb3dlckNhc2UoKT8hMTohIWF9LEJhPWZ1bmN0aW9uKGEpe3ZhciBiPVtdO2lmKHJhKGEpKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChTdHJpbmcoYVtjXSkpO3JldHVybiBifSxDYT1mdW5jdGlvbihhKXtyZXR1cm4gYT8KYS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik6IiJ9LEVhPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHhhPWZ1bmN0aW9uKCl7dGhpcy5wcmVmaXg9Imd0bS4iO3RoaXMudmFsdWVzPXt9fTt4YS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEsYil7dGhpcy52YWx1ZXNbdGhpcy5wcmVmaXgrYV09Yn07eGEucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy52YWx1ZXNbdGhpcy5wcmVmaXgrYV19Owp2YXIgRmE9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhJiZhLmhhc093blByb3BlcnR5KGIpP2FbYl06Y30sR2E9ZnVuY3Rpb24oYSl7dmFyIGI9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWIpdHJ5e2EoKX1jYXRjaChjKXt9Yj0hMH19LEhhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShjKSYmKGFbY109YltjXSl9LElhPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpcmV0dXJuITA7cmV0dXJuITF9LEphPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyljLnB1c2goYVtkXSksYy5wdXNoLmFwcGx5KGMsYlthW2RdXXx8W10pO3JldHVybiBjfSxLYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz17fSxkPWMsZT1hLnNwbGl0KCIuIiksZj0wO2Y8ZS5sZW5ndGgtMTtmKyspZD1kW2VbZl1dPXt9O2RbZVtlLmxlbmd0aC0xXV09YjtyZXR1cm4gY30sTGE9ZnVuY3Rpb24oYSl7dmFyIGI9CltdO0MoYSxmdW5jdGlvbihjLGQpezEwPmMubGVuZ3RoJiZkJiZiLnB1c2goYyl9KTtyZXR1cm4gYi5qb2luKCIsIil9Oy8qCiBqUXVlcnkgdjEuOS4xIChjKSAyMDA1LCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGpxdWVyeS5vcmcvbGljZW5zZS4gKi8KdmFyIE1hPS9cW29iamVjdCAoQm9vbGVhbnxOdW1iZXJ8U3RyaW5nfEZ1bmN0aW9ufEFycmF5fERhdGV8UmVnRXhwKVxdLyxOYT1mdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiBTdHJpbmcoYSk7dmFyIGI9TWEuZXhlYyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KGEpKSk7cmV0dXJuIGI/YlsxXS50b0xvd2VyQ2FzZSgpOiJvYmplY3QifSxPYT1mdW5jdGlvbihhLGIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoT2JqZWN0KGEpLGIpfSxQYT1mdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPU5hKGEpfHxhLm5vZGVUeXBlfHxhPT1hLndpbmRvdylyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIU9hKGEsImNvbnN0cnVjdG9yIikmJiFPYShhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWZvcih2YXIgYiBpbiBhKTtyZXR1cm4gdm9pZCAwPT09CmJ8fE9hKGEsYil9LEQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHwoImFycmF5Ij09TmEoYSk/W106e30pLGQ7Zm9yKGQgaW4gYSlpZihPYShhLGQpKXt2YXIgZT1hW2RdOyJhcnJheSI9PU5hKGUpPygiYXJyYXkiIT1OYShjW2RdKSYmKGNbZF09W10pLGNbZF09RChlLGNbZF0pKTpQYShlKT8oUGEoY1tkXSl8fChjW2RdPXt9KSxjW2RdPUQoZSxjW2RdKSk6Y1tkXT1lfXJldHVybiBjfTt2YXIgb2I7CnZhciBwYj1bXSxxYj1bXSxyYj1bXSxzYj1bXSx0Yj1bXSx1Yj17fSx2Yix4Yix5Yix6Yj1mdW5jdGlvbihhLGIpe3ZhciBjPXt9O2NbImZ1bmN0aW9uIl09Il9fIithO2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihjWyJ2dHBfIitkXT1iW2RdKTtyZXR1cm4gY30sQWI9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hWyJmdW5jdGlvbiJdO2lmKCFjKXRocm93IEVycm9yKCJFcnJvcjogTm8gZnVuY3Rpb24gbmFtZSBnaXZlbiBmb3IgZnVuY3Rpb24gY2FsbC4iKTt2YXIgZD11YltjXSxlPXt9LGY7Zm9yKGYgaW4gYSlhLmhhc093blByb3BlcnR5KGYpJiYwPT09Zi5pbmRleE9mKCJ2dHBfIikmJihlW3ZvaWQgMCE9PWQ/ZjpmLnN1YnN0cig0KV09YVtmXSk7cmV0dXJuIHZvaWQgMCE9PWQ/ZChlKTpvYihjLGUsYil9LENiPWZ1bmN0aW9uKGEsYixjKXtjPWN8fFtdO3ZhciBkPXt9LGU7Zm9yKGUgaW4gYSlhLmhhc093blByb3BlcnR5KGUpJiYoZFtlXT1CYihhW2VdLGIsYykpOwpyZXR1cm4gZH0sRGI9ZnVuY3Rpb24oYSl7dmFyIGI9YVsiZnVuY3Rpb24iXTtpZighYil0aHJvdyJFcnJvcjogTm8gZnVuY3Rpb24gbmFtZSBnaXZlbiBmb3IgZnVuY3Rpb24gY2FsbC4iO3ZhciBjPXViW2JdO3JldHVybiBjP2MucHJpb3JpdHlPdmVycmlkZXx8MDowfSxCYj1mdW5jdGlvbihhLGIsYyl7aWYocmEoYSkpe3ZhciBkO3N3aXRjaChhWzBdKXtjYXNlICJmdW5jdGlvbl9pZCI6cmV0dXJuIGFbMV07Y2FzZSAibGlzdCI6ZD1bXTtmb3IodmFyIGU9MTtlPGEubGVuZ3RoO2UrKylkLnB1c2goQmIoYVtlXSxiLGMpKTtyZXR1cm4gZDtjYXNlICJtYWNybyI6dmFyIGY9YVsxXTtpZihjW2ZdKXJldHVybjt2YXIgaD1wYltmXTtpZighaHx8Yi5QYyhoKSlyZXR1cm47Y1tmXT0hMDt0cnl7dmFyIGs9Q2IoaCxiLGMpO2sudnRwX2d0bUV2ZW50SWQ9Yi5pZDtkPUFiKGssYik7eWImJihkPXliLlhmKGQsaykpfWNhdGNoKHkpe2IueWUmJmIueWUoeSxOdW1iZXIoZikpLGQ9ITF9Y1tmXT0KITE7cmV0dXJuIGQ7Y2FzZSAibWFwIjpkPXt9O2Zvcih2YXIgbD0xO2w8YS5sZW5ndGg7bCs9MilkW0JiKGFbbF0sYixjKV09QmIoYVtsKzFdLGIsYyk7cmV0dXJuIGQ7Y2FzZSAidGVtcGxhdGUiOmQ9W107Zm9yKHZhciBtPSExLG49MTtuPGEubGVuZ3RoO24rKyl7dmFyIHI9QmIoYVtuXSxiLGMpO3hiJiYobT1tfHxyPT09eGIueWIpO2QucHVzaChyKX1yZXR1cm4geGImJm0/eGIuJGYoZCk6ZC5qb2luKCIiKTtjYXNlICJlc2NhcGUiOmQ9QmIoYVsxXSxiLGMpO2lmKHhiJiZyYShhWzFdKSYmIm1hY3JvIj09PWFbMV1bMF0mJnhiLnpnKGEpKXJldHVybiB4Yi5UZyhkKTtkPVN0cmluZyhkKTtmb3IodmFyIHU9Mjt1PGEubGVuZ3RoO3UrKylRYVthW3VdXSYmKGQ9UWFbYVt1XV0oZCkpO3JldHVybiBkO2Nhc2UgInRhZyI6dmFyIHA9YVsxXTtpZighc2JbcF0pdGhyb3cgRXJyb3IoIlVuYWJsZSB0byByZXNvbHZlIHRhZyByZWZlcmVuY2UgIitwKyIuIik7cmV0dXJuIGQ9e21lOmFbMl0sCmluZGV4OnB9O2Nhc2UgInpiIjp2YXIgdD17YXJnMDphWzJdLGFyZzE6YVszXSxpZ25vcmVfY2FzZTphWzVdfTt0WyJmdW5jdGlvbiJdPWFbMV07dmFyIHY9RWIodCxiLGMpLHc9ISFhWzRdO3JldHVybiB3fHwyIT09dj93IT09KDE9PT12KTpudWxsO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIkF0dGVtcHRpbmcgdG8gZXhwYW5kIHVua25vd24gVmFsdWUgdHlwZTogIithWzBdKyIuIik7fX1yZXR1cm4gYX0sRWI9ZnVuY3Rpb24oYSxiLGMpe3RyeXtyZXR1cm4gdmIoQ2IoYSxiLGMpKX1jYXRjaChkKXtKU09OLnN0cmluZ2lmeShhKX1yZXR1cm4gMn07dmFyIEZiPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oYil7cmV0dXJue3RvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIGJ9fX07cmV0dXJue3VkOmEoImNvbnZlcnRfY2FzZV90byIpLHZkOmEoImNvbnZlcnRfZmFsc2VfdG8iKSx3ZDphKCJjb252ZXJ0X251bGxfdG8iKSx4ZDphKCJjb252ZXJ0X3RydWVfdG8iKSx5ZDphKCJjb252ZXJ0X3VuZGVmaW5lZF90byIpLEJoOmEoImRlYnVnX21vZGVfbWV0YWRhdGEiKSxzYTphKCJmdW5jdGlvbiIpLFhlOmEoImluc3RhbmNlX25hbWUiKSxhZjphKCJsaXZlX29ubHkiKSxjZjphKCJtYWx3YXJlX2Rpc2FibGVkIiksZGY6YSgibWV0YWRhdGEiKSxDaDphKCJvcmlnaW5hbF92ZW5kb3JfdGVtcGxhdGVfaWQiKSxqZjphKCJvbmNlX3Blcl9ldmVudCIpLEhkOmEoIm9uY2VfcGVyX2xvYWQiKSxQZDphKCJzZXR1cF90YWdzIiksUmQ6YSgidGFnX2lkIiksU2Q6YSgidGVhcmRvd25fdGFncyIpfX0oKTt2YXIgR2I9bnVsbCxLYj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKHIpe2Zvcih2YXIgdT0wO3U8ci5sZW5ndGg7dSsrKWRbclt1XV09ITB9dmFyIGM9W10sZD1bXTtHYj1IYihhKTtmb3IodmFyIGU9MDtlPHFiLmxlbmd0aDtlKyspe3ZhciBmPXFiW2VdLGg9SmIoZik7aWYoaCl7Zm9yKHZhciBrPWYuYWRkfHxbXSxsPTA7bDxrLmxlbmd0aDtsKyspY1trW2xdXT0hMDtiKGYuYmxvY2t8fFtdKX1lbHNlIG51bGw9PT1oJiZiKGYuYmxvY2t8fFtdKX1mb3IodmFyIG09W10sbj0wO248c2IubGVuZ3RoO24rKyljW25dJiYhZFtuXSYmKG1bbl09ITApO3JldHVybiBtfSxKYj1mdW5jdGlvbihhKXtmb3IodmFyIGI9YVsiaWYiXXx8W10sYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1HYihiW2NdKTtpZigwPT09ZClyZXR1cm4hMTtpZigyPT09ZClyZXR1cm4gbnVsbH1mb3IodmFyIGU9YS51bmxlc3N8fFtdLGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGg9R2IoZVtmXSk7aWYoMj09PWgpcmV0dXJuIG51bGw7CmlmKDE9PT1oKXJldHVybiExfXJldHVybiEwfSxIYj1mdW5jdGlvbihhKXt2YXIgYj1bXTtyZXR1cm4gZnVuY3Rpb24oYyl7dm9pZCAwPT09YltjXSYmKGJbY109RWIocmJbY10sYSkpO3JldHVybiBiW2NdfX07LyoKIENvcHlyaWdodCAoYykgMjAxNCBEZXJlayBCcmFucywgTUlUIGxpY2Vuc2UgaHR0cHM6Ly9naXRodWIuY29tL2tydXgvcG9zdHNjcmliZS9ibG9iL21hc3Rlci9MSUNFTlNFLiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gc2ltcGxlaHRtbHBhcnNlciwgd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAqLwp2YXIgRj13aW5kb3csRz1kb2N1bWVudCxlYz1uYXZpZ2F0b3IsZmM9Ry5jdXJyZW50U2NyaXB0JiZHLmN1cnJlbnRTY3JpcHQuc3JjLGdjPWZ1bmN0aW9uKGEsYil7dmFyIGM9RlthXTtGW2FdPXZvaWQgMD09PWM/YjpjO3JldHVybiBGW2FdfSxoYz1mdW5jdGlvbihhLGIpe2ImJihhLmFkZEV2ZW50TGlzdGVuZXI/YS5vbmxvYWQ9YjphLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2EucmVhZHlTdGF0ZSBpbntsb2FkZWQ6MSxjb21wbGV0ZToxfSYmKGEub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsYigpKX0pfSxpYz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9Ry5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkLnR5cGU9InRleHQvamF2YXNjcmlwdCI7ZC5hc3luYz0hMDtkLnNyYz1hO2hjKGQsYik7YyYmKGQub25lcnJvcj1jKTt2YXIgZTtpZihudWxsPT09bmEpYjp7dmFyIGY9a2EuZG9jdW1lbnQsaD1mLnF1ZXJ5U2VsZWN0b3ImJmYucXVlcnlTZWxlY3Rvcigic2NyaXB0W25vbmNlXSIpOwppZihoKXt2YXIgaz1oLm5vbmNlfHxoLmdldEF0dHJpYnV0ZSgibm9uY2UiKTtpZihrJiZsYS50ZXN0KGspKXtuYT1rO2JyZWFrIGJ9fW5hPSIifWU9bmE7ZSYmZC5zZXRBdHRyaWJ1dGUoIm5vbmNlIixlKTt2YXIgbD1HLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXXx8Ry5ib2R5fHxHLmhlYWQ7bC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGwpO3JldHVybiBkfSxqYz1mdW5jdGlvbigpe2lmKGZjKXt2YXIgYT1mYy50b0xvd2VyQ2FzZSgpO2lmKDA9PT1hLmluZGV4T2YoImh0dHBzOi8vIikpcmV0dXJuIDI7aWYoMD09PWEuaW5kZXhPZigiaHR0cDovLyIpKXJldHVybiAzfXJldHVybiAxfSxrYz1mdW5jdGlvbihhLGIpe3ZhciBjPUcuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5oZWlnaHQ9IjAiO2Mud2lkdGg9IjAiO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Yy5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO3ZhciBkPUcuYm9keSYmRy5ib2R5Lmxhc3RDaGlsZHx8CkcuYm9keXx8Ry5oZWFkO2QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYyxkKTtoYyhjLGIpO3ZvaWQgMCE9PWEmJihjLnNyYz1hKTtyZXR1cm4gY30sbGM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW5ldyBJbWFnZSgxLDEpO2Qub25sb2FkPWZ1bmN0aW9uKCl7ZC5vbmxvYWQ9bnVsbDtiJiZiKCl9O2Qub25lcnJvcj1mdW5jdGlvbigpe2Qub25lcnJvcj1udWxsO2MmJmMoKX07ZC5zcmM9YTtyZXR1cm4gZH0sbWM9ZnVuY3Rpb24oYSxiLGMsZCl7YS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsISFkKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrYixjKX0sbmM9ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcj9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKTphLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKX0sST1mdW5jdGlvbihhKXtGLnNldFRpbWVvdXQoYSwwKX0sb2M9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmCmImJmEuYXR0cmlidXRlcyYmYS5hdHRyaWJ1dGVzW2JdP2EuYXR0cmlidXRlc1tiXS52YWx1ZTpudWxsfSxwYz1mdW5jdGlvbihhKXt2YXIgYj1hLmlubmVyVGV4dHx8YS50ZXh0Q29udGVudHx8IiI7YiYmIiAiIT1iJiYoYj1iLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKSk7YiYmKGI9Yi5yZXBsYWNlKC8oXHhhMCt8XHN7Mix9fFxufFxyXHQpL2csIiAiKSk7cmV0dXJuIGJ9LHFjPWZ1bmN0aW9uKGEpe3ZhciBiPUcuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5pbm5lckhUTUw9IkE8ZGl2PiIrYSsiPC9kaXY+IjtiPWIubGFzdENoaWxkO2Zvcih2YXIgYz1bXTtiLmZpcnN0Q2hpbGQ7KWMucHVzaChiLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCkpO3JldHVybiBjfSxyYz1mdW5jdGlvbihhLGIsYyl7Yz1jfHwxMDA7Zm9yKHZhciBkPXt9LGU9MDtlPGIubGVuZ3RoO2UrKylkW2JbZV1dPSEwO2Zvcih2YXIgZj1hLGg9MDtmJiZoPD1jO2grKyl7aWYoZFtTdHJpbmcoZi50YWdOYW1lKS50b0xvd2VyQ2FzZSgpXSlyZXR1cm4gZjsKZj1mLnBhcmVudEVsZW1lbnR9cmV0dXJuIG51bGx9LHNjPWZ1bmN0aW9uKGEpe2VjLnNlbmRCZWFjb24mJmVjLnNlbmRCZWFjb24oYSl8fGxjKGEpfSx0Yz1mdW5jdGlvbihhLGIpe3ZhciBjPWFbYl07YyYmInN0cmluZyI9PT10eXBlb2YgYy5hbmltVmFsJiYoYz1jLmFuaW1WYWwpO3JldHVybiBjfTt2YXIgd2M9ZnVuY3Rpb24oYSl7cmV0dXJuIHZjP0cucXVlcnlTZWxlY3RvckFsbChhKTpudWxsfSx4Yz1mdW5jdGlvbihhLGIpe2lmKCF2YylyZXR1cm4gbnVsbDtpZihFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0KXRyeXtyZXR1cm4gYS5jbG9zZXN0KGIpfWNhdGNoKGUpe3JldHVybiBudWxsfXZhciBjPUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXN8fEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUubW96TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3RvcixkPWE7aWYoIUcuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKGQpKXJldHVybiBudWxsO2Rve3RyeXtpZihjLmNhbGwoZCxiKSlyZXR1cm4gZH1jYXRjaChlKXticmVha31kPWQucGFyZW50RWxlbWVudHx8ZC5wYXJlbnROb2RlfXdoaWxlKG51bGwhPT1kJiYxPT09ZC5ub2RlVHlwZSk7CnJldHVybiBudWxsfSx5Yz0hMTtpZihHLnF1ZXJ5U2VsZWN0b3JBbGwpdHJ5e3ZhciB6Yz1HLnF1ZXJ5U2VsZWN0b3JBbGwoIjpyb290Iik7emMmJjE9PXpjLmxlbmd0aCYmemNbMF09PUcuZG9jdW1lbnRFbGVtZW50JiYoeWM9ITApfWNhdGNoKGEpe312YXIgdmM9eWM7dmFyIEo9e3JhOiJfZWUiLEZoOiJfdWNpIix1YzoiZXZlbnRfY2FsbGJhY2siLHhiOiJldmVudF90aW1lb3V0IixDOiJndGFnLmNvbmZpZyIsWDoiYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHMiLHZjOiJyZXN0cmljdGVkX2RhdGFfcHJvY2Vzc2luZyIsU2E6ImFsbG93X2dvb2dsZV9zaWduYWxzIixZOiJjb29raWVfZXhwaXJlcyIsd2I6ImNvb2tpZV91cGRhdGUiLFRhOiJzZXNzaW9uX2R1cmF0aW9uIixjYToidXNlcl9wcm9wZXJ0aWVzIn07CkoubGQ9InBhZ2VfdmlldyI7Si5zaD0idXNlcl9lbmdhZ2VtZW50IjtKLm1hPSJwdXJjaGFzZSI7Si5IYj0icmVmdW5kIjtKLlVhPSJiZWdpbl9jaGVja291dCI7Si5FYj0iYWRkX3RvX2NhcnQiO0ouRmI9InJlbW92ZV9mcm9tX2NhcnQiO0ouJGc9InZpZXdfY2FydCI7Si5EZD0iYWRkX3RvX3dpc2hsaXN0IjtKLkJhPSJ2aWV3X2l0ZW0iO0oucWg9InZpZXdfcHJvbW90aW9uIjtKLm5oPSJzZWxlY3RfcHJvbW90aW9uIjtKLmhoPSJzZWxlY3RfaXRlbSI7Si5lZD0idmlld19pdGVtX2xpc3QiO0ouQ2Q9ImFkZF9wYXltZW50X2luZm8iO0ouWmc9ImFkZF9zaGlwcGluZ19pbmZvIjtKLnVoPSJhbGxvd19jdXN0b21fc2NyaXB0cyI7Si55aD0iYWxsb3dfZGlzcGxheV9mZWF0dXJlcyI7Si56aD0iYWxsb3dfZW5oYW5jZWRfY29udmVyc2lvbnMiO0ouWWQ9ImVuaGFuY2VkX2NvbnZlcnNpb25zIjtKLkliPSJjbGllbnRfaWQiO0ouTz0iY29va2llX2RvbWFpbiI7Si5LYj0iY29va2llX25hbWUiOwpKLkZhPSJjb29raWVfcGF0aCI7Si5WYT0iY29va2llX2ZsYWdzIjtKLmlhPSJjdXJyZW5jeSI7Si5PYj0iY3VzdG9tX3BhcmFtcyI7Si5QZT0iY3VzdG9tX21hcCI7Si5uYz0iZ3JvdXBzIjtKLkdhPSJsYW5ndWFnZSI7Si5OZT0iY291bnRyeSI7Si5HaD0ibm9uX2ludGVyYWN0aW9uIjtKLiRhPSJwYWdlX2xvY2F0aW9uIjtKLmFiPSJwYWdlX3JlZmVycmVyIjtKLm9jPSJwYWdlX3RpdGxlIjtKLmNiPSJzZW5kX3BhZ2VfdmlldyI7Si5vYT0ic2VuZF90byI7Si5xYz0ic2Vzc2lvbl9lbmdhZ2VkIjtKLlRiPSJzZXNzaW9uX2lkIjtKLnNjPSJzZXNzaW9uX251bWJlciI7Si5zZj0idHJhY2tpbmdfaWQiO0oubmE9ImxpbmtlciI7Si5qZT0idXJsX3Bhc3N0aHJvdWdoIjtKLldhPSJhY2NlcHRfaW5jb21pbmciO0ouRj0iZG9tYWlucyI7Si5aYT0idXJsX3Bvc2l0aW9uIjtKLllhPSJkZWNvcmF0ZV9mb3JtcyI7Si5iZT0icGhvbmVfY29udmVyc2lvbl9udW1iZXIiO0ouYWU9InBob25lX2NvbnZlcnNpb25fY2FsbGJhY2siOwpKLnNkPSJwaG9uZV9jb252ZXJzaW9uX2Nzc19jbGFzcyI7Si5lZT0icGhvbmVfY29udmVyc2lvbl9vcHRpb25zIjtKLmxmPSJwaG9uZV9jb252ZXJzaW9uX2lkcyI7Si5mZj0icGhvbmVfY29udmVyc2lvbl9jb3VudHJ5X2NvZGUiO0ouRWQ9ImF3X3JlbWFya2V0aW5nIjtKLkZkPSJhd19yZW1hcmtldGluZ19vbmx5IjtKLmFhPSJ2YWx1ZSI7Si5uZj0icXVhbnRpdHkiO0ouVGU9ImFmZmlsaWF0aW9uIjtKLlhkPSJ0YXgiO0ouV2U9InNoaXBwaW5nIjtKLm1kPSJsaXN0X25hbWUiO0ouVmQ9ImNoZWNrb3V0X3N0ZXAiO0ouVWQ9ImNoZWNrb3V0X29wdGlvbiI7Si5VZT0iY291cG9uIjtKLlZlPSJwcm9tb3Rpb25zIjtKLmViPSJ0cmFuc2FjdGlvbl9pZCI7Si5mYj0idXNlcl9pZCI7Si5FYT0iY29udmVyc2lvbl9saW5rZXIiO0ouRGE9ImNvbnZlcnNpb25fY29va2llX3ByZWZpeCI7Si5TPSJjb29raWVfcHJlZml4IjtKLk09Iml0ZW1zIjtKLkxkPSJhd19tZXJjaGFudF9pZCI7Si5JZD0KImF3X2ZlZWRfY291bnRyeSI7Si5LZD0iYXdfZmVlZF9sYW5ndWFnZSI7Si5HZD0iZGlzY291bnQiO0ouUWQ9ImRpc2FibGVfbWVyY2hhbnRfcmVwb3J0ZWRfcHVyY2hhc2VzIjtKLlpkPSJuZXdfY3VzdG9tZXIiO0ouT2Q9ImN1c3RvbWVyX2xpZmV0aW1lX3ZhbHVlIjtKLlNlPSJkY19uYXR1cmFsX3NlYXJjaCI7Si5RZT0iZGNfY3VzdG9tX3BhcmFtcyI7Si50Zj0idHJpcF90eXBlIjtKLiRkPSJwYXNzZW5nZXJzIjtKLmJmPSJtZXRob2QiO0oucWY9InNlYXJjaF90ZXJtIjtKLkFoPSJjb250ZW50X3R5cGUiO0ouZWY9Im9wdGltaXplX2lkIjtKLlllPSJleHBlcmltZW50cyI7Si5TYj0iZ29vZ2xlX3NpZ25hbHMiO0oucWQ9Imdvb2dsZV90bGQiO0ouVWI9InVwZGF0ZSI7Si5wZD0iZmlyZWJhc2VfaWQiO0ouUWI9ImdhX3Jlc3RyaWN0X2RvbWFpbiI7Si5vZD0iZXZlbnRfc2V0dGluZ3MiO0oucGY9InNjcmVlbl9uYW1lIjtKLiRlPSJfeF8xOSI7Si5aZT0iX3hfMjAiO0oucWE9InRyYW5zcG9ydF91cmwiOwpKLnNlPVtKLlgsSi5TYSxKLnZjLEouTyxKLlksSi5WYSxKLktiLEouRmEsSi5TLEoud2IsSi5PYixKLnVjLEoub2QsSi54YixKLlFiLEouU2IsSi5xZCxKLm5jLEoubmEsSi5vYSxKLmNiLEouVGEsSi5VYixKLmNhLEoucWFdO0ouc2UucHVzaChKLk0pO0oua2U9W0ouJGEsSi5hYixKLm9jLEouR2EsSi5wZixKLmZiLEoucGRdO0oudmY9W0oubWEsSi5IYixKLlVhLEouRWIsSi5GYixKLiRnLEouRGQsSi5CYSxKLnFoLEoubmgsSi5lZCxKLmhoLEouQ2QsSi5aZ107Si5CZD1bSi5vYSxKLkVkLEouRmQsSi5PYixKLmNiLEouR2EsSi5hYSxKLmlhLEouZWIsSi5mYixKLkVhLEouRGEsSi5TLEouTyxKLlksSi5WYSxKLiRhLEouYWIsSi5iZSxKLmFlLEouc2QsSi5lZSxKLk0sSi5MZCxKLklkLEouS2QsSi5HZCxKLlFkLEouWmQsCkouT2QsSi5YLEoudmMsSi5VYixKLnBkLEouWWQsSi5xYSxKLmplXTtKLnFlPVtKLlgsSi5TYSxKLndiXTtKLnRlPVtKLlksSi54YixKLlRhXTt2YXIgUWM9L1tBLVpdKy8sUmM9L1xzLyxTYz1mdW5jdGlvbihhKXtpZihnKGEpJiYoYT1DYShhKSwhUmMudGVzdChhKSkpe3ZhciBiPWEuaW5kZXhPZigiLSIpO2lmKCEoMD5iKSl7dmFyIGM9YS5zdWJzdHJpbmcoMCxiKTtpZihRYy50ZXN0KGMpKXtmb3IodmFyIGQ9YS5zdWJzdHJpbmcoYisxKS5zcGxpdCgiLyIpLGU9MDtlPGQubGVuZ3RoO2UrKylpZighZFtlXSlyZXR1cm47cmV0dXJue2lkOmEscHJlZml4OmMsY29udGFpbmVySWQ6YysiLSIrZFswXSxvOmR9fX19fSxVYz1mdW5jdGlvbihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7KytjKXt2YXIgZD1TYyhhW2NdKTtkJiYoYltkLmlkXT1kKX1UYyhiKTt2YXIgZT1bXTtDKGIsZnVuY3Rpb24oZixoKXtlLnB1c2goaCl9KTtyZXR1cm4gZX07CmZ1bmN0aW9uIFRjKGEpe3ZhciBiPVtdLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1hW2NdOyJBVyI9PT1kLnByZWZpeCYmZC5vWzFdJiZiLnB1c2goZC5jb250YWluZXJJZCl9Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDsrK2UpZGVsZXRlIGFbYltlXV19O3ZhciBWYz17fSxXYz1udWxsLFhjPU1hdGgucmFuZG9tKCk7VmMucz0iVUEtNDU1MTU2Ny0zIjtWYy5DYj0iM3AxIjt2YXIgWWM9e19fY2w6ITAsX19lY2w6ITAsX19laGw6ITAsX19ldmw6ITAsX19mYWw6ITAsX19maWw6ITAsX19mc2w6ITAsX19obDohMCxfX2plbDohMCxfX2xjbDohMCxfX3NkbDohMCxfX3RsOiEwLF9feXRsOiEwLF9fcGF1c2VkOiEwLF9fdGc6ITB9LFpjPSJ3d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RtLmpzIjtaYz0id3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanMiO3ZhciAkYz1aYyxhZD1udWxsLGJkPW51bGwsY2Q9bnVsbCxlZD0iLy93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vYT9pZD0iK1ZjLnMrIiZjdj0xIixmZD17fSxnZD17fSxoZD1mdW5jdGlvbigpe3ZhciBhPVdjLnNlcXVlbmNlfHwwO1djLnNlcXVlbmNlPWErMTtyZXR1cm4gYX07dmFyIGlkPXt9LGpkPWZ1bmN0aW9uKGEsYil7aWRbYV09aWRbYV18fFtdO2lkW2FdW2JdPSEwfSxrZD1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz1pZFthXXx8W10sZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF0mJihiW01hdGguZmxvb3IoZC82KV1ePTE8PGQlNik7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspYltlXT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXyIuY2hhckF0KGJbZV18fDApO3JldHVybiBiLmpvaW4oIiIpfTsKdmFyIGxkPWZ1bmN0aW9uKCl7cmV0dXJuIiZ0Yz0iK3NiLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYX0pLmxlbmd0aH0sb2Q9ZnVuY3Rpb24oKXttZHx8KG1kPUYuc2V0VGltZW91dChuZCw1MDApKX0sbmQ9ZnVuY3Rpb24oKXttZCYmKEYuY2xlYXJUaW1lb3V0KG1kKSxtZD12b2lkIDApO3ZvaWQgMD09PXBkfHxxZFtwZF0mJiFyZCYmIXNkfHwodGRbcGRdfHx1ZC5CZygpfHwwPj12ZC0tPyhqZCgiR1RNIiwxKSx0ZFtwZF09ITApOih1ZC5iaCgpLGxjKHdkKCkpLHFkW3BkXT0hMCx4ZD15ZD1zZD1yZD0iIikpfSx3ZD1mdW5jdGlvbigpe3ZhciBhPXBkO2lmKHZvaWQgMD09PWEpcmV0dXJuIiI7dmFyIGI9a2QoIkdUTSIpLGM9a2QoIlRBR0dJTkciKTtyZXR1cm5bemQscWRbYV0/IiI6IiZlcz0xIixBZFthXSxiPyImdT0iK2I6IiIsYz8iJnV0PSIrYzoiIixsZCgpLHJkLHNkLHlkLHhkLCImej0wIl0uam9pbigiIil9LEJkPWZ1bmN0aW9uKCl7cmV0dXJuW2VkLCImdj0zJnQ9dCIsCiImcGlkPSIrd2EoKSwiJnJ2PSIrVmMuQ2JdLmpvaW4oIiIpfSxDZD0iMC4wMDUwMDAiPk1hdGgucmFuZG9tKCksemQ9QmQoKSxEZD1mdW5jdGlvbigpe3pkPUJkKCl9LHFkPXt9LHJkPSIiLHNkPSIiLHhkPSIiLHlkPSIiLHBkPXZvaWQgMCxBZD17fSx0ZD17fSxtZD12b2lkIDAsdWQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9MDtyZXR1cm57Qmc6ZnVuY3Rpb24oKXtpZihjPGEpcmV0dXJuITE7RWEoKS1kPj1iJiYoYz0wKTtyZXR1cm4gYz49YX0sYmg6ZnVuY3Rpb24oKXtFYSgpLWQ+PWImJihjPTApO2MrKztkPUVhKCl9fX0oMiwxRTMpLHZkPTFFMyxFZD1mdW5jdGlvbihhLGIpe2lmKENkJiYhdGRbYV0mJnBkIT09YSl7bmQoKTtwZD1hO3hkPXJkPSIiO3ZhciBjO2M9MD09PWIuaW5kZXhPZigiZ3RtLiIpP2VuY29kZVVSSUNvbXBvbmVudChiKToiKiI7QWRbYV09IiZlPSIrYysiJmVpZD0iK2E7b2QoKX19LEZkPWZ1bmN0aW9uKGEsYixjKXtpZihDZCYmCiF0ZFthXSYmYil7YSE9PXBkJiYobmQoKSxwZD1hKTt2YXIgZCxlPVN0cmluZyhiW0ZiLnNhXXx8IiIpLnJlcGxhY2UoL18vZywiIik7MD09PWUuaW5kZXhPZigiY3Z0IikmJihlPSJjdnQiKTtkPWU7dmFyIGY9YytkO3JkPXJkP3JkKyIuIitmOiImdHI9IitmO3ZhciBoPWJbImZ1bmN0aW9uIl07aWYoIWgpdGhyb3cgRXJyb3IoIkVycm9yOiBObyBmdW5jdGlvbiBuYW1lIGdpdmVuIGZvciBmdW5jdGlvbiBjYWxsLiIpO3ZhciBrPSh1YltoXT8iMSI6IjIiKStkO3hkPXhkP3hkKyIuIitrOiImdGk9IitrO29kKCk7MjAyMjw9d2QoKS5sZW5ndGgmJm5kKCl9fSxHZD1mdW5jdGlvbihhLGIsYyl7aWYoQ2QmJiF0ZFthXSl7YSE9PXBkJiYobmQoKSxwZD1hKTt2YXIgZD1jK2I7c2Q9CnNkP3NkKyIuIitkOiImZXByPSIrZDtvZCgpOzIwMjI8PXdkKCkubGVuZ3RoJiZuZCgpfX07dmFyIEhkPXt9LElkPW5ldyB4YSxKZD17fSxLZD17fSxOZD17bmFtZToiZGF0YUxheWVyIixzZXQ6ZnVuY3Rpb24oYSxiKXtEKEthKGEsYiksSmQpO0xkKCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gTWQoYSwyKX0scmVzZXQ6ZnVuY3Rpb24oKXtJZD1uZXcgeGE7SmQ9e307TGQoKX19LE1kPWZ1bmN0aW9uKGEsYil7aWYoMiE9Yil7dmFyIGM9SWQuZ2V0KGEpO2lmKENkKXt2YXIgZD1PZChhKTtjIT09ZCYmamQoIkdUTSIsNSl9cmV0dXJuIGN9cmV0dXJuIE9kKGEpfSxPZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5zcGxpdCgiLiIpLGU9ITEsZj12b2lkIDA7dmFyIGg9ZnVuY3Rpb24oayxsKXtmb3IodmFyIG09MDt2b2lkIDAhPT1rJiZtPGQubGVuZ3RoO20rKyl7aWYobnVsbD09PWspcmV0dXJuITE7az1rW2RbbV1dfXJldHVybiB2b2lkIDAhPT1rfHwxPG0/azpsLmxlbmd0aD9oKFBkKGwucG9wKCkpLGwpOlFkKGQpfTsKZT0hMDtmPWgoSmQuZXZlbnRNb2RlbCxbYixjXSk7cmV0dXJuIGU/ZjpRZChkKX0sUWQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPUpkLGM9MDtjPGEubGVuZ3RoO2MrKyl7aWYobnVsbD09PWIpcmV0dXJuITE7aWYodm9pZCAwPT09YilicmVhaztiPWJbYVtjXV19cmV0dXJuIGJ9O3ZhciBQZD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1RZChbImd0YWciLCJ0YXJnZXRzIixhXSk7cmV0dXJuIFBhKGIpP2I6dm9pZCAwfX0sUmQ9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGYpe2YmJkMoZixmdW5jdGlvbihoKXtkW2hdPW51bGx9KX12YXIgZD17fTtjKEpkKTtkZWxldGUgZC5ldmVudE1vZGVsO2MoUGQoYSkpO2MoUGQoYikpO2MoSmQuZXZlbnRNb2RlbCk7dmFyIGU9W107QyhkLGZ1bmN0aW9uKGYpe2UucHVzaChmKX0pO3JldHVybiBlfTsKdmFyIFNkPWZ1bmN0aW9uKGEsYil7S2QuaGFzT3duUHJvcGVydHkoYSl8fChJZC5zZXQoYSxiKSxEKEthKGEsYiksSmQpLExkKCkpfSxMZD1mdW5jdGlvbihhKXtDKEtkLGZ1bmN0aW9uKGIsYyl7SWQuc2V0KGIsYyk7RChLYShiLHZvaWQgMCksSmQpO0QoS2EoYixjKSxKZCk7YSYmZGVsZXRlIEtkW2JdfSl9LFRkPWZ1bmN0aW9uKGEsYixjKXtIZFthXT1IZFthXXx8e307dmFyIGQ9MSE9PWM/T2QoYik6SWQuZ2V0KGIpOyJhcnJheSI9PT1OYShkKXx8Im9iamVjdCI9PT1OYShkKT9IZFthXVtiXT1EKGQpOkhkW2FdW2JdPWR9LFVkPWZ1bmN0aW9uKGEsYil7aWYoSGRbYV0pcmV0dXJuIEhkW2FdW2JdfSxWZD1mdW5jdGlvbihhLGIpe0hkW2FdJiZkZWxldGUgSGRbYV1bYl19O3ZhciBXZD1mdW5jdGlvbigpe3ZhciBhPSExO3JldHVybiBhfTt2YXIgUT1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oMj09PVhkKCl8fGR8fCJodHRwOiIhPUYubG9jYXRpb24ucHJvdG9jb2w/YTpiKStjfSxYZD1mdW5jdGlvbigpe3ZhciBhPWpjKCksYjtpZigxPT09YSlhOnt2YXIgYz0kYztjPWMudG9Mb3dlckNhc2UoKTtmb3IodmFyIGQ9Imh0dHBzOi8vIitjLGU9Imh0dHA6Ly8iK2MsZj0xLGg9Ry5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iiksaz0wO2s8aC5sZW5ndGgmJjEwMD5rO2srKyl7dmFyIGw9aFtrXS5zcmM7aWYobCl7bD1sLnRvTG93ZXJDYXNlKCk7aWYoMD09PWwuaW5kZXhPZihlKSl7Yj0zO2JyZWFrIGF9MT09PWYmJjA9PT1sLmluZGV4T2YoZCkmJihmPTIpfX1iPWZ9ZWxzZSBiPWE7cmV0dXJuIGJ9Owp2YXIgWmQ9ZnVuY3Rpb24oYSxiLGMpe2lmKEZbYS5mdW5jdGlvbk5hbWVdKXJldHVybiBiLlZjJiZJKGIuVmMpLEZbYS5mdW5jdGlvbk5hbWVdO3ZhciBkPVlkKCk7RlthLmZ1bmN0aW9uTmFtZV09ZDtpZihhLkdiKWZvcih2YXIgZT0wO2U8YS5HYi5sZW5ndGg7ZSsrKUZbYS5HYltlXV09RlthLkdiW2VdXXx8WWQoKTthLlJiJiZ2b2lkIDA9PT1GW2EuUmJdJiYoRlthLlJiXT1jKTtpYyhRKCJodHRwczovLyIsImh0dHA6Ly8iLGEuZmQpLGIuVmMsYi5OZyk7cmV0dXJuIGR9LFlkPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXthLnE9YS5xfHxbXTthLnEucHVzaChhcmd1bWVudHMpfTtyZXR1cm4gYX0sJGQ9e2Z1bmN0aW9uTmFtZToiX2dvb2dXY21JbXBsIixSYjoiX2dvb2dXY21BayIsZmQ6Ind3dy5nc3RhdGljLmNvbS93Y20vbG9hZGVyLmpzIn0sYWU9e2Z1bmN0aW9uTmFtZToiX2dhUGhvbmVJbXBsIixSYjoiZ2Ffd3BpZCIsZmQ6Ind3dy5nc3RhdGljLmNvbS9nYXBob25lL2xvYWRlci5qcyJ9LApiZT17T2U6IiIscmY6IjEifSxjZT17ZnVuY3Rpb25OYW1lOiJfZ29vZ0NhbGxUcmFja2luZ0ltcGwiLEdiOlthZS5mdW5jdGlvbk5hbWUsJGQuZnVuY3Rpb25OYW1lXSxmZDoid3d3LmdzdGF0aWMuY29tL2NhbGwtdHJhY2tpbmcvY2FsbC10cmFja2luZ18iKyhiZS5PZXx8YmUucmYpKyIuanMifSxkZT17fSxlZT1mdW5jdGlvbihhLGIsYyxkKXtqZCgiR1RNIiwyMik7aWYoYyl7ZD1kfHx7fTt2YXIgZT1aZCgkZCxkLGEpLGY9e2FrOmEsY2w6Yn07dm9pZCAwPT09ZC5kYSYmKGYuYXV0b3JlcGxhY2U9Yyk7ZSgyLGQuZGEsZixjLDAsbmV3IERhdGUsZC5vcHRpb25zKX19LGZlPWZ1bmN0aW9uKGEsYixjKXtqZCgiR1RNIiwyMyk7aWYoYil7Yz1jfHx7fTt2YXIgZD1aZChhZSxjLGEpLGU9e307dm9pZCAwIT09Yy5kYT9lLnJlY2VpdmVyPWMuZGE6ZS5yZXBsYWNlPWI7ZS5nYV93cGlkPWE7ZS5kZXN0aW5hdGlvbj1iO2QoMiwKbmV3IERhdGUsZSl9fSxnZT1mdW5jdGlvbihhLGIsYyxkKXtqZCgiR1RNIiwyMSk7aWYoYiYmYyl7ZD1kfHx7fTtmb3IodmFyIGU9e2NvdW50cnlOYW1lQ29kZTpjLGRlc3RpbmF0aW9uTnVtYmVyOmIscmV0cmlldmFsVGltZTpuZXcgRGF0ZX0sZj0wO2Y8YS5sZW5ndGg7ZisrKXt2YXIgaD1hW2ZdO2RlW2guaWRdfHwoaCYmIkFXIj09PWgucHJlZml4JiYhZS5hZERhdGEmJjI8PWguby5sZW5ndGg/KGUuYWREYXRhPXthazpoLm9bMF0sY2w6aC5vWzFdfSxkZVtoLmlkXT0hMCk6aCYmIlVBIj09PWgucHJlZml4JiYhZS5nYURhdGEmJihlLmdhRGF0YT17Z2FXcGlkOmguY29udGFpbmVySWR9LGRlW2guaWRdPSEwKSl9KGUuZ2FEYXRhfHxlLmFkRGF0YSkmJlpkKGNlLGQpKGQuZGEsZSxkLm9wdGlvbnMpfX0saGU9ZnVuY3Rpb24oKXt2YXIgYT0hMTsKcmV0dXJuIGF9LGllPWZ1bmN0aW9uKGEsYil7aWYoYSlpZihXZCgpKXt9ZWxzZXtpZihnKGEpKXt2YXIgYz1TYyhhKTtpZighYylyZXR1cm47YT1jfXZhciBkPWZ1bmN0aW9uKHgpe3JldHVybiBiP2IuZ2V0V2l0aENvbmZpZyh4KTpPZCh4LGEuY29udGFpbmVySWQsYS5pZCl9LGU9dm9pZCAwLGY9ITEsaD1kKEoubGYpO2lmKGgmJnJhKGgpKXtlPVtdO2Zvcih2YXIgaz0wO2s8aC5sZW5ndGg7aysrKXt2YXIgbD1TYyhoW2tdKTtsJiYoZS5wdXNoKGwpLChhLmlkPT09bC5pZHx8YS5pZD09PWEuY29udGFpbmVySWQmJmEuY29udGFpbmVySWQ9PT1sLmNvbnRhaW5lcklkKSYmKGY9ITApKX19aWYoIWV8fGYpe3ZhciBtPWQoSi5iZSksbjtpZihtKXtyYShtKT9uPW06bj1bbV07dmFyIHI9ZChKLmFlKSx1PWQoSi5zZCkscD1kKEouZWUpLHQ9ZChKLmZmKSwKdj1yfHx1LHc9MTsiVUEiIT09YS5wcmVmaXh8fGV8fCh3PTUpO2Zvcih2YXIgeT0wO3k8bi5sZW5ndGg7eSsrKXk8dyYmKGU/Z2UoZSxuW3ldLHQse2RhOnYsb3B0aW9uczpwfSk6IkFXIj09PWEucHJlZml4JiZhLm9bMV0/aGUoKT9nZShbYV0sblt5XSx0fHwiVVMiLHtkYTp2LG9wdGlvbnM6cH0pOmVlKGEub1swXSxhLm9bMV0sblt5XSx7ZGE6dixvcHRpb25zOnB9KToiVUEiPT09YS5wcmVmaXgmJihoZSgpP2dlKFthXSxuW3ldLHR8fCJVUyIse2RhOnZ9KTpmZShhLmNvbnRhaW5lcklkLG5beV0se2RhOnZ9KSkpfX19fTt2YXIgbGU9bmV3IFJlZ0V4cCgvXiguKlwuKT8oZ29vZ2xlfHlvdXR1YmV8YmxvZ2dlcnx3aXRoZ29vZ2xlKShcLmNvbT8pPyhcLlthLXpdezJ9KT9cLj8kLyksbWU9e2NsOlsiZWNsIl0sY3VzdG9tUGl4ZWxzOlsibm9uR29vZ2xlUGl4ZWxzIl0sZWNsOlsiY2wiXSxlaGw6WyJobCJdLGhsOlsiZWhsIl0saHRtbDpbImN1c3RvbVNjcmlwdHMiLCJjdXN0b21QaXhlbHMiLCJub25Hb29nbGVQaXhlbHMiLCJub25Hb29nbGVTY3JpcHRzIiwibm9uR29vZ2xlSWZyYW1lcyJdLGN1c3RvbVNjcmlwdHM6WyJodG1sIiwiY3VzdG9tUGl4ZWxzIiwibm9uR29vZ2xlUGl4ZWxzIiwibm9uR29vZ2xlU2NyaXB0cyIsIm5vbkdvb2dsZUlmcmFtZXMiXSxub25Hb29nbGVQaXhlbHM6W10sbm9uR29vZ2xlU2NyaXB0czpbIm5vbkdvb2dsZVBpeGVscyJdLG5vbkdvb2dsZUlmcmFtZXM6WyJub25Hb29nbGVQaXhlbHMiXX0sbmU9e2NsOlsiZWNsIl0sY3VzdG9tUGl4ZWxzOlsiY3VzdG9tU2NyaXB0cyIsImh0bWwiXSwKZWNsOlsiY2wiXSxlaGw6WyJobCJdLGhsOlsiZWhsIl0saHRtbDpbImN1c3RvbVNjcmlwdHMiXSxjdXN0b21TY3JpcHRzOlsiaHRtbCJdLG5vbkdvb2dsZVBpeGVsczpbImN1c3RvbVBpeGVscyIsImN1c3RvbVNjcmlwdHMiLCJodG1sIiwibm9uR29vZ2xlU2NyaXB0cyIsIm5vbkdvb2dsZUlmcmFtZXMiXSxub25Hb29nbGVTY3JpcHRzOlsiY3VzdG9tU2NyaXB0cyIsImh0bWwiXSxub25Hb29nbGVJZnJhbWVzOlsiY3VzdG9tU2NyaXB0cyIsImh0bWwiLCJub25Hb29nbGVTY3JpcHRzIl19LG9lPSJnb29nbGUgY3VzdG9tUGl4ZWxzIGN1c3RvbVNjcmlwdHMgaHRtbCBub25Hb29nbGVQaXhlbHMgbm9uR29vZ2xlU2NyaXB0cyBub25Hb29nbGVJZnJhbWVzIi5zcGxpdCgiICIpOwp2YXIgcWU9ZnVuY3Rpb24oYSl7dmFyIGI9TWQoImd0bS53aGl0ZWxpc3QiKTtiJiZqZCgiR1RNIiw5KTtiPSJnb29nbGUgZ3RhZ2ZsIGxjbCB6b25lIG9pZCBvcCIuc3BsaXQoIiAiKTt2YXIgYz1iJiZKYShCYShiKSxtZSksZD1NZCgiZ3RtLmJsYWNrbGlzdCIpO2R8fChkPU1kKCJ0YWdUeXBlQmxhY2tsaXN0IikpJiZqZCgiR1RNIiwzKTsKZD9qZCgiR1RNIiw4KTpkPVtdO3BlKCkmJihkPUJhKGQpLGQucHVzaCgibm9uR29vZ2xlUGl4ZWxzIiwibm9uR29vZ2xlU2NyaXB0cyIsInNhbmRib3hlZFNjcmlwdHMiKSk7MDw9cShCYShkKSwiZ29vZ2xlIikmJmpkKCJHVE0iLDIpO3ZhciBlPWQmJkphKEJhKGQpLG5lKSxmPXt9O3JldHVybiBmdW5jdGlvbihoKXt2YXIgaz1oJiZoW0ZiLnNhXTtpZigha3x8InN0cmluZyIhPXR5cGVvZiBrKXJldHVybiEwO2s9ay5yZXBsYWNlKC9eXyovLCIiKTtpZih2b2lkIDAhPT1mW2tdKXJldHVybiBmW2tdO3ZhciBsPWdkW2tdfHxbXSxtPWEoayxsKTtpZihiKXt2YXIgbjtpZihuPW0pYTp7aWYoMD5xKGMsaykpaWYobCYmMDxsLmxlbmd0aClmb3IodmFyIHI9CjA7cjxsLmxlbmd0aDtyKyspe2lmKDA+cShjLGxbcl0pKXtqZCgiR1RNIiwxMSk7bj0hMTticmVhayBhfX1lbHNle249ITE7YnJlYWsgYX1uPSEwfW09bn12YXIgdT0hMTtpZihkKXt2YXIgcD0wPD1xKGUsayk7aWYocCl1PXA7ZWxzZXt2YXIgdD15YShlLGx8fFtdKTt0JiZqZCgiR1RNIiwxMCk7dT10fX12YXIgdj0hbXx8dTt2fHwhKDA8PXEobCwic2FuZGJveGVkU2NyaXB0cyIpKXx8YyYmLTEhPT1xKGMsInNhbmRib3hlZFNjcmlwdHMiKXx8KHY9eWEoZSxvZSkpO3JldHVybiBmW2tdPXZ9fSxwZT1mdW5jdGlvbigpe3JldHVybiBsZS50ZXN0KEYubG9jYXRpb24mJkYubG9jYXRpb24uaG9zdG5hbWUpfTt2YXIgcmU9e1hmOmZ1bmN0aW9uKGEsYil7YltGYi51ZF0mJiJzdHJpbmciPT09dHlwZW9mIGEmJihhPTE9PWJbRmIudWRdP2EudG9Mb3dlckNhc2UoKTphLnRvVXBwZXJDYXNlKCkpO2IuaGFzT3duUHJvcGVydHkoRmIud2QpJiZudWxsPT09YSYmKGE9YltGYi53ZF0pO2IuaGFzT3duUHJvcGVydHkoRmIueWQpJiZ2b2lkIDA9PT1hJiYoYT1iW0ZiLnlkXSk7Yi5oYXNPd25Qcm9wZXJ0eShGYi54ZCkmJiEwPT09YSYmKGE9YltGYi54ZF0pO2IuaGFzT3duUHJvcGVydHkoRmIudmQpJiYhMT09PWEmJihhPWJbRmIudmRdKTtyZXR1cm4gYX19O3ZhciBzZT17YWN0aXZlOiEwLGlzV2hpdGVsaXN0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19LHRlPWZ1bmN0aW9uKGEpe3ZhciBiPVdjLnpvbmVzOyFiJiZhJiYoYj1XYy56b25lcz1hKCkpO3JldHVybiBifTt2YXIgdWU9ZnVuY3Rpb24oKXt9O3ZhciB2ZT0hMSx3ZT0wLHhlPVtdO2Z1bmN0aW9uIHllKGEpe2lmKCF2ZSl7dmFyIGI9Ry5jcmVhdGVFdmVudE9iamVjdCxjPSJjb21wbGV0ZSI9PUcucmVhZHlTdGF0ZSxkPSJpbnRlcmFjdGl2ZSI9PUcucmVhZHlTdGF0ZTtpZighYXx8InJlYWR5c3RhdGVjaGFuZ2UiIT1hLnR5cGV8fGN8fCFiJiZkKXt2ZT0hMDtmb3IodmFyIGU9MDtlPHhlLmxlbmd0aDtlKyspSSh4ZVtlXSl9eGUucHVzaD1mdW5jdGlvbigpe2Zvcih2YXIgZj0wO2Y8YXJndW1lbnRzLmxlbmd0aDtmKyspSShhcmd1bWVudHNbZl0pO3JldHVybiAwfX19ZnVuY3Rpb24gemUoKXtpZighdmUmJjE0MD53ZSl7d2UrKzt0cnl7Ry5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKSx5ZSgpfWNhdGNoKGEpe0Yuc2V0VGltZW91dCh6ZSw1MCl9fX12YXIgQWU9ZnVuY3Rpb24oYSl7dmU/YSgpOnhlLnB1c2goYSl9O3ZhciBCZT17fSxDZT17fSxEZT1mdW5jdGlvbihhLGIsYyxkKXtpZighQ2VbYV18fFljW2JdfHwiX196b25lIj09PWIpcmV0dXJuLTE7dmFyIGU9e307UGEoZCkmJihlPUQoZCxlKSk7ZS5pZD1jO2Uuc3RhdHVzPSJ0aW1lb3V0IjtyZXR1cm4gQ2VbYV0udGFncy5wdXNoKGUpLTF9LEVlPWZ1bmN0aW9uKGEsYixjLGQpe2lmKENlW2FdKXt2YXIgZT1DZVthXS50YWdzW2JdO2UmJihlLnN0YXR1cz1jLGUuZXhlY3V0aW9uVGltZT1kKX19O2Z1bmN0aW9uIEZlKGEpe2Zvcih2YXIgYj1CZVthXXx8W10sYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10oKTtCZVthXT17cHVzaDpmdW5jdGlvbihkKXtkKFZjLnMsQ2VbYV0pfX19CnZhciBJZT1mdW5jdGlvbihhLGIsYyl7Q2VbYV09e3RhZ3M6W119O3BhKGIpJiZHZShhLGIpO2MmJkYuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBGZShhKX0sTnVtYmVyKGMpKTtyZXR1cm4gSGUoYSl9LEdlPWZ1bmN0aW9uKGEsYil7QmVbYV09QmVbYV18fFtdO0JlW2FdLnB1c2goR2EoZnVuY3Rpb24oKXtyZXR1cm4gSShmdW5jdGlvbigpe2IoVmMucyxDZVthXSl9KX0pKX07ZnVuY3Rpb24gSGUoYSl7dmFyIGI9MCxjPTAsZD0hMTtyZXR1cm57YWRkOmZ1bmN0aW9uKCl7YysrO3JldHVybiBHYShmdW5jdGlvbigpe2IrKztkJiZiPj1jJiZGZShhKX0pfSxKZjpmdW5jdGlvbigpe2Q9ITA7Yj49YyYmRmUoYSl9fX07dmFyIEplPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShkKXtyZXR1cm4hcWEoZCl8fDA+ZD8wOmR9aWYoIVdjLl9saSYmRi5wZXJmb3JtYW5jZSYmRi5wZXJmb3JtYW5jZS50aW1pbmcpe3ZhciBiPUYucGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCxjPXFhKE5kLmdldCgiZ3RtLnN0YXJ0IikpP05kLmdldCgiZ3RtLnN0YXJ0Iik6MDtXYy5fbGk9e2NzdDphKGMtYiksY2J0OmEoYmQtYil9fX07dmFyIE5lPXt9LE9lPWZ1bmN0aW9uKCl7cmV0dXJuIEYuR29vZ2xlQW5hbHl0aWNzT2JqZWN0JiZGW0YuR29vZ2xlQW5hbHl0aWNzT2JqZWN0XX0sUGU9ITE7CnZhciBRZT1mdW5jdGlvbihhKXtGLkdvb2dsZUFuYWx5dGljc09iamVjdHx8KEYuR29vZ2xlQW5hbHl0aWNzT2JqZWN0PWF8fCJnYSIpO3ZhciBiPUYuR29vZ2xlQW5hbHl0aWNzT2JqZWN0O2lmKEZbYl0pRi5oYXNPd25Qcm9wZXJ0eShiKXx8amQoIkdUTSIsMTIpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oKXtjLnE9Yy5xfHxbXTtjLnEucHVzaChhcmd1bWVudHMpfTtjLmw9TnVtYmVyKG5ldyBEYXRlKTtGW2JdPWN9SmUoKTtyZXR1cm4gRltiXX0sUmU9ZnVuY3Rpb24oYSxiLGMsZCl7Yj1TdHJpbmcoYikucmVwbGFjZSgvXHMrL2csIiIpLnNwbGl0KCIsIik7dmFyIGU9T2UoKTtlKGErInJlcXVpcmUiLCJsaW5rZXIiKTtlKGErImxpbmtlcjphdXRvTGluayIsYixjLGQpfTsKdmFyIFRlPWZ1bmN0aW9uKGEpe30sU2U9ZnVuY3Rpb24oKXtyZXR1cm4gRi5Hb29nbGVBbmFseXRpY3NPYmplY3R8fCJnYSJ9O3ZhciBWZT0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaTt2YXIgV2U9LzpbMC05XSskLyxYZT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWEuc3BsaXQoIiYiKSxlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWRbZV0uc3BsaXQoIj0iKTtpZihkZWNvZGVVUklDb21wb25lbnQoZlswXSkucmVwbGFjZSgvXCsvZywiICIpPT09Yil7dmFyIGg9Zi5zbGljZSgxKS5qb2luKCI9Iik7cmV0dXJuIGM/aDpkZWNvZGVVUklDb21wb25lbnQoaCkucmVwbGFjZSgvXCsvZywiICIpfX19LCRlPWZ1bmN0aW9uKGEsYixjLGQsZSl7YiYmKGI9U3RyaW5nKGIpLnRvTG93ZXJDYXNlKCkpO2lmKCJwcm90b2NvbCI9PT1ifHwicG9ydCI9PT1iKWEucHJvdG9jb2w9WWUoYS5wcm90b2NvbCl8fFllKEYubG9jYXRpb24ucHJvdG9jb2wpOyJwb3J0Ij09PWI/YS5wb3J0PVN0cmluZyhOdW1iZXIoYS5ob3N0bmFtZT9hLnBvcnQ6Ri5sb2NhdGlvbi5wb3J0KXx8KCJodHRwIj09YS5wcm90b2NvbD84MDoiaHR0cHMiPT1hLnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWImJgooYS5ob3N0bmFtZT0oYS5ob3N0bmFtZXx8Ri5sb2NhdGlvbi5ob3N0bmFtZSkucmVwbGFjZShXZSwiIikudG9Mb3dlckNhc2UoKSk7dmFyIGY9YixoLGs9WWUoYS5wcm90b2NvbCk7ZiYmKGY9U3RyaW5nKGYpLnRvTG93ZXJDYXNlKCkpO3N3aXRjaChmKXtjYXNlICJ1cmxfbm9fZnJhZ21lbnQiOmg9WmUoYSk7YnJlYWs7Y2FzZSAicHJvdG9jb2wiOmg9azticmVhaztjYXNlICJob3N0IjpoPWEuaG9zdG5hbWUucmVwbGFjZShXZSwiIikudG9Mb3dlckNhc2UoKTtpZihjKXt2YXIgbD0vXnd3d1xkKlwuLy5leGVjKGgpO2wmJmxbMF0mJihoPWguc3Vic3RyKGxbMF0ubGVuZ3RoKSl9YnJlYWs7Y2FzZSAicG9ydCI6aD1TdHJpbmcoTnVtYmVyKGEucG9ydCl8fCgiaHR0cCI9PWs/ODA6Imh0dHBzIj09az80NDM6IiIpKTticmVhaztjYXNlICJwYXRoIjphLnBhdGhuYW1lfHxhLmhvc3RuYW1lfHxqZCgiVEFHR0lORyIsMSk7aD0iLyI9PWEucGF0aG5hbWUuc3Vic3RyKDAsMSk/YS5wYXRobmFtZToKIi8iK2EucGF0aG5hbWU7dmFyIG09aC5zcGxpdCgiLyIpOzA8PXEoZHx8W10sbVttLmxlbmd0aC0xXSkmJihtW20ubGVuZ3RoLTFdPSIiKTtoPW0uam9pbigiLyIpO2JyZWFrO2Nhc2UgInF1ZXJ5IjpoPWEuc2VhcmNoLnJlcGxhY2UoIj8iLCIiKTtlJiYoaD1YZShoLGUsdm9pZCAwKSk7YnJlYWs7Y2FzZSAiZXh0ZW5zaW9uIjp2YXIgbj1hLnBhdGhuYW1lLnNwbGl0KCIuIik7aD0xPG4ubGVuZ3RoP25bbi5sZW5ndGgtMV06IiI7aD1oLnNwbGl0KCIvIilbMF07YnJlYWs7Y2FzZSAiZnJhZ21lbnQiOmg9YS5oYXNoLnJlcGxhY2UoIiMiLCIiKTticmVhaztkZWZhdWx0Omg9YSYmYS5ocmVmfXJldHVybiBofSxZZT1mdW5jdGlvbihhKXtyZXR1cm4gYT9hLnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxaZT1mdW5jdGlvbihhKXt2YXIgYj0iIjtpZihhJiZhLmhyZWYpe3ZhciBjPWEuaHJlZi5pbmRleE9mKCIjIik7Yj0wPmM/YS5ocmVmOmEuaHJlZi5zdWJzdHIoMCxjKX1yZXR1cm4gYn0sCmFmPWZ1bmN0aW9uKGEpe3ZhciBiPUcuY3JlYXRlRWxlbWVudCgiYSIpO2EmJihiLmhyZWY9YSk7dmFyIGM9Yi5wYXRobmFtZTsiLyIhPT1jWzBdJiYoYXx8amQoIlRBR0dJTkciLDEpLGM9Ii8iK2MpO3ZhciBkPWIuaG9zdG5hbWUucmVwbGFjZShXZSwiIik7cmV0dXJue2hyZWY6Yi5ocmVmLHByb3RvY29sOmIucHJvdG9jb2wsaG9zdDpiLmhvc3QsaG9zdG5hbWU6ZCxwYXRobmFtZTpjLHNlYXJjaDpiLnNlYXJjaCxoYXNoOmIuaGFzaCxwb3J0OmIucG9ydH19O2Z1bmN0aW9uIGZmKGEsYixjLGQpe3ZhciBlPXNiW2FdLGY9Z2YoYSxiLGMsZCk7aWYoIWYpcmV0dXJuIG51bGw7dmFyIGg9QmIoZVtGYi5QZF0sYyxbXSk7aWYoaCYmaC5sZW5ndGgpe3ZhciBrPWhbMF07Zj1mZihrLmluZGV4LHtCOmYsdzoxPT09ay5tZT9iLnRlcm1pbmF0ZTpmLHRlcm1pbmF0ZTpiLnRlcm1pbmF0ZX0sYyxkKX1yZXR1cm4gZn0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7ZnVuY3Rpb24gZSgpe2lmKGZbRmIuY2ZdKWsoKTtlbHNle3ZhciB3PUNiKGYsYyxbXSkseT1EZShjLmlkLFN0cmluZyhmW0ZiLnNhXSksTnVtYmVyKGZbRmIuUmRdKSx3W0ZiLmRmXSkseD0hMTt3LnZ0cF9ndG1PblN1Y2Nlc3M9ZnVuY3Rpb24oKXtpZigheCl7eD0hMDt2YXIgej1FYSgpLUE7RmQoYy5pZCxzYlthXSwiNSIpO0VlKGMuaWQseSwic3VjY2VzcyIseik7aCgpfX07dy52dHBfZ3RtT25GYWlsdXJlPWZ1bmN0aW9uKCl7aWYoIXgpe3g9ITA7dmFyIHo9RWEoKS1BO0ZkKGMuaWQsc2JbYV0sIjYiKTtFZShjLmlkLHksImZhaWx1cmUiLHopO2soKX19O3cudnRwX2d0bVRhZ0lkPWYudGFnX2lkOwp3LnZ0cF9ndG1FdmVudElkPWMuaWQ7RmQoYy5pZCxmLCIxIik7dmFyIEI9ZnVuY3Rpb24oKXt2YXIgej1FYSgpLUE7RmQoYy5pZCxmLCI3Iik7RWUoYy5pZCx5LCJleGNlcHRpb24iLHopO3h8fCh4PSEwLGsoKSl9O3ZhciBBPUVhKCk7dHJ5e0FiKHcsYyl9Y2F0Y2goeil7Qih6KX19fXZhciBmPXNiW2FdLGg9Yi5CLGs9Yi53LGw9Yi50ZXJtaW5hdGU7aWYoYy5QYyhmKSlyZXR1cm4gbnVsbDt2YXIgbT1CYihmW0ZiLlNkXSxjLFtdKTtpZihtJiZtLmxlbmd0aCl7dmFyIG49bVswXSxyPWZmKG4uaW5kZXgse0I6aCx3OmssdGVybWluYXRlOmx9LGMsZCk7aWYoIXIpcmV0dXJuIG51bGw7aD1yO2s9Mj09PW4ubWU/bDpyfWlmKGZbRmIuSGRdfHxmW0ZiLmpmXSl7dmFyIHU9ZltGYi5IZF0/dGI6Yy5saCxwPWgsdD1rO2lmKCF1W2FdKXtlPUdhKGUpO3ZhciB2PWhmKGEsdSxlKTtoPXYuQjtrPXYud31yZXR1cm4gZnVuY3Rpb24oKXt1W2FdKHAsdCl9fXJldHVybiBlfQpmdW5jdGlvbiBoZihhLGIsYyl7dmFyIGQ9W10sZT1bXTtiW2FdPWpmKGQsZSxjKTtyZXR1cm57QjpmdW5jdGlvbigpe2JbYV09a2Y7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXSgpfSx3OmZ1bmN0aW9uKCl7YlthXT1sZjtmb3IodmFyIGY9MDtmPGUubGVuZ3RoO2YrKyllW2ZdKCl9fX1mdW5jdGlvbiBqZihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7YS5wdXNoKGQpO2IucHVzaChlKTtjKCl9fWZ1bmN0aW9uIGtmKGEpe2EoKX1mdW5jdGlvbiBsZihhLGIpe2IoKX07dmFyIG9mPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLGQ9MDtkPHNiLmxlbmd0aDtkKyspaWYoYS5tYltkXSl7dmFyIGU9c2JbZF07dmFyIGY9Yi5hZGQoKTt0cnl7dmFyIGg9ZmYoZCx7QjpmLHc6Zix0ZXJtaW5hdGU6Zn0sYSxkKTtoP2MucHVzaCh7TGU6ZCxHZTpEYihlKSxoZzpofSk6KG1mKGQsYSksZigpKX1jYXRjaChsKXtmKCl9fWIuSmYoKTtjLnNvcnQobmYpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uaGcoKTtyZXR1cm4gMDxjLmxlbmd0aH07ZnVuY3Rpb24gbmYoYSxiKXt2YXIgYyxkPWIuR2UsZT1hLkdlO2M9ZD5lPzE6ZDxlPy0xOjA7dmFyIGY7aWYoMCE9PWMpZj1jO2Vsc2V7dmFyIGg9YS5MZSxrPWIuTGU7Zj1oPms/MTpoPGs/LTE6MH1yZXR1cm4gZn0KZnVuY3Rpb24gbWYoYSxiKXtpZighQ2QpcmV0dXJuO3ZhciBjPWZ1bmN0aW9uKGQpe3ZhciBlPWIuUGMoc2JbZF0pPyIzIjoiNCIsZj1CYihzYltkXVtGYi5QZF0sYixbXSk7ZiYmZi5sZW5ndGgmJmMoZlswXS5pbmRleCk7RmQoYi5pZCxzYltkXSxlKTt2YXIgaD1CYihzYltkXVtGYi5TZF0sYixbXSk7aCYmaC5sZW5ndGgmJmMoaFswXS5pbmRleCl9O2MoYSk7fQp2YXIgcGY9ITEscWY9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZigiZ3RtLmpzIj09Yil7aWYocGYpcmV0dXJuITE7cGY9ITB9RWQoYSxiKTt2YXIgZj1JZShhLGQsZSk7VGQoYSwiZXZlbnQiLDEpO1RkKGEsImVjb21tZXJjZSIsMSk7VGQoYSwiZ3RtIik7dmFyIGg9e2lkOmEsbmFtZTpiLFBjOnFlKGMpLG1iOltdLGxoOltdLHllOmZ1bmN0aW9uKCl7amQoIkdUTSIsNil9fTtoLm1iPUtiKGgpO3ZhciBrPW9mKGgsZik7Imd0bS5qcyIhPT1iJiYiZ3RtLnN5bmMiIT09Ynx8VGUoVmMucyk7aWYoIWspcmV0dXJuIGs7Zm9yKHZhciBsPTA7bDxoLm1iLmxlbmd0aDtsKyspaWYoaC5tYltsXSl7dmFyIG09c2JbbF07aWYobSYmIVljW1N0cmluZyhtW0ZiLnNhXSldKXJldHVybiEwfXJldHVybiExfTt2YXIgcmY9e30sc2Y9e30sdGY9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09c2ZbYV0/dm9pZCAwOnNmW2FdfTt2YXIgdWY9W107ZnVuY3Rpb24gdmYoKXt2YXIgYT1nYygiZ29vZ2xlX3RhZ19kYXRhIix7fSksYj12b2lkIDAhPXRmKCJvZ3RfY2MiKSYmdm9pZCAwIT10Zigib2d0X2NjciIpO2EuaWNzfHwoYS5pY3M9e2VudHJpZXM6e30sc2V0OndmLHVwZGF0ZTp4ZixhZGRMaXN0ZW5lcjp5Zixub3RpZnlMaXN0ZW5lcnM6emYsYWN0aXZlOiExLHZhbGlkOmJ9KTtyZXR1cm4gYS5pY3N9ZnVuY3Rpb24gd2YoYSxiLGMpe3ZhciBkPXZmKCk7ZC5hY3RpdmU9ITA7aWYodm9pZCAwIT1iKXt2YXIgZT1kLmVudHJpZXMsZj1lW2FdfHx7fSxoPWMmJmcoYyk/Yy50b1VwcGVyQ2FzZSgpOnZvaWQgMCxrPWYucmVnaW9uO2ghPT10Zigib2d0X2NjciIpJiYoaD09PXRmKCJvZ3RfY2MiKT9rPT09dGYoIm9ndF9jY3IiKTpofHxrKXx8KGVbYV09e3JlZ2lvbjpoLGluaXRpYWw6ImdyYW50ZWQiPT09Yix1cGRhdGU6Zi51cGRhdGV9KX19CmZ1bmN0aW9uIHhmKGEsYil7dmFyIGM9dmYoKTtjLmFjdGl2ZT0hMDtpZih2b2lkIDAhPWIpe3ZhciBkPUFmKGEpLGU9Yy5lbnRyaWVzO2VbYV09ZVthXXx8e307ZVthXS51cGRhdGU9ImdyYW50ZWQiPT09YjtpZihBZihhKSE9PWQpZm9yKHZhciBmPTA7Zjx1Zi5sZW5ndGg7KytmKXt2YXIgaD11ZltmXTtyYShoLmZlKSYmLTEhPT1oLmZlLmluZGV4T2YoYSkmJihoLkZlPSEwKX19fWZ1bmN0aW9uIHlmKGEsYil7dWYucHVzaCh7ZmU6YSxqZzpifSl9ZnVuY3Rpb24gemYoKXtmb3IodmFyIGE9MDthPHVmLmxlbmd0aDsrK2Epe3ZhciBiPXVmW2FdO2lmKGIuRmUpe2IuRmU9ITE7dHJ5e2IuamcuY2FsbCgpfWNhdGNoKGMpe319fX12YXIgQWY9ZnVuY3Rpb24oYSl7aWYoMD09dmYoKS52YWxpZClyZXR1cm4hMTt2YXIgYj12ZigpLmVudHJpZXNbYV18fHt9O3JldHVybiB2b2lkIDAhPT1iLnVwZGF0ZT9iLnVwZGF0ZTp2b2lkIDAhPT1iLmluaXRpYWw/Yi5pbml0aWFsOnZvaWQgMH07dmFyIEJmPVtKLk1nLEouUmddO3ZhciBDZj1mdW5jdGlvbihhLGIpe3ZhciBjPXpiKGEsYik7c2IucHVzaChjKTtyZXR1cm4gc2IubGVuZ3RoLTF9O3ZhciBEZj0vXmh0dHBzPzpcL1wvd3d3XC5nb29nbGV0YWdtYW5hZ2VyXC5jb20vO2Z1bmN0aW9uIEVmKCl7dmFyIGE7cmV0dXJuIGF9ZnVuY3Rpb24gR2YoYSxiKXt9CmZ1bmN0aW9uIEZmKGEpezAhPT1hLmluZGV4T2YoImh0dHA6Ly8iKSYmMCE9PWEuaW5kZXhPZigiaHR0cHM6Ly8iKSYmKGE9Imh0dHBzOi8vIithKTsiLyI9PT1hW2EubGVuZ3RoLTFdJiYoYT1hLnN1YnN0cmluZygwLGEubGVuZ3RoLTEpKTtyZXR1cm4gYX1mdW5jdGlvbiBIZigpe3ZhciBhPSExO3JldHVybiBhfTt2YXIgSWY9ZnVuY3Rpb24oKXt0aGlzLmV2ZW50TW9kZWw9e307dGhpcy50YXJnZXRDb25maWc9e307dGhpcy5jb250YWluZXJDb25maWc9e307dGhpcy5oPXt9O3RoaXMuZ2xvYmFsQ29uZmlnPXt9O3RoaXMuQj1mdW5jdGlvbigpe307dGhpcy53PWZ1bmN0aW9uKCl7fX0sSmY9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IElmO2IuZXZlbnRNb2RlbD1hO3JldHVybiBifSxLZj1mdW5jdGlvbihhLGIpe2EudGFyZ2V0Q29uZmlnPWI7cmV0dXJuIGF9LExmPWZ1bmN0aW9uKGEsYil7YS5jb250YWluZXJDb25maWc9YjtyZXR1cm4gYX0sTWY9ZnVuY3Rpb24oYSxiKXthLmg9YjtyZXR1cm4gYX0sTmY9ZnVuY3Rpb24oYSxiKXthLmdsb2JhbENvbmZpZz1iO3JldHVybiBhfSxPZj1mdW5jdGlvbihhLGIpe2EuQj1iO3JldHVybiBhfSxQZj1mdW5jdGlvbihhLGIpe2Eudz1iO3JldHVybiBhfTsKSWYucHJvdG90eXBlLmdldFdpdGhDb25maWc9ZnVuY3Rpb24oYSl7aWYodm9pZCAwIT09dGhpcy5ldmVudE1vZGVsW2FdKXJldHVybiB0aGlzLmV2ZW50TW9kZWxbYV07aWYodm9pZCAwIT09dGhpcy50YXJnZXRDb25maWdbYV0pcmV0dXJuIHRoaXMudGFyZ2V0Q29uZmlnW2FdO2lmKHZvaWQgMCE9PXRoaXMuY29udGFpbmVyQ29uZmlnW2FdKXJldHVybiB0aGlzLmNvbnRhaW5lckNvbmZpZ1thXTtpZih2b2lkIDAhPT10aGlzLmhbYV0pcmV0dXJuIHRoaXMuaFthXTtpZih2b2lkIDAhPT10aGlzLmdsb2JhbENvbmZpZ1thXSlyZXR1cm4gdGhpcy5nbG9iYWxDb25maWdbYV19Owp2YXIgUWY9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihlKXtDKGUsZnVuY3Rpb24oZil7Y1tmXT1udWxsfSl9dmFyIGM9e307YihhLmV2ZW50TW9kZWwpO2IoYS50YXJnZXRDb25maWcpO2IoYS5jb250YWluZXJDb25maWcpO2IoYS5nbG9iYWxDb25maWcpO3ZhciBkPVtdO0MoYyxmdW5jdGlvbihlKXtkLnB1c2goZSl9KTtyZXR1cm4gZH07dmFyIFJmPWZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9W10sZT1TdHJpbmcoYnx8ZG9jdW1lbnQuY29va2llKS5zcGxpdCgiOyIpLGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGg9ZVtmXS5zcGxpdCgiPSIpLGs9aFswXS5yZXBsYWNlKC9eXHMqfFxzKiQvZywiIik7aWYoayYmaz09YSl7dmFyIGw9aC5zbGljZSgxKS5qb2luKCI9IikucmVwbGFjZSgvXlxzKnxccyokL2csIiIpO2wmJmMmJihsPWRlY29kZVVSSUNvbXBvbmVudChsKSk7ZC5wdXNoKGwpfX1yZXR1cm4gZH0sVWY9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9U2YoYSxkKTtpZigxPT09ZS5sZW5ndGgpcmV0dXJuIGVbMF0uaWQ7aWYoMCE9PWUubGVuZ3RoKXtlPVRmKGUsZnVuY3Rpb24oZil7cmV0dXJuIGYuTWJ9LGIpO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gZVswXS5pZDtlPVRmKGUsZnVuY3Rpb24oZil7cmV0dXJuIGYubmJ9LGMpO3JldHVybiBlWzBdP2VbMF0uaWQ6dm9pZCAwfX07CmZ1bmN0aW9uIFZmKGEsYixjKXt2YXIgZD1kb2N1bWVudC5jb29raWU7ZG9jdW1lbnQuY29va2llPWE7dmFyIGU9ZG9jdW1lbnQuY29va2llO3JldHVybiBkIT1lfHx2b2lkIDAhPWMmJjA8PVJmKGIsZSkuaW5kZXhPZihjKX0KdmFyIFpmPWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKHAsdCx2KXtpZihudWxsPT12KXJldHVybiBkZWxldGUgaFt0XSxwO2hbdF09djtyZXR1cm4gcCsiOyAiK3QrIj0iK3Z9ZnVuY3Rpb24gZShwLHQpe2lmKG51bGw9PXQpcmV0dXJuIGRlbGV0ZSBoW3RdLHA7aFt0XT0hMDtyZXR1cm4gcCsiOyAiK3R9dmFyIGY7dm9pZCAwPT1iP2Y9YSsiPWRlbGV0ZWQ7IGV4cGlyZXM9IisobmV3IERhdGUoMCkpLnRvVVRDU3RyaW5nKCk6KGMuZW5jb2RlJiYoYj1lbmNvZGVVUklDb21wb25lbnQoYikpLGI9V2YoYiksZj1hKyI9IitiKTt2YXIgaD17fTtmPWQoZiwicGF0aCIsYy5wYXRoKTt2YXIgaztjLmV4cGlyZXMgaW5zdGFuY2VvZiBEYXRlP2s9Yy5leHBpcmVzLnRvVVRDU3RyaW5nKCk6bnVsbCE9Yy5leHBpcmVzJiYoaz0iIitjLmV4cGlyZXMpO2Y9ZChmLCJleHBpcmVzIixrKTtmPWQoZiwibWF4LWFnZSIsYy5PaCk7Zj1kKGYsInNhbWVzaXRlIixjLlVoKTtjLlZoJiYoZj1lKGYsInNlY3VyZSIpKTsKZj1lKGYsYy5mbGFncyk7dmFyIGw9Yy5kb21haW47aWYoImF1dG8iPT09bCl7Zm9yKHZhciBtPVhmKCksbj0wO248bS5sZW5ndGg7KytuKXt2YXIgcj0ibm9uZSIhPT1tW25dP21bbl06dm9pZCAwLHU9ZChmLCJkb21haW4iLHIpO2lmKCFZZihyLGMucGF0aCkmJlZmKHUsYSxiKSlyZXR1cm4hMH1yZXR1cm4hMX1sJiYibm9uZSIhPT1sJiYoZj1kKGYsImRvbWFpbiIsbCkpO3JldHVybiBZZihsLGMucGF0aCk/ITE6VmYoZixhLGIpfSwkZj1mdW5jdGlvbihhLGIsYyxkLGUsZixoKXt2YXIgaz17ZG9tYWluOmQscGF0aDpjLGV4cGlyZXM6ZSxmbGFnczpoLGVuY29kZTpmfTtudWxsPT1rLnBhdGgmJihrLnBhdGg9Ii8iKTtrLmRvbWFpbnx8KGsuZG9tYWluPSJhdXRvIik7cmV0dXJuIFpmKGEsYixrKX07CmZ1bmN0aW9uIFRmKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmLGg9MDtoPGEubGVuZ3RoO2grKyl7dmFyIGs9YVtoXSxsPWIoayk7bD09PWM/ZC5wdXNoKGspOnZvaWQgMD09PWZ8fGw8Zj8oZT1ba10sZj1sKTpsPT09ZiYmZS5wdXNoKGspfXJldHVybiAwPGQubGVuZ3RoP2Q6ZX1mdW5jdGlvbiBTZihhLGIpe2Zvcih2YXIgYz1bXSxkPVJmKGEpLGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXS5zcGxpdCgiLiIpLGg9Zi5zaGlmdCgpO2lmKCFifHwtMSE9PWIuaW5kZXhPZihoKSl7dmFyIGs9Zi5zaGlmdCgpO2smJihrPWsuc3BsaXQoIi0iKSxjLnB1c2goe2lkOmYuam9pbigiLiIpLE1iOjEqa1swXXx8MSxuYjoxKmtbMV18fDF9KSl9fXJldHVybiBjfQp2YXIgV2Y9ZnVuY3Rpb24oYSl7YSYmMTIwMDxhLmxlbmd0aCYmKGE9YS5zdWJzdHJpbmcoMCwxMjAwKSk7cmV0dXJuIGF9LGFnPS9eKHd3d1wuKT9nb29nbGUoXC5jb20/KT8oXC5bYS16XXsyfSk/JC8sYmc9LyhefFwuKWRvdWJsZWNsaWNrXC5uZXQkL2ksWWY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYmcudGVzdChkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSl8fCIvIj09PWImJmFnLnRlc3QoYSl9LFhmPWZ1bmN0aW9uKCl7dmFyIGE9W10sYj1kb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZS5zcGxpdCgiLiIpO2lmKDQ9PT1iLmxlbmd0aCl7dmFyIGM9YltiLmxlbmd0aC0xXTtpZihwYXJzZUludChjLDEwKS50b1N0cmluZygpPT09YylyZXR1cm5bIm5vbmUiXX1mb3IodmFyIGQ9Yi5sZW5ndGgtMjswPD1kO2QtLSlhLnB1c2goYi5zbGljZShkKS5qb2luKCIuIikpO3ZhciBlPWRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lO2JnLnRlc3QoZSl8fGFnLnRlc3QoZSl8fGEucHVzaCgibm9uZSIpOwpyZXR1cm4gYX07ZnVuY3Rpb24gY2coKXtmb3IodmFyIGE9ZWcsYj17fSxjPTA7YzxhLmxlbmd0aDsrK2MpYlthW2NdXT1jO3JldHVybiBifWZ1bmN0aW9uIGZnKCl7dmFyIGE9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjthKz1hLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyI7cmV0dXJuIGErIi4ifXZhciBlZyxnZztmdW5jdGlvbiBoZyhhKXtlZz1lZ3x8ZmcoKTtnZz1nZ3x8Y2coKTtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7Yys9Myl7dmFyIGQ9YysxPGEubGVuZ3RoLGU9YysyPGEubGVuZ3RoLGY9YS5jaGFyQ29kZUF0KGMpLGg9ZD9hLmNoYXJDb2RlQXQoYysxKTowLGs9ZT9hLmNoYXJDb2RlQXQoYysyKTowLGw9Zj4+MixtPShmJjMpPDw0fGg+PjQsbj0oaCYxNSk8PDJ8az4+NixyPWsmNjM7ZXx8KHI9NjQsZHx8KG49NjQpKTtiLnB1c2goZWdbbF0sZWdbbV0sZWdbbl0sZWdbcl0pfXJldHVybiBiLmpvaW4oIiIpfQpmdW5jdGlvbiBpZyhhKXtmdW5jdGlvbiBiKGwpe2Zvcig7ZDxhLmxlbmd0aDspe3ZhciBtPWEuY2hhckF0KGQrKyksbj1nZ1ttXTtpZihudWxsIT1uKXJldHVybiBuO2lmKCEvXltcc1x4YTBdKiQvLnRlc3QobSkpdGhyb3cgRXJyb3IoIlVua25vd24gYmFzZTY0IGVuY29kaW5nIGF0IGNoYXI6ICIrbSk7fXJldHVybiBsfWVnPWVnfHxmZygpO2dnPWdnfHxjZygpO2Zvcih2YXIgYz0iIixkPTA7Oyl7dmFyIGU9YigtMSksZj1iKDApLGg9Yig2NCksaz1iKDY0KTtpZig2ND09PWsmJi0xPT09ZSlyZXR1cm4gYztjKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGU8PDJ8Zj4+NCk7NjQhPWgmJihjKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGY8PDQmMjQwfGg+PjIpLDY0IT1rJiYoYys9U3RyaW5nLmZyb21DaGFyQ29kZShoPDw2JjE5MnxrKSkpfX07dmFyIGpnO3ZhciBuZz1mdW5jdGlvbigpe3ZhciBhPWtnLGI9bGcsYz1tZygpLGQ9ZnVuY3Rpb24oaCl7YShoLnRhcmdldHx8aC5zcmNFbGVtZW50fHx7fSl9LGU9ZnVuY3Rpb24oaCl7YihoLnRhcmdldHx8aC5zcmNFbGVtZW50fHx7fSl9O2lmKCFjLmluaXQpe21jKEcsIm1vdXNlZG93biIsZCk7bWMoRywia2V5dXAiLGQpO21jKEcsInN1Ym1pdCIsZSk7dmFyIGY9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ7SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtiKHRoaXMpO2YuY2FsbCh0aGlzKX07Yy5pbml0PSEwfX0sb2c9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj17Y2FsbGJhY2s6YSxkb21haW5zOmIsZnJhZ21lbnQ6Mj09PWMscGxhY2VtZW50OmMsZm9ybXM6ZCxzYW1lSG9zdDplfTttZygpLmRlY29yYXRvcnMucHVzaChmKX0scGc9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1tZygpLmRlY29yYXRvcnMsZT17fSxmPTA7ZjxkLmxlbmd0aDsrK2Ype3ZhciBoPQpkW2ZdLGs7aWYoaz0hY3x8aC5mb3JtcylhOnt2YXIgbD1oLmRvbWFpbnMsbT1hO2lmKGwmJihoLnNhbWVIb3N0fHxtIT09Ry5sb2NhdGlvbi5ob3N0bmFtZSkpZm9yKHZhciBuPTA7bjxsLmxlbmd0aDtuKyspaWYobFtuXWluc3RhbmNlb2YgUmVnRXhwKXtpZihsW25dLnRlc3QobSkpe2s9ITA7YnJlYWsgYX19ZWxzZSBpZigwPD1tLmluZGV4T2YobFtuXSkpe2s9ITA7YnJlYWsgYX1rPSExfWlmKGspe3ZhciByPWgucGxhY2VtZW50O3ZvaWQgMD09ciYmKHI9aC5mcmFnbWVudD8yOjEpO3I9PT1iJiZIYShlLGguY2FsbGJhY2soKSl9fXJldHVybiBlfSxtZz1mdW5jdGlvbigpe3ZhciBhPWdjKCJnb29nbGVfdGFnX2RhdGEiLHt9KSxiPWEuZ2w7YiYmYi5kZWNvcmF0b3JzfHwoYj17ZGVjb3JhdG9yczpbXX0sYS5nbD1iKTtyZXR1cm4gYn07dmFyIHFnPS8oLio/KVwqKC4qPylcKiguKikvLHJnPS9eaHR0cHM/OlwvXC8oW15cL10qPylcLj9jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyguKikvLHNnPS9eKD86d3d3XC58bVwufGFtcFwuKSsvLHRnPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIHVnKGEpe3JldHVybiBuZXcgUmVnRXhwKCIoLio/KShefCYpIithKyI9KFteJl0qKSY/KC4qKSIpfQp2YXIgd2c9ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPWFbY107dm9pZCAwIT09ZCYmZD09PWQmJm51bGwhPT1kJiYiW29iamVjdCBPYmplY3RdIiE9PWQudG9TdHJpbmcoKSYmKGIucHVzaChjKSxiLnB1c2goaGcoU3RyaW5nKGQpKSkpfXZhciBlPWIuam9pbigiKiIpO3JldHVyblsiMSIsdmcoZSksZV0uam9pbigiKiIpfSx2Zz1mdW5jdGlvbihhLGIpe3ZhciBjPVt3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCwobmV3IERhdGUpLmdldFRpbWV6b25lT2Zmc2V0KCksd2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UsTWF0aC5mbG9vcigobmV3IERhdGUpLmdldFRpbWUoKS82MC8xRTMpLSh2b2lkIDA9PT1iPzA6YiksYV0uam9pbigiKiIpLGQ7aWYoIShkPWpnKSl7Zm9yKHZhciBlPUFycmF5KDI1NiksZj0wOzI1Nj5mO2YrKyl7Zm9yKHZhciBoPWYsaz0wOzg+aztrKyspaD0KaCYxP2g+Pj4xXjM5ODgyOTIzODQ6aD4+PjE7ZVtmXT1ofWQ9ZX1qZz1kO2Zvcih2YXIgbD00Mjk0OTY3Mjk1LG09MDttPGMubGVuZ3RoO20rKylsPWw+Pj44XmpnWyhsXmMuY2hhckNvZGVBdChtKSkmMjU1XTtyZXR1cm4oKGxeLTEpPj4+MCkudG9TdHJpbmcoMzYpfSx5Zz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhKXt2YXIgYj1hZihGLmxvY2F0aW9uLmhyZWYpLGM9Yi5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGQ9WGUoYywiX2dsIiwhMCl8fCIiO2EucXVlcnk9eGcoZCl8fHt9O3ZhciBlPSRlKGIsImZyYWdtZW50IikubWF0Y2godWcoIl9nbCIpKTthLmZyYWdtZW50PXhnKGUmJmVbM118fCIiKXx8e319fSx6Zz1mdW5jdGlvbigpe3ZhciBhPXlnKCksYj1tZygpO2IuZGF0YXx8KGIuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LGEoYi5kYXRhKSk7dmFyIGM9e30sZD1iLmRhdGE7ZCYmKEhhKGMsZC5xdWVyeSksSGEoYyxkLmZyYWdtZW50KSk7cmV0dXJuIGN9LHhnPWZ1bmN0aW9uKGEpe3ZhciBiOwpiPXZvaWQgMD09PWI/MzpiO3RyeXtpZihhKXt2YXIgYzthOntmb3IodmFyIGQ9YSxlPTA7Mz5lOysrZSl7dmFyIGY9cWcuZXhlYyhkKTtpZihmKXtjPWY7YnJlYWsgYX1kPWRlY29kZVVSSUNvbXBvbmVudChkKX1jPXZvaWQgMH12YXIgaD1jO2lmKGgmJiIxIj09PWhbMV0pe3ZhciBrPWhbM10sbDthOntmb3IodmFyIG09aFsyXSxuPTA7bjxiOysrbilpZihtPT09dmcoayxuKSl7bD0hMDticmVhayBhfWw9ITF9aWYobCl7Zm9yKHZhciByPXt9LHU9az9rLnNwbGl0KCIqIik6W10scD0wO3A8dS5sZW5ndGg7cCs9MilyW3VbcF1dPWlnKHVbcCsxXSk7cmV0dXJuIHJ9fX19Y2F0Y2godCl7fX07CmZ1bmN0aW9uIEFnKGEsYixjLGQpe2Z1bmN0aW9uIGUobil7dmFyIHI9bix1PXVnKGEpLmV4ZWMocikscD1yO2lmKHUpe3ZhciB0PXVbMl0sdj11WzRdO3A9dVsxXTt2JiYocD1wK3Qrdil9bj1wO3ZhciB3PW4uY2hhckF0KG4ubGVuZ3RoLTEpO24mJiImIiE9PXcmJihuKz0iJiIpO3JldHVybiBuK219ZD12b2lkIDA9PT1kPyExOmQ7dmFyIGY9dGcuZXhlYyhjKTtpZighZilyZXR1cm4iIjt2YXIgaD1mWzFdLGs9ZlsyXXx8IiIsbD1mWzNdfHwiIixtPWErIj0iK2I7ZD9sPSIjIitlKGwuc3Vic3RyaW5nKDEpKTprPSI/IitlKGsuc3Vic3RyaW5nKDEpKTtyZXR1cm4iIitoK2srbH0KZnVuY3Rpb24gQmcoYSxiKXt2YXIgYz0iRk9STSI9PT0oYS50YWdOYW1lfHwiIikudG9VcHBlckNhc2UoKSxkPXBnKGIsMSxjKSxlPXBnKGIsMixjKSxmPXBnKGIsMyxjKTtpZihJYShkKSl7dmFyIGg9d2coZCk7Yz9DZygiX2dsIixoLGEpOkRnKCJfZ2wiLGgsYSwhMSl9aWYoIWMmJklhKGUpKXt2YXIgaz13ZyhlKTtEZygiX2dsIixrLGEsITApfWZvcih2YXIgbCBpbiBmKWlmKGYuaGFzT3duUHJvcGVydHkobCkpYTp7dmFyIG09bCxuPWZbbF0scj1hO2lmKHIudGFnTmFtZSl7aWYoImEiPT09ci50YWdOYW1lLnRvTG93ZXJDYXNlKCkpe0RnKG0sbixyLHZvaWQgMCk7YnJlYWsgYX1pZigiZm9ybSI9PT1yLnRhZ05hbWUudG9Mb3dlckNhc2UoKSl7Q2cobSxuLHIpO2JyZWFrIGF9fSJzdHJpbmciPT10eXBlb2YgciYmQWcobSxuLHIsdm9pZCAwKX19CmZ1bmN0aW9uIERnKGEsYixjLGQpe2lmKGMuaHJlZil7dmFyIGU9QWcoYSxiLGMuaHJlZix2b2lkIDA9PT1kPyExOmQpO1ZlLnRlc3QoZSkmJihjLmhyZWY9ZSl9fQpmdW5jdGlvbiBDZyhhLGIsYyl7aWYoYyYmYy5hY3Rpb24pe3ZhciBkPShjLm1ldGhvZHx8IiIpLnRvTG93ZXJDYXNlKCk7aWYoImdldCI9PT1kKXtmb3IodmFyIGU9Yy5jaGlsZE5vZGVzfHxbXSxmPSExLGg9MDtoPGUubGVuZ3RoO2grKyl7dmFyIGs9ZVtoXTtpZihrLm5hbWU9PT1hKXtrLnNldEF0dHJpYnV0ZSgidmFsdWUiLGIpO2Y9ITA7YnJlYWt9fWlmKCFmKXt2YXIgbD1HLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7bC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKTtsLnNldEF0dHJpYnV0ZSgibmFtZSIsYSk7bC5zZXRBdHRyaWJ1dGUoInZhbHVlIixiKTtjLmFwcGVuZENoaWxkKGwpfX1lbHNlIGlmKCJwb3N0Ij09PWQpe3ZhciBtPUFnKGEsYixjLmFjdGlvbik7VmUudGVzdChtKSYmKGMuYWN0aW9uPW0pfX19CnZhciBrZz1mdW5jdGlvbihhKXt0cnl7dmFyIGI7YTp7Zm9yKHZhciBjPWEsZD0xMDA7YyYmMDxkOyl7aWYoYy5ocmVmJiZjLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7Yj1jO2JyZWFrIGF9Yz1jLnBhcmVudE5vZGU7ZC0tfWI9bnVsbH12YXIgZT1iO2lmKGUpe3ZhciBmPWUucHJvdG9jb2w7Imh0dHA6IiE9PWYmJiJodHRwczoiIT09Znx8QmcoZSxlLmhvc3RuYW1lKX19Y2F0Y2goaCl7fX0sbGc9ZnVuY3Rpb24oYSl7dHJ5e2lmKGEuYWN0aW9uKXt2YXIgYj0kZShhZihhLmFjdGlvbiksImhvc3QiKTtCZyhhLGIpfX1jYXRjaChjKXt9fSxFZz1mdW5jdGlvbihhLGIsYyxkKXtuZygpO29nKGEsYiwiZnJhZ21lbnQiPT09Yz8yOjEsISFkLCExKX0sRmc9ZnVuY3Rpb24oYSl7bmcoKTtvZyhhLFtGLmxvY2F0aW9uLmhvc3RuYW1lXSwzLCEwLCEwKX0sR2c9ZnVuY3Rpb24oKXt2YXIgYT1HLmxvY2F0aW9uLmhvc3RuYW1lLGI9cmcuZXhlYyhHLnJlZmVycmVyKTtpZighYilyZXR1cm4hMTsKdmFyIGM9YlsyXSxkPWJbMV0sZT0iIjtpZihjKXt2YXIgZj1jLnNwbGl0KCIvIiksaD1mWzFdO2U9InMiPT09aD9kZWNvZGVVUklDb21wb25lbnQoZlsyXSk6ZGVjb2RlVVJJQ29tcG9uZW50KGgpfWVsc2UgaWYoZCl7aWYoMD09PWQuaW5kZXhPZigieG4tLSIpKXJldHVybiExO2U9ZC5yZXBsYWNlKC8tL2csIi4iKS5yZXBsYWNlKC9cLlwuL2csIi0iKX12YXIgaz1hLnJlcGxhY2Uoc2csIiIpLGw9ZS5yZXBsYWNlKHNnLCIiKSxtO2lmKCEobT1rPT09bCkpe3ZhciBuPSIuIitsO209ay5zdWJzdHJpbmcoay5sZW5ndGgtbi5sZW5ndGgsay5sZW5ndGgpPT09bn1yZXR1cm4gbX0sSGc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hMT09PWE/ITE6YXx8Ynx8R2coKX07dmFyIElnPS9eXHcrJC8sSmc9L15bXHctXSskLyxLZz0vXn4/W1x3LV0rJC8sTGc9e2F3OiJfYXciLGRjOiJfZGMiLGdmOiJfZ2YiLGhhOiJfaGEiLGdwOiJfZ3AifTtmdW5jdGlvbiBNZyhhKXtyZXR1cm4gYSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLm1hdGNoKElnKT9hOiJfZ2NsIn0KdmFyIE9nPWZ1bmN0aW9uKCl7dmFyIGE9YWYoRi5sb2NhdGlvbi5ocmVmKSxiPSRlKGEsInF1ZXJ5IiwhMSx2b2lkIDAsImdjbGlkIiksYz0kZShhLCJxdWVyeSIsITEsdm9pZCAwLCJnY2xzcmMiKSxkPSRlKGEsInF1ZXJ5IiwhMSx2b2lkIDAsImRjbGlkIik7aWYoIWJ8fCFjKXt2YXIgZT1hLmhhc2gucmVwbGFjZSgiIyIsIiIpO2I9Ynx8WGUoZSwiZ2NsaWQiLHZvaWQgMCk7Yz1jfHxYZShlLCJnY2xzcmMiLHZvaWQgMCl9cmV0dXJuIE5nKGIsYyxkKX0sTmc9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9LGU9ZnVuY3Rpb24oZixoKXtkW2hdfHwoZFtoXT1bXSk7ZFtoXS5wdXNoKGYpfTtkLmdjbGlkPWE7ZC5nY2xzcmM9YjtkLmRjbGlkPWM7aWYodm9pZCAwIT09YSYmYS5tYXRjaChKZykpc3dpdGNoKGIpe2Nhc2Ugdm9pZCAwOmUoYSwiYXciKTticmVhaztjYXNlICJhdy5kcyI6ZShhLCJhdyIpO2UoYSwiZGMiKTticmVhaztjYXNlICJkcyI6ZShhLCJkYyIpO2JyZWFrO2Nhc2UgIjNwLmRzIjoodm9pZCAwPT0KcmYuZ3RtXzNwZHM/MDpyZi5ndG1fM3BkcykmJmUoYSwiZGMiKTticmVhaztjYXNlICJnZiI6ZShhLCJnZiIpO2JyZWFrO2Nhc2UgImhhIjplKGEsImhhIik7YnJlYWs7Y2FzZSAiZ3AiOmUoYSwiZ3AiKX1jJiZlKGMsImRjIik7cmV0dXJuIGR9LFFnPWZ1bmN0aW9uKGEpe3ZhciBiPU9nKCk7UGcoYixhKX07CmZ1bmN0aW9uIFBnKGEsYixjKXtmdW5jdGlvbiBkKHIsdSl7dmFyIHA9UmcocixlKTtwJiYkZihwLHUsaCxmLGwsITApfWI9Ynx8e307dmFyIGU9TWcoYi5wcmVmaXgpLGY9Yi5kb21haW58fCJhdXRvIixoPWIucGF0aHx8Ii8iLGs9dm9pZCAwPT1iLk1hPzc3NzZFMzpiLk1hO2M9Y3x8RWEoKTt2YXIgbD0wPT1rP3ZvaWQgMDpuZXcgRGF0ZShjKzFFMyprKSxtPU1hdGgucm91bmQoYy8xRTMpLG49ZnVuY3Rpb24ocil7cmV0dXJuWyJHQ0wiLG0scl0uam9pbigiLiIpfTthLmF3JiYoITA9PT1iLlpoP2QoImF3IixuKCJ+IithLmF3WzBdKSk6ZCgiYXciLG4oYS5hd1swXSkpKTthLmRjJiZkKCJkYyIsbihhLmRjWzBdKSk7YS5nZiYmZCgiZ2YiLG4oYS5nZlswXSkpO2EuaGEmJmQoImhhIixuKGEuaGFbMF0pKTthLmdwJiZkKCJncCIsbihhLmdwWzBdKSl9CnZhciBUZz1mdW5jdGlvbihhLGIsYyxkLGUpe2Zvcih2YXIgZj16ZygpLGg9TWcoYiksaz0wO2s8YS5sZW5ndGg7KytrKXt2YXIgbD1hW2tdO2lmKHZvaWQgMCE9PUxnW2xdKXt2YXIgbT1SZyhsLGgpLG49ZlttXTtpZihuKXt2YXIgcj1NYXRoLm1pbihTZyhuKSxFYSgpKSx1O2I6e2Zvcih2YXIgcD1yLHQ9UmYobSxHLmNvb2tpZSksdj0wO3Y8dC5sZW5ndGg7Kyt2KWlmKFNnKHRbdl0pPnApe3U9ITA7YnJlYWsgYn11PSExfXV8fCRmKG0sbixjLGQsMD09ZT92b2lkIDA6bmV3IERhdGUocisxRTMqKG51bGw9PWU/Nzc3NkUzOmUpKSwhMCl9fX12YXIgdz17cHJlZml4OmIscGF0aDpjLGRvbWFpbjpkfTtQZyhOZyhmLmdjbGlkLGYuZ2Nsc3JjKSx3KX0sUmc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MZ1thXTtpZih2b2lkIDAhPT1jKXJldHVybiBiK2N9LFNnPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3BsaXQoIi4iKTtyZXR1cm4gMyE9PWIubGVuZ3RofHwiR0NMIiE9PWJbMF0/MDoxRTMqKE51bWJlcihiWzFdKXx8CjApfTtmdW5jdGlvbiBVZyhhKXt2YXIgYj1hLnNwbGl0KCIuIik7aWYoMz09Yi5sZW5ndGgmJiJHQ0wiPT1iWzBdJiZiWzFdKXJldHVybiBiWzJdfQp2YXIgVmc9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihyYShiKSl7dmFyIGY9TWcoZSk7RWcoZnVuY3Rpb24oKXtmb3IodmFyIGg9e30saz0wO2s8YS5sZW5ndGg7KytrKXt2YXIgbD1SZyhhW2tdLGYpO2lmKGwpe3ZhciBtPVJmKGwsRy5jb29raWUpO20ubGVuZ3RoJiYoaFtsXT1tLnNvcnQoKVttLmxlbmd0aC0xXSl9fXJldHVybiBofSxiLGMsZCl9fSxXZz1mdW5jdGlvbihhKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIEtnLnRlc3QoYil9KX0sWGc9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9TWcoYiYmYi5wcmVmaXgpLGQ9e30sZT0wO2U8YS5sZW5ndGg7ZSsrKUxnW2FbZV1dJiYoZFthW2VdXT1MZ1thW2VdXSk7QyhkLGZ1bmN0aW9uKGYsaCl7dmFyIGs9UmYoYytoLEcuY29va2llKTtpZihrLmxlbmd0aCl7dmFyIGw9a1swXSxtPVNnKGwpLG49e307bltmXT1bVWcobCldO1BnKG4sYixtKX19KX0sWWc9ZnVuY3Rpb24oKXt2YXIgYT1bIiIsImF3LmRzIl0sYj1PZygpLApjPWIuZ2NsaWQsZD1iLmdjbHNyY3x8IiI7YyYmLTEhPT1hLmluZGV4T2YoZCkmJkZnKGZ1bmN0aW9uKCl7dmFyIGU9e2djbGlkOmN9O2QmJihlLmdjbHNyYz1kKTtyZXR1cm4gZX0pfTtmdW5jdGlvbiBaZygpe3ZhciBhPU9nKCksYj1hLmdjbGlkLGM9YS5nY2xzcmM7aWYoYiYmKCFjfHwiYXcuZHMiPT09Yykpe3ZhciBkO1djLnJlcG9ydGVkX2djbGlkfHwoV2MucmVwb3J0ZWRfZ2NsaWQ9e30pO2Q9V2MucmVwb3J0ZWRfZ2NsaWQ7aWYoIWRbYl0pe2RbYl09ITA7dmFyIGU9Ii9wYWdlYWQvbGFuZGluZz9nY2xpZD0iK2VuY29kZVVSSUNvbXBvbmVudChiKTtjJiYoZSs9IiZnY2xzcmM9IitlbmNvZGVVUklDb21wb25lbnQoYykpO3NjKCJodHRwczovL3d3dy5nb29nbGUuY29tIitlKX19fTt2YXIgJGc7aWYoMz09PVZjLkNiLmxlbmd0aCkkZz0iZyI7ZWxzZXt2YXIgYWg9IkciO2FoPSJnIjskZz1haH0KdmFyIGJoPXsiIjoibiIsVUE6InUiLEFXOiJhIixEQzoiZCIsRzoiZSIsR0Y6ImYiLEhBOiJoIixHVE06JGcsT1BUOiJvIn0sY2g9ZnVuY3Rpb24oYSl7dmFyIGI9VmMucy5zcGxpdCgiLSIpLGM9YlswXS50b1VwcGVyQ2FzZSgpLGQ9YmhbY118fCJpIixlPWEmJiJHVE0iPT09Yz9iWzFdOiJPUFQiPT09Yz9iWzFdOiIiLGY7aWYoMz09PVZjLkNiLmxlbmd0aCl7dmFyIGg9dm9pZCAwO2g9aHx8KFdkKCk/InMiOiJvIik7Zj0iMiIrKGh8fCJ3Iil9ZWxzZSBmPQoiIjtyZXR1cm4gZitkK1ZjLkNiK2V9Owp2YXIgZGg9ZnVuY3Rpb24oYSl7dmFyIGI9R2YoYSwiL3BhZ2VhZC9jb252ZXJzaW9uX2FzeW5jLmpzIik7cmV0dXJuIGI/YjotMT09PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJmaXJlZm94Iik/USgiaHR0cHM6Ly8iLCJodHRwOi8vIiwid3d3Lmdvb2dsZWFkc2VydmljZXMuY29tL3BhZ2VhZC9jb252ZXJzaW9uX2FzeW5jLmpzIik6Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcGFnZWFkL2NvbnZlcnNpb25fYXN5bmMuanMifSxlaD0hMSxmaD1bXSxnaD1bImF3IiwiZGMiXSxoaD1mdW5jdGlvbihhKXt2YXIgYj1GLmdvb2dsZV90cmFja0NvbnZlcnNpb24sYz1hLmd0bV9vbkZhaWx1cmU7ImZ1bmN0aW9uIj09dHlwZW9mIGI/YihhKXx8YygpOmMoKX0saWg9ZnVuY3Rpb24oKXtmb3IoOzA8ZmgubGVuZ3RoOyloaChmaC5zaGlmdCgpKX0samg9ZnVuY3Rpb24oYSl7aWYoIWVoKXtlaD0hMDtKZSgpO3ZhciBiPWZ1bmN0aW9uKCl7aWgoKTtmaD17cHVzaDpoaH19OwpXZCgpP2IoKTppYyhhLGIsZnVuY3Rpb24oKXtpaCgpO2VoPSExfSl9fSxraD1mdW5jdGlvbihhKXtpZihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7KytjKXt2YXIgZD1hW2NdO2QmJmIucHVzaCh7aXRlbV9pZDpkLmlkLHF1YW50aXR5OmQucXVhbnRpdHksdmFsdWU6ZC5wcmljZSxzdGFydF9kYXRlOmQuc3RhcnRfZGF0ZSxlbmRfZGF0ZTpkLmVuZF9kYXRlfSl9cmV0dXJuIGJ9fSxsaD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1TYyhhKSxmPWI9PUouQyxoPWUub1swXSxrPWUub1sxXSxsPXZvaWQgMCE9PWssbT1mdW5jdGlvbihXKXtyZXR1cm4gZC5nZXRXaXRoQ29uZmlnKFcpfSxuPSExIT09bShKLkVhKSxyPW0oSi5EYSl8fG0oSi5TKSx1PW0oSi5PKSxwPW0oSi5ZKSx0PW0oSi5xYSksdj1kaCh0KTtpZihmKXt2YXIgdz1tKEoubmEpfHx7fTtpZihuKXtIZyh3W0ouV2FdLCEhd1tKLkZdKSYmVGcoZ2gscix2b2lkIDAsdSxwKTt2YXIgeT17cHJlZml4OnIsZG9tYWluOnUsCk1hOnB9O1FnKHkpO1hnKFsiYXciLCJkYyJdLHkpfXdbSi5GXSYmVmcoZ2gsd1tKLkZdLHdbSi5aYV0sISF3W0ouWWFdLHIpO3ZhciB4PSExO3g9ITA7eD9pZShlLGQpOmllKGUpO1pnKCk7fXZhciBCPSExPT09bShKLkVkKXx8ITE9PT1tKEouY2IpOwppZighZnx8IWwmJiFCKWlmKCEwPT09bShKLkZkKSYmKGw9ITEpLCExIT09bShKLlgpfHxsKXt2YXIgQT17Z29vZ2xlX2NvbnZlcnNpb25faWQ6aCxnb29nbGVfcmVtYXJrZXRpbmdfb25seTohbCxvbmxvYWRfY2FsbGJhY2s6ZC5CLGd0bV9vbkZhaWx1cmU6ZC53LGdvb2dsZV9jb252ZXJzaW9uX2Zvcm1hdDoiMyIsZ29vZ2xlX2NvbnZlcnNpb25fY29sb3I6ImZmZmZmZiIsZ29vZ2xlX2NvbnZlcnNpb25fZG9tYWluOiIiLGdvb2dsZV9jb252ZXJzaW9uX2xhYmVsOmssZ29vZ2xlX2NvbnZlcnNpb25fbGFuZ3VhZ2U6bShKLkdhKSxnb29nbGVfY29udmVyc2lvbl92YWx1ZTptKEouYWEpLGdvb2dsZV9jb252ZXJzaW9uX2N1cnJlbmN5Om0oSi5pYSksZ29vZ2xlX2NvbnZlcnNpb25fb3JkZXJfaWQ6bShKLmViKSxnb29nbGVfdXNlcl9pZDptKEouZmIpLGdvb2dsZV9jb252ZXJzaW9uX3BhZ2VfdXJsOm0oSi4kYSksZ29vZ2xlX2NvbnZlcnNpb25fcmVmZXJyZXJfdXJsOm0oSi5hYiksZ29vZ2xlX2d0bTpjaCgpLApnb29nbGVfdHJhbnNwb3J0X3VybDpHZih0LCIvIil9O0EuZ29vZ2xlX3Jlc3RyaWN0ZWRfZGF0YV9wcm9jZXNzaW5nPW0oSi52Yyk7V2QoKSYmKEEub3B0X2ltYWdlX2dlbmVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgSW1hZ2V9LEEuZ29vZ2xlX2VuYWJsZV9kaXNwbGF5X2Nvb2tpZV9tYXRjaD0hMSk7ITE9PT1tKEouWCkmJihBLmdvb2dsZV9hbGxvd19hZF9wZXJzb25hbGl6YXRpb25fc2lnbmFscz0hMSk7QS5nb29nbGVfcmVhZF9nY2xfY29va2llX29wdF9vdXQ9IW47biYmciYmKEEuZ29vZ2xlX2djbF9jb29raWVfcHJlZml4PXIpO3ZhciB6PWZ1bmN0aW9uKCl7dmFyIFc9bShKLk9iKSxjYT17ZXZlbnQ6Yn07aWYocmEoVykpe2pkKCJHVE0iLDI2KTtmb3IodmFyIGRhPTA7ZGE8Vy5sZW5ndGg7KytkYSl7dmFyIE09CldbZGFdLE49bShNKTt2b2lkIDAhPT1OJiYoY2FbTV09Til9cmV0dXJuIGNhfXZhciBQPWQuZXZlbnRNb2RlbDtpZighUClyZXR1cm4gbnVsbDtEKFAsY2EpO2Zvcih2YXIgVD0wO1Q8Si5CZC5sZW5ndGg7KytUKWRlbGV0ZSBjYVtKLkJkW1RdXTtyZXR1cm4gY2F9KCk7eiYmKEEuZ29vZ2xlX2N1c3RvbV9wYXJhbXM9eik7IWwmJm0oSi5NKSYmKEEuZ29vZ2xlX2d0YWdfZXZlbnRfZGF0YT17aXRlbXM6bShKLk0pLHZhbHVlOm0oSi5hYSl9KTtpZihsJiZiPT1KLm1hKXtBLmdvb2dsZV9jb252ZXJzaW9uX21lcmNoYW50X2lkPW0oSi5MZCk7QS5nb29nbGVfYmFza2V0X2ZlZWRfY291bnRyeT1tKEouSWQpO0EuZ29vZ2xlX2Jhc2tldF9mZWVkX2xhbmd1YWdlPW0oSi5LZCk7QS5nb29nbGVfYmFza2V0X2Rpc2NvdW50PW0oSi5HZCk7QS5nb29nbGVfYmFza2V0X3RyYW5zYWN0aW9uX3R5cGU9YjtBLmdvb2dsZV9kaXNhYmxlX21lcmNoYW50X3JlcG9ydGVkX2NvbnZlcnNpb25zPSEwPT09bShKLlFkKTsKV2QoKSYmKEEuZ29vZ2xlX2Rpc2FibGVfbWVyY2hhbnRfcmVwb3J0ZWRfY29udmVyc2lvbnM9ITApO3ZhciBFPWtoKG0oSi5NKSk7RSYmKEEuZ29vZ2xlX2NvbnZlcnNpb25faXRlbXM9RSl9dmFyIEg9ZnVuY3Rpb24oVyxjYSl7dm9pZCAwIT1jYSYmIiIhPT1jYSYmKEEuZ29vZ2xlX2FkZGl0aW9uYWxfY29udmVyc2lvbl9wYXJhbXM9QS5nb29nbGVfYWRkaXRpb25hbF9jb252ZXJzaW9uX3BhcmFtc3x8e30sQS5nb29nbGVfYWRkaXRpb25hbF9jb252ZXJzaW9uX3BhcmFtc1tXXT1jYSl9O2wmJihIKCJ2ZG5jIixtKEouWmQpKSxIKCJ2ZGx0diIsbShKLk9kKSkpO3ZhciBLPSEwOwpLJiZmaC5wdXNoKEEpfWpoKHYpfTt2YXIgbWg9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZWMudXNlckFnZW50KyhHLmNvb2tpZXx8IiIpKyhHLnJlZmVycmVyfHwiIiksYj1hLmxlbmd0aCxjPUYuaGlzdG9yeS5sZW5ndGg7MDxjOylhKz1jLS1eYisrO3ZhciBkPTEsZSxmLGg7aWYoYSlmb3IoZD0wLGY9YS5sZW5ndGgtMTswPD1mO2YtLSloPWEuY2hhckNvZGVBdChmKSxkPShkPDw2JjI2ODQzNTQ1NSkraCsoaDw8MTQpLGU9ZCYyNjYzMzgzMDQsZD0wIT1lP2ReZT4+MjE6ZDtyZXR1cm5bTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpXmQmMjE0NzQ4MzY0NyxNYXRoLnJvdW5kKEVhKCkvMUUzKV0uam9pbigiLiIpfSxwaD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uaChiKTtyZXR1cm4gVWYoYSxlLG9oKGMpLGQpfSxxaD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0iIituaChjKSxmPW9oKGQpOzE8ZiYmKGUrPSItIitmKTtyZXR1cm5bYixlLGFdLmpvaW4oIi4iKX0sbmg9ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIDE7CmE9MD09PWEuaW5kZXhPZigiLiIpP2Euc3Vic3RyKDEpOmE7cmV0dXJuIGEuc3BsaXQoIi4iKS5sZW5ndGh9LG9oPWZ1bmN0aW9uKGEpe2lmKCFhfHwiLyI9PT1hKXJldHVybiAxOyIvIiE9PWFbMF0mJihhPSIvIithKTsiLyIhPT1hW2EubGVuZ3RoLTFdJiYoYSs9Ii8iKTtyZXR1cm4gYS5zcGxpdCgiLyIpLmxlbmd0aC0xfTt2YXIgcmg9WyIxIl0sc2g9e30sd2g9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGgoYSk7c2hbZV18fHVoKGUsYixjKXx8KHZoKGUsbWgoKSxiLGMsZCksdWgoZSxiLGMpKX07ZnVuY3Rpb24gdmgoYSxiLGMsZCxlKXt2YXIgZj1xaChiLCIxIixkLGMpOyRmKGEsZixjLGQsMD09ZT92b2lkIDA6bmV3IERhdGUoRWEoKSsxRTMqKHZvaWQgMD09ZT83Nzc2RTM6ZSkpKX1mdW5jdGlvbiB1aChhLGIsYyl7dmFyIGQ9cGgoYSxiLGMscmgpO2QmJihzaFthXT1kKTtyZXR1cm4gZH1mdW5jdGlvbiB0aChhKXtyZXR1cm4oYXx8Il9nY2wiKSsiX2F1In07dmFyIHhoPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9Ry5jb29raWUuc3BsaXQoIjsiKSxjPS9eXHMqX2dhY18oVUEtXGQrLVxkKyk9XHMqKC4rPylccyokLyxkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBlPWJbZF0ubWF0Y2goYyk7ZSYmYS5wdXNoKHtoZDplWzFdLHZhbHVlOmVbMl19KX12YXIgZj17fTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBmO2Zvcih2YXIgaD0wO2g8YS5sZW5ndGg7aCsrKXt2YXIgaz1hW2hdLnZhbHVlLnNwbGl0KCIuIik7IjEiPT1rWzBdJiYzPT1rLmxlbmd0aCYma1sxXSYmKGZbYVtoXS5oZF18fChmW2FbaF0uaGRdPVtdKSxmW2FbaF0uaGRdLnB1c2goe3RpbWVzdGFtcDprWzFdLGxnOmtbMl19KSl9cmV0dXJuIGZ9O3ZhciB5aD0vXlxkK1wuZmxzXC5kb3VibGVjbGlja1wubmV0JC87ZnVuY3Rpb24gemgoYSl7dmFyIGI9YWYoRi5sb2NhdGlvbi5ocmVmKSxjPSRlKGIsImhvc3QiLCExKTtpZihjJiZjLm1hdGNoKHloKSl7dmFyIGQ9JGUoYiwicGF0aCIpLnNwbGl0KGErIj0iKTtpZigxPGQubGVuZ3RoKXJldHVybiBkWzFdLnNwbGl0KCI7IilbMF0uc3BsaXQoIj8iKVswXX19CmZ1bmN0aW9uIEFoKGEsYil7aWYoImF3Ij09YXx8ImRjIj09YSl7dmFyIGM9emgoImdjbCIrYSk7aWYoYylyZXR1cm4gYy5zcGxpdCgiLiIpfXZhciBkPU1nKGIpO2lmKCJfZ2NsIj09ZCl7dmFyIGU7ZT1PZygpW2FdfHxbXTtpZigwPGUubGVuZ3RoKXJldHVybiBlfXZhciBmPVJnKGEsZCksaDtpZihmKXt2YXIgaz1bXTtpZihHLmNvb2tpZSl7dmFyIGw9UmYoZixHLmNvb2tpZSk7aWYobCYmMCE9bC5sZW5ndGgpe2Zvcih2YXIgbT0wO208bC5sZW5ndGg7bSsrKXt2YXIgbj1VZyhsW21dKTtuJiYtMT09PXEoayxuKSYmay5wdXNoKG4pfWg9V2coayl9ZWxzZSBoPWt9ZWxzZSBoPWt9ZWxzZSBoPVtdO3JldHVybiBofQp2YXIgQmg9ZnVuY3Rpb24oKXt2YXIgYT16aCgiZ2FjIik7aWYoYSlyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGEpO3ZhciBiPXhoKCksYz1bXTtDKGIsZnVuY3Rpb24oZCxlKXtmb3IodmFyIGY9W10saD0wO2g8ZS5sZW5ndGg7aCsrKWYucHVzaChlW2hdLmxnKTtmPVdnKGYpO2YubGVuZ3RoJiZjLnB1c2goZCsiOiIrZi5qb2luKCIsIikpfSk7cmV0dXJuIGMuam9pbigiOyIpfSxDaD1mdW5jdGlvbihhLGIsYyxkLGUpe3doKGIsYyxkLGUpO3ZhciBmPXNoW3RoKGIpXSxoPU9nKCkuZGN8fFtdLGs9ITE7aWYoZiYmMDxoLmxlbmd0aCl7dmFyIGw9V2Muam9pbmVkX2F1PVdjLmpvaW5lZF9hdXx8e30sbT1ifHwiX2djbCI7aWYoIWxbbV0pZm9yKHZhciBuPTA7bjxoLmxlbmd0aDtuKyspe3ZhciByPSJodHRwczovL2Fkc2VydmljZS5nb29nbGUuY29tL2RkbS9yZWdjbGsiO3I9cisiP2djbGlkPSIraFtuXSsiJmF1aWRkYz0iK2Y7c2Mocik7az1sW21dPSEwfX1udWxsPT1hJiYoYT1rKTtpZihhJiZmKXt2YXIgdT0KdGgoYikscD1zaFt1XTtwJiZ2aCh1LHAsYyxkLGUpfX07CnZhciBEaD1mdW5jdGlvbihhKXtyZXR1cm4hKHZvaWQgMD09PWF8fG51bGw9PT1hfHwwPT09KGErIiIpLmxlbmd0aCl9LEVoPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoMj09PWIuVylyZXR1cm4gYSgib3JkIix3YSgxRTExLDFFMTMpKSwhMDtpZigzPT09Yi5XKXJldHVybiBhKCJvcmQiLCIxIiksYSgibnVtIix3YSgxRTExLDFFMTMpKSwhMDtpZig0PT09Yi5XKXJldHVybiBEaChiLnNlc3Npb25JZCkmJmEoIm9yZCIsYi5zZXNzaW9uSWQpLCEwO2lmKDU9PT1iLlcpYz0iMSI7ZWxzZSBpZig2PT09Yi5XKWM9Yi5jZDtlbHNlIHJldHVybiExO0RoKGMpJiZhKCJxdHkiLGMpO0RoKGIuSmIpJiZhKCJjb3N0IixiLkpiKTtEaChiLnRyYW5zYWN0aW9uSWQpJiZhKCJvcmQiLGIudHJhbnNhY3Rpb25JZCk7cmV0dXJuITB9LEZoPWVuY29kZVVSSUNvbXBvbmVudCxHaD1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMobixyLHUpe2YuaGFzT3duUHJvcGVydHkobil8fChyKz0iIixlKz0iOyIrbisiPSIrCih1P3I6RmgocikpKX12YXIgZD1hLkljLGU9YS5wcm90b2NvbDtlKz1hLmNjPyIvLyIrZCsiLmZscy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHlpIjoiLy9hZC5kb3VibGVjbGljay5uZXQvYWN0aXZpdHkiO2UrPSI7c3JjPSIrRmgoZCkrKCI7dHlwZT0iK0ZoKGEuTGMpKSsoIjtjYXQ9IitGaChhLmhiKSk7dmFyIGY9YS5iZ3x8e307QyhmLGZ1bmN0aW9uKG4scil7ZSs9IjsiK0ZoKG4pKyI9IitGaChyKyIiKX0pO2lmKEVoKGMsYSkpe0RoKGEubWMpJiZjKCJ1IixhLm1jKTtEaChhLmtjKSYmYygidHJhbiIsYS5rYyk7YygiZ3RtIixjaCgpKTshMT09PWEuR2YmJmMoIm5wYSIsIjEiKTtpZihhLkhjKXt2YXIgaD1BaCgiZGMiLGEuSGEpO2gmJmgubGVuZ3RoJiZjKCJnY2xkYyIsaC5qb2luKCIuIikpO3ZhciBrPUFoKCJhdyIsYS5IYSk7ayYmay5sZW5ndGgmJmMoImdjbGF3IixrLmpvaW4oIi4iKSk7dmFyIGw9QmgoKTtsJiZjKCJnYWMiLGwpO3doKGEuSGEsdm9pZCAwLGEuWWYsYS5aZik7CnZhciBtPXNoW3RoKGEuSGEpXTttJiZjKCJhdWlkZGMiLG0pfURoKGEuWmMpJiZjKCJwcmQiLGEuWmMsITApO0MoYS5rZCxmdW5jdGlvbihuLHIpe2MobixyKX0pO2UrPWJ8fCIiO0RoKGEuWGIpJiZjKCJ+b3JlZiIsYS5YYik7YS5jYz9rYyhlKyI/IixhLkIpOmxjKGUrIj8iLGEuQixhLncpfWVsc2UgSShhLncpfTsKdmFyIEhoPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgaD17Y29uZmlnOmEsZ3RtOmNoKCl9O2MmJih3aChkLHZvaWQgMCxlLGYpLGguYXVpZGRjPXNoW3RoKGQpXSk7YiYmKGgubG9hZEluc2VjdXJlPWIpO3ZvaWQgMD09PUYuX19kY19uc19wcm9jZXNzb3ImJihGLl9fZGNfbnNfcHJvY2Vzc29yPVtdKTtGLl9fZGNfbnNfcHJvY2Vzc29yLnB1c2goaCk7aWMoKGI/Imh0dHAiOiJodHRwcyIpKyI6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZGNsay9ucy92MS5qcyIpfSxJaD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9L151KFsxLTldXGQ/fDEwMCkkLyxlPWEuZ2V0V2l0aENvbmZpZyhKLlBlKXx8e30sZj1SZChiLGMpO2Y9UWYoYSk7dmFyIGg9e30saz17fTtpZihQYShlKSlmb3IodmFyIGwgaW4gZSlpZihlLmhhc093blByb3BlcnR5KGwpJiYKZC50ZXN0KGwpKXt2YXIgbT1lW2xdO2cobSkmJihoW2xdPW0pfWZvcih2YXIgbj0wO248Zi5sZW5ndGg7bisrKXt2YXIgcj1mW25dO2QudGVzdChyKSYmKGhbcl09cil9Zm9yKHZhciB1IGluIGgpaC5oYXNPd25Qcm9wZXJ0eSh1KSYmKGtbdV09YS5nZXRXaXRoQ29uZmlnKGhbdV0pKTtyZXR1cm4ga30sSmg9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihsLG0sbil7dm9pZCAwIT09biYmMCE9PShuKyIiKS5sZW5ndGgmJmQucHVzaChsK20rIjoiK2MobisiIikpfXZhciBjPWVuY29kZVVSSUNvbXBvbmVudCxkPVtdLGU9YShKLk0pfHxbXTtpZihyYShlKSlmb3IodmFyIGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGg9ZVtmXSxrPWYrMTtiKCJpIixrLGguaWQpO2IoInAiLGssaC5wcmljZSk7YigicSIsayxoLnF1YW50aXR5KTtiKCJjIixrLGEoSi5OZSkpO2IoImwiLGssYShKLkdhKSl9cmV0dXJuIGQuam9pbigifCIpfSxLaD1mdW5jdGlvbihhKXt2YXIgYj0vXkRDLShcZCspKFwvKFtcdy1dKylcLyhbXHctXSspXCsoXHcrKSk/JC8uZXhlYyhhKTsKaWYoYil7dmFyIGM9e3N0YW5kYXJkOjIsdW5pcXVlOjMscGVyX3Nlc3Npb246NCx0cmFuc2FjdGlvbnM6NSxpdGVtc19zb2xkOjYsIiI6MX1bKGJbNV18fCIiKS50b0xvd2VyQ2FzZSgpXTtpZihjKXJldHVybntjb250YWluZXJJZDoiREMtIitiWzFdLFU6YlszXT9hOiIiLEFmOmJbMV0semY6YlszXXx8IiIsaGI6Yls0XXx8IiIsVzpjfX19LE1oPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPUtoKGEpO2lmKGUpe3ZhciBmPWZ1bmN0aW9uKEspe3JldHVybiBkLmdldFdpdGhDb25maWcoSyl9LGg9ITEhPT1mKEouRWEpLGs9ZihKLkRhKXx8ZihKLlMpLGw9ZihKLk8pLG09ZihKLlkpLG49ZihKLlNlKSxyPTM9PT1YZCgpO2lmKGI9PT1KLkMpe3ZhciB1PWYoSi5uYSl8fHt9LHA9ZihKLndiKSx0PXZvaWQgMD09PXA/ITA6ISFwO2lmKGgpe2lmKEhnKHVbSi5XYV0sISF1W0ouRl0pKXtUZyhMaCxrLHZvaWQgMCxsLAptKTt9dmFyIHY9e3ByZWZpeDprLGRvbWFpbjpsLE1hOm19O1FnKHYpO1hnKExoLHYpO0NoKHQsayx2b2lkIDAsbCxtKX1pZih1W0ouRl0pe1ZnKExoLHVbSi5GXSx1W0ouWmFdLCEhdVtKLllhXSxrKTt9aWYobiYmbi5leGNsdXNpb25fcGFyYW1ldGVycyYmbi5lbmdpbmVzKWlmKFdkKCkpe31lbHNlIEhoKG4scixoLGssbCxtKTtJKGQuQil9ZWxzZXt2YXIgdz17fSx5PWYoSi5RZSk7aWYoUGEoeSkpZm9yKHZhciB4IGluIHkpaWYoeS5oYXNPd25Qcm9wZXJ0eSh4KSl7dmFyIEI9eVt4XTt2b2lkIDAhPT1CJiZudWxsIT09CkImJih3W3hdPUIpfXZhciBBPSIiO2lmKDU9PT1lLld8fDY9PT1lLlcpQT1KaChmKTt2YXIgej1JaChkLGUuY29udGFpbmVySWQsZS5VKSxFPSEwPT09ZihKLnVoKTtpZihXZCgpJiZFKXtFPSExfXZhciBIPXtoYjplLmhiLEhjOmgsWWY6bCxaZjptLEhhOmssSmI6ZihKLmFhKSxXOmUuVyxiZzp3LEljOmUuQWYsTGM6ZS56Zix3OmQudyxCOmQuQixYYjpaZShhZihGLmxvY2F0aW9uLmhyZWYpKSxaYzpBLHByb3RvY29sOnI/Imh0dHA6IjoiaHR0cHM6IixjZDpmKEoubmYpLGNjOkUsc2Vzc2lvbklkOmYoSi5UYiksa2M6dm9pZCAwLHRyYW5zYWN0aW9uSWQ6ZihKLmViKSxtYzp2b2lkIDAsa2Q6eixHZjohMSE9PWYoSi5YKX07R2goSCl9fWVsc2UgSShkLncpfSxMaD1bImF3IiwiZGMiXTsKdmFyIE9oPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEuaGFzT3duUHJvcGVydHkoImNvbnZlcnNpb25fZGF0YSIpKWI9ImNvbnZlcnNpb25fZGF0YSI7ZWxzZSBpZihhLmhhc093blByb3BlcnR5KCJwcmljZSIpKWI9InByaWNlIjtlbHNlIHJldHVybjt2YXIgYz1iLGQ9TmgoSlNPTi5zdHJpbmdpZnkoYVtjXSkpLGU9TmgoYS5jb252ZXJzaW9uX2lkKSxmPSJodHRwczovL3d3dy5nb29nbGV0cmF2ZWxhZHNlcnZpY2VzLmNvbS90cmF2ZWwvZmxpZ2h0cy9jbGsvcGFnZWFkL2NvbnZlcnNpb24iO2Y9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdHJhdmVsL2ZsaWdodHMvY2xpY2svY29udmVyc2lvbiI7dmFyIGg9ZisiLyIrZSsiLz8iK2MrIj0iK2Q7aWYoYS5jb252ZXJzaW9uTGlua2VyRW5hYmxlZCl7dmFyIGs9CkFoKCJnZiIsYS5jb29raWVQcmVmaXgpO2lmKGsmJmsubGVuZ3RoKWZvcih2YXIgbD0wO2w8ay5sZW5ndGg7bCsrKWgrPSImZ2NsZ2Y9IitOaChrW2xdKX1sYyhoLGEub25TdWNjZXNzLGEub25GYWlsdXJlKX0sTmg9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hfHx2b2lkIDA9PT1hfHwwPT09U3RyaW5nKGEpLmxlbmd0aD8iIjplbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGEpKX07CnZhciBQaD0vLipcLmdvb2dsZVwuY29tKDpcZCspP1wvYm9va2luZ1wvZmxpZ2h0cy4qLyxSaD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mdW5jdGlvbih3KXtyZXR1cm4gZC5nZXRXaXRoQ29uZmlnKHcpfSxmPVNjKGEpLm9bMF0saD0hMSE9PWUoSi5FYSksaz1lKEouRGEpfHxlKEouUyksbD1lKEouTyksbT1lKEouWSk7aWYoYj09PUouQyl7aWYoaCl7dmFyIG49e3ByZWZpeDprLGRvbWFpbjpsLE1hOm19O1FnKG4pO1hnKFsiYXciLCJkYyJdLG4pfUkoZC5CKX1lbHNle3ZhciByPXtjb252ZXJzaW9uX2lkOmYsb25GYWlsdXJlOmQudyxvblN1Y2Nlc3M6ZC5CLGNvbnZlcnNpb25MaW5rZXJFbmFibGVkOmgsY29va2llUHJlZml4Omt9LHU9UGgudGVzdChGLmxvY2F0aW9uLmhyZWYpO2lmKGIhPT1KLm1hKUkoZC53KTtlbHNle3ZhciB0PXtwYXJ0bmVyX2lkOmYsdHJpcF90eXBlOmUoSi50ZiksdG90YWxfcHJpY2U6ZShKLmFhKSxjdXJyZW5jeTplKEouaWEpLGlzX2RpcmVjdF9ib29raW5nOnUsZmxpZ2h0X3NlZ21lbnQ6UWgoZShKLk0pKX0sdj1lKEouJGQpO3YmJiJvYmplY3QiPT09dHlwZW9mIHYmJih0LnBhc3NlbmdlcnNfdG90YWw9emEodi50b3RhbCksdC5wYXNzZW5nZXJzX2FkdWx0PXphKHYuYWR1bHQpLHQucGFzc2VuZ2Vyc19jaGlsZD16YSh2LmNoaWxkKSx0LnBhc3NlbmdlcnNfaW5mYW50X2luX3NlYXQ9emEodi5pbmZhbnRfaW5fc2VhdCksdC5wYXNzZW5nZXJzX2luZmFudF9pbl9sYXA9emEodi5pbmZhbnRfaW5fbGFwKSk7ci5jb252ZXJzaW9uX2RhdGE9dDtPaChyKX19fSxRaD0KZnVuY3Rpb24oYSl7aWYoYSl7Zm9yKHZhciBiPVtdLGM9MCxkPTA7ZDxhLmxlbmd0aDsrK2Qpe3ZhciBlPWFbZF07IWV8fHZvaWQgMCE9PWUuY2F0ZWdvcnkmJiIiIT09ZS5jYXRlZ29yeSYmIkZsaWdodFNlZ21lbnQiIT09ZS5jYXRlZ29yeXx8KGJbY109e2NhYmluOmUudHJhdmVsX2NsYXNzLGZhcmVfcHJvZHVjdDplLmZhcmVfcHJvZHVjdCxib29raW5nX2NvZGU6ZS5ib29raW5nX2NvZGUsZmxpZ2h0X251bWJlcjplLmZsaWdodF9udW1iZXIsb3JpZ2luOmUub3JpZ2luLGRlc3RpbmF0aW9uOmUuZGVzdGluYXRpb24sZGVwYXJ0dXJlX2RhdGU6ZS5zdGFydF9kYXRlfSxjKyspfXJldHVybiBifX07CnZhciBXaD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1TYyhhKSxmPWZ1bmN0aW9uKHkpe3JldHVybiBkLmdldFdpdGhDb25maWcoeSl9LGg9ITEhPT1mKEouRWEpLGs9ZihKLkRhKXx8ZihKLlMpLGw9ZihKLk8pLG09ZihKLlkpO2lmKGI9PT1KLkMpe3ZhciBuPWYoSi5uYSl8fHt9O2lmKGgpe0hnKG5bSi5XYV0sISFuW0ouRl0pJiZUZyhTaCxrLHZvaWQgMCxsLG0pO3ZhciByPXtwcmVmaXg6ayxkb21haW46bCxNYTptfTtRZyhyKTtYZyhbImF3IiwiZGMiXSxyKX1pZihuW0ouRl0pe1ZnKFNoLG5bSi5GXSxuW0ouWmFdLCEhbltKLllhXSxrKTt9SShkLkIpfWVsc2V7dmFyIHU9ZS5vWzBdO2lmKC9eXGQrJC8udGVzdCh1KSl7dmFyIHA9Imh0dHBzOi8vd3d3Lmdvb2dsZXRyYXZlbGFkc2VydmljZXMuY29tL3RyYXZlbC9jbGsvcGFnZWFkL2NvbnZlcnNpb24vIitlbmNvZGVVUklDb21wb25lbnQodSkrCiIvIjtpZihiPT09Si5tYSl7dmFyIHQ9VGgoZihKLmViKSxmKEouYWEpLGYoSi5pYSksZihKLk0pKTt0PWVuY29kZVVSSUNvbXBvbmVudChVaCh0KSk7cCs9Ij9kYXRhPSIrdH1lbHNlIGlmKGI9PT1KLkJhKXt2YXIgdj1WaCh1LGYoSi5hYSksZihKLlhkKSxmKEouaWEpLGYoSi5NKSk7dj1lbmNvZGVVUklDb21wb25lbnQoVWgodikpO3ArPSI/bGFiZWw9RkgmZ3VpZD1PTiZzY3JpcHQ9MCZvcmQ9Iit3YSgwLDQyOTQ5NjcyOTUpKygiJnByaWNlPSIrdil9ZWxzZXtJKGQudyk7cmV0dXJufWlmKGgpe3ZhciB3PWI9PT1KLkJhP0FoKCJhdyIsayk6QWgoImhhIixrKTtwKz13Lm1hcChmdW5jdGlvbih5KXtyZXR1cm4iJmdjbGhhPSIrZW5jb2RlVVJJQ29tcG9uZW50KHkpfSkuam9pbigiIil9bGMocCxkLkIsZC53KX1lbHNlIEkoZC53KX19LFRoPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXt9O1hoKGEpJiYoZS5oY3RfYm9va2luZ194cmVmPWEpO2coYykmJihlLmhjdF9jdXJyZW5jeV9jb2RlPQpjKTtYaChiKSYmKGUuaGN0X3RvdGFsX3ByaWNlPWIsZS5oY3RfYmFzZV9wcmljZT1iKTtpZighcmEoZCl8fDA9PT1kLmxlbmd0aClyZXR1cm4gZTt2YXIgZj1kWzBdO2lmKCFQYShmKSlyZXR1cm4gZTtYaChmW1loLnZhXSkmJihlLmhjdF9wYXJ0bmVyX2hvdGVsX2lkPWZbWWgudmFdKTtnKGZbWWguamFdKSYmKGUuaGN0X2NoZWNraW5fZGF0ZT1mW1loLmphXSk7ZyhmW1loLlJhXSkmJihlLmhjdF9jaGVja291dF9kYXRlPWZbWWguUmFdKTtyZXR1cm4gZX0sVmg9ZnVuY3Rpb24oYSxiLGMsZCxlKXtmdW5jdGlvbiBmKG4pe3ZvaWQgMD09PW4mJihuPTApO2lmKFhoKG4pKXJldHVybiBsK259ZnVuY3Rpb24gaChuLHIsdSl7dShyKSYmKGtbbl09cil9dmFyIGs9e307ay5wYXJ0bmVyX2lkPWE7dmFyIGw9IlVTRCI7ZyhkKSYmKGw9ay5jdXJyZW5jeT1kKTtYaChiKSYmKGsuYmFzZV9wcmljZV92YWx1ZV9zdHJpbmc9ZihiKSxrLmRpc3BsYXlfcHJpY2VfdmFsdWVfc3RyaW5nPWYoYikpO1hoKGMpJiYKKGsudGF4X3ByaWNlX3ZhbHVlX3N0cmluZz1mKGMpKTtnKCJMQU5ESU5HX1BBR0UiKSYmKGsucGFnZV90eXBlPSJMQU5ESU5HX1BBR0UiKTtpZighcmEoZSl8fDA9PWUubGVuZ3RoKXJldHVybiBrO3ZhciBtPWVbMF07aWYoIVBhKG0pKXJldHVybiBrO1hoKG1bWWguSmRdKSYmKGsudG90YWxfcHJpY2VfdmFsdWVfc3RyaW5nPWYobVtZaC5KZF0pKTtoKCJwYXJ0bmVyX2hvdGVsX2lkIixtW1loLnZhXSxYaCk7aCgiY2hlY2tfaW5fZGF0ZSIsbVtZaC5qYV0sZyk7aCgiY2hlY2tfb3V0X2RhdGUiLG1bWWguUmFdLGcpO2goImFkdWx0cyIsbVtZaC5oZl0sWmgpO2goWWguTmQsbVtZaC5OZF0sZyk7aChZaC5NZCxtW1loLk1kXSxnKTtyZXR1cm4ga30sVWg9ZnVuY3Rpb24oYSl7dmFyIGI9W107QyhhLGZ1bmN0aW9uKGMsZCl7Yi5wdXNoKGMrIj0iK2QpfSk7cmV0dXJuIGIuam9pbigiOyIpfSxYaD1mdW5jdGlvbihhKXtyZXR1cm4gZyhhKXx8WmgoYSl9LFpoPWZ1bmN0aW9uKGEpe3JldHVybiJudW1iZXIiPT09CnR5cGVvZiBhfSxZaD17dmE6ImlkIixKZDoicHJpY2UiLGphOiJzdGFydF9kYXRlIixSYToiZW5kX2RhdGUiLGhmOiJvY2N1cGFuY3kiLE5kOiJyb29tX2lkIixNZDoicmF0ZV9ydWxlX2lkIn0sU2g9WyJoYSJdOwp2YXIgYmk9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9U2MoYSksZj0hMSE9PWQuZ2V0V2l0aENvbmZpZyhKLkVhKSxoPWQuZ2V0V2l0aENvbmZpZyhKLkRhKXx8ZC5nZXRXaXRoQ29uZmlnKEouUyk7aWYoYj09PUouQyl7aWYoZil7dmFyIGs9e3ByZWZpeDpofTtRZyhrKTtYZyhbImF3IiwiZGMiXSxrKX1JKGQuQil9ZWxzZSBpZihiPT09Si5tYSl7dmFyIGw9ZC5nZXRXaXRoQ29uZmlnKEouYWEpLG09ZC5nZXRXaXRoQ29uZmlnKEouaWEpLG49ZC5nZXRXaXRoQ29uZmlnKEouJGQpLHI9ZC5nZXRXaXRoQ29uZmlnKEouTSksdT17fTtpZihnKGwpfHwibnVtYmVyIj09PXR5cGVvZiBsKXUuYmFzZV9wcmljZV92YWx1ZV9zdHJpbmc9IiIrbStsLHUudGF4X3ByaWNlX3ZhbHVlX3N0cmluZz1tKyIwIjtQYShuKSYmIm51bWJlciI9PT10eXBlb2Ygbi5hZHVsdCYmKHUuYWR1bHRfY291bnQ9bi5hZHVsdCk7aWYocmEocikmJjAhPT1yLmxlbmd0aCl7dmFyIHA9clswXTtpZihQYShwKSl7aWYoZyhwWyRoLnZhXSl8fAoibnVtYmVyIj09PXR5cGVvZiBwWyRoLnZhXSl1LnBhcnRuZXJfaG90ZWxfaWQ9cFskaC52YV07ZyhwWyRoLmphXSkmJih1LmhvdGVsX2NoZWNraW5fZGF0ZT1wWyRoLmphXSk7dmFyIHQ9cFskaC5SYV07Zyh0KSYmKHUuaG90ZWxfY2hlY2tvdXRfZGF0ZT10LHUucmV0dXJuX2RhdGU9dCk7aWYoMSE9PXIubGVuZ3RoKXt2YXIgdj1yWzFdO2lmKFBhKHYpKXt1Lm9yaWdpbl9haXJwb3J0PXZbJGgua2ZdO3UuZGVwYXJ0dXJlX2RhdGU9dlskaC5qYV07Zm9yKHZhciB3PVt2WyRoLlRkXV0seT1bdlskaC50ZF1dLHg9W3ZbJGguemRdXSxCPW51bGwhPT10JiZnKHQpLEE9MSx6PTI7ejxyLmxlbmd0aDt6Kyspe3ZhciBFPXJbel07UGEoRSkmJih3LnB1c2goRVskaC5UZF0pLHkucHVzaChFWyRoLnRkXSkseC5wdXNoKEVbJGguemRdKSxCJiZFWyRoLmphXTx0JiYoQT16KSl9QiYmKHUuZGVzdGluYXRpb25fYWlycG9ydD1yW0FdWyRoLlJlXSk7dS5jYWJpbnM9dy5qb2luKCIsIik7dS5ib29raW5nX2NvZGVzPQp5LmpvaW4oIiwiKTt1LmZsaWdodF9udW1iZXJzPXguam9pbigiLCIpfX19fWFpKGUub1swXSx1LGYsaCxkLkIsZC53KX1lbHNlIEkoZC53KX0sYWk9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKC9eXGQrJC8udGVzdChhKSl7dmFyIGg9ZW5jb2RlVVJJQ29tcG9uZW50KGEpLGs9ZW5jb2RlVVJJQ29tcG9uZW50KGNpKGIpKSxsPSJodHRwczovL3d3dy5nb29nbGV0cmF2ZWxhZHNlcnZpY2VzLmNvbS90cmF2ZWwvdmFjYXRpb25zL2Nsay9wYWdlYWQvY29udmVyc2lvbi8iK2grIi8/ZGF0YT0iK2s7YyYmKGwrPUFoKCJncCIsZCkubWFwKGZ1bmN0aW9uKG0pe3JldHVybiImZ2NsZ3A9IitlbmNvZGVVUklDb21wb25lbnQobSl9KS5qb2luKCIiKSk7bGMobCxlLGYpfWVsc2UgSShmKX0sY2k9ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJmIucHVzaChjKyI9IithW2NdKTtyZXR1cm4gYi5qb2luKCI7Iil9LCRoPXt2YToiaWQiLGphOiJzdGFydF9kYXRlIiwKUmE6ImVuZF9kYXRlIixrZjoib3JpZ2luIixUZDoidHJhdmVsX2NsYXNzIix0ZDoiYm9va2luZ19jb2RlIix6ZDoiZmxpZ2h0X251bWJlciIsUmU6ImRlc3RpbmF0aW9uIn07CnZhciBtaT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0iaHR0cHM6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vYW5hbHl0aWNzLmpzIixmPVFlKCk7aWYocGEoZikpe3ZhciBoPSJndGFnXyIrYS5zcGxpdCgiLSIpLmpvaW4oIl8iKSxrPWZ1bmN0aW9uKHgpe3ZhciBCPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO0JbMF09aCsiLiIrQlswXTtmLmFwcGx5KHdpbmRvdyxCKX0sbD1mdW5jdGlvbigpe3ZhciB4PWZ1bmN0aW9uKEUsSCl7Zm9yKHZhciBLPTA7SCYmSzxILmxlbmd0aDtLKyspayhFLEhbS10pfSxCPWRpKGIsZCk7aWYoQil7dmFyIEE9Qi5hY3Rpb247aWYoImltcHJlc3Npb25zIj09PUEpeCgiZWM6YWRkSW1wcmVzc2lvbiIsQi51Zyk7ZWxzZSBpZigicHJvbW9fY2xpY2siPT09QXx8InByb21vX3ZpZXciPT09QSl7dmFyIHo9Qi4kYzt4KCJlYzphZGRQcm9tbyIsQi4kYyk7eiYmMDx6Lmxlbmd0aCYmInByb21vX2NsaWNrIj09PUEmJmsoImVjOnNldEFjdGlvbiIsQSl9ZWxzZSB4KCJlYzphZGRQcm9kdWN0IiwKQi5OYSksaygiZWM6c2V0QWN0aW9uIixBLEIuZ2IpfX0sbT1mdW5jdGlvbigpe2lmKFdkKCkpe31lbHNle3ZhciB4PWQuZ2V0V2l0aENvbmZpZyhKLmVmKTt4JiYoaygicmVxdWlyZSIseCx7ZGF0YUxheWVyOiJkYXRhTGF5ZXIifSksaygicmVxdWlyZSIsInJlbmRlciIpKX19LG49ZWkoYSxoLGIsZCk7ZmkoaCxuLklhKSYmKGYoZnVuY3Rpb24oKXtPZSgpJiZPZSgpLnJlbW92ZShoKX0pLGdpW2hdPSExKTtmKCJjcmVhdGUiLGEsbi5JYSk7KGZ1bmN0aW9uKCl7dmFyIHg9ZC5nZXRXaXRoQ29uZmlnKCJjdXN0b21fbWFwIik7ZihmdW5jdGlvbigpe2lmKFBhKHgpKXt2YXIgQj1uLmthLEE9T2UoKS5nZXRCeU5hbWUoaCksejtmb3IoeiBpbiB4KWlmKHguaGFzT3duUHJvcGVydHkoeikmJi9eKGRpbWVuc2lvbnxtZXRyaWMpXGQrJC8udGVzdCh6KSYmdm9pZCAwIT14W3pdKXt2YXIgRT1BLmdldChoaSh4W3pdKSk7aWkoQix6LEUpfX19KX0pKCk7KGZ1bmN0aW9uKHgpe2lmKHgpe3ZhciBCPXt9O2lmKFBhKHgpKWZvcih2YXIgQSBpbiBqaSlqaS5oYXNPd25Qcm9wZXJ0eShBKSYma2koamlbQV0sQSx4W0FdLEIpO2soInJlcXVpcmUiLCJsaW5raWQiLEIpfX0pKG4ubGlua0F0dHJpYnV0aW9uKTsKdmFyIHU9bltKLm5hXTtpZih1JiZ1W0ouRl0pe3ZhciBwPXVbSi5aYV07UmUoaCsiLiIsdVtKLkZdLHZvaWQgMD09PXA/ISF1LnVzZV9hbmNob3I6ImZyYWdtZW50Ij09PXAsISF1W0ouWWFdKX12YXIgdD1mdW5jdGlvbih4LEIsQSl7QSYmKEI9IiIrQik7bi5rYVt4XT1CfTtpZihiPT09Si5sZCltKCksaygic2VuZCIsInBhZ2V2aWV3IixuLmthKTtlbHNlIGlmKGI9PT1KLkMpe20oKTt2YXIgdj0hMTt2PSEwO3Y/aWUoYSxkKTppZShhKTswIT1uLnNlbmRQYWdlVmlldyYmaygic2VuZCIsInBhZ2V2aWV3IixuLmthKX1lbHNlInNjcmVlbl92aWV3Ij09PWI/aygic2VuZCIsInNjcmVlbnZpZXciLG4ua2EpOiJ0aW1pbmdfY29tcGxldGUiPT09Yj8odCgidGltaW5nQ2F0ZWdvcnkiLApuLmV2ZW50Q2F0ZWdvcnksITApLHQoInRpbWluZ1ZhciIsbi5uYW1lLCEwKSx0KCJ0aW1pbmdWYWx1ZSIsemEobi52YWx1ZSkpLHZvaWQgMCE9PW4uZXZlbnRMYWJlbCYmdCgidGltaW5nTGFiZWwiLG4uZXZlbnRMYWJlbCwhMCksaygic2VuZCIsInRpbWluZyIsbi5rYSkpOiJleGNlcHRpb24iPT09Yj9rKCJzZW5kIiwiZXhjZXB0aW9uIixuLmthKToib3B0aW1pemUuY2FsbGJhY2siIT09YiYmKDA8PXEoW0ouZWQsInNlbGVjdF9jb250ZW50IixKLkJhLEouRWIsSi5GYixKLlVhLCJzZXRfY2hlY2tvdXRfb3B0aW9uIixKLm1hLEouSGIsInZpZXdfcHJvbW90aW9uIiwiY2hlY2tvdXRfcHJvZ3Jlc3MiXSxiKSYmKGsoInJlcXVpcmUiLCJlYyIsImVjLmpzIiksbCgpKSx0KCJldmVudENhdGVnb3J5IixuLmV2ZW50Q2F0ZWdvcnksITApLHQoImV2ZW50QWN0aW9uIixuLmV2ZW50QWN0aW9ufHxiLCEwKSx2b2lkIDAhPT1uLmV2ZW50TGFiZWwmJnQoImV2ZW50TGFiZWwiLG4uZXZlbnRMYWJlbCwKITApLHZvaWQgMCE9PW4udmFsdWUmJnQoImV2ZW50VmFsdWUiLHphKG4udmFsdWUpKSxrKCJzZW5kIiwiZXZlbnQiLG4ua2EpKTtpZighbGkpe2xpPSEwO0plKCk7dmFyIHc9ZC53LHk9ZnVuY3Rpb24oKXtPZSgpLmxvYWRlZHx8dygpfTtXZCgpP0koeSk6aWMoZSx5LHcpfX1lbHNlIEkoZC53KX0sbGksZ2k9e30sbmk9e2NsaWVudF9pZDoxLGNsaWVudF9zdG9yYWdlOiJzdG9yYWdlIixjb29raWVfbmFtZToxLGNvb2tpZV9kb21haW46MSxjb29raWVfZXhwaXJlczoxLGNvb2tpZV9wYXRoOjEsY29va2llX3VwZGF0ZToxLGNvb2tpZV9mbGFnczoxLHNhbXBsZV9yYXRlOjEsc2l0ZV9zcGVlZF9zYW1wbGVfcmF0ZToxLHVzZV9hbXBfY2xpZW50X2lkOjEsc3RvcmVfZ2FjOjEsY29udmVyc2lvbl9saW5rZXI6InN0b3JlR2FjIn0sb2k9e2Fub255bWl6ZV9pcDoxLGFwcF9pZDoxLGFwcF9pbnN0YWxsZXJfaWQ6MSxhcHBfbmFtZToxLGFwcF92ZXJzaW9uOjEsY2FtcGFpZ246e25hbWU6ImNhbXBhaWduTmFtZSIsCnNvdXJjZToiY2FtcGFpZ25Tb3VyY2UiLG1lZGl1bToiY2FtcGFpZ25NZWRpdW0iLHRlcm06ImNhbXBhaWduVGVybSIsY29udGVudDoiY2FtcGFpZ25Db250ZW50IixpZDoiY2FtcGFpZ25JZCJ9LGN1cnJlbmN5OiJjdXJyZW5jeUNvZGUiLGRlc2NyaXB0aW9uOiJleERlc2NyaXB0aW9uIixmYXRhbDoiZXhGYXRhbCIsbGFuZ3VhZ2U6MSxub25faW50ZXJhY3Rpb246MSxwYWdlX2hvc3RuYW1lOiJob3N0bmFtZSIscGFnZV9yZWZlcnJlcjoicmVmZXJyZXIiLHBhZ2VfcGF0aDoicGFnZSIscGFnZV9sb2NhdGlvbjoibG9jYXRpb24iLHBhZ2VfdGl0bGU6InRpdGxlIixzY3JlZW5fbmFtZToxLHRyYW5zcG9ydF90eXBlOiJ0cmFuc3BvcnQiLHVzZXJfaWQ6MX0scGk9e2NvbnRlbnRfaWQ6MSxldmVudF9jYXRlZ29yeToxLGV2ZW50X2FjdGlvbjoxLGV2ZW50X2xhYmVsOjEsbGlua19hdHRyaWJ1dGlvbjoxLGxpbmtlcjoxLG1ldGhvZDoxLG5hbWU6MSxzZW5kX3BhZ2VfdmlldzoxLHZhbHVlOjF9LApqaT17Y29va2llX25hbWU6MSxjb29raWVfZXhwaXJlczoiZHVyYXRpb24iLGxldmVsczoxfSxxaT17YW5vbnltaXplX2lwOjEsZmF0YWw6MSxub25faW50ZXJhY3Rpb246MSx1c2VfYW1wX2NsaWVudF9pZDoxLHNlbmRfcGFnZV92aWV3OjEsc3RvcmVfZ2FjOjEsY29udmVyc2lvbl9saW5rZXI6MX0sa2k9ZnVuY3Rpb24oYSxiLGMsZCl7aWYodm9pZCAwIT09YylpZihxaVtiXSYmKGM9QWEoYykpLCJhbm9ueW1pemVfaXAiIT09Ynx8Y3x8KGM9dm9pZCAwKSwxPT09YSlkW2hpKGIpXT1jO2Vsc2UgaWYoZyhhKSlkW2FdPWM7ZWxzZSBmb3IodmFyIGUgaW4gYSlhLmhhc093blByb3BlcnR5KGUpJiZ2b2lkIDAhPT1jW2VdJiYoZFthW2VdXT1jW2VdKX0saGk9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmcoYSk/YS5yZXBsYWNlKC8oX1thLXpdKS9nLGZ1bmN0aW9uKGIpe3JldHVybiBiWzFdLnRvVXBwZXJDYXNlKCl9KTphfSxyaT1mdW5jdGlvbihhKXt2YXIgYj0iZ2VuZXJhbCI7MDw9cShbSi5DZCwKSi5FYixKLkRkLEouVWEsImNoZWNrb3V0X3Byb2dyZXNzIixKLm1hLEouSGIsSi5GYiwic2V0X2NoZWNrb3V0X29wdGlvbiJdLGEpP2I9ImVjb21tZXJjZSI6MDw9cSgiZ2VuZXJhdGVfbGVhZCBsb2dpbiBzZWFyY2ggc2VsZWN0X2NvbnRlbnQgc2hhcmUgc2lnbl91cCB2aWV3X2l0ZW0gdmlld19pdGVtX2xpc3Qgdmlld19wcm9tb3Rpb24gdmlld19zZWFyY2hfcmVzdWx0cyIuc3BsaXQoIiAiKSxhKT9iPSJlbmdhZ2VtZW50IjoiZXhjZXB0aW9uIj09PWEmJihiPSJlcnJvciIpO3JldHVybiBifSxpaT1mdW5jdGlvbihhLGIsYyl7YS5oYXNPd25Qcm9wZXJ0eShiKXx8KGFbYl09Yyl9LHNpPWZ1bmN0aW9uKGEpe2lmKHJhKGEpKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO2lmKHZvaWQgMCE9ZCl7dmFyIGU9ZC5pZCxmPWQudmFyaWFudDt2b2lkIDAhPWUmJnZvaWQgMCE9ZiYmYi5wdXNoKFN0cmluZyhlKSsiLiIrU3RyaW5nKGYpKX19cmV0dXJuIDA8CmIubGVuZ3RoP2Iuam9pbigiISIpOnZvaWQgMH19LGVpPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWZ1bmN0aW9uKHope3JldHVybiBkLmdldFdpdGhDb25maWcoeil9LGY9e30saD17fSxrPXt9LGw9c2koZShKLlllKSk7bCYmaWkoaCwiZXhwIixsKTt2YXIgbT1lKCJjdXN0b21fbWFwIik7aWYoUGEobSkpZm9yKHZhciBuIGluIG0paWYobS5oYXNPd25Qcm9wZXJ0eShuKSYmL14oZGltZW5zaW9ufG1ldHJpYylcZCskLy50ZXN0KG4pJiZ2b2lkIDAhPW1bbl0pe3ZhciByPWUoU3RyaW5nKG1bbl0pKTt2b2lkIDAhPT1yJiZpaShoLG4scil9dmFyIHU9UmQoYSk7dT1RZihkKTtmb3IodmFyIHA9MDtwPHUubGVuZ3RoOysrcCl7dmFyIHQ9dVtwXSx2PWUodCk7aWYocGkuaGFzT3duUHJvcGVydHkodCkpa2kocGlbdF0sCnQsdixmKTtlbHNlIGlmKG9pLmhhc093blByb3BlcnR5KHQpKWtpKG9pW3RdLHQsdixoKTtlbHNlIGlmKG5pLmhhc093blByb3BlcnR5KHQpKWtpKG5pW3RdLHQsdixrKTtlbHNlIGlmKC9eKGRpbWVuc2lvbnxtZXRyaWN8Y29udGVudF9ncm91cClcZCskLy50ZXN0KHQpKWtpKDEsdCx2LGgpO2Vsc2UgaWYoImRldmVsb3Blcl9pZCI9PT10KXt9ZWxzZSB0PT09Si5TJiYwPnEodSxKLktiKSYmKGsuY29va2llTmFtZT12KyJfZ2EiKX1paShrLCJjb29raWVEb21haW4iLCJhdXRvIik7aWkoaCwiZm9yY2VTU0wiLCEwKTtpaShmLCJldmVudENhdGVnb3J5IixyaShjKSk7MDw9cShbInZpZXdfaXRlbSIsInZpZXdfaXRlbV9saXN0Iiwidmlld19wcm9tb3Rpb24iLAoidmlld19zZWFyY2hfcmVzdWx0cyJdLGMpJiZpaShoLCJub25JbnRlcmFjdGlvbiIsITApOyJsb2dpbiI9PT1jfHwic2lnbl91cCI9PT1jfHwic2hhcmUiPT09Yz9paShmLCJldmVudExhYmVsIixlKEouYmYpKToic2VhcmNoIj09PWN8fCJ2aWV3X3NlYXJjaF9yZXN1bHRzIj09PWM/aWkoZiwiZXZlbnRMYWJlbCIsZShKLnFmKSk6InNlbGVjdF9jb250ZW50Ij09PWMmJmlpKGYsImV2ZW50TGFiZWwiLGUoSi5BaCkpO3ZhciB5PWZbSi5uYV18fHt9LHg9eVtKLldhXTt4fHwwIT14JiZ5W0ouRl0/ay5hbGxvd0xpbmtlcj0hMDohMT09PXgmJmlpKGssInVzZUFtcENsaWVudElkIiwhMSk7aWYoITE9PT1lKEoueWgpfHwhMT09PWUoSi5YKXx8ITE9PT1lKEouU2EpKWguYWxsb3dBZEZlYXR1cmVzPSExOyExPT09ZShKLlgpJiZqZCgiR1RNIiwyNyk7ay5uYW1lPWI7aFsiJmd0bSJdPWNoKCEwKTtoLmhpdENhbGxiYWNrPWQuQjt2YXIgQj1lKEouJGUpfHxNZCgiZ3RhZy5yZW1vdGVfY29uZmlnLiIrCmErIi51cmwiLDIpLEE9ZShKLlplKXx8TWQoImd0YWcucmVtb3RlX2NvbmZpZy4iK2ErIi5kdWFsSWQiLDIpO0ImJm51bGwhPWZjJiYoay5feF8xOT1CKTtBJiYoay5feF8yMD1BKTtmLmthPWg7Zi5JYT1rO3JldHVybiBmfSxkaT1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGModil7dmFyIHc9RCh2KTt3Lmxpc3Q9di5saXN0X25hbWU7dy5saXN0UG9zaXRpb249di5saXN0X3Bvc2l0aW9uO3cucG9zaXRpb249di5saXN0X3Bvc2l0aW9ufHx2LmNyZWF0aXZlX3Nsb3Q7dy5jcmVhdGl2ZT12LmNyZWF0aXZlX25hbWU7cmV0dXJuIHd9ZnVuY3Rpb24gZCh2KXtmb3IodmFyIHc9W10seT0wO3YmJnk8di5sZW5ndGg7eSsrKXZbeV0mJncucHVzaChjKHZbeV0pKTtyZXR1cm4gdy5sZW5ndGg/dzp2b2lkIDB9ZnVuY3Rpb24gZSh2KXtyZXR1cm57aWQ6ZihKLmViKSxhZmZpbGlhdGlvbjpmKEouVGUpLHJldmVudWU6ZihKLmFhKSx0YXg6ZihKLlhkKSxzaGlwcGluZzpmKEouV2UpLGNvdXBvbjpmKEouVWUpLApsaXN0OmYoSi5tZCl8fHZ9fWZvcih2YXIgZj1mdW5jdGlvbih2KXtyZXR1cm4gYi5nZXRXaXRoQ29uZmlnKHYpfSxoPWYoSi5NKSxrLGw9MDtoJiZsPGgubGVuZ3RoJiYhKGs9aFtsXVtKLm1kXSk7bCsrKTt2YXIgbT1mKCJjdXN0b21fbWFwIik7aWYoUGEobSkpZm9yKHZhciBuPTA7aCYmbjxoLmxlbmd0aDsrK24pe3ZhciByPWhbbl0sdTtmb3IodSBpbiBtKW0uaGFzT3duUHJvcGVydHkodSkmJi9eKGRpbWVuc2lvbnxtZXRyaWMpXGQrJC8udGVzdCh1KSYmdm9pZCAwIT1tW3VdJiZpaShyLHUsclttW3VdXSl9dmFyIHA9bnVsbCx0PWYoSi5WZSk7YT09PUoubWF8fGE9PT1KLkhiP3A9e2FjdGlvbjphLGdiOmUoKSxOYTpkKGgpfTphPT09Si5FYj9wPXthY3Rpb246ImFkZCIsTmE6ZChoKX06YT09PUouRmI/cD17YWN0aW9uOiJyZW1vdmUiLE5hOmQoaCl9OmE9PT1KLkJhP3A9e2FjdGlvbjoiZGV0YWlsIixnYjplKGspLE5hOmQoaCl9OmE9PT1KLmVkP3A9e2FjdGlvbjoiaW1wcmVzc2lvbnMiLAp1ZzpkKGgpfToidmlld19wcm9tb3Rpb24iPT09YT9wPXthY3Rpb246InByb21vX3ZpZXciLCRjOmQodCl9OiJzZWxlY3RfY29udGVudCI9PT1hJiZ0JiYwPHQubGVuZ3RoP3A9e2FjdGlvbjoicHJvbW9fY2xpY2siLCRjOmQodCl9OiJzZWxlY3RfY29udGVudCI9PT1hP3A9e2FjdGlvbjoiY2xpY2siLGdiOntsaXN0OmYoSi5tZCl8fGt9LE5hOmQoaCl9OmE9PT1KLlVhfHwiY2hlY2tvdXRfcHJvZ3Jlc3MiPT09YT9wPXthY3Rpb246ImNoZWNrb3V0IixOYTpkKGgpLGdiOntzdGVwOmE9PT1KLlVhPzE6ZihKLlZkKSxvcHRpb246ZihKLlVkKX19OiJzZXRfY2hlY2tvdXRfb3B0aW9uIj09PWEmJihwPXthY3Rpb246ImNoZWNrb3V0X29wdGlvbiIsZ2I6e3N0ZXA6ZihKLlZkKSxvcHRpb246ZihKLlVkKX19KTtwJiYocC5KaD1mKEouaWEpKTtyZXR1cm4gcH0sdGk9e30sZmk9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aVthXTt0aVthXT1EKGIpO2lmKCFjKXJldHVybiExO2Zvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdIT09Y1tkXSlyZXR1cm4hMDtmb3IodmFyIGUgaW4gYylpZihjLmhhc093blByb3BlcnR5KGUpJiZjW2VdIT09YltlXSlyZXR1cm4hMDtyZXR1cm4hMX07dmFyIHVpPXt9LHZpPVsiRyIsIkdQIl07dWkuTWU9IiI7dmFyIHdpPXVpLk1lLnNwbGl0KCIsIik7ZnVuY3Rpb24geGkoKXt2YXIgYT1XYztyZXR1cm4gYS5nY3E9YS5nY3F8fG5ldyB5aX0KdmFyIHppPWZ1bmN0aW9uKGEsYixjKXt4aSgpLnJlZ2lzdGVyKGEsYixjKX0sQWk9ZnVuY3Rpb24oYSxiLGMsZCl7eGkoKS5wdXNoKCJldmVudCIsW2IsYV0sYyxkKX0sQmk9ZnVuY3Rpb24oYSxiKXt4aSgpLnB1c2goImNvbmZpZyIsW2FdLGIpfSxDaT17fSxEaT1mdW5jdGlvbigpe3RoaXMuc3RhdHVzPTE7dGhpcy5jb250YWluZXJDb25maWc9e307dGhpcy50YXJnZXRDb25maWc9e307dGhpcy5pPXt9O3RoaXMubT1udWxsO3RoaXMuaD0hMX0sRWk9ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aGlzLnR5cGU9YTt0aGlzLm09Yjt0aGlzLlU9Y3x8IiI7dGhpcy5oPWQ7dGhpcy5pPWV9LHlpPWZ1bmN0aW9uKCl7dGhpcy5pPXt9O3RoaXMubT17fTt0aGlzLmg9W119LEZpPWZ1bmN0aW9uKGEsYil7dmFyIGM9U2MoYik7cmV0dXJuIGEuaVtjLmNvbnRhaW5lcklkXT1hLmlbYy5jb250YWluZXJJZF18fG5ldyBEaX0sR2k9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoZC5VKXt2YXIgZT1GaShhLGQuVSksCmY9ZS5tO2lmKGYpe3ZhciBoPUQoYyksaz1EKGUudGFyZ2V0Q29uZmlnW2QuVV0pLGw9RChlLmNvbnRhaW5lckNvbmZpZyksbT1EKGUuaSksbj1EKGEubSkscj1NZCgiZ3RtLnVuaXF1ZUV2ZW50SWQiKSx1PVNjKGQuVSkucHJlZml4LHA9UGYoT2YoTmYoTWYoTGYoS2YoSmYoaCksayksbCksbSksbiksZnVuY3Rpb24oKXtHZChyLHUsIjIiKTt9KSxmdW5jdGlvbigpe0dkKHIsdSwiMyIpO30pO3RyeXtHZChyLHUsIjEiKTtmKGQuVSxiLGQubSxwKX1jYXRjaCh0KXsKR2Qocix1LCI0Iik7fX19fTsKeWkucHJvdG90eXBlLnJlZ2lzdGVyPWZ1bmN0aW9uKGEsYixjKXtpZigzIT09RmkodGhpcyxhKS5zdGF0dXMpe0ZpKHRoaXMsYSkubT1iO0ZpKHRoaXMsYSkuc3RhdHVzPTM7YyYmKEZpKHRoaXMsYSkuaT1jKTt2YXIgZD1TYyhhKSxlPUNpW2QuY29udGFpbmVySWRdO2lmKHZvaWQgMCE9PWUpe3ZhciBmPVdjW2QuY29udGFpbmVySWRdLmJvb3RzdHJhcCxoPWQucHJlZml4LnRvVXBwZXJDYXNlKCk7V2NbZC5jb250YWluZXJJZF0uX3NweCYmKGg9aC50b0xvd2VyQ2FzZSgpKTt2YXIgaz1NZCgiZ3RtLnVuaXF1ZUV2ZW50SWQiKSxsPWgsbT1FYSgpLWY7aWYoQ2QmJiF0ZFtrXSl7ayE9PXBkJiYobmQoKSxwZD1rKTt2YXIgbj1sKyIuIitNYXRoLmZsb29yKGYtZSkrIi4iK01hdGguZmxvb3IobSk7eWQ9eWQ/eWQrIiwiK246IiZjbD0iK259ZGVsZXRlIENpW2QuY29udGFpbmVySWRdfXRoaXMuZmx1c2goKX19Owp5aS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1NYXRoLmZsb29yKEVhKCkvMUUzKTthOmlmKGMpe3ZhciBmPVNjKGMpLGg7aWYoaD1mKXt2YXIgaztpZihrPTE9PT1GaSh0aGlzLGMpLnN0YXR1cyliOnt2YXIgbD1mLnByZWZpeDtrPSEwfWg9a31pZihoKWlmKEZpKHRoaXMsYykuc3RhdHVzPTIsdGhpcy5wdXNoKCJyZXF1aXJlIixbXSxmLmNvbnRhaW5lcklkKSxDaVtmLmNvbnRhaW5lcklkXT1FYSgpLFdkKCkpe31lbHNle3ZhciBuPWVuY29kZVVSSUNvbXBvbmVudChmLmNvbnRhaW5lcklkKSxyPSgiaHR0cDoiIT1GLmxvY2F0aW9uLnByb3RvY29sPyJodHRwczoiOiJodHRwOiIpKyIvL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbSI7CmljKHIrIi9ndGFnL2pzP2lkPSIrbisiJmw9ZGF0YUxheWVyJmN4PWMiKX19dGhpcy5oLnB1c2gobmV3IEVpKGEsZSxjLGIsZCkpO2R8fHRoaXMuZmx1c2goKX07CnlpLnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpczt0aGlzLmgubGVuZ3RoOyl7dmFyIGM9dGhpcy5oWzBdO2lmKGMuaSljLmk9ITEsdGhpcy5oLnB1c2goYyk7ZWxzZSBzd2l0Y2goYy50eXBlKXtjYXNlICJyZXF1aXJlIjppZigzIT09RmkodGhpcyxjLlUpLnN0YXR1cyYmIWEpcmV0dXJuO2JyZWFrO2Nhc2UgInNldCI6QyhjLmhbMF0sZnVuY3Rpb24obCxtKXtEKEthKGwsbSksYi5tKX0pO2JyZWFrO2Nhc2UgImNvbmZpZyI6dmFyIGQ9Yy5oWzBdLGU9ISFkW0ouVWJdO2RlbGV0ZSBkW0ouVWJdO3ZhciBmPUZpKHRoaXMsYy5VKSxoPVNjKGMuVSksaz1oLmNvbnRhaW5lcklkPT09aC5pZDtlfHwoaz9mLmNvbnRhaW5lckNvbmZpZz17fTpmLnRhcmdldENvbmZpZ1tjLlVdPXt9KTtmLmgmJmV8fEdpKHRoaXMsSi5DLGQsYyk7Zi5oPSEwO2RlbGV0ZSBkW0oucmFdO2s/RChkLGYuY29udGFpbmVyQ29uZmlnKTpEKGQsZi50YXJnZXRDb25maWdbYy5VXSk7YnJlYWs7CmNhc2UgImV2ZW50IjpHaSh0aGlzLGMuaFsxXSxjLmhbMF0sYyl9dGhpcy5oLnNoaWZ0KCl9fTt2YXIgSGk9WyJHUCIsIkciXSxJaT0iRyIuc3BsaXQoLywvKTtJaS5wdXNoKCJIQSIpO3ZhciBKaT0hMTtKaT0hMDt2YXIgS2k9bnVsbCxMaT17fSxNaT17fSxOaTtmdW5jdGlvbiBPaShhLGIpe3ZhciBjPXtldmVudDphfTtiJiYoYy5ldmVudE1vZGVsPUQoYiksYltKLnVjXSYmKGMuZXZlbnRDYWxsYmFjaz1iW0oudWNdKSxiW0oueGJdJiYoYy5ldmVudFRpbWVvdXQ9YltKLnhiXSkpO3JldHVybiBjfQp2YXIgUGk9ZnVuY3Rpb24oKXtLaT1LaXx8IVdjLmd0YWdSZWdpc3RlcmVkO1djLmd0YWdSZWdpc3RlcmVkPSEwO3JldHVybiBLaX0sUWk9ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09TWlbYS5pZF0pe3ZhciBiO3N3aXRjaChhLnByZWZpeCl7Y2FzZSAiVUEiOmI9Q2YoImd0YWd1YSIse3RyYWNraW5nSWQ6YS5pZH0pO2JyZWFrO2Nhc2UgIkFXIjpiPUNmKCJndGFnYXciLHtjb252ZXJzaW9uSWQ6YX0pO2JyZWFrO2Nhc2UgIkRDIjpiPUNmKCJndGFnZmwiLHt0YXJnZXRJZDphLmlkfSk7YnJlYWs7Y2FzZSAiR0YiOmI9Q2YoImd0YWdnZiIse2NvbnZlcnNpb25JZDphfSk7YnJlYWs7Y2FzZSAiSEEiOmI9Q2YoImd0YWdoYSIse2NvbnZlcnNpb25JZDphfSk7YnJlYWs7Y2FzZSAiR1AiOmI9Q2YoImd0YWdncCIse2NvbnZlcnNpb25JZDphLmlkfSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59aWYoIU5pKXt2YXIgYz16YigidiIse25hbWU6InNlbmRfdG8iLGRhdGFMYXllclZlcnNpb246Mn0pO3BiLnB1c2goYyk7Ck5pPVsibWFjcm8iLHBiLmxlbmd0aC0xXX12YXIgZD17YXJnMDpOaSxhcmcxOmEuaWQsaWdub3JlX2Nhc2U6ITF9O2RbRmIuc2FdPSJfbGMiO3JiLnB1c2goZCk7dmFyIGU9eyJpZiI6W3JiLmxlbmd0aC0xXSxhZGQ6W2JdfTtlWyJpZiJdJiYoZS5hZGR8fGUuYmxvY2spJiZxYi5wdXNoKGUpO01pW2EuaWRdPWJ9fSxSaT1mdW5jdGlvbihhKXtDKExpLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9cShjLGEpOzA8PWQmJmMuc3BsaWNlKGQsMSl9KX0sU2k9R2EoZnVuY3Rpb24oKXt9KSxUaT1mdW5jdGlvbihhKXtpZihhLmNvbnRhaW5lcklkIT09VmMucyYmIkciIT09YS5wcmVmaXgpe3ZhciBiO3N3aXRjaChhLnByZWZpeCl7Y2FzZSAiVUEiOmI9MTQ7YnJlYWs7Y2FzZSAiQVciOmI9MTU7YnJlYWs7Y2FzZSAiREMiOmI9MTY7YnJlYWs7ZGVmYXVsdDpiPTE3fWpkKCJHVE0iLGIpfX07CnZhciBVaT17Y29uZmlnOmZ1bmN0aW9uKGEpe3ZhciBiPWFbMl18fHt9O2lmKDI+YS5sZW5ndGh8fCFnKGFbMV0pfHwhUGEoYikpcmV0dXJuO3ZhciBjPVNjKGFbMV0pO2lmKCFjKXJldHVybjtSaShjLmlkKTt2YXIgZD1jLmlkLGU9YltKLm5jXXx8ImRlZmF1bHQiO2U9ZS50b1N0cmluZygpLnNwbGl0KCIsIik7Zm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspTGlbZVtmXV09TGlbZVtmXV18fFtdLExpW2VbZl1dLnB1c2goZCk7ZGVsZXRlIGJbSi5uY107aWYoUGkoKSl7aGQoKTtEKGIpO2lmKEppJiYtMSE9PXEoSWksYy5wcmVmaXgpfHwtMSE9PXEoSGksYy5wcmVmaXgpKXsiRyI9PT1jLnByZWZpeCYmKGJbSi5yYV09ITApO0JpKGIsYy5pZCk7cmV0dXJufVFpKGMpO1RpKGMpfWVsc2UgU2koKTtTZCgiZ3RhZy50YXJnZXRzLiIrYy5pZCx2b2lkIDApO1NkKCJndGFnLnRhcmdldHMuIitjLmlkLEQoYikpO3ZhciBoPXt9O2hbSi5vYV09CmMuaWQ7cmV0dXJuIE9pKEouQyxoKTt9LGV2ZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWFbMV07aWYoZyhiKSYmISgzPGEubGVuZ3RoKSl7dmFyIGM7aWYoMjxhLmxlbmd0aCl7aWYoIVBhKGFbMl0pJiZ2b2lkIDAhPWFbMl0pcmV0dXJuO2M9YVsyXX12YXIgZD1PaShiLGMpO3ZhciBlO3ZhciBmPWMmJmNbSi5vYV07dm9pZCAwPT09ZiYmKGY9TWQoSi5vYSwyKSx2b2lkIDA9PT1mJiYoZj0iZGVmYXVsdCIpKTtpZihnKGYpfHxyYShmKSl7Zm9yKHZhciBoPWYudG9TdHJpbmcoKS5yZXBsYWNlKC9ccysvZywiIikuc3BsaXQoIiwiKSxrPVtdLGw9MDtsPGgubGVuZ3RoO2wrKykwPD1oW2xdLmluZGV4T2YoIi0iKT9rLnB1c2goaFtsXSk6az1rLmNvbmNhdChMaVtoW2xdXXx8W10pO2U9VWMoayl9ZWxzZSBlPXZvaWQgMDt2YXIgbT1lO2lmKCFtKXJldHVybjtoZCgpO3ZhciBuPVBpKCk7bnx8ClNpKCk7Zm9yKHZhciByPVtdLHU9MDtuJiZ1PG0ubGVuZ3RoO3UrKyl7dmFyIHA9bVt1XTtUaShwKTtpZihKaSYmLTEhPT1xKElpLHAucHJlZml4KXx8LTEhPT1xKEhpLHAucHJlZml4KSl7dmFyIHQ9RChjKTsiRyI9PT1wLnByZWZpeCYmKHRbSi5yYV09ITApO0FpKGIsdCxwLmlkKX1lbHNlIFFpKHApO3IucHVzaChwLmlkKX1kLmV2ZW50TW9kZWw9ZC5ldmVudE1vZGVsfHx7fTswPG0ubGVuZ3RoP2QuZXZlbnRNb2RlbFtKLm9hXT1yLmpvaW4oKTpkZWxldGUgZC5ldmVudE1vZGVsW0oub2FdO3JldHVybiBkfX0sanM6ZnVuY3Rpb24oYSl7aWYoMj09YS5sZW5ndGgmJmFbMV0uZ2V0VGltZSlyZXR1cm57ZXZlbnQ6Imd0bS5qcyIsImd0bS5zdGFydCI6YVsxXS5nZXRUaW1lKCl9fSxwb2xpY3k6ZnVuY3Rpb24oKXt9LHNldDpmdW5jdGlvbihhKXt2YXIgYjsyPT1hLmxlbmd0aCYmUGEoYVsxXSk/Yj1EKGFbMV0pOjM9PWEubGVuZ3RoJiYKZyhhWzFdKSYmKGI9e30sUGEoYVsyXSl8fHJhKGFbMl0pP2JbYVsxXV09RChhWzJdKTpiW2FbMV1dPWFbMl0pO2lmKGIpe2lmKFBpKCkpe3ZhciBjPUQoYik7eGkoKS5wdXNoKCJzZXQiLFtjXSk7RChiKX1iLl9jbGVhcj0hMDtyZXR1cm4gYn19fTsKdmFyIFZpPXtwb2xpY3k6ITB9O3ZhciBXaT1mdW5jdGlvbihhLGIpe3ZhciBjPWEuaGlkZTtpZihjJiZ2b2lkIDAhPT1jW2JdJiZjLmVuZCl7Y1tiXT0hMTt2YXIgZD0hMCxlO2ZvcihlIGluIGMpaWYoYy5oYXNPd25Qcm9wZXJ0eShlKSYmITA9PT1jW2VdKXtkPSExO2JyZWFrfWQmJihjLmVuZCgpLGMuZW5kPW51bGwpfX0sWWk9ZnVuY3Rpb24oYSl7dmFyIGI9WGkoKSxjPWImJmIuaGlkZTtjJiZjLmVuZCYmKGNbYV09ITApfTt2YXIgWmk9ITEsJGk9W107ZnVuY3Rpb24gYWooKXtpZighWmkpe1ppPSEwO2Zvcih2YXIgYT0wO2E8JGkubGVuZ3RoO2ErKylJKCRpW2FdKX19dmFyIGJqPWZ1bmN0aW9uKGEpe1ppP0koYSk6JGkucHVzaChhKX07dmFyIHJqPWZ1bmN0aW9uKGEpe2lmKHFqKGEpKXJldHVybiBhO3RoaXMuaD1hfTtyai5wcm90b3R5cGUucGc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ofTt2YXIgcWo9ZnVuY3Rpb24oYSl7cmV0dXJuIWF8fCJvYmplY3QiIT09TmEoYSl8fFBhKGEpPyExOiJnZXRVbnRydXN0ZWRVcGRhdGVWYWx1ZSJpbiBhfTtyai5wcm90b3R5cGUuZ2V0VW50cnVzdGVkVXBkYXRlVmFsdWU9cmoucHJvdG90eXBlLnBnO3ZhciBzaj1bXSx0aj0hMSx1aj1mdW5jdGlvbihhKXtyZXR1cm4gRlsiZGF0YUxheWVyIl0ucHVzaChhKX0sdmo9ZnVuY3Rpb24oYSl7dmFyIGI9V2NbImRhdGFMYXllciJdLGM9Yj9iLnN1YnNjcmliZXJzOjEsZD0wO3JldHVybiBmdW5jdGlvbigpeysrZD09PWMmJmEoKX19OwpmdW5jdGlvbiB3aihhKXt2YXIgYj1hLl9jbGVhcjtDKGEsZnVuY3Rpb24oZixoKXsiX2NsZWFyIiE9PWYmJihiJiZTZChmLHZvaWQgMCksU2QoZixoKSl9KTthZHx8KGFkPWFbImd0bS5zdGFydCJdKTt2YXIgYz1hLmV2ZW50O2lmKCFjKXJldHVybiExO3ZhciBkPWFbImd0bS51bmlxdWVFdmVudElkIl07ZHx8KGQ9aGQoKSxhWyJndG0udW5pcXVlRXZlbnRJZCJdPWQsU2QoImd0bS51bmlxdWVFdmVudElkIixkKSk7Y2Q9Yzt2YXIgZT14aihhKTsKY2Q9bnVsbDtzd2l0Y2goYyl7Y2FzZSAiZ3RtLmluaXQiOmpkKCJHVE0iLDE5KSxlJiZqZCgiR1RNIiwyMCl9cmV0dXJuIGV9ZnVuY3Rpb24geGooYSl7dmFyIGI9YS5ldmVudCxjPWFbImd0bS51bmlxdWVFdmVudElkIl0sZCxlPVdjLnpvbmVzO2Q9ZT9lLmNoZWNrU3RhdGUoVmMucyxjKTpzZTtyZXR1cm4gZC5hY3RpdmU/cWYoYyxiLGQuaXNXaGl0ZWxpc3RlZCxhLmV2ZW50Q2FsbGJhY2ssYS5ldmVudFRpbWVvdXQpPyEwOiExOiExfQpmdW5jdGlvbiB5aigpe2Zvcih2YXIgYT0hMTshdGomJjA8c2oubGVuZ3RoOyl7dGo9ITA7ZGVsZXRlIEpkLmV2ZW50TW9kZWw7TGQoKTt2YXIgYj1zai5zaGlmdCgpO2lmKG51bGwhPWIpe3ZhciBjPXFqKGIpO2lmKGMpe3ZhciBkPWI7Yj1xaihkKT9kLmdldFVudHJ1c3RlZFVwZGF0ZVZhbHVlKCk6dm9pZCAwO2Zvcih2YXIgZT1bImd0bS53aGl0ZWxpc3QiLCJndG0uYmxhY2tsaXN0IiwidGFnVHlwZUJsYWNrbGlzdCJdLGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGg9ZVtmXSxrPU1kKGgsMSk7aWYocmEoayl8fFBhKGspKWs9RChrKTtLZFtoXT1rfX10cnl7aWYocGEoYikpdHJ5e2IuY2FsbChOZCl9Y2F0Y2godil7fWVsc2UgaWYocmEoYikpe3ZhciBsPWI7aWYoZyhsWzBdKSl7dmFyIG09CmxbMF0uc3BsaXQoIi4iKSxuPW0ucG9wKCkscj1sLnNsaWNlKDEpLHU9TWQobS5qb2luKCIuIiksMik7aWYodm9pZCAwIT09dSYmbnVsbCE9PXUpdHJ5e3Vbbl0uYXBwbHkodSxyKX1jYXRjaCh2KXt9fX1lbHNle3ZhciBwPWI7aWYocCYmKCJbb2JqZWN0IEFyZ3VtZW50c10iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocCl8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLCJjYWxsZWUiKSkpe2E6e2lmKGIubGVuZ3RoJiZnKGJbMF0pKXt2YXIgdD1VaVtiWzBdXTtpZih0JiYoIWN8fCFWaVtiWzBdXSkpe2I9dChiKTticmVhayBhfX1iPXZvaWQgMH1pZighYil7dGo9ITE7Y29udGludWV9fWE9d2ooYil8fGF9fWZpbmFsbHl7YyYmTGQoITApfX10aj0hMX0KcmV0dXJuIWF9ZnVuY3Rpb24gemooKXt2YXIgYT15aigpO3RyeXtXaShGWyJkYXRhTGF5ZXIiXSxWYy5zKX1jYXRjaChiKXt9cmV0dXJuIGF9CnZhciBCaj1mdW5jdGlvbigpe3ZhciBhPWdjKCJkYXRhTGF5ZXIiLFtdKSxiPWdjKCJnb29nbGVfdGFnX21hbmFnZXIiLHt9KTtiPWJbImRhdGFMYXllciJdPWJbImRhdGFMYXllciJdfHx7fTtBZShmdW5jdGlvbigpe2IuZ3RtRG9tfHwoYi5ndG1Eb209ITAsYS5wdXNoKHtldmVudDoiZ3RtLmRvbSJ9KSl9KTtiaihmdW5jdGlvbigpe2IuZ3RtTG9hZHx8KGIuZ3RtTG9hZD0hMCxhLnB1c2goe2V2ZW50OiJndG0ubG9hZCJ9KSl9KTtiLnN1YnNjcmliZXJzPShiLnN1YnNjcmliZXJzfHwwKSsxO3ZhciBjPWEucHVzaDthLnB1c2g9ZnVuY3Rpb24oKXt2YXIgZDtpZigwPFdjLlNBTkRCT1hFRF9KU19TRU1BUEhPUkUpe2Q9W107Zm9yKHZhciBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKylkW2VdPW5ldyByaihhcmd1bWVudHNbZV0pfWVsc2UgZD1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTt2YXIgZj1jLmFwcGx5KGEsZCk7c2oucHVzaC5hcHBseShzaixkKTtpZigzMDA8CnRoaXMubGVuZ3RoKWZvcihqZCgiR1RNIiw0KTszMDA8dGhpcy5sZW5ndGg7KXRoaXMuc2hpZnQoKTt2YXIgaD0iYm9vbGVhbiIhPT10eXBlb2YgZnx8ZjtyZXR1cm4geWooKSYmaH07c2oucHVzaC5hcHBseShzaixhLnNsaWNlKDApKTtBaigpJiZJKHpqKX0sQWo9ZnVuY3Rpb24oKXt2YXIgYT0hMDtyZXR1cm4gYX07dmFyIENqPXt9O0NqLnliPW5ldyBTdHJpbmcoInVuZGVmaW5lZCIpOwp2YXIgRGo9ZnVuY3Rpb24oYSl7dGhpcy5oPWZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYy5wdXNoKGFbZF09PT1Dai55Yj9iOmFbZF0pO3JldHVybiBjLmpvaW4oIiIpfX07RGoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaCgidW5kZWZpbmVkIil9O0RqLnByb3RvdHlwZS52YWx1ZU9mPURqLnByb3RvdHlwZS50b1N0cmluZztDai51Zj1EajtDai5CYz17fTtDai4kZj1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IERqKGEpfTt2YXIgRWo9e307Q2ouZGg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1oZCgpO0VqW2NdPVthLGJdO3JldHVybiBjfTtDai5oZT1mdW5jdGlvbihhKXt2YXIgYj1hPzA6MTtyZXR1cm4gZnVuY3Rpb24oYyl7dmFyIGQ9RWpbY107aWYoZCYmImZ1bmN0aW9uIj09PXR5cGVvZiBkW2JdKWRbYl0oKTtFaltjXT12b2lkIDB9fTtDai56Zz1mdW5jdGlvbihhKXtmb3IodmFyIGI9ITEsYz0hMSxkPTI7ZDxhLmxlbmd0aDtkKyspYj0KYnx8OD09PWFbZF0sYz1jfHwxNj09PWFbZF07cmV0dXJuIGImJmN9O0NqLlRnPWZ1bmN0aW9uKGEpe2lmKGE9PT1Dai55YilyZXR1cm4gYTt2YXIgYj1oZCgpO0NqLkJjW2JdPWE7cmV0dXJuJ2dvb2dsZV90YWdfbWFuYWdlclsiJytWYy5zKyciXS5tYWNybygnK2IrIikifTtDai5KZz1mdW5jdGlvbihhLGIsYyl7YSBpbnN0YW5jZW9mIENqLnVmJiYoYT1hLmgoQ2ouZGgoYixjKSksYj1vYSk7cmV0dXJue05jOmEsQjpifX07dmFyIEZqPWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGYsaCl7dmFyIGs9ZltoXTtyZXR1cm4ga312YXIgZT17ZXZlbnQ6YiwiZ3RtLmVsZW1lbnQiOmEsImd0bS5lbGVtZW50Q2xhc3NlcyI6ZChhLCJjbGFzc05hbWUiKSwiZ3RtLmVsZW1lbnRJZCI6YVsiZm9yIl18fG9jKGEsImlkIil8fCIiLCJndG0uZWxlbWVudFRhcmdldCI6YS5mb3JtVGFyZ2V0fHxkKGEsInRhcmdldCIpfHwiIn07YyYmKGVbImd0bS50cmlnZ2VycyJdPWMuam9pbigiLCIpKTtlWyJndG0uZWxlbWVudFVybCJdPShhLmF0dHJpYnV0ZXMmJmEuYXR0cmlidXRlcy5mb3JtYWN0aW9uP2EuZm9ybUFjdGlvbjoiIil8fGEuYWN0aW9ufHxkKGEsImhyZWYiKXx8YS5zcmN8fGEuY29kZXx8YS5jb2RlYmFzZXx8CiIiO3JldHVybiBlfSxHaj1mdW5jdGlvbihhKXtXYy5oYXNPd25Qcm9wZXJ0eSgiYXV0b0V2ZW50c1NldHRpbmdzIil8fChXYy5hdXRvRXZlbnRzU2V0dGluZ3M9e30pO3ZhciBiPVdjLmF1dG9FdmVudHNTZXR0aW5ncztiLmhhc093blByb3BlcnR5KGEpfHwoYlthXT17fSk7cmV0dXJuIGJbYV19LEhqPWZ1bmN0aW9uKGEsYixjKXtHaihhKVtiXT1jfSxJaj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1HaihhKSxmPUZhKGUsYixkKTtlW2JdPWMoZil9LEpqPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1HaihhKTtyZXR1cm4gRmEoZCxiLGMpfTt2YXIgS2o9WyJpbnB1dCIsInNlbGVjdCIsInRleHRhcmVhIl0sTGo9WyJidXR0b24iLCJoaWRkZW4iLCJpbWFnZSIsInJlc2V0Iiwic3VibWl0Il0sTWo9ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIXZhKEtqLGZ1bmN0aW9uKGMpe3JldHVybiBjPT09Yn0pfHwiaW5wdXQiPT09YiYmdmEoTGosZnVuY3Rpb24oYyl7cmV0dXJuIGM9PT1hLnR5cGUudG9Mb3dlckNhc2UoKX0pPyExOiEwfSxOaj1mdW5jdGlvbihhKXtyZXR1cm4gYS5mb3JtP2EuZm9ybS50YWdOYW1lP2EuZm9ybTpHLmdldEVsZW1lbnRCeUlkKGEuZm9ybSk6cmMoYSxbImZvcm0iXSwxMDApfSxPaj1mdW5jdGlvbihhLGIsYyl7aWYoIWEuZWxlbWVudHMpcmV0dXJuIDA7Zm9yKHZhciBkPWIuZ2V0QXR0cmlidXRlKGMpLGU9MCxmPTE7ZTxhLmVsZW1lbnRzLmxlbmd0aDtlKyspe3ZhciBoPWEuZWxlbWVudHNbZV07aWYoTWooaCkpe2lmKGguZ2V0QXR0cmlidXRlKGMpPT09ZClyZXR1cm4gZjsKZisrfX1yZXR1cm4gMH07dmFyIFBqPSEhRi5NdXRhdGlvbk9ic2VydmVyLFFqPXZvaWQgMCxSaj1mdW5jdGlvbihhKXtpZighUWope3ZhciBiPWZ1bmN0aW9uKCl7dmFyIGM9Ry5ib2R5O2lmKGMpaWYoUGopKG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxRai5sZW5ndGg7ZSsrKUkoUWpbZV0pfSkpLm9ic2VydmUoYyx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KTtlbHNle3ZhciBkPSExO21jKGMsIkRPTU5vZGVJbnNlcnRlZCIsZnVuY3Rpb24oKXtkfHwoZD0hMCxJKGZ1bmN0aW9uKCl7ZD0hMTtmb3IodmFyIGU9MDtlPFFqLmxlbmd0aDtlKyspSShRaltlXSl9KSl9KX19O1FqPVtdO0cuYm9keT9iKCk6SShiKX1Rai5wdXNoKGEpfTt2YXIgbWs9Ri5jbGVhclRpbWVvdXQsbms9Ri5zZXRUaW1lb3V0LFM9ZnVuY3Rpb24oYSxiLGMpe2lmKFdkKCkpe2ImJkkoYil9ZWxzZSByZXR1cm4gaWMoYSxiLGMpfSxvaz1mdW5jdGlvbigpe3JldHVybiBGLmxvY2F0aW9uLmhyZWZ9LHBrPWZ1bmN0aW9uKGEpe3JldHVybiAkZShhZihhKSwiZnJhZ21lbnQiKX0scWs9ZnVuY3Rpb24oYSl7cmV0dXJuIFplKGFmKGEpKX0sVT1mdW5jdGlvbihhLGIpe3JldHVybiBNZChhLGJ8fDIpfSxyaz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj8oYS5ldmVudENhbGxiYWNrPWIsYyYmKGEuZXZlbnRUaW1lb3V0PWMpLGQ9dWooYSkpOmQ9dWooYSk7cmV0dXJuIGR9LHNrPWZ1bmN0aW9uKGEsYil7RlthXT1ifSxYPWZ1bmN0aW9uKGEsYixjKXtiJiYodm9pZCAwPT09RlthXXx8YyYmIUZbYV0pJiYoRlthXT0KYik7cmV0dXJuIEZbYV19LHRrPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gUmYoYSxiLHZvaWQgMD09PWM/ITA6ISFjKX0sdWs9ZnVuY3Rpb24oYSxiKXtpZihXZCgpKXtiJiZJKGIpfWVsc2Uga2MoYSxiKX0sdms9ZnVuY3Rpb24oYSl7cmV0dXJuISFKaihhLCJpbml0IiwhMSl9LHdrPWZ1bmN0aW9uKGEpe0hqKGEsImluaXQiLCEwKX0seGs9ZnVuY3Rpb24oYSxiKXt2YXIgYz0odm9pZCAwPT09Yj8wOmIpPyJ3d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcyI6JGM7Yys9Ij9pZD0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmw9ZGF0YUxheWVyIjtTKFEoImh0dHBzOi8vIiwiaHR0cDovLyIsYykpfSx5az1mdW5jdGlvbihhLGIpe3ZhciBjPWFbYl07cmV0dXJuIGN9Owp2YXIgems9Q2ouSmc7dmFyIFdrPW5ldyB4YTtmdW5jdGlvbiBYayhhLGIpe2Z1bmN0aW9uIGMoaCl7dmFyIGs9YWYoaCksbD0kZShrLCJwcm90b2NvbCIpLG09JGUoaywiaG9zdCIsITApLG49JGUoaywicG9ydCIpLHI9JGUoaywicGF0aCIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXC8kLywiIik7aWYodm9pZCAwPT09bHx8Imh0dHAiPT1sJiYiODAiPT1ufHwiaHR0cHMiPT1sJiYiNDQzIj09bilsPSJ3ZWIiLG49ImRlZmF1bHQiO3JldHVybltsLG0sbixyXX1mb3IodmFyIGQ9YyhTdHJpbmcoYSkpLGU9YyhTdHJpbmcoYikpLGY9MDtmPGQubGVuZ3RoO2YrKylpZihkW2ZdIT09ZVtmXSlyZXR1cm4hMTtyZXR1cm4hMH0KZnVuY3Rpb24gWWsoYSl7cmV0dXJuIFprKGEpPzE6MH0KZnVuY3Rpb24gWmsoYSl7dmFyIGI9YS5hcmcwLGM9YS5hcmcxO2lmKGEuYW55X29mJiZyYShjKSl7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspaWYoWWsoeyJmdW5jdGlvbiI6YVsiZnVuY3Rpb24iXSxhcmcwOmIsYXJnMTpjW2RdfSkpcmV0dXJuITA7cmV0dXJuITF9c3dpdGNoKGFbImZ1bmN0aW9uIl0pe2Nhc2UgIl9jbiI6cmV0dXJuIDA8PVN0cmluZyhiKS5pbmRleE9mKFN0cmluZyhjKSk7Y2FzZSAiX2NzcyI6dmFyIGU7YTp7aWYoYil7dmFyIGY9WyJtYXRjaGVzIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwibW96TWF0Y2hlc1NlbGVjdG9yIiwibXNNYXRjaGVzU2VsZWN0b3IiLCJvTWF0Y2hlc1NlbGVjdG9yIl07dHJ5e2Zvcih2YXIgaD0wO2g8Zi5sZW5ndGg7aCsrKWlmKGJbZltoXV0pe2U9YltmW2hdXShjKTticmVhayBhfX1jYXRjaCh2KXt9fWU9ITF9cmV0dXJuIGU7Y2FzZSAiX2V3Ijp2YXIgayxsO2s9U3RyaW5nKGIpO2w9U3RyaW5nKGMpO3ZhciBtPWsubGVuZ3RoLQpsLmxlbmd0aDtyZXR1cm4gMDw9bSYmay5pbmRleE9mKGwsbSk9PW07Y2FzZSAiX2VxIjpyZXR1cm4gU3RyaW5nKGIpPT1TdHJpbmcoYyk7Y2FzZSAiX2dlIjpyZXR1cm4gTnVtYmVyKGIpPj1OdW1iZXIoYyk7Y2FzZSAiX2d0IjpyZXR1cm4gTnVtYmVyKGIpPk51bWJlcihjKTtjYXNlICJfbGMiOnZhciBuO249U3RyaW5nKGIpLnNwbGl0KCIsIik7cmV0dXJuIDA8PXEobixTdHJpbmcoYykpO2Nhc2UgIl9sZSI6cmV0dXJuIE51bWJlcihiKTw9TnVtYmVyKGMpO2Nhc2UgIl9sdCI6cmV0dXJuIE51bWJlcihiKTxOdW1iZXIoYyk7Y2FzZSAiX3JlIjp2YXIgcjt2YXIgdT1hLmlnbm9yZV9jYXNlPyJpIjp2b2lkIDA7dHJ5e3ZhciBwPVN0cmluZyhjKSt1LHQ9V2suZ2V0KHApO3R8fCh0PW5ldyBSZWdFeHAoYyx1KSxXay5zZXQocCx0KSk7cj10LnRlc3QoYil9Y2F0Y2godil7cj0hMX1yZXR1cm4gcjtjYXNlICJfc3ciOnJldHVybiAwPT1TdHJpbmcoYikuaW5kZXhPZihTdHJpbmcoYykpO2Nhc2UgIl91bSI6cmV0dXJuIFhrKGIsCmMpfXJldHVybiExfTt2YXIgJGs9ZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbigpe307Yy5wcm90b3R5cGU9YS5wcm90b3R5cGU7dmFyIGQ9bmV3IGM7YS5hcHBseShkLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7cmV0dXJuIGR9O3ZhciBhbD17fSxibD1lbmNvZGVVUkksWT1lbmNvZGVVUklDb21wb25lbnQsY2w9bGM7dmFyIGRsPWZ1bmN0aW9uKGEsYil7aWYoIWEpcmV0dXJuITE7dmFyIGM9JGUoYWYoYSksImhvc3QiKTtpZighYylyZXR1cm4hMTtmb3IodmFyIGQ9MDtiJiZkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXSYmYltkXS50b0xvd2VyQ2FzZSgpO2lmKGUpe3ZhciBmPWMubGVuZ3RoLWUubGVuZ3RoOzA8ZiYmIi4iIT1lLmNoYXJBdCgwKSYmKGYtLSxlPSIuIitlKTtpZigwPD1mJiZjLmluZGV4T2YoZSxmKT09ZilyZXR1cm4hMH19cmV0dXJuITF9Owp2YXIgZWw9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD17fSxlPSExLGY9MDthJiZmPGEubGVuZ3RoO2YrKylhW2ZdJiZhW2ZdLmhhc093blByb3BlcnR5KGIpJiZhW2ZdLmhhc093blByb3BlcnR5KGMpJiYoZFthW2ZdW2JdXT1hW2ZdW2NdLGU9ITApO3JldHVybiBlP2Q6bnVsbH07YWwuQWc9ZnVuY3Rpb24oKXt2YXIgYT0hMTtyZXR1cm4gYX07dmFyIHJtPWZ1bmN0aW9uKCl7dmFyIGE9Ri5nYUdsb2JhbD1GLmdhR2xvYmFsfHx7fTthLmhpZD1hLmhpZHx8d2EoKTtyZXR1cm4gYS5oaWR9O3ZhciBDbT13aW5kb3csRG09ZG9jdW1lbnQsRW09ZnVuY3Rpb24oYSl7dmFyIGI9Q20uX2dhVXNlclByZWZzO2lmKGImJmIuaW9vJiZiLmlvbygpfHxhJiYhMD09PUNtWyJnYS1kaXNhYmxlLSIrYV0pcmV0dXJuITA7dHJ5e3ZhciBjPUNtLmV4dGVybmFsO2lmKGMmJmMuX2dhVXNlclByZWZzJiYib28iPT1jLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaChmKXt9Zm9yKHZhciBkPVJmKCJBTVBfVE9LRU4iLERtLmNvb2tpZSwhMCksZT0wO2U8ZC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PWRbZV0pcmV0dXJuITA7cmV0dXJuIERtLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIik/ITA6ITF9O3ZhciBIbT1mdW5jdGlvbihhKXtDKGEsZnVuY3Rpb24oYyl7Il8iPT09Yy5jaGFyQXQoMCkmJmRlbGV0ZSBhW2NdfSk7dmFyIGI9YVtKLmNhXXx8e307QyhiLGZ1bmN0aW9uKGMpeyJfIj09PWMuY2hhckF0KDApJiZkZWxldGUgYltjXX0pfTt2YXIgTG09ZnVuY3Rpb24oYSxiLGMpe0FpKGIsYyxhKX0sTW09ZnVuY3Rpb24oYSxiLGMpe0FpKGIsYyxhLCEwKX0sT209ZnVuY3Rpb24oYSxiKXt9OwpmdW5jdGlvbiBObShhLGIpe312YXIgWj17YTp7fX07CgpaLmEuZ3RhZ2hhPVsiZ29vZ2xlIl0sZnVuY3Rpb24oKXsoZnVuY3Rpb24oYSl7Wi5fX2d0YWdoYT1hO1ouX19ndGFnaGEuYj0iZ3RhZ2hhIjtaLl9fZ3RhZ2hhLmc9ITA7Wi5fX2d0YWdoYS5wcmlvcml0eU92ZXJyaWRlPTB9KShmdW5jdGlvbihhKXt2YXIgYj1hLnZ0cF9jb252ZXJzaW9uSWQsYz1jZCxkPVUoImV2ZW50TW9kZWwiKTt6aShiLmlkLFdoKTtpZihjPT09Si5DKXt2YXIgZT1VKCJndGFnLnRhcmdldHMuIitiLmlkKTtCaShlLGIuaWQpfWVsc2UgQWkoYyxkLGIuaWQpO0koYS52dHBfZ3RtT25TdWNjZXNzKX0pfSgpOwpaLmEuZT1bImdvb2dsZSJdLGZ1bmN0aW9uKCl7KGZ1bmN0aW9uKGEpe1ouX19lPWE7Wi5fX2UuYj0iZSI7Wi5fX2UuZz0hMDtaLl9fZS5wcmlvcml0eU92ZXJyaWRlPTB9KShmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKFVkKGEudnRwX2d0bUV2ZW50SWQsImV2ZW50IikpfSl9KCk7CgpaLmEudj1bImdvb2dsZSJdLGZ1bmN0aW9uKCl7KGZ1bmN0aW9uKGEpe1ouX192PWE7Wi5fX3YuYj0idiI7Wi5fX3YuZz0hMDtaLl9fdi5wcmlvcml0eU92ZXJyaWRlPTB9KShmdW5jdGlvbihhKXt2YXIgYj1hLnZ0cF9uYW1lO2lmKCFifHwhYi5yZXBsYWNlKXJldHVybiExO3ZhciBjPVUoYi5yZXBsYWNlKC9cXFwuL2csIi4iKSxhLnZ0cF9kYXRhTGF5ZXJWZXJzaW9ufHwxKTtyZXR1cm4gdm9pZCAwIT09Yz9jOmEudnRwX2RlZmF1bHRWYWx1ZX0pfSgpOwpaLmEucmVwPVsiZ29vZ2xlIl0sZnVuY3Rpb24oKXsoZnVuY3Rpb24oYSl7Wi5fX3JlcD1hO1ouX19yZXAuYj0icmVwIjtaLl9fcmVwLmc9ITA7Wi5fX3JlcC5wcmlvcml0eU92ZXJyaWRlPTB9KShmdW5jdGlvbihhKXt2YXIgYjtzd2l0Y2goU2MoYS52dHBfY29udGFpbmVySWQpLnByZWZpeCl7Y2FzZSAiQVciOmI9bGg7YnJlYWs7Y2FzZSAiREMiOmI9TWg7YnJlYWs7Y2FzZSAiR0YiOmI9Umg7YnJlYWs7Y2FzZSAiR1AiOmI9Ymk7YnJlYWs7Y2FzZSAiSEEiOmI9V2g7YnJlYWs7Y2FzZSAiVUEiOmI9bWk7YnJlYWs7ZGVmYXVsdDpJKGEudnRwX2d0bU9uRmFpbHVyZSk7cmV0dXJufUkoYS52dHBfZ3RtT25TdWNjZXNzKTt6aShhLnZ0cF9jb250YWluZXJJZCxiLGEudnRwX3JlbW90ZUNvbmZpZ3x8e30pfSl9KCk7CgoKClouYS5jaWQ9WyJnb29nbGUiXSxmdW5jdGlvbigpeyhmdW5jdGlvbihhKXtaLl9fY2lkPWE7Wi5fX2NpZC5iPSJjaWQiO1ouX19jaWQuZz0hMDtaLl9fY2lkLnByaW9yaXR5T3ZlcnJpZGU9MH0pKGZ1bmN0aW9uKCl7cmV0dXJuIFZjLnN9KX0oKTsKCgoKWi5hLmd0YWdhdz1bImdvb2dsZSJdLGZ1bmN0aW9uKCl7KGZ1bmN0aW9uKGEpe1ouX19ndGFnYXc9YTtaLl9fZ3RhZ2F3LmI9Imd0YWdhdyI7Wi5fX2d0YWdhdy5nPSEwO1ouX19ndGFnYXcucHJpb3JpdHlPdmVycmlkZT0wfSkoZnVuY3Rpb24oYSl7dmFyIGI9YS52dHBfY29udmVyc2lvbklkLGM9Y2Q7emkoYi5pZCxsaCk7aWYoYz09PUouQyl7dmFyIGQ9VSgiZ3RhZy50YXJnZXRzLiIrYi5pZCk7QmkoZCxiLmlkKX1lbHNle3ZhciBlPVUoImV2ZW50TW9kZWwiKTtBaShjLGUsYi5pZCl9SShhLnZ0cF9ndG1PblN1Y2Nlc3MpfSl9KCk7CgpaLmEuZ2V0PVsiZ29vZ2xlIl0sZnVuY3Rpb24oKXsoZnVuY3Rpb24oYSl7Wi5fX2dldD1hO1ouX19nZXQuYj0iZ2V0IjtaLl9fZ2V0Lmc9ITA7Wi5fX2dldC5wcmlvcml0eU92ZXJyaWRlPTB9KShmdW5jdGlvbihhKXtpZihhLnZ0cF9pc0F1dG9UYWcpe3ZhciBiPVN0cmluZyhhLnZ0cF90cmFja2luZ0lkKSxjPWNkfHwiIixkPXt9O2lmKGM9PT1KLkMpe3ZhciBlPVUoImd0YWcudGFyZ2V0cy4iK2IpO0QoZSxkKTtkW0oucmFdPSEwO0JpKGQsYil9ZWxzZXt2YXIgZj1VKCJldmVudE1vZGVsIik7RChmLGQpO2RbSi5yYV09ITA7QWkoYyxkLGIpfX1lbHNle3ZhciBoPWEudnRwX3NldHRpbmdzOyhhLnZ0cF9kZWZlcnJhYmxlP01tOkxtKShTdHJpbmcoaC5zdHJlYW1JZCksU3RyaW5nKGEudnRwX2V2ZW50TmFtZSksaC5ldmVudFBhcmFtZXRlcnN8fHt9KX1hLnZ0cF9ndG1PblN1Y2Nlc3MoKX0pfSgpOwoKWi5hLmd0YWdmbD1bXSxmdW5jdGlvbigpeyhmdW5jdGlvbihhKXtaLl9fZ3RhZ2ZsPWE7Wi5fX2d0YWdmbC5iPSJndGFnZmwiO1ouX19ndGFnZmwuZz0hMDtaLl9fZ3RhZ2ZsLnByaW9yaXR5T3ZlcnJpZGU9MH0pKGZ1bmN0aW9uKGEpe3ZhciBiPWEudnRwX3RhcmdldElkLGM9Y2QsZD1VKCJldmVudE1vZGVsIik7emkoYixNaCk7aWYoYz09PUouQyl7dmFyIGU9VSgiZ3RhZy50YXJnZXRzLiIrYik7QmkoZSxiKX1lbHNlIEFpKGMsZCxiKTtJKGEudnRwX2d0bU9uU3VjY2Vzcyl9KX0oKTsKCgpaLmEuZ3RhZ2dmPVsiZ29vZ2xlIl0sZnVuY3Rpb24oKXsoZnVuY3Rpb24oYSl7Wi5fX2d0YWdnZj1hO1ouX19ndGFnZ2YuYj0iZ3RhZ2dmIjtaLl9fZ3RhZ2dmLmc9ITA7Wi5fX2d0YWdnZi5wcmlvcml0eU92ZXJyaWRlPTB9KShmdW5jdGlvbihhKXt2YXIgYj1hLnZ0cF9jb252ZXJzaW9uSWQsYz1jZCxkPVUoImV2ZW50TW9kZWwiKTt6aShiLmlkLFJoKTtpZihjPT09Si5DKXt2YXIgZT1VKCJndGFnLnRhcmdldHMuIitiLmlkKTtCaShlLGIuaWQpfWVsc2UgQWkoYyxkLGIuaWQpO0koYS52dHBfZ3RtT25TdWNjZXNzKX0pfSgpOwoKWi5hLmd0YWdncD1bImdvb2dsZSJdLGZ1bmN0aW9uKCl7KGZ1bmN0aW9uKGEpe1ouX19ndGFnZ3A9YTtaLl9fZ3RhZ2dwLmI9Imd0YWdncCI7Wi5fX2d0YWdncC5nPSEwO1ouX19ndGFnZ3AucHJpb3JpdHlPdmVycmlkZT0wfSkoZnVuY3Rpb24oYSl7dmFyIGI9YS52dHBfY29udmVyc2lvbklkLGM9Y2QsZD1VKCJldmVudE1vZGVsIik7emkoYixiaSk7aWYoYz09PUouQyl7dmFyIGU9VSgiZ3RhZy50YXJnZXRzLiIrYik7QmkoZSxiKX1lbHNlIEFpKGMsZCxiKTtJKGEudnRwX2d0bU9uU3VjY2Vzcyl9KX0oKTsKCgoKWi5hLmd0YWd1YT1bImdvb2dsZSJdLGZ1bmN0aW9uKCl7KGZ1bmN0aW9uKGEpe1ouX19ndGFndWE9YTtaLl9fZ3RhZ3VhLmI9Imd0YWd1YSI7Wi5fX2d0YWd1YS5nPSEwO1ouX19ndGFndWEucHJpb3JpdHlPdmVycmlkZT0wfSkoZnVuY3Rpb24oYSl7dmFyIGI9YS52dHBfdHJhY2tpbmdJZCxjPWNkLGQ9VSgiZXZlbnRNb2RlbCIpO3ppKGIsbWkpO2lmKGM9PT1KLkMpe3ZhciBlPVUoImd0YWcudGFyZ2V0cy4iK2IpO0JpKGUsYil9ZWxzZSBBaShjLGQsYik7SShhLnZ0cF9ndG1PblN1Y2Nlc3MpfSl9KCk7CgoKdmFyIFBtPXt9O1BtLm1hY3JvPWZ1bmN0aW9uKGEpe2lmKENqLkJjLmhhc093blByb3BlcnR5KGEpKXJldHVybiBDai5CY1thXX0sUG0ub25IdG1sU3VjY2Vzcz1Dai5oZSghMCksUG0ub25IdG1sRmFpbHVyZT1Dai5oZSghMSk7UG0uZGF0YUxheWVyPU5kO1BtLmNhbGxiYWNrPWZ1bmN0aW9uKGEpe2ZkLmhhc093blByb3BlcnR5KGEpJiZwYShmZFthXSkmJmZkW2FdKCk7ZGVsZXRlIGZkW2FdfTtmdW5jdGlvbiBRbSgpe1djW1ZjLnNdPVBtO0hhKGdkLFouYSk7eGI9eGJ8fENqO3liPXJlfQpmdW5jdGlvbiBSbSgpe3JmLmd0bV8zcGRzPSEwO1djPUYuZ29vZ2xlX3RhZ19tYW5hZ2VyPUYuZ29vZ2xlX3RhZ19tYW5hZ2VyfHx7fTtpZihXY1tWYy5zXSl7dmFyIGE9V2Muem9uZXM7YSYmYS51bnJlZ2lzdGVyQ2hpbGQoVmMucyl9ZWxzZXtmb3IodmFyIGI9ZGF0YS5yZXNvdXJjZXx8Cnt9LGM9Yi5tYWNyb3N8fFtdLGQ9MDtkPGMubGVuZ3RoO2QrKylwYi5wdXNoKGNbZF0pO2Zvcih2YXIgZT1iLnRhZ3N8fFtdLGY9MDtmPGUubGVuZ3RoO2YrKylzYi5wdXNoKGVbZl0pO2Zvcih2YXIgaD1iLnByZWRpY2F0ZXN8fFtdLGs9MDtrPGgubGVuZ3RoO2srKylyYi5wdXNoKGhba10pO2Zvcih2YXIgbD1iLnJ1bGVzfHxbXSxtPTA7bTxsLmxlbmd0aDttKyspe2Zvcih2YXIgbj1sW21dLHI9e30sdT0wO3U8bi5sZW5ndGg7dSsrKXJbblt1XVswXV09QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoblt1XSwxKTtxYi5wdXNoKHIpfXViPVo7dmI9WWs7UW0oKTtCaigpO3ZlPSExO3dlPTA7aWYoImludGVyYWN0aXZlIj09Ry5yZWFkeVN0YXRlJiYhRy5jcmVhdGVFdmVudE9iamVjdHx8ImNvbXBsZXRlIj09Ry5yZWFkeVN0YXRlKXllKCk7ZWxzZXttYyhHLCJET01Db250ZW50TG9hZGVkIix5ZSk7bWMoRywicmVhZHlzdGF0ZWNoYW5nZSIseWUpO2lmKEcuY3JlYXRlRXZlbnRPYmplY3QmJgpHLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCl7dmFyIHA9ITA7dHJ5e3A9IUYuZnJhbWVFbGVtZW50fWNhdGNoKHkpe31wJiZ6ZSgpfW1jKEYsImxvYWQiLHllKX1aaT0hMTsiY29tcGxldGUiPT09Ry5yZWFkeVN0YXRlP2FqKCk6bWMoRiwibG9hZCIsYWopO2E6e2lmKCFDZClicmVhayBhO0Yuc2V0SW50ZXJ2YWwoRGQsODY0RTUpO31iZD0obmV3IERhdGUpLmdldFRpbWUoKTtQbS5ib290c3RyYXA9YmQ7fX1SbSgpOwoKfSkoKQo=
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
fd361b57998c76f86335afa28b8a62527d88a8200fb5c428d6f0fff73383e955
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 04 Jun 2020 23:38:14 GMT
server
Golfe2
age
2358
date
Mon, 13 Jul 2020 20:56:18 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
18469
expires
Mon, 13 Jul 2020 22:56:18 GMT
collect
www.google-analytics.com/r/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j81&a=527611419&t=pageview&_s=1&dl=http%3A%2F%2Fmoodle.ucl.rrnn.me%2Fclient2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect%2F&ul=en-us&de=UTF-8&dt=UCL%20Moodle%3A%20Log%20in%20to%20the%20site&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=KEBAAUABE~&jid=227847898&gjid=1075682981&cid=1655290074.1594676136&tid=UA-4551567-3&_gid=1883344776.1594676136&_r=1&gtm=2ou3p1&z=1873624589
Requested by
Host: moodle.ucl.rrnn.me
URL: http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 13 Jul 2020 21:35:36 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
truncated
/
918 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
423ff14c52ec6925a505b7dc8420af419e877f056ea7a9d98b04b15c6c2ac1d1

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
85 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d8b560b0de451450b378976aadf95623e77714bfdcddf7a4602332d2c98d394

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
14 KB
14 KB
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9c50a96c859b9beea47b71740bd14e7f69a4df586d015f47434037f8def53b52

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Origin
http://moodle.ucl.rrnn.me

Response headers

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

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
85 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
12 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c0d8568fe6f9d837f664000f1973f22009d776aabb49bd6daf692912825f6e28

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
21 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
af44c83f737c501b3862145a4a30d18f780168a429f94c9a6ef90b71f464c858

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
5 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
87d3c5e03355bf60f1603a860425b44d849425708463613a57c354a2b18405c1

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
3 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4716cba143c796ec52cb2a097d569aef24d42df2b959f9dde09379664846ad5c

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
6 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7d54882ec2e47c8a561f969a92d4694b9756c95bc2d02f8c1a03de8ea31fe3d8

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
21 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
449723b1d16bcd4fd32e34bcbd8f41a2ff7cfe84b939740a9417f71dd4f61479

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
5 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
bc44e3c31ade476e79495064cf8ff4f6bf63a8f3da772da617acacc39e221ac1

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
image/png
truncated
/
17 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4b9f572393f50aa7fd63ba6ac5d3b39c1a4ee71e27766757a76821418c040650

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
application/javascript
truncated
/
75 KB
75 KB
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Origin
http://moodle.ucl.rrnn.me

Response headers

Content-Type
application/font-woff2
truncated
/
15 KB
15 KB
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
1491de1b31182d38593bcf660c99bc6018af8e192d91663f67ec9d045a3b5ccc

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Origin
http://moodle.ucl.rrnn.me

Response headers

Content-Type
font/woff2
moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm
www.ucl.ac.uk/isd/news/2020/jul/
Redirect Chain
  • https://moodle.ucl.ac.uk/theme/yui_combo.php?m/1583791301/core/event/event-min.js&m/1583791301/core/widget/widget-focusafterclose-min.js&3.17.2/plugin/plugin-min.js&m/1583791301/core/lockscroll/loc...
  • https://www.ucl.ac.uk/isd/news/2020/jul/moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm?m/1583791301/core/event/event-min.js&m/1583791301/core/widget/widget-focusafterclose-min.js&3...
0
0
Script
General
Full URL
https://www.ucl.ac.uk/isd/news/2020/jul/moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm?m/1583791301/core/event/event-min.js&m/1583791301/core/widget/widget-focusafterclose-min.js&3.17.2/plugin/plugin-min.js&m/1583791301/core/lockscroll/lockscroll-min.js&m/1583791301/core/notification/notification-dialogue-min.js&m/1583791301/core/notification/notification-alert-min.js&m/1583791301/core/notification/notification-exception-min.js&m/1583791301/core/notification/notification-ajaxexception-min.js&m/1583791301/filter_glossary/autolinker/autolinker-min.js
Requested by
Host: moodle.ucl.rrnn.me
URL: http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.60.250.24 London, United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
wwwr-02-188-d05-vip.ucl.ac.uk
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Redirect headers

Location
https://www.ucl.ac.uk/isd/news/2020/jul/moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm?m/1583791301/core/event/event-min.js&m/1583791301/core/widget/widget-focusafterclose-min.js&3.17.2/plugin/plugin-min.js&m/1583791301/core/lockscroll/lockscroll-min.js&m/1583791301/core/notification/notification-dialogue-min.js&m/1583791301/core/notification/notification-alert-min.js&m/1583791301/core/notification/notification-exception-min.js&m/1583791301/core/notification/notification-ajaxexception-min.js&m/1583791301/filter_glossary/autolinker/autolinker-min.js
Date
Mon, 13 Jul 2020 21:35:36 GMT
Server
Apache/2.4.6 (Red Hat Enterprise Linux)
Connection
close
Content-Length
787
Content-Type
text/html; charset=iso-8859-1
moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm
www.ucl.ac.uk/isd/news/2020/jul/
Redirect Chain
  • https://moodle.ucl.ac.uk/lib/requirejs.php/1583791301/core/first.js
  • https://www.ucl.ac.uk/isd/news/2020/jul/moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm
0
0
Script
General
Full URL
https://www.ucl.ac.uk/isd/news/2020/jul/moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm
Requested by
Host: moodle.ucl.rrnn.me
URL: http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.60.250.24 London, United Kingdom, ASN786 (JANET Jisc Services Limited, GB),
Reverse DNS
wwwr-02-188-d05-vip.ucl.ac.uk
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Redirect headers

Location
https://www.ucl.ac.uk/isd/news/2020/jul/moodle-1920-scheduled-downtime-monday-13-july-2020-900pm-1100pm
Date
Mon, 13 Jul 2020 21:35:36 GMT
Server
Apache/2.4.6 (Red Hat Enterprise Linux)
Connection
close
Content-Length
287
Content-Type
text/html; charset=iso-8859-1
nr-1167.min.js
js-agent.newrelic.com/
26 KB
10 KB
Script
General
Full URL
https://js-agent.newrelic.com/nr-1167.min.js
Requested by
Host: moodle.ucl.rrnn.me
URL: http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.110 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f4ae8a2c83e0a851fd331bbf34d7a6f9184b3e31b6f2e681e8377fb8a8edc10f

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Mon, 13 Jul 2020 21:35:37 GMT
content-encoding
gzip
x-amz-request-id
9F168BA697B778D0
x-cache
HIT
status
200
content-length
10178
x-amz-id-2
yYgBioLjCplIhDxMZm/PKonf0xZGo/IH9CxBrQAf8lWo1+WyLnApygFOHARQZ+4eJQtQu20EMwQ=
x-served-by
cache-hhn4057-HHN
last-modified
Fri, 07 Feb 2020 23:39:55 GMT
server
AmazonS3
x-timer
S1594676138.597027,VS0,VE0
etag
"8155781ab74e51eee2ead2c1d5902e63"
vary
Accept-Encoding
content-type
application/javascript
via
1.1 varnish
cache-control
public, max-age=7200, stale-if-error=604800
accept-ranges
bytes
x-cache-hits
433
e208fce074
bam.nr-data.net/1/
57 B
275 B
Script
General
Full URL
https://bam.nr-data.net/1/e208fce074?a=84293272&v=1167.2a4546b&to=Y1BXZBRVV0dUWkUKXFoaYEIPG1VbUlBfTFpaUVBISERRRA%3D%3D&rst=1753&ref=http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/&ap=125&be=242&fe=1716&dc=793&af=err,xhr,stn,ins&perf=%7B%22timing%22:%7B%22of%22:1594676135867,%22n%22:0,%22f%22:0,%22dn%22:1,%22dne%22:147,%22c%22:147,%22ce%22:152,%22rq%22:152,%22rp%22:209,%22rpe%22:596,%22dl%22:212,%22di%22:793,%22ds%22:793,%22de%22:795,%22dc%22:1716,%22l%22:1716,%22le%22:1717%7D,%22navigation%22:%7B%7D%7D&fp=596&fcp=864&at=TxdUElxPREk%3D&jsonp=NREUM.setToken
Requested by
Host: js-agent.newrelic.com
URL: https://js-agent.newrelic.com/nr-1167.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
162.247.242.19 San Francisco, United States, ASN23467 (NEWRELIC-AS-1, US),
Reverse DNS
Software
/
Resource Hash
f69a13217482dc43f25e74cfcb9391d0f06d22501f10f5cb5e413d2d98a5cd23

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Expires
Thu, 01 Jan 1970 00:00:00 GMT
Content-Length
57
Content-Type
text/javascript;charset=ISO-8859-1
MathMenu.js
moodle.ucl.rrnn.me/extensions/
0
0
Script
General
Full URL
http://moodle.ucl.rrnn.me/extensions/MathMenu.js?V=2.7.5
Requested by
Host: application
URL: data:application/javascript;base64,LyoKICogIC9NYXRoSmF4LmpzCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDktMjAxOCBUaGUgTWF0aEpheCBDb25zb3J0aXVtCiAqCiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQmJmRvY3VtZW50LmNoaWxkTm9kZXMmJmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpe2lmKCEod2luZG93Lk1hdGhKYXgmJk1hdGhKYXguSHViKSl7aWYod2luZG93Lk1hdGhKYXgpe3dpbmRvdy5NYXRoSmF4PXtBdXRob3JDb25maWc6d2luZG93Lk1hdGhKYXh9fWVsc2V7d2luZG93Lk1hdGhKYXg9e319TWF0aEpheC5pc1BhY2tlZD10cnVlO01hdGhKYXgudmVyc2lvbj0iMi43LjUiO01hdGhKYXguZmlsZXZlcnNpb249IjIuNy41IjtNYXRoSmF4LmNkblZlcnNpb249IjIuNy41IjtNYXRoSmF4LmNkbkZpbGVWZXJzaW9ucz17fTsoZnVuY3Rpb24oZCl7dmFyIGI9d2luZG93W2RdO2lmKCFiKXtiPXdpbmRvd1tkXT17fX12YXIgZT1bXTt2YXIgYz1mdW5jdGlvbihmKXt2YXIgZz1mLmNvbnN0cnVjdG9yO2lmKCFnKXtnPWZ1bmN0aW9uKCl7fX1mb3IodmFyIGggaW4gZil7aWYoaCE9PSJjb25zdHJ1Y3RvciImJmYuaGFzT3duUHJvcGVydHkoaCkpe2dbaF09ZltoXX19cmV0dXJuIGd9O3ZhciBhPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5jYWxsZWUuSW5pdC5jYWxsKHRoaXMsYXJndW1lbnRzKX19O2IuT2JqZWN0PWMoe2NvbnN0cnVjdG9yOmEoKSxTdWJjbGFzczpmdW5jdGlvbihmLGgpe3ZhciBnPWEoKTtnLlNVUEVSPXRoaXM7Zy5Jbml0PXRoaXMuSW5pdDtnLlN1YmNsYXNzPXRoaXMuU3ViY2xhc3M7Zy5BdWdtZW50PXRoaXMuQXVnbWVudDtnLnByb3RvRnVuY3Rpb249dGhpcy5wcm90b0Z1bmN0aW9uO2cuY2FuPXRoaXMuY2FuO2cuaGFzPXRoaXMuaGFzO2cuaXNhPXRoaXMuaXNhO2cucHJvdG90eXBlPW5ldyB0aGlzKGUpO2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPWc7Zy5BdWdtZW50KGYsaCk7cmV0dXJuIGd9LEluaXQ6ZnVuY3Rpb24oZil7dmFyIGc9dGhpcztpZihmLmxlbmd0aD09PTEmJmZbMF09PT1lKXtyZXR1cm4gZ31pZighKGcgaW5zdGFuY2VvZiBmLmNhbGxlZSkpe2c9bmV3IGYuY2FsbGVlKGUpfXJldHVybiBnLkluaXQuYXBwbHkoZyxmKXx8Z30sQXVnbWVudDpmdW5jdGlvbihmLGcpe3ZhciBoO2lmKGYhPW51bGwpe2ZvcihoIGluIGYpe2lmKGYuaGFzT3duUHJvcGVydHkoaCkpe3RoaXMucHJvdG9GdW5jdGlvbihoLGZbaF0pfX1pZihmLnRvU3RyaW5nIT09dGhpcy5wcm90b3R5cGUudG9TdHJpbmcmJmYudG9TdHJpbmchPT17fS50b1N0cmluZyl7dGhpcy5wcm90b0Z1bmN0aW9uKCJ0b1N0cmluZyIsZi50b1N0cmluZyl9fWlmKGchPW51bGwpe2ZvcihoIGluIGcpe2lmKGcuaGFzT3duUHJvcGVydHkoaCkpe3RoaXNbaF09Z1toXX19fXJldHVybiB0aGlzfSxwcm90b0Z1bmN0aW9uOmZ1bmN0aW9uKGcsZil7dGhpcy5wcm90b3R5cGVbZ109ZjtpZih0eXBlb2YgZj09PSJmdW5jdGlvbiIpe2YuU1VQRVI9dGhpcy5TVVBFUi5wcm90b3R5cGV9fSxwcm90b3R5cGU6e0luaXQ6ZnVuY3Rpb24oKXt9LFNVUEVSOmZ1bmN0aW9uKGYpe3JldHVybiBmLmNhbGxlZS5TVVBFUn0sY2FuOmZ1bmN0aW9uKGYpe3JldHVybiB0eXBlb2YodGhpc1tmXSk9PT0iZnVuY3Rpb24ifSxoYXM6ZnVuY3Rpb24oZil7cmV0dXJuIHR5cGVvZih0aGlzW2ZdKSE9PSJ1bmRlZmluZWQifSxpc2E6ZnVuY3Rpb24oZil7cmV0dXJuKGYgaW5zdGFuY2VvZiBPYmplY3QpJiYodGhpcyBpbnN0YW5jZW9mIGYpfX0sY2FuOmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLnByb3RvdHlwZS5jYW4uY2FsbCh0aGlzLGYpfSxoYXM6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMucHJvdG90eXBlLmhhcy5jYWxsKHRoaXMsZil9LGlzYTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO3doaWxlKGYpe2lmKGY9PT1nKXtyZXR1cm4gdHJ1ZX1lbHNle2Y9Zi5TVVBFUn19cmV0dXJuIGZhbHNlfSxTaW1wbGVTVVBFUjpjKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5TaW1wbGVTVVBFUi5kZWZpbmUoZil9LGRlZmluZTpmdW5jdGlvbihmKXt2YXIgaD17fTtpZihmIT1udWxsKXtmb3IodmFyIGcgaW4gZil7aWYoZi5oYXNPd25Qcm9wZXJ0eShnKSl7aFtnXT10aGlzLndyYXAoZyxmW2ddKX19aWYoZi50b1N0cmluZyE9PXRoaXMucHJvdG90eXBlLnRvU3RyaW5nJiZmLnRvU3RyaW5nIT09e30udG9TdHJpbmcpe2gudG9TdHJpbmc9dGhpcy53cmFwKCJ0b1N0cmluZyIsZi50b1N0cmluZyl9fXJldHVybiBofSx3cmFwOmZ1bmN0aW9uKGksaCl7aWYodHlwZW9mKGgpIT09ImZ1bmN0aW9uInx8IWgudG9TdHJpbmcoKS5tYXRjaCgvXC5ccypTVVBFUlxzKlwoLykpe3JldHVybiBofXZhciBnPWZ1bmN0aW9uKCl7dGhpcy5TVVBFUj1nLlNVUEVSW2ldO3RyeXt2YXIgZj1oLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jYXRjaChqKXtkZWxldGUgdGhpcy5TVVBFUjt0aHJvdyBqfWRlbGV0ZSB0aGlzLlNVUEVSO3JldHVybiBmfTtnLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGgudG9TdHJpbmcuYXBwbHkoaCxhcmd1bWVudHMpfTtyZXR1cm4gZ319KX0pO2IuT2JqZWN0LmlzQXJyYXk9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmKT09PSJbb2JqZWN0IEFycmF5XSJ9O2IuT2JqZWN0LkFycmF5PUFycmF5fSkoIk1hdGhKYXgiKTsoZnVuY3Rpb24oQkFTRU5BTUUpe3ZhciBCQVNFPXdpbmRvd1tCQVNFTkFNRV07aWYoIUJBU0Upe0JBU0U9d2luZG93W0JBU0VOQU1FXT17fX12YXIgaXNBcnJheT1CQVNFLk9iamVjdC5pc0FycmF5O3ZhciBDQUxMQkFDSz1mdW5jdGlvbihkYXRhKXt2YXIgY2I9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmNhbGxlZS5leGVjdXRlLmFwcGx5KGFyZ3VtZW50cy5jYWxsZWUsYXJndW1lbnRzKX07Zm9yKHZhciBpZCBpbiBDQUxMQkFDSy5wcm90b3R5cGUpe2lmKENBTExCQUNLLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShpZCkpe2lmKHR5cGVvZihkYXRhW2lkXSkhPT0idW5kZWZpbmVkIil7Y2JbaWRdPWRhdGFbaWRdfWVsc2V7Y2JbaWRdPUNBTExCQUNLLnByb3RvdHlwZVtpZF19fX1jYi50b1N0cmluZz1DQUxMQkFDSy5wcm90b3R5cGUudG9TdHJpbmc7cmV0dXJuIGNifTtDQUxMQkFDSy5wcm90b3R5cGU9e2lzQ2FsbGJhY2s6dHJ1ZSxob29rOmZ1bmN0aW9uKCl7fSxkYXRhOltdLG9iamVjdDp3aW5kb3csZXhlY3V0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmNhbGxlZHx8dGhpcy5hdXRvUmVzZXQpe3RoaXMuY2FsbGVkPSF0aGlzLmF1dG9SZXNldDtyZXR1cm4gdGhpcy5ob29rLmFwcGx5KHRoaXMub2JqZWN0LHRoaXMuZGF0YS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpKX19LHJlc2V0OmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuY2FsbGVkfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhvb2sudG9TdHJpbmcuYXBwbHkodGhpcy5ob29rLGFyZ3VtZW50cyl9fTt2YXIgSVNDQUxMQkFDSz1mdW5jdGlvbihmKXtyZXR1cm4odHlwZW9mKGYpPT09ImZ1bmN0aW9uIiYmZi5pc0NhbGxiYWNrKX07dmFyIEVWQUw9ZnVuY3Rpb24oY29kZSl7cmV0dXJuIGV2YWwuY2FsbCh3aW5kb3csY29kZSl9O3ZhciBURVNURVZBTD1mdW5jdGlvbigpe0VWQUwoInZhciBfX1RlU3RfVmFSX18gPSAxIik7aWYod2luZG93Ll9fVGVTdF9WYVJfXyl7dHJ5e2RlbGV0ZSB3aW5kb3cuX19UZVN0X1ZhUl9ffWNhdGNoKGVycm9yKXt3aW5kb3cuX19UZVN0X1ZhUl9fPW51bGx9fWVsc2V7aWYod2luZG93LmV4ZWNTY3JpcHQpe0VWQUw9ZnVuY3Rpb24oY29kZSl7QkFTRS5fX2NvZGU9Y29kZTtjb2RlPSJ0cnkgeyIrQkFTRU5BTUUrIi5fX3Jlc3VsdCA9IGV2YWwoIitCQVNFTkFNRSsiLl9fY29kZSl9IGNhdGNoKGVycikgeyIrQkFTRU5BTUUrIi5fX3Jlc3VsdCA9IGVycn0iO3dpbmRvdy5leGVjU2NyaXB0KGNvZGUpO3ZhciByZXN1bHQ9QkFTRS5fX3Jlc3VsdDtkZWxldGUgQkFTRS5fX3Jlc3VsdDtkZWxldGUgQkFTRS5fX2NvZGU7aWYocmVzdWx0IGluc3RhbmNlb2YgRXJyb3Ipe3Rocm93IHJlc3VsdH1yZXR1cm4gcmVzdWx0fX1lbHNle0VWQUw9ZnVuY3Rpb24oY29kZSl7QkFTRS5fX2NvZGU9Y29kZTtjb2RlPSJ0cnkgeyIrQkFTRU5BTUUrIi5fX3Jlc3VsdCA9IGV2YWwoIitCQVNFTkFNRSsiLl9fY29kZSl9IGNhdGNoKGVycikgeyIrQkFTRU5BTUUrIi5fX3Jlc3VsdCA9IGVycn0iO3ZhciBoZWFkPShkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpKVswXTtpZighaGVhZCl7aGVhZD1kb2N1bWVudC5ib2R5fXZhciBzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7c2NyaXB0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvZGUpKTtoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7aGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpO3ZhciByZXN1bHQ9QkFTRS5fX3Jlc3VsdDtkZWxldGUgQkFTRS5fX3Jlc3VsdDtkZWxldGUgQkFTRS5fX2NvZGU7aWYocmVzdWx0IGluc3RhbmNlb2YgRXJyb3Ipe3Rocm93IHJlc3VsdH1yZXR1cm4gcmVzdWx0fX19VEVTVEVWQUw9bnVsbH07dmFyIFVTSU5HPWZ1bmN0aW9uKGFyZ3MsaSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MiYmISh0eXBlb2YgYXJndW1lbnRzWzBdPT09ImZ1bmN0aW9uIikmJmFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIE9iamVjdCYmdHlwZW9mIGFyZ3VtZW50c1sxXT09PSJudW1iZXIiKXthcmdzPVtdLnNsaWNlLmNhbGwoYXJncyxpKX1lbHNle2FyZ3M9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCl9fWlmKGlzQXJyYXkoYXJncykmJmFyZ3MubGVuZ3RoPT09MSYmdHlwZW9mKGFyZ3NbMF0pPT09ImZ1bmN0aW9uIil7YXJncz1hcmdzWzBdfWlmKHR5cGVvZiBhcmdzPT09ImZ1bmN0aW9uIil7aWYoYXJncy5leGVjdXRlPT09Q0FMTEJBQ0sucHJvdG90eXBlLmV4ZWN1dGUpe3JldHVybiBhcmdzfXJldHVybiBDQUxMQkFDSyh7aG9vazphcmdzfSl9ZWxzZXtpZihpc0FycmF5KGFyZ3MpKXtpZih0eXBlb2YoYXJnc1swXSk9PT0ic3RyaW5nIiYmYXJnc1sxXSBpbnN0YW5jZW9mIE9iamVjdCYmdHlwZW9mIGFyZ3NbMV1bYXJnc1swXV09PT0iZnVuY3Rpb24iKXtyZXR1cm4gQ0FMTEJBQ0soe2hvb2s6YXJnc1sxXVthcmdzWzBdXSxvYmplY3Q6YXJnc1sxXSxkYXRhOmFyZ3Muc2xpY2UoMil9KX1lbHNle2lmKHR5cGVvZiBhcmdzWzBdPT09ImZ1bmN0aW9uIil7cmV0dXJuIENBTExCQUNLKHtob29rOmFyZ3NbMF0sZGF0YTphcmdzLnNsaWNlKDEpfSl9ZWxzZXtpZih0eXBlb2YgYXJnc1sxXT09PSJmdW5jdGlvbiIpe3JldHVybiBDQUxMQkFDSyh7aG9vazphcmdzWzFdLG9iamVjdDphcmdzWzBdLGRhdGE6YXJncy5zbGljZSgyKX0pfX19fWVsc2V7aWYodHlwZW9mKGFyZ3MpPT09InN0cmluZyIpe2lmKFRFU1RFVkFMKXtURVNURVZBTCgpfXJldHVybiBDQUxMQkFDSyh7aG9vazpFVkFMLGRhdGE6W2FyZ3NdfSl9ZWxzZXtpZihhcmdzIGluc3RhbmNlb2YgT2JqZWN0KXtyZXR1cm4gQ0FMTEJBQ0soYXJncyl9ZWxzZXtpZih0eXBlb2YoYXJncyk9PT0idW5kZWZpbmVkIil7cmV0dXJuIENBTExCQUNLKHt9KX19fX19dGhyb3cgRXJyb3IoIkNhbid0IG1ha2UgY2FsbGJhY2sgZnJvbSBnaXZlbiBkYXRhIil9O3ZhciBERUxBWT1mdW5jdGlvbih0aW1lLGNhbGxiYWNrKXtjYWxsYmFjaz1VU0lORyhjYWxsYmFjayk7Y2FsbGJhY2sudGltZW91dD1zZXRUaW1lb3V0KGNhbGxiYWNrLHRpbWUpO3JldHVybiBjYWxsYmFja307dmFyIFdBSVRGT1I9ZnVuY3Rpb24oY2FsbGJhY2ssc2lnbmFsKXtjYWxsYmFjaz1VU0lORyhjYWxsYmFjayk7aWYoIWNhbGxiYWNrLmNhbGxlZCl7V0FJVFNJR05BTChjYWxsYmFjayxzaWduYWwpO3NpZ25hbC5wZW5kaW5nKyt9fTt2YXIgV0FJVEVYRUNVVEU9ZnVuY3Rpb24oKXt2YXIgc2lnbmFscz10aGlzLnNpZ25hbDtkZWxldGUgdGhpcy5zaWduYWw7dGhpcy5leGVjdXRlPXRoaXMub2xkRXhlY3V0ZTtkZWxldGUgdGhpcy5vbGRFeGVjdXRlO3ZhciByZXN1bHQ9dGhpcy5leGVjdXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihJU0NBTExCQUNLKHJlc3VsdCkmJiFyZXN1bHQuY2FsbGVkKXtXQUlUU0lHTkFMKHJlc3VsdCxzaWduYWxzKX1lbHNle2Zvcih2YXIgaT0wLG09c2lnbmFscy5sZW5ndGg7aTxtO2krKyl7c2lnbmFsc1tpXS5wZW5kaW5nLS07aWYoc2lnbmFsc1tpXS5wZW5kaW5nPD0wKXtzaWduYWxzW2ldLmNhbGwoKX19fX07dmFyIFdBSVRTSUdOQUw9ZnVuY3Rpb24oY2FsbGJhY2ssc2lnbmFscyl7aWYoIWlzQXJyYXkoc2lnbmFscykpe3NpZ25hbHM9W3NpZ25hbHNdfWlmKCFjYWxsYmFjay5zaWduYWwpe2NhbGxiYWNrLm9sZEV4ZWN1dGU9Y2FsbGJhY2suZXhlY3V0ZTtjYWxsYmFjay5leGVjdXRlPVdBSVRFWEVDVVRFO2NhbGxiYWNrLnNpZ25hbD1zaWduYWxzfWVsc2V7aWYoc2lnbmFscy5sZW5ndGg9PT0xKXtjYWxsYmFjay5zaWduYWwucHVzaChzaWduYWxzWzBdKX1lbHNle2NhbGxiYWNrLnNpZ25hbD1jYWxsYmFjay5zaWduYWwuY29uY2F0KHNpZ25hbHMpfX19O3ZhciBBRlRFUj1mdW5jdGlvbihjYWxsYmFjayl7Y2FsbGJhY2s9VVNJTkcoY2FsbGJhY2spO2NhbGxiYWNrLnBlbmRpbmc9MDtmb3IodmFyIGk9MSxtPWFyZ3VtZW50cy5sZW5ndGg7aTxtO2krKyl7aWYoYXJndW1lbnRzW2ldKXtXQUlURk9SKGFyZ3VtZW50c1tpXSxjYWxsYmFjayl9fWlmKGNhbGxiYWNrLnBlbmRpbmc9PT0wKXt2YXIgcmVzdWx0PWNhbGxiYWNrKCk7aWYoSVNDQUxMQkFDSyhyZXN1bHQpKXtjYWxsYmFjaz1yZXN1bHR9fXJldHVybiBjYWxsYmFja307dmFyIEhPT0tTPU1hdGhKYXguT2JqZWN0LlN1YmNsYXNzKHtJbml0OmZ1bmN0aW9uKHJlc2V0KXt0aGlzLmhvb2tzPVtdO3RoaXMucmVtb3ZlPVtdO3RoaXMucmVzZXQ9cmVzZXQ7dGhpcy5ydW5uaW5nPWZhbHNlfSxBZGQ6ZnVuY3Rpb24oaG9vayxwcmlvcml0eSl7aWYocHJpb3JpdHk9PW51bGwpe3ByaW9yaXR5PTEwfWlmKCFJU0NBTExCQUNLKGhvb2spKXtob29rPVVTSU5HKGhvb2spfWhvb2sucHJpb3JpdHk9cHJpb3JpdHk7dmFyIGk9dGhpcy5ob29rcy5sZW5ndGg7d2hpbGUoaT4wJiZwcmlvcml0eTx0aGlzLmhvb2tzW2ktMV0ucHJpb3JpdHkpe2ktLX10aGlzLmhvb2tzLnNwbGljZShpLDAsaG9vayk7cmV0dXJuIGhvb2t9LFJlbW92ZTpmdW5jdGlvbihob29rKXtmb3IodmFyIGk9MCxtPXRoaXMuaG9va3MubGVuZ3RoO2k8bTtpKyspe2lmKHRoaXMuaG9va3NbaV09PT1ob29rKXtpZih0aGlzLnJ1bm5pbmcpe3RoaXMucmVtb3ZlLnB1c2goaSl9ZWxzZXt0aGlzLmhvb2tzLnNwbGljZShpLDEpfXJldHVybn19fSxFeGVjdXRlOmZ1bmN0aW9uKCl7dmFyIGNhbGxiYWNrcz1be31dO3RoaXMucnVubmluZz10cnVlO2Zvcih2YXIgaT0wLG09dGhpcy5ob29rcy5sZW5ndGg7aTxtO2krKyl7aWYodGhpcy5yZXNldCl7dGhpcy5ob29rc1tpXS5yZXNldCgpfXZhciByZXN1bHQ9dGhpcy5ob29rc1tpXS5hcHBseSh3aW5kb3csYXJndW1lbnRzKTtpZihJU0NBTExCQUNLKHJlc3VsdCkmJiFyZXN1bHQuY2FsbGVkKXtjYWxsYmFja3MucHVzaChyZXN1bHQpfX10aGlzLnJ1bm5pbmc9ZmFsc2U7aWYodGhpcy5yZW1vdmUubGVuZ3RoKXt0aGlzLlJlbW92ZVBlbmRpbmcoKX1pZihjYWxsYmFja3MubGVuZ3RoPT09MSl7cmV0dXJuIG51bGx9aWYoY2FsbGJhY2tzLmxlbmd0aD09PTIpe3JldHVybiBjYWxsYmFja3NbMV19cmV0dXJuIEFGVEVSLmFwcGx5KHt9LGNhbGxiYWNrcyl9LFJlbW92ZVBlbmRpbmc6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZT10aGlzLnJlbW92ZS5zb3J0KCk7Zm9yKHZhciBpPXRoaXMucmVtb3ZlLmxlbmd0aC0xO2k+PTA7aS0tKXt0aGlzLmhvb2tzLnNwbGljZShpLDEpfXRoaXMucmVtb3ZlPVtdfX0pO3ZhciBFWEVDVVRFSE9PS1M9ZnVuY3Rpb24oaG9va3MsZGF0YSxyZXNldCl7aWYoIWhvb2tzKXtyZXR1cm4gbnVsbH1pZighaXNBcnJheShob29rcykpe2hvb2tzPVtob29rc119aWYoIWlzQXJyYXkoZGF0YSkpe2RhdGE9KGRhdGE9PW51bGw/W106W2RhdGFdKX12YXIgaGFuZGxlcj1IT09LUyhyZXNldCk7Zm9yKHZhciBpPTAsbT1ob29rcy5sZW5ndGg7aTxtO2krKyl7aGFuZGxlci5BZGQoaG9va3NbaV0pfXJldHVybiBoYW5kbGVyLkV4ZWN1dGUuYXBwbHkoaGFuZGxlcixkYXRhKX07dmFyIFFVRVVFPUJBU0UuT2JqZWN0LlN1YmNsYXNzKHtJbml0OmZ1bmN0aW9uKCl7dGhpcy5wZW5kaW5nPXRoaXMucnVubmluZz0wO3RoaXMucXVldWU9W107dGhpcy5QdXNoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sUHVzaDpmdW5jdGlvbigpe3ZhciBjYWxsYmFjaztmb3IodmFyIGk9MCxtPWFyZ3VtZW50cy5sZW5ndGg7aTxtO2krKyl7Y2FsbGJhY2s9VVNJTkcoYXJndW1lbnRzW2ldKTtpZihjYWxsYmFjaz09PWFyZ3VtZW50c1tpXSYmIWNhbGxiYWNrLmNhbGxlZCl7Y2FsbGJhY2s9VVNJTkcoWyJ3YWl0Iix0aGlzLGNhbGxiYWNrXSl9dGhpcy5xdWV1ZS5wdXNoKGNhbGxiYWNrKX1pZighdGhpcy5ydW5uaW5nJiYhdGhpcy5wZW5kaW5nKXt0aGlzLlByb2Nlc3MoKX1yZXR1cm4gY2FsbGJhY2t9LFByb2Nlc3M6ZnVuY3Rpb24ocXVldWUpe3doaWxlKCF0aGlzLnJ1bm5pbmcmJiF0aGlzLnBlbmRpbmcmJnRoaXMucXVldWUubGVuZ3RoKXt2YXIgY2FsbGJhY2s9dGhpcy5xdWV1ZVswXTtxdWV1ZT10aGlzLnF1ZXVlLnNsaWNlKDEpO3RoaXMucXVldWU9W107dGhpcy5TdXNwZW5kKCk7dmFyIHJlc3VsdD1jYWxsYmFjaygpO3RoaXMuUmVzdW1lKCk7aWYocXVldWUubGVuZ3RoKXt0aGlzLnF1ZXVlPXF1ZXVlLmNvbmNhdCh0aGlzLnF1ZXVlKX1pZihJU0NBTExCQUNLKHJlc3VsdCkmJiFyZXN1bHQuY2FsbGVkKXtXQUlURk9SKHJlc3VsdCx0aGlzKX19fSxTdXNwZW5kOmZ1bmN0aW9uKCl7dGhpcy5ydW5uaW5nKyt9LFJlc3VtZTpmdW5jdGlvbigpe2lmKHRoaXMucnVubmluZyl7dGhpcy5ydW5uaW5nLS19fSxjYWxsOmZ1bmN0aW9uKCl7dGhpcy5Qcm9jZXNzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2FpdDpmdW5jdGlvbihjYWxsYmFjayl7cmV0dXJuIGNhbGxiYWNrfX0pO3ZhciBTSUdOQUw9UVVFVUUuU3ViY2xhc3Moe0luaXQ6ZnVuY3Rpb24obmFtZSl7UVVFVUUucHJvdG90eXBlLkluaXQuY2FsbCh0aGlzKTt0aGlzLm5hbWU9bmFtZTt0aGlzLnBvc3RlZD1bXTt0aGlzLmxpc3RlbmVycz1IT09LUyh0cnVlKTt0aGlzLnBvc3Rpbmc9ZmFsc2U7dGhpcy5jYWxsYmFjaz1udWxsfSxQb3N0OmZ1bmN0aW9uKG1lc3NhZ2UsY2FsbGJhY2ssZm9yZ2V0KXtjYWxsYmFjaz1VU0lORyhjYWxsYmFjayk7aWYodGhpcy5wb3N0aW5nfHx0aGlzLnBlbmRpbmcpe3RoaXMuUHVzaChbIlBvc3QiLHRoaXMsbWVzc2FnZSxjYWxsYmFjayxmb3JnZXRdKX1lbHNle3RoaXMuY2FsbGJhY2s9Y2FsbGJhY2s7Y2FsbGJhY2sucmVzZXQoKTtpZighZm9yZ2V0KXt0aGlzLnBvc3RlZC5wdXNoKG1lc3NhZ2UpfXRoaXMuU3VzcGVuZCgpO3RoaXMucG9zdGluZz10cnVlO3ZhciByZXN1bHQ9dGhpcy5saXN0ZW5lcnMuRXhlY3V0ZShtZXNzYWdlKTtpZihJU0NBTExCQUNLKHJlc3VsdCkmJiFyZXN1bHQuY2FsbGVkKXtXQUlURk9SKHJlc3VsdCx0aGlzKX10aGlzLlJlc3VtZSgpO3RoaXMucG9zdGluZz1mYWxzZTtpZighdGhpcy5wZW5kaW5nKXt0aGlzLmNhbGwoKX19cmV0dXJuIGNhbGxiYWNrfSxDbGVhcjpmdW5jdGlvbihjYWxsYmFjayl7Y2FsbGJhY2s9VVNJTkcoY2FsbGJhY2spO2lmKHRoaXMucG9zdGluZ3x8dGhpcy5wZW5kaW5nKXtjYWxsYmFjaz10aGlzLlB1c2goWyJDbGVhciIsdGhpcyxjYWxsYmFja10pfWVsc2V7dGhpcy5wb3N0ZWQ9W107Y2FsbGJhY2soKX1yZXR1cm4gY2FsbGJhY2t9LGNhbGw6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNrKHRoaXMpO3RoaXMuUHJvY2VzcygpfSxJbnRlcmVzdDpmdW5jdGlvbihjYWxsYmFjayxpZ25vcmVQYXN0LHByaW9yaXR5KXtjYWxsYmFjaz1VU0lORyhjYWxsYmFjayk7dGhpcy5saXN0ZW5lcnMuQWRkKGNhbGxiYWNrLHByaW9yaXR5KTtpZighaWdub3JlUGFzdCl7Zm9yKHZhciBpPTAsbT10aGlzLnBvc3RlZC5sZW5ndGg7aTxtO2krKyl7Y2FsbGJhY2sucmVzZXQoKTt2YXIgcmVzdWx0PWNhbGxiYWNrKHRoaXMucG9zdGVkW2ldKTtpZihJU0NBTExCQUNLKHJlc3VsdCkmJmk9PT10aGlzLnBvc3RlZC5sZW5ndGgtMSl7V0FJVEZPUihyZXN1bHQsdGhpcyl9fX1yZXR1cm4gY2FsbGJhY2t9LE5vSW50ZXJlc3Q6ZnVuY3Rpb24oY2FsbGJhY2spe3RoaXMubGlzdGVuZXJzLlJlbW92ZShjYWxsYmFjayl9LE1lc3NhZ2VIb29rOmZ1bmN0aW9uKG1zZyxjYWxsYmFjayxwcmlvcml0eSl7Y2FsbGJhY2s9VVNJTkcoY2FsbGJhY2spO2lmKCF0aGlzLmhvb2tzKXt0aGlzLmhvb2tzPXt9O3RoaXMuSW50ZXJlc3QoWyJFeGVjdXRlSG9va3MiLHRoaXNdKX1pZighdGhpcy5ob29rc1ttc2ddKXt0aGlzLmhvb2tzW21zZ109SE9PS1ModHJ1ZSl9dGhpcy5ob29rc1ttc2ddLkFkZChjYWxsYmFjayxwcmlvcml0eSk7Zm9yKHZhciBpPTAsbT10aGlzLnBvc3RlZC5sZW5ndGg7aTxtO2krKyl7aWYodGhpcy5wb3N0ZWRbaV09PW1zZyl7Y2FsbGJhY2sucmVzZXQoKTtjYWxsYmFjayh0aGlzLnBvc3RlZFtpXSl9fWNhbGxiYWNrLm1zZz1tc2c7cmV0dXJuIGNhbGxiYWNrfSxFeGVjdXRlSG9va3M6ZnVuY3Rpb24obXNnKXt2YXIgdHlwZT0oaXNBcnJheShtc2cpP21zZ1swXTptc2cpO2lmKCF0aGlzLmhvb2tzW3R5cGVdKXtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5ob29rc1t0eXBlXS5FeGVjdXRlKG1zZyl9LFJlbW92ZUhvb2s6ZnVuY3Rpb24oaG9vayl7dGhpcy5ob29rc1tob29rLm1zZ10uUmVtb3ZlKGhvb2spfX0se3NpZ25hbHM6e30sZmluZDpmdW5jdGlvbihuYW1lKXtpZighU0lHTkFMLnNpZ25hbHNbbmFtZV0pe1NJR05BTC5zaWduYWxzW25hbWVdPW5ldyBTSUdOQUwobmFtZSl9cmV0dXJuIFNJR05BTC5zaWduYWxzW25hbWVdfX0pO0JBU0UuQ2FsbGJhY2s9QkFTRS5DYWxsQmFjaz1VU0lORztCQVNFLkNhbGxiYWNrLkRlbGF5PURFTEFZO0JBU0UuQ2FsbGJhY2suQWZ0ZXI9QUZURVI7QkFTRS5DYWxsYmFjay5RdWV1ZT1RVUVVRTtCQVNFLkNhbGxiYWNrLlNpZ25hbD1TSUdOQUwuZmluZDtCQVNFLkNhbGxiYWNrLkhvb2tzPUhPT0tTO0JBU0UuQ2FsbGJhY2suRXhlY3V0ZUhvb2tzPUVYRUNVVEVIT09LU30pKCJNYXRoSmF4Iik7KGZ1bmN0aW9uKGUpe3ZhciBhPXdpbmRvd1tlXTtpZighYSl7YT13aW5kb3dbZV09e319dmFyIGQ9KG5hdmlnYXRvci52ZW5kb3I9PT0iQXBwbGUgQ29tcHV0ZXIsIEluYy4iJiZ0eXBlb2YgbmF2aWdhdG9yLnZlbmRvclN1Yj09PSJ1bmRlZmluZWQiKTt2YXIgZz0wO3ZhciBoPWZ1bmN0aW9uKGkpe2lmKGRvY3VtZW50LnN0eWxlU2hlZXRzJiZkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg+Zyl7Zz1kb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGh9aWYoIWkpe2k9ZG9jdW1lbnQuaGVhZHx8KChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpKVswXSk7aWYoIWkpe2k9ZG9jdW1lbnQuYm9keX19cmV0dXJuIGl9O3ZhciBmPVtdO3ZhciBjPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPTAsaj1mLmxlbmd0aDtrPGo7aysrKXthLkFqYXguaGVhZC5yZW1vdmVDaGlsZChmW2tdKX1mPVtdfTt2YXIgYj17fTtiW2VdPSIiO2IuYTExeT0iW01hdGhKYXhdL2V4dGVuc2lvbnMvYTExeSI7Yi5Db250cmliPSJodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2NvbnRyaWIiO2EuQWpheD17bG9hZGVkOnt9LGxvYWRpbmc6e30sbG9hZEhvb2tzOnt9LHRpbWVvdXQ6MTUqMTAwMCxzdHlsZURlbGF5OjEsY29uZmlnOntyb290OiIiLHBhdGg6Yn0scGFyYW1zOnt9LFNUQVRVUzp7T0s6MSxFUlJPUjotMX0sZmlsZVVSTDpmdW5jdGlvbihqKXt2YXIgaTt3aGlsZSgoaT1qLm1hdGNoKC9eXFsoWy0uX2EtejAtOV0rKVxdL2kpKSYmYi5oYXNPd25Qcm9wZXJ0eShpWzFdKSl7aj0oYltpWzFdXXx8dGhpcy5jb25maWcucm9vdCkrai5zdWJzdHIoaVsxXS5sZW5ndGgrMil9cmV0dXJuIGp9LGZpbGVOYW1lOmZ1bmN0aW9uKGope3ZhciBpPXRoaXMuY29uZmlnLnJvb3Q7aWYoai5zdWJzdHIoMCxpLmxlbmd0aCk9PT1pKXtqPSJbIitlKyJdIitqLnN1YnN0cihpLmxlbmd0aCl9ZG97dmFyIGs9ZmFsc2U7Zm9yKHZhciBsIGluIGIpe2lmKGIuaGFzT3duUHJvcGVydHkobCkmJmJbbF0pe2lmKGouc3Vic3RyKDAsYltsXS5sZW5ndGgpPT09YltsXSl7aj0iWyIrbCsiXSIrai5zdWJzdHIoYltsXS5sZW5ndGgpO2s9dHJ1ZTticmVha319fX13aGlsZShrKTtyZXR1cm4gan0sZmlsZVJldjpmdW5jdGlvbihqKXt2YXIgaT1hLmNkbkZpbGVWZXJzaW9uc1tqXXx8YS5jZG5WZXJzaW9ufHwiIjtpZihpKXtpPSI/Vj0iK2l9cmV0dXJuIGl9LHVybFJldjpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5maWxlVVJMKGkpK3RoaXMuZmlsZVJldihpKX0sUmVxdWlyZTpmdW5jdGlvbihrLG4pe249YS5DYWxsYmFjayhuKTt2YXIgbDtpZihrIGluc3RhbmNlb2YgT2JqZWN0KXtmb3IodmFyIGogaW4gayl7aWYoay5oYXNPd25Qcm9wZXJ0eShqKSl7bD1qLnRvVXBwZXJDYXNlKCk7az1rW2pdfX19ZWxzZXtsPWsuc3BsaXQoL1wuLykucG9wKCkudG9VcHBlckNhc2UoKX1pZih0aGlzLnBhcmFtcy5ub0NvbnRyaWImJmsuc3Vic3RyKDAsOSk9PT0iW0NvbnRyaWJdIil7bih0aGlzLlNUQVRVUy5FUlJPUil9ZWxzZXtrPXRoaXMuZmlsZVVSTChrKTtpZih0aGlzLmxvYWRlZFtrXSl7bih0aGlzLmxvYWRlZFtrXSl9ZWxzZXt2YXIgbT17fTttW2xdPWs7dGhpcy5Mb2FkKG0sbil9fXJldHVybiBufSxMb2FkOmZ1bmN0aW9uKGssbSl7bT1hLkNhbGxiYWNrKG0pO3ZhciBsO2lmKGsgaW5zdGFuY2VvZiBPYmplY3Qpe2Zvcih2YXIgaiBpbiBrKXtpZihrLmhhc093blByb3BlcnR5KGopKXtsPWoudG9VcHBlckNhc2UoKTtrPWtbal19fX1lbHNle2w9ay5zcGxpdCgvXC4vKS5wb3AoKS50b1VwcGVyQ2FzZSgpfWs9dGhpcy5maWxlVVJMKGspO2lmKHRoaXMubG9hZGluZ1trXSl7dGhpcy5hZGRIb29rKGssbSl9ZWxzZXt0aGlzLmhlYWQ9aCh0aGlzLmhlYWQpO2lmKHRoaXMubG9hZGVyW2xdKXt0aGlzLmxvYWRlcltsXS5jYWxsKHRoaXMsayxtKX1lbHNle3Rocm93IEVycm9yKCJDYW4ndCBsb2FkIGZpbGVzIG9mIHR5cGUgIitsKX19cmV0dXJuIG19LExvYWRIb29rOmZ1bmN0aW9uKGwsbSxrKXttPWEuQ2FsbGJhY2sobSk7aWYobCBpbnN0YW5jZW9mIE9iamVjdCl7Zm9yKHZhciBqIGluIGwpe2lmKGwuaGFzT3duUHJvcGVydHkoaikpe2w9bFtqXX19fWw9dGhpcy5maWxlVVJMKGwpO2lmKHRoaXMubG9hZGVkW2xdKXttKHRoaXMubG9hZGVkW2xdKX1lbHNle3RoaXMuYWRkSG9vayhsLG0sayl9cmV0dXJuIG19LGFkZEhvb2s6ZnVuY3Rpb24oaixrLGkpe2lmKCF0aGlzLmxvYWRIb29rc1tqXSl7dGhpcy5sb2FkSG9va3Nbal09TWF0aEpheC5DYWxsYmFjay5Ib29rcygpfXRoaXMubG9hZEhvb2tzW2pdLkFkZChrLGkpO2suZmlsZT1qfSxyZW1vdmVIb29rOmZ1bmN0aW9uKGkpe2lmKHRoaXMubG9hZEhvb2tzW2kuZmlsZV0pe3RoaXMubG9hZEhvb2tzW2kuZmlsZV0uUmVtb3ZlKGkpO2lmKCF0aGlzLmxvYWRIb29rc1tpLmZpbGVdLmhvb2tzLmxlbmd0aCl7ZGVsZXRlIHRoaXMubG9hZEhvb2tzW2kuZmlsZV19fX0sUHJlbG9hZGluZzpmdW5jdGlvbigpe2Zvcih2YXIgbD0wLGo9YXJndW1lbnRzLmxlbmd0aDtsPGo7bCsrKXt2YXIgaz10aGlzLmZpbGVVUkwoYXJndW1lbnRzW2xdKTtpZighdGhpcy5sb2FkaW5nW2tdKXt0aGlzLmxvYWRpbmdba109e3ByZWxvYWRlZDp0cnVlfX19fSxsb2FkZXI6e0pTOmZ1bmN0aW9uKGssbSl7dmFyIGo9dGhpcy5maWxlTmFtZShrKTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt2YXIgbD1hLkNhbGxiYWNrKFsibG9hZFRpbWVvdXQiLHRoaXMsa10pO3RoaXMubG9hZGluZ1trXT17Y2FsbGJhY2s6bSx0aW1lb3V0OnNldFRpbWVvdXQobCx0aGlzLnRpbWVvdXQpLHN0YXR1czp0aGlzLlNUQVRVUy5PSyxzY3JpcHQ6aX07dGhpcy5sb2FkaW5nW2tdLm1lc3NhZ2U9YS5NZXNzYWdlLkZpbGUoaik7aS5vbmVycm9yPWw7aS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2kuc3JjPWsrdGhpcy5maWxlUmV2KGopO3RoaXMuaGVhZC5hcHBlbmRDaGlsZChpKX0sQ1NTOmZ1bmN0aW9uKGosbCl7dmFyIGk9dGhpcy5maWxlTmFtZShqKTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7ay5yZWw9InN0eWxlc2hlZXQiO2sudHlwZT0idGV4dC9jc3MiO2suaHJlZj1qK3RoaXMuZmlsZVJldihpKTt0aGlzLmxvYWRpbmdbal09e2NhbGxiYWNrOmwsbWVzc2FnZTphLk1lc3NhZ2UuRmlsZShpKSxzdGF0dXM6dGhpcy5TVEFUVVMuT0t9O3RoaXMuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLnRpbWVyLmNyZWF0ZS5jYWxsKHRoaXMsW3RoaXMudGltZXIuZmlsZSxqXSxrKX19LHRpbWVyOntjcmVhdGU6ZnVuY3Rpb24oaixpKXtqPWEuQ2FsbGJhY2soaik7aWYoaS5ub2RlTmFtZT09PSJTVFlMRSImJmkuc3R5bGVTaGVldCYmdHlwZW9mKGkuc3R5bGVTaGVldC5jc3NUZXh0KSE9PSJ1bmRlZmluZWQiKXtqKHRoaXMuU1RBVFVTLk9LKX1lbHNle2lmKHdpbmRvdy5jaHJvbWUmJmkubm9kZU5hbWU9PT0iTElOSyIpe2oodGhpcy5TVEFUVVMuT0spfWVsc2V7aWYoZCl7dGhpcy50aW1lci5zdGFydCh0aGlzLFt0aGlzLnRpbWVyLmNoZWNrU2FmYXJpMixnKyssal0sdGhpcy5zdHlsZURlbGF5KX1lbHNle3RoaXMudGltZXIuc3RhcnQodGhpcyxbdGhpcy50aW1lci5jaGVja0xlbmd0aCxpLGpdLHRoaXMuc3R5bGVEZWxheSl9fX1yZXR1cm4gan0sc3RhcnQ6ZnVuY3Rpb24oaixpLGssbCl7aT1hLkNhbGxiYWNrKGkpO2kuZXhlY3V0ZT10aGlzLmV4ZWN1dGU7aS50aW1lPXRoaXMudGltZTtpLlNUQVRVUz1qLlNUQVRVUztpLnRpbWVvdXQ9bHx8ai50aW1lb3V0O2kuZGVsYXk9aS50b3RhbD1rfHwwO2lmKGspe3NldFRpbWVvdXQoaSxrKX1lbHNle2koKX19LHRpbWU6ZnVuY3Rpb24oaSl7dGhpcy50b3RhbCs9dGhpcy5kZWxheTt0aGlzLmRlbGF5PU1hdGguZmxvb3IodGhpcy5kZWxheSoxLjA1KzUpO2lmKHRoaXMudG90YWw+PXRoaXMudGltZW91dCl7aSh0aGlzLlNUQVRVUy5FUlJPUik7cmV0dXJuIDF9cmV0dXJuIDB9LGZpbGU6ZnVuY3Rpb24oaixpKXtpZihpPDApe2EuQWpheC5sb2FkVGltZW91dChqKX1lbHNle2EuQWpheC5sb2FkQ29tcGxldGUoail9fSxleGVjdXRlOmZ1bmN0aW9uKCl7dGhpcy5ob29rLmNhbGwodGhpcy5vYmplY3QsdGhpcyx0aGlzLmRhdGFbMF0sdGhpcy5kYXRhWzFdKX0sY2hlY2tTYWZhcmkyOmZ1bmN0aW9uKGksaixrKXtpZihpLnRpbWUoaykpe3JldHVybn1pZihkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg+aiYmZG9jdW1lbnQuc3R5bGVTaGVldHNbal0uY3NzUnVsZXMmJmRvY3VtZW50LnN0eWxlU2hlZXRzW2pdLmNzc1J1bGVzLmxlbmd0aCl7ayhpLlNUQVRVUy5PSyl9ZWxzZXtzZXRUaW1lb3V0KGksaS5kZWxheSl9fSxjaGVja0xlbmd0aDpmdW5jdGlvbihpLGwsbil7aWYoaS50aW1lKG4pKXtyZXR1cm59dmFyIG09MDt2YXIgaj0obC5zaGVldHx8bC5zdHlsZVNoZWV0KTt0cnl7aWYoKGouY3NzUnVsZXN8fGoucnVsZXN8fFtdKS5sZW5ndGg+MCl7bT0xfX1jYXRjaChrKXtpZihrLm1lc3NhZ2UubWF0Y2goL3Byb3RlY3RlZCB2YXJpYWJsZXxyZXN0cmljdGVkIFVSSS8pKXttPTF9ZWxzZXtpZihrLm1lc3NhZ2UubWF0Y2goL1NlY3VyaXR5IGVycm9yLykpe209MX19fWlmKG0pe3NldFRpbWVvdXQoYS5DYWxsYmFjayhbbixpLlNUQVRVUy5PS10pLDApfWVsc2V7c2V0VGltZW91dChpLGkuZGVsYXkpfX19LGxvYWRDb21wbGV0ZTpmdW5jdGlvbihpKXtpPXRoaXMuZmlsZVVSTChpKTt2YXIgaj10aGlzLmxvYWRpbmdbaV07aWYoaiYmIWoucHJlbG9hZGVkKXthLk1lc3NhZ2UuQ2xlYXIoai5tZXNzYWdlKTtjbGVhclRpbWVvdXQoai50aW1lb3V0KTtpZihqLnNjcmlwdCl7aWYoZi5sZW5ndGg9PT0wKXtzZXRUaW1lb3V0KGMsMCl9Zi5wdXNoKGouc2NyaXB0KX10aGlzLmxvYWRlZFtpXT1qLnN0YXR1cztkZWxldGUgdGhpcy5sb2FkaW5nW2ldO3RoaXMuYWRkSG9vayhpLGouY2FsbGJhY2spfWVsc2V7aWYoail7ZGVsZXRlIHRoaXMubG9hZGluZ1tpXX10aGlzLmxvYWRlZFtpXT10aGlzLlNUQVRVUy5PSztqPXtzdGF0dXM6dGhpcy5TVEFUVVMuT0t9fWlmKCF0aGlzLmxvYWRIb29rc1tpXSl7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMubG9hZEhvb2tzW2ldLkV4ZWN1dGUoai5zdGF0dXMpfSxsb2FkVGltZW91dDpmdW5jdGlvbihpKXtpZih0aGlzLmxvYWRpbmdbaV0udGltZW91dCl7Y2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1tpXS50aW1lb3V0KX10aGlzLmxvYWRpbmdbaV0uc3RhdHVzPXRoaXMuU1RBVFVTLkVSUk9SO3RoaXMubG9hZEVycm9yKGkpO3RoaXMubG9hZENvbXBsZXRlKGkpfSxsb2FkRXJyb3I6ZnVuY3Rpb24oaSl7YS5NZXNzYWdlLlNldChbIkxvYWRGYWlsZWQiLCJGaWxlIGZhaWxlZCB0byBsb2FkOiAlMSIsaV0sbnVsbCwyMDAwKTthLkh1Yi5zaWduYWwuUG9zdChbImZpbGUgbG9hZCBlcnJvciIsaV0pfSxTdHlsZXM6ZnVuY3Rpb24oayxsKXt2YXIgaT10aGlzLlN0eWxlU3RyaW5nKGspO2lmKGk9PT0iIil7bD1hLkNhbGxiYWNrKGwpO2woKX1lbHNle3ZhciBqPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ai50eXBlPSJ0ZXh0L2NzcyI7dGhpcy5oZWFkPWgodGhpcy5oZWFkKTt0aGlzLmhlYWQuYXBwZW5kQ2hpbGQoaik7aWYoai5zdHlsZVNoZWV0JiZ0eXBlb2Yoai5zdHlsZVNoZWV0LmNzc1RleHQpIT09InVuZGVmaW5lZCIpe2ouc3R5bGVTaGVldC5jc3NUZXh0PWl9ZWxzZXtqLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGkpKX1sPXRoaXMudGltZXIuY3JlYXRlLmNhbGwodGhpcyxsLGopfXJldHVybiBsfSxTdHlsZVN0cmluZzpmdW5jdGlvbihuKXtpZih0eXBlb2Yobik9PT0ic3RyaW5nIil7cmV0dXJuIG59dmFyIGs9IiIsbyxtO2ZvcihvIGluIG4pe2lmKG4uaGFzT3duUHJvcGVydHkobykpe2lmKHR5cGVvZiBuW29dPT09InN0cmluZyIpe2srPW8rIiB7IituW29dKyJ9XG4ifWVsc2V7aWYoYS5PYmplY3QuaXNBcnJheShuW29dKSl7Zm9yKHZhciBsPTA7bDxuW29dLmxlbmd0aDtsKyspe209e307bVtvXT1uW29dW2xdO2srPXRoaXMuU3R5bGVTdHJpbmcobSl9fWVsc2V7aWYoby5zdWJzdHIoMCw2KT09PSJAbWVkaWEiKXtrKz1vKyIgeyIrdGhpcy5TdHlsZVN0cmluZyhuW29dKSsifVxuIn1lbHNle2lmKG5bb10hPW51bGwpe209W107Zm9yKHZhciBqIGluIG5bb10pe2lmKG5bb10uaGFzT3duUHJvcGVydHkoaikpe2lmKG5bb11bal0hPW51bGwpe21bbS5sZW5ndGhdPWorIjogIituW29dW2pdfX19ays9bysiIHsiK20uam9pbigiOyAiKSsifVxuIn19fX19fXJldHVybiBrfX19KSgiTWF0aEpheCIpO01hdGhKYXguSFRNTD17RWxlbWVudDpmdW5jdGlvbihkLGYsZSl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkKSxoO2lmKGYpe2lmKGYuaGFzT3duUHJvcGVydHkoInN0eWxlIikpe3ZhciBjPWYuc3R5bGU7Zi5zdHlsZT17fTtmb3IoaCBpbiBjKXtpZihjLmhhc093blByb3BlcnR5KGgpKXtmLnN0eWxlW2gucmVwbGFjZSgvLShbYS16XSkvZyx0aGlzLnVjTWF0Y2gpXT1jW2hdfX19TWF0aEpheC5IdWIuSW5zZXJ0KGcsZik7Zm9yKGggaW4gZil7aWYoaD09PSJyb2xlInx8aC5zdWJzdHIoMCw1KT09PSJhcmlhLSIpe2cuc2V0QXR0cmlidXRlKGgsZltoXSl9fX1pZihlKXtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShlKSl7ZT1bZV19Zm9yKHZhciBiPTAsYT1lLmxlbmd0aDtiPGE7YisrKXtpZihNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGVbYl0pKXtnLmFwcGVuZENoaWxkKHRoaXMuRWxlbWVudChlW2JdWzBdLGVbYl1bMV0sZVtiXVsyXSkpfWVsc2V7aWYoZD09PSJzY3JpcHQiKXt0aGlzLnNldFNjcmlwdChnLGVbYl0pfWVsc2V7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlW2JdKSl9fX19cmV0dXJuIGd9LHVjTWF0Y2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSxhZGRFbGVtZW50OmZ1bmN0aW9uKGIsYSxkLGMpe3JldHVybiBiLmFwcGVuZENoaWxkKHRoaXMuRWxlbWVudChhLGQsYykpfSxUZXh0Tm9kZTpmdW5jdGlvbihhKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSl9LGFkZFRleHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5hcHBlbmRDaGlsZCh0aGlzLlRleHROb2RlKGIpKX0sc2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7aWYodGhpcy5zZXRTY3JpcHRCdWcpe2EudGV4dD1ifWVsc2V7d2hpbGUoYS5maXJzdENoaWxkKXthLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9dGhpcy5hZGRUZXh0KGEsYil9fSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSl7dmFyIGI9KGEudGV4dD09PSIiP2EuaW5uZXJIVE1MOmEudGV4dCk7cmV0dXJuIGIucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX0sQ29va2llOntwcmVmaXg6Im1qeCIsZXhwaXJlczozNjUsU2V0OmZ1bmN0aW9uKGEsZSl7dmFyIGQ9W107aWYoZSl7Zm9yKHZhciBnIGluIGUpe2lmKGUuaGFzT3duUHJvcGVydHkoZykpe2QucHVzaChnKyI6IitlW2ddLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCImJiIpKX19fXZhciBiPXRoaXMucHJlZml4KyIuIithKyI9Iitlc2NhcGUoZC5qb2luKCImOyIpKTtpZih0aGlzLmV4cGlyZXMpe3ZhciBmPW5ldyBEYXRlKCk7Zi5zZXREYXRlKGYuZ2V0RGF0ZSgpK3RoaXMuZXhwaXJlcyk7Yis9IjsgZXhwaXJlcz0iK2YudG9HTVRTdHJpbmcoKX10cnl7ZG9jdW1lbnQuY29va2llPWIrIjsgcGF0aD0vIn1jYXRjaChjKXt9fSxHZXQ6ZnVuY3Rpb24oYSxkKXtpZighZCl7ZD17fX12YXIgZz1uZXcgUmVnRXhwKCIoPzpefDtcXHMqKSIrdGhpcy5wcmVmaXgrIlxcLiIrYSsiPShbXjtdKikoPzo7fCQpIik7dmFyIGY7dHJ5e2Y9Zy5leGVjKGRvY3VtZW50LmNvb2tpZSl9Y2F0Y2goYyl7fWlmKGYmJmZbMV0hPT0iIil7dmFyIGo9dW5lc2NhcGUoZlsxXSkuc3BsaXQoIiY7Iik7Zm9yKHZhciBlPTAsYj1qLmxlbmd0aDtlPGI7ZSsrKXtmPWpbZV0ubWF0Y2goLyhbXjpdKyk6KC4qKS8pO3ZhciBoPWZbMl0ucmVwbGFjZSgvJiYvZywiJiIpO2lmKGg9PT0idHJ1ZSIpe2g9dHJ1ZX1lbHNle2lmKGg9PT0iZmFsc2UiKXtoPWZhbHNlfWVsc2V7aWYoaC5tYXRjaCgvXi0/KFxkKyhcLlxkKyk/fFwuXGQrKSQvKSl7aD1wYXJzZUZsb2F0KGgpfX19ZFtmWzFdXT1ofX1yZXR1cm4gZH19fTtNYXRoSmF4LkxvY2FsaXphdGlvbj17bG9jYWxlOiJlbiIsZGlyZWN0b3J5OiJbTWF0aEpheF0vbG9jYWxpemF0aW9uIixzdHJpbmdzOnthcjp7bWVudVRpdGxlOiJcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NEFcdTA2MjkifSxhc3Q6e21lbnVUaXRsZToiYXN0dXJpYW51In0sYmc6e21lbnVUaXRsZToiXHUwNDMxXHUwNDRBXHUwNDNCXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNBXHUwNDM4In0sYmNjOnttZW51VGl0bGU6Ilx1MDYyOFx1MDY0NFx1MDY0OFx1MDY4Nlx1MDZDQyJ9LGJyOnttZW51VGl0bGU6ImJyZXpob25lZyJ9LGNhOnttZW51VGl0bGU6ImNhdGFsXHUwMEUwIn0sY2RvOnttZW51VGl0bGU6Ik1cdTAwRUNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFFNzNcdTAzMDQifSxjczp7bWVudVRpdGxlOiJcdTAxMERlXHUwMTYxdGluYSJ9LGRhOnttZW51VGl0bGU6ImRhbnNrIn0sZGU6e21lbnVUaXRsZToiRGV1dHNjaCJ9LGRpcTp7bWVudVRpdGxlOiJaYXpha2kifSxlbjp7bWVudVRpdGxlOiJFbmdsaXNoIixpc0xvYWRlZDp0cnVlfSxlbzp7bWVudVRpdGxlOiJFc3BlcmFudG8ifSxlczp7bWVudVRpdGxlOiJlc3BhXHUwMEYxb2wifSxmYTp7bWVudVRpdGxlOiJcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Q0MifSxmaTp7bWVudVRpdGxlOiJzdW9taSJ9LGZyOnttZW51VGl0bGU6ImZyYW5cdTAwRTdhaXMifSxnbDp7bWVudVRpdGxlOiJnYWxlZ28ifSxoZTp7bWVudVRpdGxlOiJcdTA1RTJcdTA1RDFcdTA1RThcdTA1RDlcdTA1RUEifSxpYTp7bWVudVRpdGxlOiJpbnRlcmxpbmd1YSJ9LGl0OnttZW51VGl0bGU6Iml0YWxpYW5vIn0samE6e21lbnVUaXRsZToiXHU2NUU1XHU2NzJDXHU4QTlFIn0sa246e21lbnVUaXRsZToiXHUwQzk1XHUwQ0E4XHUwQ0NEXHUwQ0E4XHUwQ0ExIn0sa286e21lbnVUaXRsZToiXHVENTVDXHVBRDZEXHVDNUI0In0sbGI6e21lbnVUaXRsZToiTFx1MDBFQnR6ZWJ1ZXJnZXNjaCJ9LGxraTp7bWVudVRpdGxlOiJcdTA2NDRcdTA2RDVcdTA2QTlcdTA2Q0MifSxsdDp7bWVudVRpdGxlOiJsaWV0dXZpXHUwMTczIn0sbWs6e21lbnVUaXRsZToiXHUwNDNDXHUwNDMwXHUwNDNBXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDNEXHUwNDQxXHUwNDNBXHUwNDM4In0sbmw6e21lbnVUaXRsZToiTmVkZXJsYW5kcyJ9LG9jOnttZW51VGl0bGU6Im9jY2l0YW4ifSxwbDp7bWVudVRpdGxlOiJwb2xza2kifSxwdDp7bWVudVRpdGxlOiJwb3J0dWd1XHUwMEVBcyJ9LCJwdC1iciI6e21lbnVUaXRsZToicG9ydHVndVx1MDBFQXMgZG8gQnJhc2lsIn0scnU6e21lbnVUaXRsZToiXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5In0sc2NvOnttZW51VGl0bGU6IlNjb3RzIn0sc2NuOnttZW51VGl0bGU6InNpY2lsaWFudSJ9LHNrOnttZW51VGl0bGU6InNsb3Zlblx1MDEwRGluYSJ9LHNsOnttZW51VGl0bGU6InNsb3Zlblx1MDE2MVx1MDEwRGluYSJ9LHN2OnttZW51VGl0bGU6InN2ZW5za2EifSx0aDp7bWVudVRpdGxlOiJcdTBFNDRcdTBFMTdcdTBFMjIifSx0cjp7bWVudVRpdGxlOiJUXHUwMEZDcmtcdTAwRTdlIn0sdWs6e21lbnVUaXRsZToiXHUwNDQzXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNEXHUwNDQxXHUwNDRDXHUwNDNBXHUwNDMwIn0sdmk6e21lbnVUaXRsZToiVGlcdTFFQkZuZyBWaVx1MUVDN3QifSwiemgtaGFucyI6e21lbnVUaXRsZToiXHU0RTJEXHU2NTg3XHVGRjA4XHU3QjgwXHU0RjUzXHVGRjA5In0sInpoLWhhbnQiOnttZW51VGl0bGU6Ilx1NkM0OVx1OEJFRCJ9fSxwYXR0ZXJuOi8lKFxkK3xce1xkK1x9fFx7W2Etel0rOlwlXGQrKD86XHwoPzolXHtcZCtcfXwlLnxbXlx9XSkqKStcfXwuKS9nLFNQTElUOigiYXhiIi5zcGxpdCgvKHgpLykubGVuZ3RoPT09Mz9mdW5jdGlvbihhLGIpe3JldHVybiBhLnNwbGl0KGIpfTpmdW5jdGlvbihjLGUpe3ZhciBhPVtdLGIsZD0wO2UubGFzdEluZGV4PTA7d2hpbGUoKGI9ZS5leGVjKGMpKSl7YS5wdXNoKGMuc3Vic3RyKGQsYi5pbmRleC1kKSk7YS5wdXNoLmFwcGx5KGEsYi5zbGljZSgxKSk7ZD1iLmluZGV4K2JbMF0ubGVuZ3RofWEucHVzaChjLnN1YnN0cihkKSk7cmV0dXJuIGF9KSxfOmZ1bmN0aW9uKGIsYSl7aWYoTWF0aEpheC5PYmplY3QuaXNBcnJheShhKSl7cmV0dXJuIHRoaXMucHJvY2Vzc1NuaXBwZXQoYixhKX1yZXR1cm4gdGhpcy5wcm9jZXNzU3RyaW5nKHRoaXMubG9va3VwUGhyYXNlKGIsYSksW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSxwcm9jZXNzU3RyaW5nOmZ1bmN0aW9uKGwscCxnKXt2YXIgaixlLG89TWF0aEpheC5PYmplY3QuaXNBcnJheTtmb3Ioaj0wLGU9cC5sZW5ndGg7ajxlO2orKyl7aWYoZyYmbyhwW2pdKSl7cFtqXT10aGlzLnByb2Nlc3NTbmlwcGV0KGcscFtqXSl9fXZhciBmPXRoaXMuU1BMSVQobCx0aGlzLnBhdHRlcm4pO2ZvcihqPTEsZT1mLmxlbmd0aDtqPGU7ais9Mil7dmFyIHE9ZltqXS5jaGFyQXQoMCk7aWYocT49IjAiJiZxPD0iOSIpe2Zbal09cFtmW2pdLTFdO2lmKHR5cGVvZiBmW2pdPT09Im51bWJlciIpe2Zbal09dGhpcy5udW1iZXIoZltqXSl9fWVsc2V7aWYocT09PSJ7Iil7cT1mW2pdLnN1YnN0cigxKTtpZihxPj0iMCImJnE8PSI5Iil7ZltqXT1wW2Zbal0uc3Vic3RyKDEsZltqXS5sZW5ndGgtMiktMV07aWYodHlwZW9mIGZbal09PT0ibnVtYmVyIil7ZltqXT10aGlzLm51bWJlcihmW2pdKX19ZWxzZXt2YXIgaz1mW2pdLm1hdGNoKC9eXHsoW2Etel0rKTolKFxkKylcfCguKilcfSQvKTtpZihrKXtpZihrWzFdPT09InBsdXJhbCIpe3ZhciBkPXBba1syXS0xXTtpZih0eXBlb2YgZD09PSJ1bmRlZmluZWQiKXtmW2pdPSI/Pz8ifWVsc2V7ZD10aGlzLnBsdXJhbChkKS0xO3ZhciBoPWtbM10ucmVwbGFjZSgvKF58W14lXSkoJSUpKiVcfC9nLCIkMSQyJVx1RUZFRiIpLnNwbGl0KC9cfC8pO2lmKGQ+PTAmJmQ8aC5sZW5ndGgpe2Zbal09dGhpcy5wcm9jZXNzU3RyaW5nKGhbZF0ucmVwbGFjZSgvXHVFRkVGL2csInwiKSxwLGcpfWVsc2V7ZltqXT0iPz8/In19fWVsc2V7ZltqXT0iJSIrZltqXX19fX19aWYoZltqXT09bnVsbCl7ZltqXT0iPz8/In19aWYoIWcpe3JldHVybiBmLmpvaW4oIiIpfXZhciBhPVtdLGI9IiI7Zm9yKGo9MDtqPGU7aisrKXtiKz1mW2pdO2orKztpZihqPGUpe2lmKG8oZltqXSkpe2EucHVzaChiKTthPWEuY29uY2F0KGZbal0pO2I9IiJ9ZWxzZXtiKz1mW2pdfX19aWYoYiE9PSIiKXthLnB1c2goYil9cmV0dXJuIGF9LHByb2Nlc3NTbmlwcGV0OmZ1bmN0aW9uKGcsZSl7dmFyIGM9W107Zm9yKHZhciBkPTAsYj1lLmxlbmd0aDtkPGI7ZCsrKXtpZihNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGVbZF0pKXt2YXIgZj1lW2RdO2lmKHR5cGVvZiBmWzFdPT09InN0cmluZyIpe3ZhciBoPWZbMF07aWYoIU1hdGhKYXguT2JqZWN0LmlzQXJyYXkoaCkpe2g9W2csaF19dmFyIGE9dGhpcy5sb29rdXBQaHJhc2UoaCxmWzFdKTtjPWMuY29uY2F0KHRoaXMucHJvY2Vzc01hcmtkb3duKGEsZi5zbGljZSgyKSxnKSl9ZWxzZXtpZihNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGZbMV0pKXtjPWMuY29uY2F0KHRoaXMucHJvY2Vzc1NuaXBwZXQuYXBwbHkodGhpcyxmKSl9ZWxzZXtpZihmLmxlbmd0aD49Myl7Yy5wdXNoKFtmWzBdLGZbMV0sdGhpcy5wcm9jZXNzU25pcHBldChnLGZbMl0pXSl9ZWxzZXtjLnB1c2goZVtkXSl9fX19ZWxzZXtjLnB1c2goZVtkXSl9fXJldHVybiBjfSxtYXJrZG93blBhdHRlcm46LyglLil8KFwqezEsM30pKCg/OiUufC4pKz8pXDJ8KGArKSgoPzolLnwuKSs/KVw0fFxbKCg/OiUufC4pKz8pXF1cKChbXlxzXCldKylcKS8scHJvY2Vzc01hcmtkb3duOmZ1bmN0aW9uKGIsaCxkKXt2YXIgaj1bXSxlO3ZhciBjPWIuc3BsaXQodGhpcy5tYXJrZG93blBhdHRlcm4pO3ZhciBnPWNbMF07Zm9yKHZhciBmPTEsYT1jLmxlbmd0aDtmPGE7Zis9OCl7aWYoY1tmKzFdKXtlPXRoaXMucHJvY2Vzc1N0cmluZyhjW2YrMl0saCxkKTtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShlKSl7ZT1bZV19ZT1bWyJiIiwiaSIsImkiXVtjW2YrMV0ubGVuZ3RoLTFdLHt9LGVdO2lmKGNbZisxXS5sZW5ndGg9PT0zKXtlPVsiYiIse30sZV19fWVsc2V7aWYoY1tmKzNdKXtlPXRoaXMucHJvY2Vzc1N0cmluZyhjW2YrNF0ucmVwbGFjZSgvXlxzLywiIikucmVwbGFjZSgvXHMkLywiIiksaCxkKTtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShlKSl7ZT1bZV19ZT1bImNvZGUiLHt9LGVdfWVsc2V7aWYoY1tmKzVdKXtlPXRoaXMucHJvY2Vzc1N0cmluZyhjW2YrNV0saCxkKTtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShlKSl7ZT1bZV19ZT1bImEiLHtocmVmOnRoaXMucHJvY2Vzc1N0cmluZyhjW2YrNl0saCksdGFyZ2V0OiJfYmxhbmsifSxlXX1lbHNle2crPWNbZl07ZT1udWxsfX19aWYoZSl7aj10aGlzLmNvbmNhdFN0cmluZyhqLGcsaCxkKTtqLnB1c2goZSk7Zz0iIn1pZihjW2YrN10hPT0iIil7Zys9Y1tmKzddfX1qPXRoaXMuY29uY2F0U3RyaW5nKGosZyxoLGQpO3JldHVybiBqfSxjb25jYXRTdHJpbmc6ZnVuY3Rpb24oYSxjLGIsZCl7aWYoYyE9IiIpe2M9dGhpcy5wcm9jZXNzU3RyaW5nKGMsYixkKTtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShjKSl7Yz1bY119YT1hLmNvbmNhdChjKX1yZXR1cm4gYX0sbG9va3VwUGhyYXNlOmZ1bmN0aW9uKGYsYSxkKXtpZighZCl7ZD0iXyJ9aWYoTWF0aEpheC5PYmplY3QuaXNBcnJheShmKSl7ZD0oZlswXXx8Il8iKTtmPShmWzFdfHwiIil9dmFyIGM9dGhpcy5sb2FkRG9tYWluKGQpO2lmKGMpe01hdGhKYXguSHViLlJlc3RhcnRBZnRlcihjKX12YXIgYj10aGlzLnN0cmluZ3NbdGhpcy5sb2NhbGVdO2lmKGIpe2lmKGIuZG9tYWlucyYmZCBpbiBiLmRvbWFpbnMpe3ZhciBlPWIuZG9tYWluc1tkXTtpZihlLnN0cmluZ3MmJmYgaW4gZS5zdHJpbmdzKXthPWUuc3RyaW5nc1tmXX19fXJldHVybiBhfSxsb2FkRmlsZTpmdW5jdGlvbihiLGQsZSl7ZT1NYXRoSmF4LkNhbGxiYWNrKGUpO2I9KGQuZmlsZXx8Yik7aWYoIWIubWF0Y2goL1wuanMkLykpe2IrPSIuanMifWlmKCFiLm1hdGNoKC9eKFthLXpdKzp8XFtNYXRoSmF4XF0pLykpe3ZhciBhPSh0aGlzLnN0cmluZ3NbdGhpcy5sb2NhbGVdLmRpcmVjdG9yeXx8dGhpcy5kaXJlY3RvcnkrIi8iK3RoaXMubG9jYWxlfHwiW01hdGhKYXhdL2xvY2FsaXphdGlvbi8iK3RoaXMubG9jYWxlKTtiPWErIi8iK2J9dmFyIGM9TWF0aEpheC5BamF4LlJlcXVpcmUoYixmdW5jdGlvbigpe2QuaXNMb2FkZWQ9dHJ1ZTtyZXR1cm4gZSgpfSk7cmV0dXJuKGMuY2FsbGVkP251bGw6Yyl9LGxvYWREb21haW46ZnVuY3Rpb24oYyxlKXt2YXIgYixhPXRoaXMuc3RyaW5nc1t0aGlzLmxvY2FsZV07aWYoYSl7aWYoIWEuaXNMb2FkZWQpe2I9dGhpcy5sb2FkRmlsZSh0aGlzLmxvY2FsZSxhKTtpZihiKXtyZXR1cm4gTWF0aEpheC5DYWxsYmFjay5RdWV1ZShiLFsibG9hZERvbWFpbiIsdGhpcyxjXSkuUHVzaChlfHx7fSl9fWlmKGEuZG9tYWlucyYmYyBpbiBhLmRvbWFpbnMpe3ZhciBkPWEuZG9tYWluc1tjXTtpZighZC5pc0xvYWRlZCl7Yj10aGlzLmxvYWRGaWxlKGMsZCk7aWYoYil7cmV0dXJuIE1hdGhKYXguQ2FsbGJhY2suUXVldWUoYikuUHVzaChlKX19fX1yZXR1cm4gTWF0aEpheC5DYWxsYmFjayhlKSgpfSxUcnk6ZnVuY3Rpb24oYSl7YT1NYXRoSmF4LkNhbGxiYWNrKGEpO2EuYXV0b1Jlc2V0PXRydWU7dHJ5e2EoKX1jYXRjaChiKXtpZighYi5yZXN0YXJ0KXt0aHJvdyBifU1hdGhKYXguQ2FsbGJhY2suQWZ0ZXIoWyJUcnkiLHRoaXMsYV0sYi5yZXN0YXJ0KX19LHJlc2V0TG9jYWxlOmZ1bmN0aW9uKGEpe2lmKCFhKXtyZXR1cm59YT1hLnRvTG93ZXJDYXNlKCk7d2hpbGUoIXRoaXMuc3RyaW5nc1thXSl7dmFyIGM9YS5sYXN0SW5kZXhPZigiLSIpO2lmKGM9PT0tMSl7cmV0dXJufWE9YS5zdWJzdHJpbmcoMCxjKX12YXIgYj10aGlzLnN0cmluZ3NbYV0ucmVtYXA7dGhpcy5sb2NhbGU9Yj9iOmE7TWF0aEpheC5DYWxsYmFjay5TaWduYWwoIkh1YiIpLlBvc3QoWyJMb2NhbGUgUmVzZXQiLHRoaXMubG9jYWxlXSl9LHNldExvY2FsZTpmdW5jdGlvbihhKXt0aGlzLnJlc2V0TG9jYWxlKGEpO2lmKE1hdGhKYXguTWVudSl7dGhpcy5sb2FkRG9tYWluKCJNYXRoTWVudSIpfX0sYWRkVHJhbnNsYXRpb246ZnVuY3Rpb24oYixlLGMpe3ZhciBkPXRoaXMuc3RyaW5nc1tiXSxhPWZhbHNlO2lmKCFkKXtkPXRoaXMuc3RyaW5nc1tiXT17fTthPXRydWV9aWYoIWQuZG9tYWlucyl7ZC5kb21haW5zPXt9fWlmKGUpe2lmKCFkLmRvbWFpbnNbZV0pe2QuZG9tYWluc1tlXT17fX1kPWQuZG9tYWluc1tlXX1NYXRoSmF4Lkh1Yi5JbnNlcnQoZCxjKTtpZihhJiZNYXRoSmF4Lk1lbnUubWVudSl7TWF0aEpheC5NZW51LkNyZWF0ZUxvY2FsZU1lbnUoKX19LHNldENTUzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnN0cmluZ3NbdGhpcy5sb2NhbGVdO2lmKGEpe2lmKGEuZm9udEZhbWlseSl7Yi5zdHlsZS5mb250RmFtaWx5PWEuZm9udEZhbWlseX1pZihhLmZvbnREaXJlY3Rpb24pe2Iuc3R5bGUuZGlyZWN0aW9uPWEuZm9udERpcmVjdGlvbjtpZihhLmZvbnREaXJlY3Rpb249PT0icnRsIil7Yi5zdHlsZS50ZXh0QWxpZ249InJpZ2h0In19fXJldHVybiBifSxmb250RmFtaWx5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zdHJpbmdzW3RoaXMubG9jYWxlXTtyZXR1cm4oYT9hLmZvbnRGYW1pbHk6bnVsbCl9LGZvbnREaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnN0cmluZ3NbdGhpcy5sb2NhbGVdO3JldHVybihhP2EuZm9udERpcmVjdGlvbjpudWxsKX0scGx1cmFsOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuc3RyaW5nc1t0aGlzLmxvY2FsZV07aWYoYSYmYS5wbHVyYWwpe3JldHVybiBhLnBsdXJhbChiKX1pZihiPT0xKXtyZXR1cm4gMX1yZXR1cm4gMn0sbnVtYmVyOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuc3RyaW5nc1t0aGlzLmxvY2FsZV07aWYoYSYmYS5udW1iZXIpe3JldHVybiBhLm51bWJlcihiKX1yZXR1cm4gYn19O01hdGhKYXguTWVzc2FnZT17cmVhZHk6ZmFsc2UsbG9nOlt7fV0sY3VycmVudDpudWxsLHRleHROb2RlQnVnOihuYXZpZ2F0b3IudmVuZG9yPT09IkFwcGxlIENvbXB1dGVyLCBJbmMuIiYmdHlwZW9mIG5hdmlnYXRvci52ZW5kb3JTdWI9PT0idW5kZWZpbmVkIil8fCh3aW5kb3cuaGFzT3duUHJvcGVydHkmJndpbmRvdy5oYXNPd25Qcm9wZXJ0eSgia29ucXVlcm9yIikpLHN0eWxlczp7IiNNYXRoSmF4X01lc3NhZ2UiOntwb3NpdGlvbjoiZml4ZWQiLGxlZnQ6IjFweCIsYm90dG9tOiIycHgiLCJiYWNrZ3JvdW5kLWNvbG9yIjoiI0U2RTZFNiIsYm9yZGVyOiIxcHggc29saWQgIzk1OTU5NSIsbWFyZ2luOiIwcHgiLHBhZGRpbmc6IjJweCA4cHgiLCJ6LWluZGV4IjoiMTAyIixjb2xvcjoiYmxhY2siLCJmb250LXNpemUiOiI4MCUiLHdpZHRoOiJhdXRvIiwid2hpdGUtc3BhY2UiOiJub3dyYXAifSwiI01hdGhKYXhfTVNJRV9GcmFtZSI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHdpZHRoOiIwcHgiLCJ6LWluZGV4IjoxMDEsYm9yZGVyOiIwcHgiLG1hcmdpbjoiMHB4IixwYWRkaW5nOiIwcHgifX0sYnJvd3NlcnM6e01TSUU6ZnVuY3Rpb24oYSl7TWF0aEpheC5NZXNzYWdlLm1zaWVGaXhlZFBvc2l0aW9uQnVnPSgoZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHwwKTw3KTtpZihNYXRoSmF4Lk1lc3NhZ2UubXNpZUZpeGVkUG9zaXRpb25CdWcpe01hdGhKYXguSHViLmNvbmZpZy5zdHlsZXNbIiNNYXRoSmF4X01lc3NhZ2UiXS5wb3NpdGlvbj0iYWJzb2x1dGUifU1hdGhKYXguTWVzc2FnZS5xdWlya3M9KGRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQmFja0NvbXBhdCIpfSxDaHJvbWU6ZnVuY3Rpb24oYSl7TWF0aEpheC5IdWIuY29uZmlnLnN0eWxlc1siI01hdGhKYXhfTWVzc2FnZSJdLmJvdHRvbT0iMS41ZW0iO01hdGhKYXguSHViLmNvbmZpZy5zdHlsZXNbIiNNYXRoSmF4X01lc3NhZ2UiXS5sZWZ0PSIxZW0ifX0sSW5pdDpmdW5jdGlvbihhKXtpZihhKXt0aGlzLnJlYWR5PXRydWV9aWYoIWRvY3VtZW50LmJvZHl8fCF0aGlzLnJlYWR5KXtyZXR1cm4gZmFsc2V9aWYodGhpcy5kaXYmJnRoaXMuZGl2LnBhcmVudE5vZGU9PW51bGwpe3RoaXMuZGl2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNYXRoSmF4X01lc3NhZ2UiKTt0aGlzLnRleHQ9KHRoaXMuZGl2P3RoaXMuZGl2LmZpcnN0Q2hpbGQ6bnVsbCl9aWYoIXRoaXMuZGl2KXt2YXIgYj1kb2N1bWVudC5ib2R5O2lmKHRoaXMubXNpZUZpeGVkUG9zaXRpb25CdWcmJndpbmRvdy5hdHRhY2hFdmVudCl7Yj10aGlzLmZyYW1lPXRoaXMuYWRkRGl2KGRvY3VtZW50LmJvZHkpO2IucmVtb3ZlQXR0cmlidXRlKCJpZCIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLmJvcmRlcj1iLnN0eWxlLm1hcmdpbj1iLnN0eWxlLnBhZGRpbmc9IjBweCI7Yi5zdHlsZS56SW5kZXg9IjEwMSI7Yi5zdHlsZS5oZWlnaHQ9IjBweCI7Yj10aGlzLmFkZERpdihiKTtiLmlkPSJNYXRoSmF4X01TSUVfRnJhbWUiO3dpbmRvdy5hdHRhY2hFdmVudCgib25zY3JvbGwiLHRoaXMuTW92ZUZyYW1lKTt3aW5kb3cuYXR0YWNoRXZlbnQoIm9ucmVzaXplIix0aGlzLk1vdmVGcmFtZSk7dGhpcy5Nb3ZlRnJhbWUoKX10aGlzLmRpdj10aGlzLmFkZERpdihiKTt0aGlzLmRpdi5zdHlsZS5kaXNwbGF5PSJub25lIn1pZighdGhpcy50ZXh0KXt0aGlzLnRleHQ9dGhpcy5kaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpKX1yZXR1cm4gdHJ1ZX0sYWRkRGl2OmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9Ik1hdGhKYXhfTWVzc2FnZSI7aWYoYS5maXJzdENoaWxkKXthLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCl9ZWxzZXthLmFwcGVuZENoaWxkKGIpfXJldHVybiBifSxNb3ZlRnJhbWU6ZnVuY3Rpb24oKXt2YXIgYT0oTWF0aEpheC5NZXNzYWdlLnF1aXJrcz9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7dmFyIGI9TWF0aEpheC5NZXNzYWdlLmZyYW1lO2Iuc3R5bGUubGVmdD1hLnNjcm9sbExlZnQrInB4IjtiLnN0eWxlLnRvcD1hLnNjcm9sbFRvcCsicHgiO2Iuc3R5bGUud2lkdGg9YS5jbGllbnRXaWR0aCsicHgiO2I9Yi5maXJzdENoaWxkO2Iuc3R5bGUuaGVpZ2h0PWEuY2xpZW50SGVpZ2h0KyJweCJ9LGxvY2FsaXplOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoSmF4LkxvY2FsaXphdGlvbi5fKGEsYSl9LGZpbHRlclRleHQ6ZnVuY3Rpb24oYSxjLGIpe2lmKE1hdGhKYXguSHViLmNvbmZpZy5tZXNzYWdlU3R5bGU9PT0ic2ltcGxlIil7aWYoYj09PSJMb2FkRmlsZSIpe2lmKCF0aGlzLmxvYWRpbmcpe3RoaXMubG9hZGluZz10aGlzLmxvY2FsaXplKCJMb2FkaW5nIikrIiAifWE9dGhpcy5sb2FkaW5nO3RoaXMubG9hZGluZys9Ii4ifWVsc2V7aWYoYj09PSJQcm9jZXNzTWF0aCIpe2lmKCF0aGlzLnByb2Nlc3Npbmcpe3RoaXMucHJvY2Vzc2luZz10aGlzLmxvY2FsaXplKCJQcm9jZXNzaW5nIikrIiAifWE9dGhpcy5wcm9jZXNzaW5nO3RoaXMucHJvY2Vzc2luZys9Ii4ifWVsc2V7aWYoYj09PSJUeXBlc2V0TWF0aCIpe2lmKCF0aGlzLnR5cGVzZXR0aW5nKXt0aGlzLnR5cGVzZXR0aW5nPXRoaXMubG9jYWxpemUoIlR5cGVzZXR0aW5nIikrIiAifWE9dGhpcy50eXBlc2V0dGluZzt0aGlzLnR5cGVzZXR0aW5nKz0iLiJ9fX19cmV0dXJuIGF9LGNsZWFyQ291bnRzOmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMubG9hZGluZztkZWxldGUgdGhpcy5wcm9jZXNzaW5nO2RlbGV0ZSB0aGlzLnR5cGVzZXR0aW5nfSxTZXQ6ZnVuY3Rpb24oYyxlLGIpe2lmKGU9PW51bGwpe2U9dGhpcy5sb2cubGVuZ3RoO3RoaXMubG9nW2VdPXt9fXZhciBkPSIiO2lmKE1hdGhKYXguT2JqZWN0LmlzQXJyYXkoYykpe2Q9Y1swXTtpZihNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGQpKXtkPWRbMV19dHJ5e2M9TWF0aEpheC5Mb2NhbGl6YXRpb24uXy5hcHBseShNYXRoSmF4LkxvY2FsaXphdGlvbixjKX1jYXRjaChhKXtpZighYS5yZXN0YXJ0KXt0aHJvdyBhfWlmKCFhLnJlc3RhcnQuY2FsbGVkKXtpZih0aGlzLmxvZ1tlXS5yZXN0YXJ0ZWQ9PW51bGwpe3RoaXMubG9nW2VdLnJlc3RhcnRlZD0wfXRoaXMubG9nW2VdLnJlc3RhcnRlZCsrO2RlbGV0ZSB0aGlzLmxvZ1tlXS5jbGVhcmVkO01hdGhKYXguQ2FsbGJhY2suQWZ0ZXIoWyJTZXQiLHRoaXMsYyxlLGJdLGEucmVzdGFydCk7cmV0dXJuIGV9fX1pZih0aGlzLnRpbWVyKXtjbGVhclRpbWVvdXQodGhpcy50aW1lcik7ZGVsZXRlIHRoaXMudGltZXJ9dGhpcy5sb2dbZV0udGV4dD1jO3RoaXMubG9nW2VdLmZpbHRlcmVkVGV4dD1jPXRoaXMuZmlsdGVyVGV4dChjLGUsZCk7aWYodHlwZW9mKHRoaXMubG9nW2VdLm5leHQpPT09InVuZGVmaW5lZCIpe3RoaXMubG9nW2VdLm5leHQ9dGhpcy5jdXJyZW50O2lmKHRoaXMuY3VycmVudCE9bnVsbCl7dGhpcy5sb2dbdGhpcy5jdXJyZW50XS5wcmV2PWV9dGhpcy5jdXJyZW50PWV9aWYodGhpcy5jdXJyZW50PT09ZSYmTWF0aEpheC5IdWIuY29uZmlnLm1lc3NhZ2VTdHlsZSE9PSJub25lIil7aWYodGhpcy5Jbml0KCkpe2lmKHRoaXMudGV4dE5vZGVCdWcpe3RoaXMuZGl2LmlubmVySFRNTD1jfWVsc2V7dGhpcy50ZXh0Lm5vZGVWYWx1ZT1jfXRoaXMuZGl2LnN0eWxlLmRpc3BsYXk9IiI7aWYodGhpcy5zdGF0dXMpe3dpbmRvdy5zdGF0dXM9IiI7ZGVsZXRlIHRoaXMuc3RhdHVzfX1lbHNle3dpbmRvdy5zdGF0dXM9Yzt0aGlzLnN0YXR1cz10cnVlfX1pZih0aGlzLmxvZ1tlXS5yZXN0YXJ0ZWQpe2lmKHRoaXMubG9nW2VdLmNsZWFyZWQpe2I9MH1pZigtLXRoaXMubG9nW2VdLnJlc3RhcnRlZD09PTApe2RlbGV0ZSB0aGlzLmxvZ1tlXS5jbGVhcmVkfX1pZihiKXtzZXRUaW1lb3V0KE1hdGhKYXguQ2FsbGJhY2soWyJDbGVhciIsdGhpcyxlXSksYil9ZWxzZXtpZihiPT0wKXt0aGlzLkNsZWFyKGUsMCl9fXJldHVybiBlfSxDbGVhcjpmdW5jdGlvbihiLGEpe2lmKHRoaXMubG9nW2JdLnByZXYhPW51bGwpe3RoaXMubG9nW3RoaXMubG9nW2JdLnByZXZdLm5leHQ9dGhpcy5sb2dbYl0ubmV4dH1pZih0aGlzLmxvZ1tiXS5uZXh0IT1udWxsKXt0aGlzLmxvZ1t0aGlzLmxvZ1tiXS5uZXh0XS5wcmV2PXRoaXMubG9nW2JdLnByZXZ9aWYodGhpcy5jdXJyZW50PT09Yil7dGhpcy5jdXJyZW50PXRoaXMubG9nW2JdLm5leHQ7aWYodGhpcy50ZXh0KXtpZih0aGlzLmRpdi5wYXJlbnROb2RlPT1udWxsKXt0aGlzLkluaXQoKX1pZih0aGlzLmN1cnJlbnQ9PW51bGwpe2lmKHRoaXMudGltZXIpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtkZWxldGUgdGhpcy50aW1lcn1pZihhPT1udWxsKXthPTYwMH1pZihhPT09MCl7dGhpcy5SZW1vdmUoKX1lbHNle3RoaXMudGltZXI9c2V0VGltZW91dChNYXRoSmF4LkNhbGxiYWNrKFsiUmVtb3ZlIix0aGlzXSksYSl9fWVsc2V7aWYoTWF0aEpheC5IdWIuY29uZmlnLm1lc3NhZ2VTdHlsZSE9PSJub25lIil7aWYodGhpcy50ZXh0Tm9kZUJ1Zyl7dGhpcy5kaXYuaW5uZXJIVE1MPXRoaXMubG9nW3RoaXMuY3VycmVudF0uZmlsdGVyZWRUZXh0fWVsc2V7dGhpcy50ZXh0Lm5vZGVWYWx1ZT10aGlzLmxvZ1t0aGlzLmN1cnJlbnRdLmZpbHRlcmVkVGV4dH19fWlmKHRoaXMuc3RhdHVzKXt3aW5kb3cuc3RhdHVzPSIiO2RlbGV0ZSB0aGlzLnN0YXR1c319ZWxzZXtpZih0aGlzLnN0YXR1cyl7d2luZG93LnN0YXR1cz0odGhpcy5jdXJyZW50PT1udWxsPyIiOnRoaXMubG9nW3RoaXMuY3VycmVudF0udGV4dCl9fX1kZWxldGUgdGhpcy5sb2dbYl0ubmV4dDtkZWxldGUgdGhpcy5sb2dbYl0ucHJldjtkZWxldGUgdGhpcy5sb2dbYl0uZmlsdGVyZWRUZXh0O2lmKHRoaXMubG9nW2JdLnJlc3RhcnRlZCl7dGhpcy5sb2dbYl0uY2xlYXJlZD10cnVlfX0sUmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy50ZXh0Lm5vZGVWYWx1ZT0iIjt0aGlzLmRpdi5zdHlsZS5kaXNwbGF5PSJub25lIn0sRmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TZXQoWyJMb2FkRmlsZSIsIkxvYWRpbmcgJTEiLGFdLG51bGwsbnVsbCl9LExvZzpmdW5jdGlvbigpe3ZhciBiPVtdO2Zvcih2YXIgYz0xLGE9dGhpcy5sb2cubGVuZ3RoO2M8YTtjKyspe2JbY109dGhpcy5sb2dbY10udGV4dH1yZXR1cm4gYi5qb2luKCJcbiIpfX07TWF0aEpheC5IdWI9e2NvbmZpZzp7cm9vdDoiIixjb25maWc6W10sc3R5bGVTaGVldHM6W10sc3R5bGVzOnsiLk1hdGhKYXhfUHJldmlldyI6e2NvbG9yOiIjODg4In19LGpheDpbXSxleHRlbnNpb25zOltdLHByZUpheDpudWxsLHBvc3RKYXg6bnVsbCxkaXNwbGF5QWxpZ246ImNlbnRlciIsZGlzcGxheUluZGVudDoiMCIscHJlUmVtb3ZlQ2xhc3M6Ik1hdGhKYXhfUHJldmlldyIsc2hvd1Byb2Nlc3NpbmdNZXNzYWdlczp0cnVlLG1lc3NhZ2VTdHlsZToibm9ybWFsIixkZWxheVN0YXJ0dXBVbnRpbDoibm9uZSIsc2tpcFN0YXJ0dXBUeXBlc2V0OmZhbHNlLGVsZW1lbnRzOltdLHBvc2l0aW9uVG9IYXNoOnRydWUsc2hvd01hdGhNZW51OnRydWUsc2hvd01hdGhNZW51TVNJRTp0cnVlLG1lbnVTZXR0aW5nczp7em9vbToiTm9uZSIsQ1RSTDpmYWxzZSxBTFQ6ZmFsc2UsQ01EOmZhbHNlLFNoaWZ0OmZhbHNlLGRpc2NvdmVyYWJsZTpmYWxzZSx6c2NhbGU6IjIwMCUiLHJlbmRlcmVyOm51bGwsZm9udDoiQXV0byIsY29udGV4dDoiTWF0aEpheCIsbG9jYWxlOm51bGwsbXBDb250ZXh0OmZhbHNlLG1wTW91c2U6ZmFsc2UsdGV4SGludHM6dHJ1ZSxGYXN0UHJldmlldzpudWxsLGFzc2lzdGl2ZU1NTDpudWxsLGluVGFiT3JkZXI6dHJ1ZSxzZW1hbnRpY3M6ZmFsc2V9LGVycm9yU2V0dGluZ3M6e21lc3NhZ2U6WyJbIixbIk1hdGhQcm9jZXNzaW5nRXJyb3IiLCJNYXRoIFByb2Nlc3NpbmcgRXJyb3IiXSwiXSJdLHN0eWxlOntjb2xvcjoiI0NDMDAwMCIsImZvbnQtc3R5bGUiOiJpdGFsaWMifX0saWdub3JlTU1MYXR0cmlidXRlczp7fX0scHJlUHJvY2Vzc29yczpNYXRoSmF4LkNhbGxiYWNrLkhvb2tzKHRydWUpLGlucHV0SmF4Ont9LG91dHB1dEpheDp7b3JkZXI6e319LHByb2Nlc3NTZWN0aW9uRGVsYXk6NTAscHJvY2Vzc1VwZGF0ZVRpbWU6MjUwLHByb2Nlc3NVcGRhdGVEZWxheToxMCxzaWduYWw6TWF0aEpheC5DYWxsYmFjay5TaWduYWwoIkh1YiIpLENvbmZpZzpmdW5jdGlvbihhKXt0aGlzLkluc2VydCh0aGlzLmNvbmZpZyxhKTtpZih0aGlzLmNvbmZpZy5BdWdtZW50KXt0aGlzLkF1Z21lbnQodGhpcy5jb25maWcuQXVnbWVudCl9fSxDb21iaW5lQ29uZmlnOmZ1bmN0aW9uKGMsZil7dmFyIGI9dGhpcy5jb25maWcsZyxlO2M9Yy5zcGxpdCgvXC4vKTtmb3IodmFyIGQ9MCxhPWMubGVuZ3RoO2Q8YTtkKyspe2c9Y1tkXTtpZighYltnXSl7YltnXT17fX1lPWI7Yj1iW2ddfWVbZ109Yj10aGlzLkluc2VydChmLGIpO3JldHVybiBifSxSZWdpc3Rlcjp7UHJlUHJvY2Vzc29yOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGhKYXguSHViLnByZVByb2Nlc3NvcnMuQWRkLmFwcGx5KE1hdGhKYXguSHViLnByZVByb2Nlc3NvcnMsYXJndW1lbnRzKX0sTWVzc2FnZUhvb2s6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aEpheC5IdWIuc2lnbmFsLk1lc3NhZ2VIb29rLmFwcGx5KE1hdGhKYXguSHViLnNpZ25hbCxhcmd1bWVudHMpfSxTdGFydHVwSG9vazpmdW5jdGlvbigpe3JldHVybiBNYXRoSmF4Lkh1Yi5TdGFydHVwLnNpZ25hbC5NZXNzYWdlSG9vay5hcHBseShNYXRoSmF4Lkh1Yi5TdGFydHVwLnNpZ25hbCxhcmd1bWVudHMpfSxMb2FkSG9vazpmdW5jdGlvbigpe3JldHVybiBNYXRoSmF4LkFqYXguTG9hZEhvb2suYXBwbHkoTWF0aEpheC5BamF4LGFyZ3VtZW50cyl9fSxVblJlZ2lzdGVyOntQcmVQcm9jZXNzb3I6ZnVuY3Rpb24oYSl7TWF0aEpheC5IdWIucHJlUHJvY2Vzc29ycy5SZW1vdmUoYSl9LE1lc3NhZ2VIb29rOmZ1bmN0aW9uKGEpe01hdGhKYXguSHViLnNpZ25hbC5SZW1vdmVIb29rKGEpfSxTdGFydHVwSG9vazpmdW5jdGlvbihhKXtNYXRoSmF4Lkh1Yi5TdGFydHVwLnNpZ25hbC5SZW1vdmVIb29rKGEpfSxMb2FkSG9vazpmdW5jdGlvbihhKXtNYXRoSmF4LkFqYXgucmVtb3ZlSG9vayhhKX19LGdldEFsbEpheDpmdW5jdGlvbihlKXt2YXIgYz1bXSxiPXRoaXMuZWxlbWVudFNjcmlwdHMoZSk7Zm9yKHZhciBkPTAsYT1iLmxlbmd0aDtkPGE7ZCsrKXtpZihiW2RdLk1hdGhKYXgmJmJbZF0uTWF0aEpheC5lbGVtZW50SmF4KXtjLnB1c2goYltkXS5NYXRoSmF4LmVsZW1lbnRKYXgpfX1yZXR1cm4gY30sZ2V0SmF4QnlUeXBlOmZ1bmN0aW9uKGYsZSl7dmFyIGM9W10sYj10aGlzLmVsZW1lbnRTY3JpcHRzKGUpO2Zvcih2YXIgZD0wLGE9Yi5sZW5ndGg7ZDxhO2QrKyl7aWYoYltkXS5NYXRoSmF4JiZiW2RdLk1hdGhKYXguZWxlbWVudEpheCYmYltkXS5NYXRoSmF4LmVsZW1lbnRKYXgubWltZVR5cGU9PT1mKXtjLnB1c2goYltkXS5NYXRoSmF4LmVsZW1lbnRKYXgpfX1yZXR1cm4gY30sZ2V0SmF4QnlJbnB1dFR5cGU6ZnVuY3Rpb24oZixlKXt2YXIgYz1bXSxiPXRoaXMuZWxlbWVudFNjcmlwdHMoZSk7Zm9yKHZhciBkPTAsYT1iLmxlbmd0aDtkPGE7ZCsrKXtpZihiW2RdLk1hdGhKYXgmJmJbZF0uTWF0aEpheC5lbGVtZW50SmF4JiZiW2RdLnR5cGUmJmJbZF0udHlwZS5yZXBsYWNlKC8gKjsoLnxccykqLywiIik9PT1mKXtjLnB1c2goYltkXS5NYXRoSmF4LmVsZW1lbnRKYXgpfX1yZXR1cm4gY30sZ2V0SmF4Rm9yOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZihhKT09PSJzdHJpbmciKXthPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpfWlmKGEmJmEuTWF0aEpheCl7cmV0dXJuIGEuTWF0aEpheC5lbGVtZW50SmF4fWlmKHRoaXMuaXNNYXRoSmF4Tm9kZShhKSl7aWYoIWEuaXNNYXRoSmF4KXthPWEuZmlyc3RDaGlsZH13aGlsZShhJiYhYS5qYXhJRCl7YT1hLnBhcmVudE5vZGV9aWYoYSl7cmV0dXJuIE1hdGhKYXguT3V0cHV0SmF4W2EuamF4SURdLmdldEpheEZyb21NYXRoKGEpfX1yZXR1cm4gbnVsbH0saXNKYXg6ZnVuY3Rpb24oYSl7aWYodHlwZW9mKGEpPT09InN0cmluZyIpe2E9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSl9aWYodGhpcy5pc01hdGhKYXhOb2RlKGEpKXtyZXR1cm4gMX1pZihhJiYoYS50YWdOYW1lfHwiIikudG9Mb3dlckNhc2UoKT09PSJzY3JpcHQiKXtpZihhLk1hdGhKYXgpe3JldHVybihhLk1hdGhKYXguc3RhdGU9PT1NYXRoSmF4LkVsZW1lbnRKYXguU1RBVEUuUFJPQ0VTU0VEPzE6LTEpfWlmKGEudHlwZSYmdGhpcy5pbnB1dEpheFthLnR5cGUucmVwbGFjZSgvICo7KC58XHMpKi8sIiIpXSl7cmV0dXJuIC0xfX1yZXR1cm4gMH0saXNNYXRoSmF4Tm9kZTpmdW5jdGlvbihhKXtyZXR1cm4gISFhJiYoYS5pc01hdGhKYXh8fChhLmNsYXNzTmFtZXx8IiIpPT09Ik1hdGhKYXhfTWF0aE1MIil9LHNldFJlbmRlcmVyOmZ1bmN0aW9uKGQsYyl7aWYoIWQpe3JldHVybn12YXIgZT1NYXRoSmF4Lk91dHB1dEpheFtkXTtpZighZSl7TWF0aEpheC5PdXRwdXRKYXhbZF09TWF0aEpheC5PdXRwdXRKYXgoe2lkOiJ1bmtub3duIix2ZXJzaW9uOiIxLjAuMCIsaXNVbmtub3duOnRydWV9KTt0aGlzLmNvbmZpZy5tZW51U2V0dGluZ3MucmVuZGVyZXI9IiI7dmFyIGI9IltNYXRoSmF4XS9qYXgvb3V0cHV0LyIrZCsiL2NvbmZpZy5qcyI7cmV0dXJuIE1hdGhKYXguQWpheC5SZXF1aXJlKGIsWyJzZXRSZW5kZXJlciIsdGhpcyxkLGNdKX1lbHNle3RoaXMuY29uZmlnLm1lbnVTZXR0aW5ncy5yZW5kZXJlcj1kO2lmKGM9PW51bGwpe2M9ImpheC9tbWwifWlmKGUuaXNVbmtub3duKXtlLlJlZ2lzdGVyKGMpfXZhciBhPXRoaXMub3V0cHV0SmF4O2lmKGFbY10mJmFbY10ubGVuZ3RoKXtpZihkIT09YVtjXVswXS5pZCl7YVtjXS51bnNoaWZ0KGUpO3JldHVybiB0aGlzLnNpZ25hbC5Qb3N0KFsiUmVuZGVyZXIgU2VsZWN0ZWQiLGRdKX19cmV0dXJuIG51bGx9fSxRdWV1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXVlLlB1c2guYXBwbHkodGhpcy5xdWV1ZSxhcmd1bWVudHMpfSxUeXBlc2V0OmZ1bmN0aW9uKGMsZCl7aWYoIU1hdGhKYXguaXNSZWFkeSl7cmV0dXJuIG51bGx9dmFyIGI9dGhpcy5lbGVtZW50Q2FsbGJhY2soYyxkKTtpZihiLmNvdW50KXt2YXIgYT1NYXRoSmF4LkNhbGxiYWNrLlF1ZXVlKFsiUHJlUHJvY2VzcyIsdGhpcyxiLmVsZW1lbnRzXSxbIlByb2Nlc3MiLHRoaXMsYi5lbGVtZW50c10pfXJldHVybiBhLlB1c2goYi5jYWxsYmFjayl9LFByZVByb2Nlc3M6ZnVuY3Rpb24oZSxnKXt2YXIgYz10aGlzLmVsZW1lbnRDYWxsYmFjayhlLGcpO3ZhciBiPU1hdGhKYXguQ2FsbGJhY2suUXVldWUoKTtpZihjLmNvdW50KXt2YXIgZj0oYy5jb3VudD09PTE/W2MuZWxlbWVudHNdOmMuZWxlbWVudHMpO2IuUHVzaChbIlBvc3QiLHRoaXMuc2lnbmFsLFsiQmVnaW4gUHJlUHJvY2VzcyIsYy5lbGVtZW50c11dKTtmb3IodmFyIGQ9MCxhPWYubGVuZ3RoO2Q8YTtkKyspe2lmKGZbZF0pe2IuUHVzaChbIkV4ZWN1dGUiLHRoaXMucHJlUHJvY2Vzc29ycyxmW2RdXSl9fWIuUHVzaChbIlBvc3QiLHRoaXMuc2lnbmFsLFsiRW5kIFByZVByb2Nlc3MiLGMuZWxlbWVudHNdXSl9cmV0dXJuIGIuUHVzaChjLmNhbGxiYWNrKX0sUHJvY2VzczpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRha2VBY3Rpb24oIlByb2Nlc3MiLGEsYil9LFVwZGF0ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRha2VBY3Rpb24oIlVwZGF0ZSIsYSxiKX0sUmVwcm9jZXNzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMudGFrZUFjdGlvbigiUmVwcm9jZXNzIixhLGIpfSxSZXJlbmRlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRha2VBY3Rpb24oIlJlcmVuZGVyIixhLGIpfSx0YWtlQWN0aW9uOmZ1bmN0aW9uKGcsZCxoKXt2YXIgYz10aGlzLmVsZW1lbnRDYWxsYmFjayhkLGgpO3ZhciBmPWMuZWxlbWVudHM7dmFyIGE9TWF0aEpheC5DYWxsYmFjay5RdWV1ZShbIkNsZWFyIix0aGlzLnNpZ25hbF0pO3ZhciBlPXtzY3JpcHRzOltdLHN0YXJ0Om5ldyBEYXRlKCkuZ2V0VGltZSgpLGk6MCxqOjAsamF4Ont9LGpheElEczpbXX07aWYoYy5jb3VudCl7dmFyIGI9WyJEZWxheSIsTWF0aEpheC5DYWxsYmFjayx0aGlzLnByb2Nlc3NTZWN0aW9uRGVsYXldO2lmKCFiWzJdKXtiPXt9fWEuUHVzaChbImNsZWFyQ291bnRzIixNYXRoSmF4Lk1lc3NhZ2VdLFsiUG9zdCIsdGhpcy5zaWduYWwsWyJCZWdpbiAiK2csZl1dLFsiUG9zdCIsdGhpcy5zaWduYWwsWyJCZWdpbiBNYXRoIixmLGddXSxbInByZXBhcmVTY3JpcHRzIix0aGlzLGcsZixlXSxbIlBvc3QiLHRoaXMuc2lnbmFsLFsiQmVnaW4gTWF0aCBJbnB1dCIsZixnXV0sWyJwcm9jZXNzSW5wdXQiLHRoaXMsZV0sWyJQb3N0Iix0aGlzLnNpZ25hbCxbIkVuZCBNYXRoIElucHV0IixmLGddXSxiLFsicHJlcGFyZU91dHB1dCIsdGhpcyxlLCJwcmVQcm9jZXNzIl0sYixbIlBvc3QiLHRoaXMuc2lnbmFsLFsiQmVnaW4gTWF0aCBPdXRwdXQiLGYsZ11dLFsicHJvY2Vzc091dHB1dCIsdGhpcyxlXSxbIlBvc3QiLHRoaXMuc2lnbmFsLFsiRW5kIE1hdGggT3V0cHV0IixmLGddXSxiLFsicHJlcGFyZU91dHB1dCIsdGhpcyxlLCJwb3N0UHJvY2VzcyJdLGIsWyJQb3N0Iix0aGlzLnNpZ25hbCxbIkVuZCBNYXRoIixmLGddXSxbIlBvc3QiLHRoaXMuc2lnbmFsLFsiRW5kICIrZyxmXV0sWyJjbGVhckNvdW50cyIsTWF0aEpheC5NZXNzYWdlXSl9cmV0dXJuIGEuUHVzaChjLmNhbGxiYWNrKX0sc2NyaXB0QWN0aW9uOntQcm9jZXNzOmZ1bmN0aW9uKGEpe30sVXBkYXRlOmZ1bmN0aW9uKGIpe3ZhciBhPWIuTWF0aEpheC5lbGVtZW50SmF4O2lmKGEmJmEubmVlZHNVcGRhdGUoKSl7YS5SZW1vdmUodHJ1ZSk7Yi5NYXRoSmF4LnN0YXRlPWEuU1RBVEUuVVBEQVRFfWVsc2V7Yi5NYXRoSmF4LnN0YXRlPWEuU1RBVEUuUFJPQ0VTU0VEfX0sUmVwcm9jZXNzOmZ1bmN0aW9uKGIpe3ZhciBhPWIuTWF0aEpheC5lbGVtZW50SmF4O2lmKGEpe2EuUmVtb3ZlKHRydWUpO2IuTWF0aEpheC5zdGF0ZT1hLlNUQVRFLlVQREFURX19LFJlcmVuZGVyOmZ1bmN0aW9uKGIpe3ZhciBhPWIuTWF0aEpheC5lbGVtZW50SmF4O2lmKGEpe2EuUmVtb3ZlKHRydWUpO2IuTWF0aEpheC5zdGF0ZT1hLlNUQVRFLk9VVFBVVH19fSxwcmVwYXJlU2NyaXB0czpmdW5jdGlvbihoLGUsZyl7aWYoYXJndW1lbnRzLmNhbGxlZS5kaXNhYmxlZCl7cmV0dXJufXZhciBiPXRoaXMuZWxlbWVudFNjcmlwdHMoZSk7dmFyIGY9TWF0aEpheC5FbGVtZW50SmF4LlNUQVRFO2Zvcih2YXIgZD0wLGE9Yi5sZW5ndGg7ZDxhO2QrKyl7dmFyIGM9YltkXTtpZihjLnR5cGUmJnRoaXMuaW5wdXRKYXhbYy50eXBlLnJlcGxhY2UoLyAqOygufFxuKSovLCIiKV0pe2lmKGMuTWF0aEpheCl7aWYoYy5NYXRoSmF4LmVsZW1lbnRKYXgmJmMuTWF0aEpheC5lbGVtZW50SmF4LmhvdmVyKXtNYXRoSmF4LkV4dGVuc2lvbi5NYXRoRXZlbnRzLkhvdmVyLkNsZWFySG92ZXIoYy5NYXRoSmF4LmVsZW1lbnRKYXgpfWlmKGMuTWF0aEpheC5zdGF0ZSE9PWYuUEVORElORyl7dGhpcy5zY3JpcHRBY3Rpb25baF0oYyl9fWlmKCFjLk1hdGhKYXgpe2MuTWF0aEpheD17c3RhdGU6Zi5QRU5ESU5HfX1pZihjLk1hdGhKYXguZXJyb3Ipe2RlbGV0ZSBjLk1hdGhKYXguZXJyb3J9aWYoYy5NYXRoSmF4LnN0YXRlIT09Zi5QUk9DRVNTRUQpe2cuc2NyaXB0cy5wdXNoKGMpfX19fSxjaGVja1NjcmlwdFNpYmxpbmdzOmZ1bmN0aW9uKGEpe2lmKGEuTWF0aEpheC5jaGVja2VkKXtyZXR1cm59dmFyIGI9dGhpcy5jb25maWcsZj1hLnByZXZpb3VzU2libGluZztpZihmJiZmLm5vZGVOYW1lPT09IiN0ZXh0Iil7dmFyIGQsZSxjPWEubmV4dFNpYmxpbmc7aWYoYyYmYy5ub2RlTmFtZSE9PSIjdGV4dCIpe2M9bnVsbH1pZihiLnByZUpheCl7aWYodHlwZW9mKGIucHJlSmF4KT09PSJzdHJpbmciKXtiLnByZUpheD1uZXcgUmVnRXhwKGIucHJlSmF4KyIkIil9ZD1mLm5vZGVWYWx1ZS5tYXRjaChiLnByZUpheCl9aWYoYi5wb3N0SmF4JiZjKXtpZih0eXBlb2YoYi5wb3N0SmF4KT09PSJzdHJpbmciKXtiLnBvc3RKYXg9bmV3IFJlZ0V4cCgiXiIrYi5wb3N0SmF4KX1lPWMubm9kZVZhbHVlLm1hdGNoKGIucG9zdEpheCl9aWYoZCYmKCFiLnBvc3RKYXh8fGUpKXtmLm5vZGVWYWx1ZT1mLm5vZGVWYWx1ZS5yZXBsYWNlKGIucHJlSmF4LChkLmxlbmd0aD4xP2RbMV06IiIpKTtmPW51bGx9aWYoZSYmKCFiLnByZUpheHx8ZCkpe2Mubm9kZVZhbHVlPWMubm9kZVZhbHVlLnJlcGxhY2UoYi5wb3N0SmF4LChlLmxlbmd0aD4xP2VbMV06IiIpKX1pZihmJiYhZi5ub2RlVmFsdWUubWF0Y2goL1xTLykpe2Y9Zi5wcmV2aW91c1NpYmxpbmd9fWlmKGIucHJlUmVtb3ZlQ2xhc3MmJmYmJmYuY2xhc3NOYW1lPT09Yi5wcmVSZW1vdmVDbGFzcyl7YS5NYXRoSmF4LnByZXZpZXc9Zn1hLk1hdGhKYXguY2hlY2tlZD0xfSxwcm9jZXNzSW5wdXQ6ZnVuY3Rpb24oYSl7dmFyIGIsaT1NYXRoSmF4LkVsZW1lbnRKYXguU1RBVEU7dmFyIGgsZSxkPWEuc2NyaXB0cy5sZW5ndGg7dHJ5e3doaWxlKGEuaTxkKXtoPWEuc2NyaXB0c1thLmldO2lmKCFoKXthLmkrKztjb250aW51ZX1lPWgucHJldmlvdXNTaWJsaW5nO2lmKGUmJmUuY2xhc3NOYW1lPT09Ik1hdGhKYXhfRXJyb3IiKXtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9aWYoIWgucGFyZW50Tm9kZXx8IWguTWF0aEpheHx8aC5NYXRoSmF4LnN0YXRlPT09aS5QUk9DRVNTRUQpe2EuaSsrO2NvbnRpbnVlfWlmKCFoLk1hdGhKYXguZWxlbWVudEpheHx8aC5NYXRoSmF4LnN0YXRlPT09aS5VUERBVEUpe3RoaXMuY2hlY2tTY3JpcHRTaWJsaW5ncyhoKTt2YXIgZz1oLnR5cGUucmVwbGFjZSgvICo7KC58XHMpKi8sIiIpO3ZhciBqPXRoaXMuaW5wdXRKYXhbZ107Yj1qLlByb2Nlc3MoaCxhKTtpZih0eXBlb2YgYj09PSJmdW5jdGlvbiIpe2lmKGIuY2FsbGVkKXtjb250aW51ZX10aGlzLlJlc3RhcnRBZnRlcihiKX1iPWIuQXR0YWNoKGgsai5pZCk7dGhpcy5zYXZlU2NyaXB0KGIsYSxoLGkpO3RoaXMucG9zdElucHV0SG9va3MuRXhlY3V0ZShiLGouaWQsaCl9ZWxzZXtpZihoLk1hdGhKYXguc3RhdGU9PT1pLk9VVFBVVCl7dGhpcy5zYXZlU2NyaXB0KGguTWF0aEpheC5lbGVtZW50SmF4LGEsaCxpKX19YS5pKys7dmFyIGM9bmV3IERhdGUoKS5nZXRUaW1lKCk7aWYoYy1hLnN0YXJ0PnRoaXMucHJvY2Vzc1VwZGF0ZVRpbWUmJmEuaTxhLnNjcmlwdHMubGVuZ3RoKXthLnN0YXJ0PWM7dGhpcy5SZXN0YXJ0QWZ0ZXIoTWF0aEpheC5DYWxsYmFjay5EZWxheSgxKSl9fX1jYXRjaChmKXtyZXR1cm4gdGhpcy5wcm9jZXNzRXJyb3IoZixhLCJJbnB1dCIpfWlmKGEuc2NyaXB0cy5sZW5ndGgmJnRoaXMuY29uZmlnLnNob3dQcm9jZXNzaW5nTWVzc2FnZXMpe01hdGhKYXguTWVzc2FnZS5TZXQoWyJQcm9jZXNzTWF0aCIsIlByb2Nlc3NpbmcgbWF0aDogJTElJSIsMTAwXSwwKX1hLnN0YXJ0PW5ldyBEYXRlKCkuZ2V0VGltZSgpO2EuaT1hLmo9MDtyZXR1cm4gbnVsbH0scG9zdElucHV0SG9va3M6TWF0aEpheC5DYWxsYmFjay5Ib29rcyh0cnVlKSxzYXZlU2NyaXB0OmZ1bmN0aW9uKGEsZCxiLGMpe2lmKCF0aGlzLm91dHB1dEpheFthLm1pbWVUeXBlXSl7Yi5NYXRoSmF4LnN0YXRlPWMuVVBEQVRFO3Rocm93IEVycm9yKCJObyBvdXRwdXQgamF4IHJlZ2lzdGVyZWQgZm9yICIrYS5taW1lVHlwZSl9YS5vdXRwdXRKYXg9dGhpcy5vdXRwdXRKYXhbYS5taW1lVHlwZV1bMF0uaWQ7aWYoIWQuamF4W2Eub3V0cHV0SmF4XSl7aWYoZC5qYXhJRHMubGVuZ3RoPT09MCl7ZC5qYXhbYS5vdXRwdXRKYXhdPWQuc2NyaXB0c31lbHNle2lmKGQuamF4SURzLmxlbmd0aD09PTEpe2QuamF4W2QuamF4SURzWzBdXT1kLnNjcmlwdHMuc2xpY2UoMCxkLmkpfWQuamF4W2Eub3V0cHV0SmF4XT1bXX1kLmpheElEcy5wdXNoKGEub3V0cHV0SmF4KX1pZihkLmpheElEcy5sZW5ndGg+MSl7ZC5qYXhbYS5vdXRwdXRKYXhdLnB1c2goYil9Yi5NYXRoSmF4LnN0YXRlPWMuT1VUUFVUfSxwcmVwYXJlT3V0cHV0OmZ1bmN0aW9uKGMsZil7d2hpbGUoYy5qPGMuamF4SURzLmxlbmd0aCl7dmFyIGU9Yy5qYXhJRHNbYy5qXSxkPU1hdGhKYXguT3V0cHV0SmF4W2VdO2lmKGRbZl0pe3RyeXt2YXIgYT1kW2ZdKGMpO2lmKHR5cGVvZiBhPT09ImZ1bmN0aW9uIil7aWYoYS5jYWxsZWQpe2NvbnRpbnVlfXRoaXMuUmVzdGFydEFmdGVyKGEpfX1jYXRjaChiKXtpZighYi5yZXN0YXJ0KXtNYXRoSmF4Lk1lc3NhZ2UuU2V0KFsiUHJlcEVycm9yIiwiRXJyb3IgcHJlcGFyaW5nICUxIG91dHB1dCAoJTIpIixlLGZdLG51bGwsNjAwKTtNYXRoSmF4Lkh1Yi5sYXN0UHJlcEVycm9yPWI7Yy5qKyt9cmV0dXJuIE1hdGhKYXguQ2FsbGJhY2suQWZ0ZXIoWyJwcmVwYXJlT3V0cHV0Iix0aGlzLGMsZl0sYi5yZXN0YXJ0KX19Yy5qKyt9cmV0dXJuIG51bGx9LHByb2Nlc3NPdXRwdXQ6ZnVuY3Rpb24oaCl7dmFyIGIsZz1NYXRoSmF4LkVsZW1lbnRKYXguU1RBVEUsZCxhPWguc2NyaXB0cy5sZW5ndGg7dHJ5e3doaWxlKGguaTxhKXtkPWguc2NyaXB0c1toLmldO2lmKCFkfHwhZC5wYXJlbnROb2RlfHwhZC5NYXRoSmF4fHxkLk1hdGhKYXguZXJyb3Ipe2guaSsrO2NvbnRpbnVlfXZhciBjPWQuTWF0aEpheC5lbGVtZW50SmF4O2lmKCFjKXtoLmkrKztjb250aW51ZX1iPU1hdGhKYXguT3V0cHV0SmF4W2Mub3V0cHV0SmF4XS5Qcm9jZXNzKGQsaCk7aWYoYiE9PWZhbHNlKXtkLk1hdGhKYXguc3RhdGU9Zy5QUk9DRVNTRUQ7aWYoZC5NYXRoSmF4LnByZXZpZXcpe2QuTWF0aEpheC5wcmV2aWV3LmlubmVySFRNTD0iIjtkLk1hdGhKYXgucHJldmlldy5zdHlsZS5kaXNwbGF5PSJub25lIn10aGlzLnNpZ25hbC5Qb3N0KFsiTmV3IE1hdGgiLGMuaW5wdXRJRF0pfWguaSsrO3ZhciBlPW5ldyBEYXRlKCkuZ2V0VGltZSgpO2lmKGUtaC5zdGFydD50aGlzLnByb2Nlc3NVcGRhdGVUaW1lJiZoLmk8aC5zY3JpcHRzLmxlbmd0aCl7aC5zdGFydD1lO3RoaXMuUmVzdGFydEFmdGVyKE1hdGhKYXguQ2FsbGJhY2suRGVsYXkodGhpcy5wcm9jZXNzVXBkYXRlRGVsYXkpKX19fWNhdGNoKGYpe3JldHVybiB0aGlzLnByb2Nlc3NFcnJvcihmLGgsIk91dHB1dCIpfWlmKGguc2NyaXB0cy5sZW5ndGgmJnRoaXMuY29uZmlnLnNob3dQcm9jZXNzaW5nTWVzc2FnZXMpe01hdGhKYXguTWVzc2FnZS5TZXQoWyJUeXBlc2V0TWF0aCIsIlR5cGVzZXR0aW5nIG1hdGg6ICUxJSUiLDEwMF0sMCk7TWF0aEpheC5NZXNzYWdlLkNsZWFyKDApfWguaT1oLmo9MDtyZXR1cm4gbnVsbH0scHJvY2Vzc01lc3NhZ2U6ZnVuY3Rpb24oZCxiKXt2YXIgYT1NYXRoLmZsb29yKGQuaS8oZC5zY3JpcHRzLmxlbmd0aCkqMTAwKTt2YXIgYz0oYj09PSJPdXRwdXQiP1siVHlwZXNldE1hdGgiLCJUeXBlc2V0dGluZyBtYXRoOiAlMSUlIl06WyJQcm9jZXNzTWF0aCIsIlByb2Nlc3NpbmcgbWF0aDogJTElJSJdKTtpZih0aGlzLmNvbmZpZy5zaG93UHJvY2Vzc2luZ01lc3NhZ2VzKXtNYXRoSmF4Lk1lc3NhZ2UuU2V0KGMuY29uY2F0KGEpLDApfX0scHJvY2Vzc0Vycm9yOmZ1bmN0aW9uKGIsYyxhKXtpZighYi5yZXN0YXJ0KXtpZighdGhpcy5jb25maWcuZXJyb3JTZXR0aW5ncy5tZXNzYWdlKXt0aHJvdyBifXRoaXMuZm9ybWF0RXJyb3IoYy5zY3JpcHRzW2MuaV0sYik7Yy5pKyt9dGhpcy5wcm9jZXNzTWVzc2FnZShjLGEpO3JldHVybiBNYXRoSmF4LkNhbGxiYWNrLkFmdGVyKFsicHJvY2VzcyIrYSx0aGlzLGNdLGIucmVzdGFydCl9LGZvcm1hdEVycm9yOmZ1bmN0aW9uKGIsZil7dmFyIGg9ZnVuY3Rpb24obCxrLGosaSl7cmV0dXJuIE1hdGhKYXguTG9jYWxpemF0aW9uLl8obCxrLGosaSl9O3ZhciBlPWgoIkVycm9yTWVzc2FnZSIsIkVycm9yOiAlMSIsZi5tZXNzYWdlKSsiXG4iO2lmKGYuc291cmNlVVJMfHxmLmZpbGVOYW1lKXtlKz0iXG4iK2goIkVycm9yRmlsZSIsImZpbGU6ICUxIixmLnNvdXJjZVVSTHx8Zi5maWxlTmFtZSl9aWYoZi5saW5lfHxmLmxpbmVOdW1iZXIpe2UrPSJcbiIraCgiRXJyb3JMaW5lIiwibGluZTogJTEiLGYubGluZXx8Zi5saW5lTnVtYmVyKX1lKz0iXG5cbiIraCgiRXJyb3JUaXBzIiwiRGVidWdnaW5nIHRpcHM6IHVzZSAlMSwgaW5zcGVjdCAlMiBpbiB0aGUgYnJvd3NlciBjb25zb2xlIiwiJ3VucGFja2VkL01hdGhKYXguanMnIiwiJ01hdGhKYXguSHViLmxhc3RFcnJvciciKTtiLk1hdGhKYXguZXJyb3I9TWF0aEpheC5PdXRwdXRKYXguRXJyb3IuSmF4KGUsYik7aWYoYi5NYXRoSmF4LmVsZW1lbnRKYXgpe2IuTWF0aEpheC5lcnJvci5pbnB1dElEPWIuTWF0aEpheC5lbGVtZW50SmF4LmlucHV0SUR9dmFyIGc9dGhpcy5jb25maWcuZXJyb3JTZXR0aW5nczt2YXIgYT1oKGcubWVzc2FnZUlkLGcubWVzc2FnZSk7dmFyIGM9TWF0aEpheC5IVE1MLkVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Ik1hdGhKYXhfRXJyb3IiLGpheElEOiJFcnJvciIsaXNNYXRoSmF4OnRydWUsaWQ6Yi5NYXRoSmF4LmVycm9yLmlucHV0SUQrIi1GcmFtZSJ9LFtbInNwYW4iLG51bGwsYV1dKTtNYXRoSmF4LkFqYXguUmVxdWlyZSgiW01hdGhKYXhdL2V4dGVuc2lvbnMvTWF0aEV2ZW50cy5qcyIsZnVuY3Rpb24oKXt2YXIgaj1NYXRoSmF4LkV4dGVuc2lvbi5NYXRoRXZlbnRzLkV2ZW50LGk9TWF0aEpheC5IdWI7Yy5vbmNvbnRleHRtZW51PWouTWVudTtjLm9ubW91c2Vkb3duPWouTW91c2Vkb3duO2Mub25rZXlkb3duPWouS2V5ZG93bjtjLnRhYkluZGV4PWkuZ2V0VGFiT3JkZXIoaS5nZXRKYXhGb3IoYikpfSk7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5pZCk7aWYoZCl7ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpfWlmKGIucGFyZW50Tm9kZSl7Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjLGIpfWlmKGIuTWF0aEpheC5wcmV2aWV3KXtiLk1hdGhKYXgucHJldmlldy5pbm5lckhUTUw9IiI7Yi5NYXRoSmF4LnByZXZpZXcuc3R5bGUuZGlzcGxheT0ibm9uZSJ9dGhpcy5sYXN0RXJyb3I9Zjt0aGlzLnNpZ25hbC5Qb3N0KFsiTWF0aCBQcm9jZXNzaW5nIEVycm9yIixiLGZdKX0sUmVzdGFydEFmdGVyOmZ1bmN0aW9uKGEpe3Rocm93IHRoaXMuSW5zZXJ0KEVycm9yKCJyZXN0YXJ0Iikse3Jlc3RhcnQ6TWF0aEpheC5DYWxsYmFjayhhKX0pfSxlbGVtZW50Q2FsbGJhY2s6ZnVuY3Rpb24oYyxmKXtpZihmPT1udWxsJiYoTWF0aEpheC5PYmplY3QuaXNBcnJheShjKXx8dHlwZW9mIGM9PT0iZnVuY3Rpb24iKSl7dHJ5e01hdGhKYXguQ2FsbGJhY2soYyk7Zj1jO2M9bnVsbH1jYXRjaChkKXt9fWlmKGM9PW51bGwpe2M9dGhpcy5jb25maWcuZWxlbWVudHN8fFtdfWlmKHRoaXMuaXNIVE1MQ29sbGVjdGlvbihjKSl7Yz10aGlzLkhUTUxDb2xsZWN0aW9uMkFycmF5KGMpfWlmKCFNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGMpKXtjPVtjXX1jPVtdLmNvbmNhdChjKTtmb3IodmFyIGI9MCxhPWMubGVuZ3RoO2I8YTtiKyspe2lmKHR5cGVvZihjW2JdKT09PSJzdHJpbmciKXtjW2JdPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNbYl0pfX1pZighZG9jdW1lbnQuYm9keSl7ZG9jdW1lbnQuYm9keT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdfWlmKGMubGVuZ3RoPT0wKXtjLnB1c2goZG9jdW1lbnQuYm9keSl9aWYoIWYpe2Y9e319cmV0dXJue2NvdW50OmMubGVuZ3RoLGVsZW1lbnRzOihjLmxlbmd0aD09PTE/Y1swXTpjKSxjYWxsYmFjazpmfX0sZWxlbWVudFNjcmlwdHM6ZnVuY3Rpb24oZSl7dmFyIGI9W107aWYoTWF0aEpheC5PYmplY3QuaXNBcnJheShlKXx8dGhpcy5pc0hUTUxDb2xsZWN0aW9uKGUpKXtmb3IodmFyIGQ9MCxhPWUubGVuZ3RoO2Q8YTtkKyspe3ZhciBmPTA7Zm9yKHZhciBjPTA7YzxkJiYhZjtjKyspe2Y9ZVtjXS5jb250YWlucyhlW2RdKX1pZighZil7Yi5wdXNoLmFwcGx5KGIsdGhpcy5lbGVtZW50U2NyaXB0cyhlW2RdKSl9fXJldHVybiBifWlmKHR5cGVvZihlKT09PSJzdHJpbmciKXtlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpfWlmKCFkb2N1bWVudC5ib2R5KXtkb2N1bWVudC5ib2R5PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF19aWYoZT09bnVsbCl7ZT1kb2N1bWVudC5ib2R5fWlmKGUudGFnTmFtZSE9bnVsbCYmZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic2NyaXB0Iil7cmV0dXJuW2VdfWI9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7aWYodGhpcy5tc2llSFRNTENvbGxlY3Rpb25CdWcpe2I9dGhpcy5IVE1MQ29sbGVjdGlvbjJBcnJheShiKX1yZXR1cm4gYn0saXNIVE1MQ29sbGVjdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4oIkhUTUxDb2xsZWN0aW9uIiBpbiB3aW5kb3cmJnR5cGVvZihhKT09PSJvYmplY3QiJiZhIGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb24pfSxIVE1MQ29sbGVjdGlvbjJBcnJheTpmdW5jdGlvbihjKXtpZighdGhpcy5tc2llSFRNTENvbGxlY3Rpb25CdWcpe3JldHVybltdLnNsaWNlLmNhbGwoYyl9dmFyIGI9W107Zm9yKHZhciBkPTAsYT1jLmxlbmd0aDtkPGE7ZCsrKXtiW2RdPWNbZF19cmV0dXJuIGJ9LEluc2VydDpmdW5jdGlvbihjLGEpe2Zvcih2YXIgYiBpbiBhKXtpZihhLmhhc093blByb3BlcnR5KGIpKXtpZih0eXBlb2YgYVtiXT09PSJvYmplY3QiJiYhKE1hdGhKYXguT2JqZWN0LmlzQXJyYXkoYVtiXSkpJiYodHlwZW9mIGNbYl09PT0ib2JqZWN0Inx8dHlwZW9mIGNbYl09PT0iZnVuY3Rpb24iKSl7dGhpcy5JbnNlcnQoY1tiXSxhW2JdKX1lbHNle2NbYl09YVtiXX19fXJldHVybiBjfSxnZXRUYWJPcmRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb25maWcubWVudVNldHRpbmdzLmluVGFiT3JkZXI/MDotMX0sU3BsaXRMaXN0OigidHJpbSIgaW4gU3RyaW5nLnByb3RvdHlwZT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCkuc3BsaXQoL1xzKy8pfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpLnNwbGl0KC9ccysvKX0pfTtNYXRoSmF4Lkh1Yi5JbnNlcnQoTWF0aEpheC5IdWIuY29uZmlnLnN0eWxlcyxNYXRoSmF4Lk1lc3NhZ2Uuc3R5bGVzKTtNYXRoSmF4Lkh1Yi5JbnNlcnQoTWF0aEpheC5IdWIuY29uZmlnLnN0eWxlcyx7Ii5NYXRoSmF4X0Vycm9yIjpNYXRoSmF4Lkh1Yi5jb25maWcuZXJyb3JTZXR0aW5ncy5zdHlsZX0pO01hdGhKYXguRXh0ZW5zaW9uPXt9O01hdGhKYXguSHViLkNvbmZpZ3VyZWQ9TWF0aEpheC5DYWxsYmFjayh7fSk7TWF0aEpheC5IdWIuU3RhcnR1cD17c2NyaXB0OiIiLHF1ZXVlOk1hdGhKYXguQ2FsbGJhY2suUXVldWUoKSxzaWduYWw6TWF0aEpheC5DYWxsYmFjay5TaWduYWwoIlN0YXJ0dXAiKSxwYXJhbXM6e30sQ29uZmlnOmZ1bmN0aW9uKCl7dGhpcy5xdWV1ZS5QdXNoKFsiUG9zdCIsdGhpcy5zaWduYWwsIkJlZ2luIENvbmZpZyJdKTtpZihNYXRoSmF4LkF1dGhvckNvbmZpZyYmTWF0aEpheC5BdXRob3JDb25maWcucm9vdCl7TWF0aEpheC5BamF4LmNvbmZpZy5yb290PU1hdGhKYXguQXV0aG9yQ29uZmlnLnJvb3R9aWYodGhpcy5wYXJhbXMubG9jYWxlKXtNYXRoSmF4LkxvY2FsaXphdGlvbi5yZXNldExvY2FsZSh0aGlzLnBhcmFtcy5sb2NhbGUpO01hdGhKYXguSHViLmNvbmZpZy5tZW51U2V0dGluZ3MubG9jYWxlPXRoaXMucGFyYW1zLmxvY2FsZX1pZih0aGlzLnBhcmFtcy5jb25maWcpe3ZhciBjPXRoaXMucGFyYW1zLmNvbmZpZy5zcGxpdCgvLC8pO2Zvcih2YXIgYj0wLGE9Yy5sZW5ndGg7YjxhO2IrKyl7aWYoIWNbYl0ubWF0Y2goL1wuanMkLykpe2NbYl0rPSIuanMifXRoaXMucXVldWUuUHVzaChbIlJlcXVpcmUiLE1hdGhKYXguQWpheCx0aGlzLlVSTCgiY29uZmlnIixjW2JdKV0pfX10aGlzLnF1ZXVlLlB1c2goWyJDb25maWciLE1hdGhKYXguSHViLE1hdGhKYXguQXV0aG9yQ29uZmlnXSk7aWYodGhpcy5zY3JpcHQubWF0Y2goL1xTLykpe3RoaXMucXVldWUuUHVzaCh0aGlzLnNjcmlwdCsiO1xuMTsiKX10aGlzLnF1ZXVlLlB1c2goWyJDb25maWdEZWxheSIsdGhpc10sWyJDb25maWdCbG9ja3MiLHRoaXNdLFtmdW5jdGlvbihkKXtyZXR1cm4gZC5sb2FkQXJyYXkoTWF0aEpheC5IdWIuY29uZmlnLmNvbmZpZywiY29uZmlnIixudWxsLHRydWUpfSx0aGlzXSxbIlBvc3QiLHRoaXMuc2lnbmFsLCJFbmQgQ29uZmlnIl0pfSxDb25maWdEZWxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGFyYW1zLmRlbGF5U3RhcnR1cFVudGlsfHxNYXRoSmF4Lkh1Yi5jb25maWcuZGVsYXlTdGFydHVwVW50aWw7aWYoYT09PSJvbmxvYWQiKXtyZXR1cm4gdGhpcy5vbmxvYWR9aWYoYT09PSJjb25maWd1cmVkIil7cmV0dXJuIE1hdGhKYXguSHViLkNvbmZpZ3VyZWR9cmV0dXJuIGF9LENvbmZpZ0Jsb2NrczpmdW5jdGlvbigpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTt2YXIgYj1NYXRoSmF4LkNhbGxiYWNrLlF1ZXVlKCk7Zm9yKHZhciBkPTAsYT1jLmxlbmd0aDtkPGE7ZCsrKXt2YXIgZT1TdHJpbmcoY1tkXS50eXBlKS5yZXBsYWNlKC8gL2csIiIpO2lmKGUubWF0Y2goL150ZXh0XC94LW1hdGhqYXgtY29uZmlnKDsuKik/JC8pJiYhZS5tYXRjaCgvO2V4ZWN1dGVkPXRydWUvKSl7Y1tkXS50eXBlKz0iO2V4ZWN1dGVkPXRydWUiO2IuUHVzaChjW2RdLmlubmVySFRNTCsiO1xuMTsiKX19cmV0dXJuIGIuUHVzaChmdW5jdGlvbigpe01hdGhKYXguQWpheC5jb25maWcucm9vdD1NYXRoSmF4Lkh1Yi5jb25maWcucm9vdH0pfSxDb29raWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWV1ZS5QdXNoKFsiUG9zdCIsdGhpcy5zaWduYWwsIkJlZ2luIENvb2tpZSJdLFsiR2V0IixNYXRoSmF4LkhUTUwuQ29va2llLCJtZW51IixNYXRoSmF4Lkh1Yi5jb25maWcubWVudVNldHRpbmdzXSxbZnVuY3Rpb24oZSl7dmFyIGQ9ZS5tZW51U2V0dGluZ3M7aWYoZC5sb2NhbGUpe01hdGhKYXguTG9jYWxpemF0aW9uLnJlc2V0TG9jYWxlKGQubG9jYWxlKX12YXIgZz1lLm1lbnVTZXR0aW5ncy5yZW5kZXJlcixiPWUuamF4O2lmKGcpe3ZhciBjPSJvdXRwdXQvIitnO2Iuc29ydCgpO2Zvcih2YXIgZj0wLGE9Yi5sZW5ndGg7ZjxhO2YrKyl7aWYoYltmXS5zdWJzdHIoMCw3KT09PSJvdXRwdXQvIil7YnJlYWt9fWlmKGY9PWEtMSl7Yi5wb3AoKX1lbHNle3doaWxlKGY8YSl7aWYoYltmXT09PWMpe2Iuc3BsaWNlKGYsMSk7YnJlYWt9ZisrfX1iLnVuc2hpZnQoYyl9aWYoZC5DSFRNTHByZXZpZXchPW51bGwpe2lmKGQuRmFzdFByZXZpZXc9PW51bGwpe2QuRmFzdFByZXZpZXc9ZC5DSFRNTHByZXZpZXd9ZGVsZXRlIGQuQ0hUTUxwcmV2aWV3fWlmKGQuRmFzdFByZXZpZXcmJiFNYXRoSmF4LkV4dGVuc2lvblsiZmFzdC1wcmV2aWV3Il0pe01hdGhKYXguSHViLmNvbmZpZy5leHRlbnNpb25zLnB1c2goImZhc3QtcHJldmlldy5qcyIpfWlmKGUubWVudVNldHRpbmdzLmFzc2lzdGl2ZU1NTCYmIU1hdGhKYXguRXh0ZW5zaW9uLkFzc2lzdGl2ZU1NTCl7TWF0aEpheC5IdWIuY29uZmlnLmV4dGVuc2lvbnMucHVzaCgiQXNzaXN0aXZlTU1MLmpzIil9fSxNYXRoSmF4Lkh1Yi5jb25maWddLFsiUG9zdCIsdGhpcy5zaWduYWwsIkVuZCBDb29raWUiXSl9LFN0eWxlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXVlLlB1c2goWyJQb3N0Iix0aGlzLnNpZ25hbCwiQmVnaW4gU3R5bGVzIl0sWyJsb2FkQXJyYXkiLHRoaXMsTWF0aEpheC5IdWIuY29uZmlnLnN0eWxlU2hlZXRzLCJjb25maWciXSxbIlN0eWxlcyIsTWF0aEpheC5BamF4LE1hdGhKYXguSHViLmNvbmZpZy5zdHlsZXNdLFsiUG9zdCIsdGhpcy5zaWduYWwsIkVuZCBTdHlsZXMiXSl9LEpheDpmdW5jdGlvbigpe3ZhciBmPU1hdGhKYXguSHViLmNvbmZpZyxjPU1hdGhKYXguSHViLm91dHB1dEpheDtmb3IodmFyIGc9MCxiPWYuamF4Lmxlbmd0aCxkPTA7ZzxiO2crKyl7dmFyIGU9Zi5qYXhbZ10uc3Vic3RyKDcpO2lmKGYuamF4W2ddLnN1YnN0cigwLDcpPT09Im91dHB1dC8iJiZjLm9yZGVyW2VdPT1udWxsKXtjLm9yZGVyW2VdPWQ7ZCsrfX12YXIgYT1NYXRoSmF4LkNhbGxiYWNrLlF1ZXVlKCk7cmV0dXJuIGEuUHVzaChbIlBvc3QiLHRoaXMuc2lnbmFsLCJCZWdpbiBKYXgiXSxbImxvYWRBcnJheSIsdGhpcyxmLmpheCwiamF4IiwiY29uZmlnLmpzIl0sWyJQb3N0Iix0aGlzLnNpZ25hbCwiRW5kIEpheCJdKX0sRXh0ZW5zaW9uczpmdW5jdGlvbigpe3ZhciBhPU1hdGhKYXguQ2FsbGJhY2suUXVldWUoKTtyZXR1cm4gYS5QdXNoKFsiUG9zdCIsdGhpcy5zaWduYWwsIkJlZ2luIEV4dGVuc2lvbnMiXSxbImxvYWRBcnJheSIsdGhpcyxNYXRoSmF4Lkh1Yi5jb25maWcuZXh0ZW5zaW9ucywiZXh0ZW5zaW9ucyJdLFsiUG9zdCIsdGhpcy5zaWduYWwsIkVuZCBFeHRlbnNpb25zIl0pfSxNZXNzYWdlOmZ1bmN0aW9uKCl7TWF0aEpheC5NZXNzYWdlLkluaXQodHJ1ZSl9LE1lbnU6ZnVuY3Rpb24oKXt2YXIgYj1NYXRoSmF4Lkh1Yi5jb25maWcubWVudVNldHRpbmdzLGE9TWF0aEpheC5IdWIub3V0cHV0SmF4LGQ7Zm9yKHZhciBjIGluIGEpe2lmKGEuaGFzT3duUHJvcGVydHkoYykpe2lmKGFbY10ubGVuZ3RoKXtkPWFbY107YnJlYWt9fX1pZihkJiZkLmxlbmd0aCl7aWYoYi5yZW5kZXJlciYmYi5yZW5kZXJlciE9PWRbMF0uaWQpe2QudW5zaGlmdChNYXRoSmF4Lk91dHB1dEpheFtiLnJlbmRlcmVyXSl9Yi5yZW5kZXJlcj1kWzBdLmlkfX0sSGFzaDpmdW5jdGlvbigpe2lmKE1hdGhKYXguSHViLmNvbmZpZy5wb3NpdGlvblRvSGFzaCYmZG9jdW1lbnQubG9jYXRpb24uaGFzaCYmZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5zY3JvbGxJbnRvVmlldyl7dmFyIGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmxvY2F0aW9uLmhhc2guc3Vic3RyKDEpKTt2YXIgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKTtpZighZil7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTtmb3IodmFyIGU9MCxiPWMubGVuZ3RoO2U8YjtlKyspe2lmKGNbZV0ubmFtZT09PWQpe2Y9Y1tlXTticmVha319fWlmKGYpe3doaWxlKCFmLnNjcm9sbEludG9WaWV3KXtmPWYucGFyZW50Tm9kZX1mPXRoaXMuSGFzaENoZWNrKGYpO2lmKGYmJmYuc2Nyb2xsSW50b1ZpZXcpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNjcm9sbEludG9WaWV3KHRydWUpfSwxKX19fX0sSGFzaENoZWNrOmZ1bmN0aW9uKGIpe3ZhciBhPU1hdGhKYXguSHViLmdldEpheEZvcihiKTtpZihhJiZNYXRoSmF4Lk91dHB1dEpheFthLm91dHB1dEpheF0uaGFzaENoZWNrKXtiPU1hdGhKYXguT3V0cHV0SmF4W2Eub3V0cHV0SmF4XS5oYXNoQ2hlY2soYil9cmV0dXJuIGJ9LE1lbnVab29tOmZ1bmN0aW9uKCl7aWYoTWF0aEpheC5IdWIuY29uZmlnLnNob3dNYXRoTWVudSl7aWYoIU1hdGhKYXguRXh0ZW5zaW9uLk1hdGhNZW51KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TWF0aEpheC5DYWxsYmFjay5RdWV1ZShbIlJlcXVpcmUiLE1hdGhKYXguQWpheCwiW01hdGhKYXhdL2V4dGVuc2lvbnMvTWF0aE1lbnUuanMiLHt9XSxbImxvYWREb21haW4iLE1hdGhKYXguTG9jYWxpemF0aW9uLCJNYXRoTWVudSJdKX0sMTAwMCl9ZWxzZXtzZXRUaW1lb3V0KE1hdGhKYXguQ2FsbGJhY2soWyJsb2FkRG9tYWluIixNYXRoSmF4LkxvY2FsaXphdGlvbiwiTWF0aE1lbnUiXSksMTAwMCl9aWYoIU1hdGhKYXguRXh0ZW5zaW9uLk1hdGhab29tKXtzZXRUaW1lb3V0KE1hdGhKYXguQ2FsbGJhY2soWyJSZXF1aXJlIixNYXRoSmF4LkFqYXgsIltNYXRoSmF4XS9leHRlbnNpb25zL01hdGhab29tLmpzIix7fV0pLDIwMDApfX19LG9uTG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub25sb2FkPU1hdGhKYXguQ2FsbGJhY2soZnVuY3Rpb24oKXtNYXRoSmF4Lkh1Yi5TdGFydHVwLnNpZ25hbC5Qb3N0KCJvbkxvYWQiKX0pO2lmKGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LnJlYWR5U3RhdGUpe2lmKE1hdGhKYXguSHViLkJyb3dzZXIuaXNNU0lFKXtpZihkb2N1bWVudC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIil7cmV0dXJuW2FdfX1lbHNle2lmKGRvY3VtZW50LnJlYWR5U3RhdGUhPT0ibG9hZGluZyIpe3JldHVyblthXX19fWlmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYSxmYWxzZSk7aWYoIXRoaXMucGFyYW1zLm5vRE9NQ29udGVudEV2ZW50KXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsYSxmYWxzZSl9fWVsc2V7aWYod2luZG93LmF0dGFjaEV2ZW50KXt3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsYSl9ZWxzZXt3aW5kb3cub25sb2FkPWF9fXJldHVybiBhfSxUeXBlc2V0OmZ1bmN0aW9uKGEsYil7aWYoTWF0aEpheC5IdWIuY29uZmlnLnNraXBTdGFydHVwVHlwZXNldCl7cmV0dXJuIGZ1bmN0aW9uKCl7fX1yZXR1cm4gdGhpcy5xdWV1ZS5QdXNoKFsiUG9zdCIsdGhpcy5zaWduYWwsIkJlZ2luIFR5cGVzZXQiXSxbIlR5cGVzZXQiLE1hdGhKYXguSHViLGEsYl0sWyJQb3N0Iix0aGlzLnNpZ25hbCwiRW5kIFR5cGVzZXQiXSl9LFVSTDpmdW5jdGlvbihiLGEpe2lmKCFhLm1hdGNoKC9eKFthLXpdKzpcL1wvfFxbfFwvKS8pKXthPSJbTWF0aEpheF0vIitiKyIvIithfXJldHVybiBhfSxsb2FkQXJyYXk6ZnVuY3Rpb24oYixmLGMsYSl7aWYoYil7aWYoIU1hdGhKYXguT2JqZWN0LmlzQXJyYXkoYikpe2I9W2JdfWlmKGIubGVuZ3RoKXt2YXIgaD1NYXRoSmF4LkNhbGxiYWNrLlF1ZXVlKCksaj17fSxlO2Zvcih2YXIgZz0wLGQ9Yi5sZW5ndGg7ZzxkO2crKyl7ZT10aGlzLlVSTChmLGJbZ10pO2lmKGMpe2UrPSIvIitjfWlmKGEpe2guUHVzaChbIlJlcXVpcmUiLE1hdGhKYXguQWpheCxlLGpdKX1lbHNle2guUHVzaChNYXRoSmF4LkFqYXguUmVxdWlyZShlLGopKX19cmV0dXJuIGguUHVzaCh7fSl9fXJldHVybiBudWxsfX07KGZ1bmN0aW9uKGQpe3ZhciBiPXdpbmRvd1tkXSxlPSJbIitkKyJdIjt2YXIgYz1iLkh1YixhPWIuQWpheCxmPWIuQ2FsbGJhY2s7dmFyIGc9TWF0aEpheC5PYmplY3QuU3ViY2xhc3Moe0pBWEZJTEU6ImpheC5qcyIscmVxdWlyZTpudWxsLGNvbmZpZzp7fSxJbml0OmZ1bmN0aW9uKGksaCl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3JldHVybiB0aGlzfXJldHVybih0aGlzLmNvbnN0cnVjdG9yLlN1YmNsYXNzKGksaCkpKCl9LEF1Z21lbnQ6ZnVuY3Rpb24oayxqKXt2YXIgaT10aGlzLmNvbnN0cnVjdG9yLGg9e307aWYoayE9bnVsbCl7Zm9yKHZhciBsIGluIGspe2lmKGsuaGFzT3duUHJvcGVydHkobCkpe2lmKHR5cGVvZiBrW2xdPT09ImZ1bmN0aW9uIil7aS5wcm90b0Z1bmN0aW9uKGwsa1tsXSl9ZWxzZXtoW2xdPWtbbF19fX1pZihrLnRvU3RyaW5nIT09aS5wcm90b3R5cGUudG9TdHJpbmcmJmsudG9TdHJpbmchPT17fS50b1N0cmluZyl7aS5wcm90b0Z1bmN0aW9uKCJ0b1N0cmluZyIsay50b1N0cmluZyl9fWMuSW5zZXJ0KGkucHJvdG90eXBlLGgpO2kuQXVnbWVudChudWxsLGopO3JldHVybiB0aGlzfSxUcmFuc2xhdGU6ZnVuY3Rpb24oaCxpKXt0aHJvdyBFcnJvcih0aGlzLmRpcmVjdG9yeSsiLyIrdGhpcy5KQVhGSUxFKyIgZmFpbGVkIHRvIGRlZmluZSB0aGUgVHJhbnNsYXRlKCkgbWV0aG9kIil9LFJlZ2lzdGVyOmZ1bmN0aW9uKGgpe30sQ29uZmlnOmZ1bmN0aW9uKCl7dGhpcy5jb25maWc9Yy5Db21iaW5lQ29uZmlnKHRoaXMuaWQsdGhpcy5jb25maWcpO2lmKHRoaXMuY29uZmlnLkF1Z21lbnQpe3RoaXMuQXVnbWVudCh0aGlzLmNvbmZpZy5BdWdtZW50KX19LFN0YXJ0dXA6ZnVuY3Rpb24oKXt9LGxvYWRDb21wbGV0ZTpmdW5jdGlvbihpKXtpZihpPT09ImNvbmZpZy5qcyIpe3JldHVybiBhLmxvYWRDb21wbGV0ZSh0aGlzLmRpcmVjdG9yeSsiLyIraSl9ZWxzZXt2YXIgaD1mLlF1ZXVlKCk7aC5QdXNoKGMuUmVnaXN0ZXIuU3RhcnR1cEhvb2soIkVuZCBDb25maWciLHt9KSxbIlBvc3QiLGMuU3RhcnR1cC5zaWduYWwsdGhpcy5pZCsiIEpheCBDb25maWciXSxbIkNvbmZpZyIsdGhpc10sWyJQb3N0IixjLlN0YXJ0dXAuc2lnbmFsLHRoaXMuaWQrIiBKYXggUmVxdWlyZSJdLFtmdW5jdGlvbihqKXtyZXR1cm4gTWF0aEpheC5IdWIuU3RhcnR1cC5sb2FkQXJyYXkoai5yZXF1aXJlLHRoaXMuZGlyZWN0b3J5KX0sdGhpc10sW2Z1bmN0aW9uKGosayl7cmV0dXJuIE1hdGhKYXguSHViLlN0YXJ0dXAubG9hZEFycmF5KGouZXh0ZW5zaW9ucywiZXh0ZW5zaW9ucy8iK2spfSx0aGlzLmNvbmZpZ3x8e30sdGhpcy5pZF0sWyJQb3N0IixjLlN0YXJ0dXAuc2lnbmFsLHRoaXMuaWQrIiBKYXggU3RhcnR1cCJdLFsiU3RhcnR1cCIsdGhpc10sWyJQb3N0IixjLlN0YXJ0dXAuc2lnbmFsLHRoaXMuaWQrIiBKYXggUmVhZHkiXSk7aWYodGhpcy5jb3B5VHJhbnNsYXRlKXtoLlB1c2goW2Z1bmN0aW9uKGope2oucHJlUHJvY2Vzcz1qLnByZVRyYW5zbGF0ZTtqLlByb2Nlc3M9ai5UcmFuc2xhdGU7ai5wb3N0UHJvY2Vzcz1qLnBvc3RUcmFuc2xhdGV9LHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlXSl9cmV0dXJuIGguUHVzaChbImxvYWRDb21wbGV0ZSIsYSx0aGlzLmRpcmVjdG9yeSsiLyIraV0pfX19LHtpZDoiSmF4Iix2ZXJzaW9uOiIyLjcuNSIsZGlyZWN0b3J5OmUrIi9qYXgiLGV4dGVuc2lvbkRpcjplKyIvZXh0ZW5zaW9ucyJ9KTtiLklucHV0SmF4PWcuU3ViY2xhc3Moe2VsZW1lbnRKYXg6Im1tbCIsc291cmNlTWVudVRpdGxlOlsiT3JpZ2luYWwiLCJPcmlnaW5hbCBGb3JtIl0sY29weVRyYW5zbGF0ZTp0cnVlLFByb2Nlc3M6ZnVuY3Rpb24obCxxKXt2YXIgaj1mLlF1ZXVlKCksbzt2YXIgaz10aGlzLmVsZW1lbnRKYXg7aWYoIWIuT2JqZWN0LmlzQXJyYXkoaykpe2s9W2tdfWZvcih2YXIgbj0wLGg9ay5sZW5ndGg7bjxoO24rKyl7bz1iLkVsZW1lbnRKYXguZGlyZWN0b3J5KyIvIitrW25dKyIvIit0aGlzLkpBWEZJTEU7aWYoIXRoaXMucmVxdWlyZSl7dGhpcy5yZXF1aXJlPVtdfWVsc2V7aWYoIWIuT2JqZWN0LmlzQXJyYXkodGhpcy5yZXF1aXJlKSl7dGhpcy5yZXF1aXJlPVt0aGlzLnJlcXVpcmVdfX10aGlzLnJlcXVpcmUucHVzaChvKTtqLlB1c2goYS5SZXF1aXJlKG8pKX1vPXRoaXMuZGlyZWN0b3J5KyIvIit0aGlzLkpBWEZJTEU7dmFyIHA9ai5QdXNoKGEuUmVxdWlyZShvKSk7aWYoIXAuY2FsbGVkKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5Qcm9jZXNzPWZ1bmN0aW9uKCl7aWYoIXAuY2FsbGVkKXtyZXR1cm4gcH10aHJvdyBFcnJvcihvKyIgZmFpbGVkIHRvIGxvYWQgcHJvcGVybHkiKX19az1jLm91dHB1dEpheFsiamF4LyIra1swXV07aWYoayl7ai5QdXNoKGEuUmVxdWlyZShrWzBdLmRpcmVjdG9yeSsiLyIrdGhpcy5KQVhGSUxFKSl9cmV0dXJuIGouUHVzaCh7fSl9LG5lZWRzVXBkYXRlOmZ1bmN0aW9uKGgpe3ZhciBpPWguU291cmNlRWxlbWVudCgpO3JldHVybihoLm9yaWdpbmFsVGV4dCE9PWIuSFRNTC5nZXRTY3JpcHQoaSkpfSxSZWdpc3RlcjpmdW5jdGlvbihoKXtpZighYy5pbnB1dEpheCl7Yy5pbnB1dEpheD17fX1jLmlucHV0SmF4W2hdPXRoaXN9fSx7aWQ6IklucHV0SmF4Iix2ZXJzaW9uOiIyLjcuNSIsZGlyZWN0b3J5OmcuZGlyZWN0b3J5KyIvaW5wdXQiLGV4dGVuc2lvbkRpcjpnLmV4dGVuc2lvbkRpcn0pO2IuT3V0cHV0SmF4PWcuU3ViY2xhc3Moe2NvcHlUcmFuc2xhdGU6dHJ1ZSxwcmVQcm9jZXNzOmZ1bmN0aW9uKGope3ZhciBpLGg9dGhpcy5kaXJlY3RvcnkrIi8iK3RoaXMuSkFYRklMRTt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5wcmVQcm9jZXNzPWZ1bmN0aW9uKGspe2lmKCFpLmNhbGxlZCl7cmV0dXJuIGl9dGhyb3cgRXJyb3IoaCsiIGZhaWxlZCB0byBsb2FkIHByb3Blcmx5Iil9O2k9YS5SZXF1aXJlKGgpO3JldHVybiBpfSxQcm9jZXNzOmZ1bmN0aW9uKGgpe3Rocm93IEVycm9yKHRoaXMuaWQrIiBvdXRwdXQgamF4IGZhaWxlZCB0byBsb2FkIHByb3Blcmx5Iil9LFJlZ2lzdGVyOmZ1bmN0aW9uKGkpe3ZhciBoPWMub3V0cHV0SmF4O2lmKCFoW2ldKXtoW2ldPVtdfWlmKGhbaV0ubGVuZ3RoJiYodGhpcy5pZD09PWMuY29uZmlnLm1lbnVTZXR0aW5ncy5yZW5kZXJlcnx8KGgub3JkZXJbdGhpcy5pZF18fDApPChoLm9yZGVyW2hbaV1bMF0uaWRdfHwwKSkpe2hbaV0udW5zaGlmdCh0aGlzKX1lbHNle2hbaV0ucHVzaCh0aGlzKX1pZighdGhpcy5yZXF1aXJlKXt0aGlzLnJlcXVpcmU9W119ZWxzZXtpZighYi5PYmplY3QuaXNBcnJheSh0aGlzLnJlcXVpcmUpKXt0aGlzLnJlcXVpcmU9W3RoaXMucmVxdWlyZV19fXRoaXMucmVxdWlyZS5wdXNoKGIuRWxlbWVudEpheC5kaXJlY3RvcnkrIi8iKyhpLnNwbGl0KC9cLy8pWzFdKSsiLyIrdGhpcy5KQVhGSUxFKX0sUmVtb3ZlOmZ1bmN0aW9uKGgpe319LHtpZDoiT3V0cHV0SmF4Iix2ZXJzaW9uOiIyLjcuNSIsZGlyZWN0b3J5OmcuZGlyZWN0b3J5KyIvb3V0cHV0IixleHRlbnNpb25EaXI6Zy5leHRlbnNpb25EaXIsZm9udERpcjplKyhiLmlzUGFja2VkPyIiOiIvLi4iKSsiL2ZvbnRzIixpbWFnZURpcjplKyhiLmlzUGFja2VkPyIiOiIvLi4iKSsiL2ltYWdlcyJ9KTtiLkVsZW1lbnRKYXg9Zy5TdWJjbGFzcyh7SW5pdDpmdW5jdGlvbihpLGgpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLlN1YmNsYXNzKGksaCl9LGlucHV0SmF4Om51bGwsb3V0cHV0SmF4Om51bGwsaW5wdXRJRDpudWxsLG9yaWdpbmFsVGV4dDoiIixtaW1lVHlwZToiIixzb3VyY2VNZW51VGl0bGU6WyJNYXRoTUxjb2RlIiwiTWF0aE1MIENvZGUiXSxUZXh0OmZ1bmN0aW9uKGksail7dmFyIGg9dGhpcy5Tb3VyY2VFbGVtZW50KCk7Yi5IVE1MLnNldFNjcmlwdChoLGkpO2guTWF0aEpheC5zdGF0ZT10aGlzLlNUQVRFLlVQREFURTtyZXR1cm4gYy5VcGRhdGUoaCxqKX0sUmVwcm9jZXNzOmZ1bmN0aW9uKGkpe3ZhciBoPXRoaXMuU291cmNlRWxlbWVudCgpO2guTWF0aEpheC5zdGF0ZT10aGlzLlNUQVRFLlVQREFURTtyZXR1cm4gYy5SZXByb2Nlc3MoaCxpKX0sVXBkYXRlOmZ1bmN0aW9uKGgpe3JldHVybiB0aGlzLlJlcmVuZGVyKGgpfSxSZXJlbmRlcjpmdW5jdGlvbihpKXt2YXIgaD10aGlzLlNvdXJjZUVsZW1lbnQoKTtoLk1hdGhKYXguc3RhdGU9dGhpcy5TVEFURS5PVVRQVVQ7cmV0dXJuIGMuUHJvY2VzcyhoLGkpfSxSZW1vdmU6ZnVuY3Rpb24oaCl7aWYodGhpcy5ob3Zlcil7dGhpcy5ob3Zlci5jbGVhcih0aGlzKX1iLk91dHB1dEpheFt0aGlzLm91dHB1dEpheF0uUmVtb3ZlKHRoaXMpO2lmKCFoKXtjLnNpZ25hbC5Qb3N0KFsiUmVtb3ZlIE1hdGgiLHRoaXMuaW5wdXRJRF0pO3RoaXMuRGV0YWNoKCl9fSxuZWVkc1VwZGF0ZTpmdW5jdGlvbigpe3JldHVybiBiLklucHV0SmF4W3RoaXMuaW5wdXRKYXhdLm5lZWRzVXBkYXRlKHRoaXMpfSxTb3VyY2VFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaW5wdXRJRCl9LEF0dGFjaDpmdW5jdGlvbihpLGope3ZhciBoPWkuTWF0aEpheC5lbGVtZW50SmF4O2lmKGkuTWF0aEpheC5zdGF0ZT09PXRoaXMuU1RBVEUuVVBEQVRFKXtoLkNsb25lKHRoaXMpfWVsc2V7aD1pLk1hdGhKYXguZWxlbWVudEpheD10aGlzO2lmKGkuaWQpe3RoaXMuaW5wdXRJRD1pLmlkfWVsc2V7aS5pZD10aGlzLmlucHV0SUQ9Yi5FbGVtZW50SmF4LkdldElEKCk7dGhpcy5uZXdJRD0xfX1oLm9yaWdpbmFsVGV4dD1iLkhUTUwuZ2V0U2NyaXB0KGkpO2guaW5wdXRKYXg9ajtpZihoLnJvb3Qpe2gucm9vdC5pbnB1dElEPWguaW5wdXRJRH1yZXR1cm4gaH0sRGV0YWNoOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5Tb3VyY2VFbGVtZW50KCk7aWYoIWgpe3JldHVybn10cnl7ZGVsZXRlIGguTWF0aEpheH1jYXRjaChpKXtoLk1hdGhKYXg9bnVsbH1pZih0aGlzLm5ld0lEKXtoLmlkPSIifX0sQ2xvbmU6ZnVuY3Rpb24oaCl7dmFyIGk7Zm9yKGkgaW4gdGhpcyl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoaSkpe2NvbnRpbnVlfWlmKHR5cGVvZihoW2ldKT09PSJ1bmRlZmluZWQiJiZpIT09Im5ld0lEIil7ZGVsZXRlIHRoaXNbaV19fWZvcihpIGluIGgpe2lmKCFoLmhhc093blByb3BlcnR5KGkpKXtjb250aW51ZX1pZih0eXBlb2YodGhpc1tpXSk9PT0idW5kZWZpbmVkInx8KHRoaXNbaV0hPT1oW2ldJiZpIT09ImlucHV0SUQiKSl7dGhpc1tpXT1oW2ldfX19fSx7aWQ6IkVsZW1lbnRKYXgiLHZlcnNpb246IjIuNy41IixkaXJlY3Rvcnk6Zy5kaXJlY3RvcnkrIi9lbGVtZW50IixleHRlbnNpb25EaXI6Zy5leHRlbnNpb25EaXIsSUQ6MCxTVEFURTp7UEVORElORzoxLFBST0NFU1NFRDoyLFVQREFURTozLE9VVFBVVDo0fSxHZXRJRDpmdW5jdGlvbigpe3RoaXMuSUQrKztyZXR1cm4iTWF0aEpheC1FbGVtZW50LSIrdGhpcy5JRH0sU3ViY2xhc3M6ZnVuY3Rpb24oKXt2YXIgaD1nLlN1YmNsYXNzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtoLmxvYWRDb21wbGV0ZT10aGlzLnByb3RvdHlwZS5sb2FkQ29tcGxldGU7cmV0dXJuIGh9fSk7Yi5FbGVtZW50SmF4LnByb3RvdHlwZS5TVEFURT1iLkVsZW1lbnRKYXguU1RBVEU7Yi5PdXRwdXRKYXguRXJyb3I9e2lkOiJFcnJvciIsdmVyc2lvbjoiMi43LjUiLGNvbmZpZzp7fSxlcnJvcnM6MCxDb250ZXh0TWVudTpmdW5jdGlvbigpe3JldHVybiBiLkV4dGVuc2lvbi5NYXRoRXZlbnRzLkV2ZW50LkNvbnRleHRNZW51LmFwcGx5KGIuRXh0ZW5zaW9uLk1hdGhFdmVudHMuRXZlbnQsYXJndW1lbnRzKX0sTW91c2Vkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRXh0ZW5zaW9uLk1hdGhFdmVudHMuRXZlbnQuQWx0Q29udGV4dE1lbnUuYXBwbHkoYi5FeHRlbnNpb24uTWF0aEV2ZW50cy5FdmVudCxhcmd1bWVudHMpfSxnZXRKYXhGcm9tTWF0aDpmdW5jdGlvbihoKXtyZXR1cm4oaC5uZXh0U2libGluZy5NYXRoSmF4fHx7fSkuZXJyb3J9LEpheDpmdW5jdGlvbihqLGkpe3ZhciBoPU1hdGhKYXguSHViLmlucHV0SmF4W2kudHlwZS5yZXBsYWNlKC8gKjsoLnxccykqLywiIildO3RoaXMuZXJyb3JzKys7cmV0dXJue2lucHV0SmF4OihofHx7aWQ6IkVycm9yIn0pLmlkLG91dHB1dEpheDoiRXJyb3IiLGlucHV0SUQ6Ik1hdGhKYXgtRXJyb3ItIit0aGlzLmVycm9ycyxzb3VyY2VNZW51VGl0bGU6WyJFcnJvck1lc3NhZ2UiLCJFcnJvciBNZXNzYWdlIl0sc291cmNlTWVudUZvcm1hdDoiRXJyb3IiLG9yaWdpbmFsVGV4dDpNYXRoSmF4LkhUTUwuZ2V0U2NyaXB0KGkpLGVycm9yVGV4dDpqfX19O2IuSW5wdXRKYXguRXJyb3I9e2lkOiJFcnJvciIsdmVyc2lvbjoiMi43LjUiLGNvbmZpZzp7fSxzb3VyY2VNZW51VGl0bGU6WyJPcmlnaW5hbCIsIk9yaWdpbmFsIEZvcm0iXX19KSgiTWF0aEpheCIpOyhmdW5jdGlvbihvKXt2YXIgaD13aW5kb3dbb107aWYoIWgpe2g9d2luZG93W29dPXt9fXZhciBkPWguSHViO3ZhciBzPWQuU3RhcnR1cDt2YXIgdz1kLmNvbmZpZzt2YXIgZz1kb2N1bWVudC5oZWFkfHwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSk7aWYoIWcpe2c9ZG9jdW1lbnQuY2hpbGROb2Rlc1swXX12YXIgYj0oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2lmKGIubGVuZ3RoPT09MCYmZy5uYW1lc3BhY2VVUkkpe2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhnLm5hbWVzcGFjZVVSSSwic2NyaXB0Iil9dmFyIGY9bmV3IFJlZ0V4cCgiKF58LykiK28rIlxcLmpzKFxcPy4qKT8kIik7Zm9yKHZhciBxPWIubGVuZ3RoLTE7cT49MDtxLS0pe2lmKChiW3FdLnNyY3x8IiIpLm1hdGNoKGYpKXtzLnNjcmlwdD1iW3FdLmlubmVySFRNTDtpZihSZWdFeHAuJDIpe3ZhciB0PVJlZ0V4cC4kMi5zdWJzdHIoMSkuc3BsaXQoL1wmLyk7Zm9yKHZhciBwPTAsbD10Lmxlbmd0aDtwPGw7cCsrKXt2YXIgbj10W3BdLm1hdGNoKC8oLiopPSguKikvKTtpZihuKXtzLnBhcmFtc1t1bmVzY2FwZShuWzFdKV09dW5lc2NhcGUoblsyXSl9ZWxzZXtzLnBhcmFtc1t0W3BdXT10cnVlfX19dy5yb290PWJbcV0uc3JjLnJlcGxhY2UoLyhefFwvKVteXC9dKihcPy4qKT8kLywiIik7aC5BamF4LmNvbmZpZy5yb290PXcucm9vdDtoLkFqYXgucGFyYW1zPXMucGFyYW1zO2JyZWFrfX12YXIgaz1uYXZpZ2F0b3IudXNlckFnZW50O3ZhciBhPXtpc01hYzoobmF2aWdhdG9yLnBsYXRmb3JtLnN1YnN0cigwLDMpPT09Ik1hYyIpLGlzUEM6KG5hdmlnYXRvci5wbGF0Zm9ybS5zdWJzdHIoMCwzKT09PSJXaW4iKSxpc01TSUU6KCJBY3RpdmVYT2JqZWN0IiBpbiB3aW5kb3cmJiJjbGlwYm9hcmREYXRhIiBpbiB3aW5kb3cpLGlzRWRnZTooIk1TR2VzdHVyZUV2ZW50IiBpbiB3aW5kb3cmJiJjaHJvbWUiIGluIHdpbmRvdyYmd2luZG93LmNocm9tZS5sb2FkVGltZXM9PW51bGwpLGlzRmlyZWZveDooISFrLm1hdGNoKC9HZWNrb1wvLykmJiFrLm1hdGNoKC9saWtlIEdlY2tvLykpLGlzU2FmYXJpOighIWsubWF0Y2goLyAoQXBwbGUpP1dlYktpdFwvLykmJiFrLm1hdGNoKC8gbGlrZSBpUGhvbmUgLykmJighd2luZG93LmNocm9tZXx8d2luZG93LmNocm9tZS5hcHA9PW51bGwpKSxpc0Nocm9tZTooImNocm9tZSIgaW4gd2luZG93JiZ3aW5kb3cuY2hyb21lLmxvYWRUaW1lcyE9bnVsbCksaXNPcGVyYTooIm9wZXJhIiBpbiB3aW5kb3cmJndpbmRvdy5vcGVyYS52ZXJzaW9uIT1udWxsKSxpc0tvbnF1ZXJvcjooImtvbnF1ZXJvciIgaW4gd2luZG93JiZuYXZpZ2F0b3IudmVuZG9yPT0iS0RFIiksdmVyc2lvbkF0TGVhc3Q6ZnVuY3Rpb24oeSl7dmFyIHg9KHRoaXMudmVyc2lvbikuc3BsaXQoIi4iKTt5PShuZXcgU3RyaW5nKHkpKS5zcGxpdCgiLiIpO2Zvcih2YXIgej0wLGo9eS5sZW5ndGg7ejxqO3orKyl7aWYoeFt6XSE9eVt6XSl7cmV0dXJuIHBhcnNlSW50KHhbel18fCIwIik+PXBhcnNlSW50KHlbel0pfX1yZXR1cm4gdHJ1ZX0sU2VsZWN0OmZ1bmN0aW9uKGope3ZhciBpPWpbZC5Ccm93c2VyXTtpZihpKXtyZXR1cm4gaShkLkJyb3dzZXIpfXJldHVybiBudWxsfX07dmFyIGU9ay5yZXBsYWNlKC9eTW96aWxsYVwvKFxkK1wuKStcZCsgLywiIikucmVwbGFjZSgvW2Etel1bLWEtejAtOS5fOiBdK1wvXGQrW14gXSotW14gXSpcLihbYS16XVthLXpdKT9cZCsgL2ksIiIpLnJlcGxhY2UoL0dlbnRvbyB8VWJ1bnR1XC8oXGQrXC4pKlxkKyAoXChbXildKlwpICk/LywiIik7ZC5Ccm93c2VyPWQuSW5zZXJ0KGQuSW5zZXJ0KG5ldyBTdHJpbmcoIlVua25vd24iKSx7dmVyc2lvbjoiMC4wIn0pLGEpO2Zvcih2YXIgdiBpbiBhKXtpZihhLmhhc093blByb3BlcnR5KHYpKXtpZihhW3ZdJiZ2LnN1YnN0cigwLDIpPT09ImlzIil7dj12LnNsaWNlKDIpO2lmKHY9PT0iTWFjInx8dj09PSJQQyIpe2NvbnRpbnVlfWQuQnJvd3Nlcj1kLkluc2VydChuZXcgU3RyaW5nKHYpLGEpO3ZhciByPW5ldyBSZWdFeHAoIi4qKFZlcnNpb24vfCBUcmlkZW50Ly4qOyBydjopKCg/OlxcZCtcXC4pK1xcZCspfC4qKCIrdisiKSIrKHY9PSJNU0lFIj8iICI6Ii8iKSsiKCg/OlxcZCtcXC4pKlxcZCspfCg/Ol58XFwofCApKFthLXpdWy1hLXowLTkuXzogXSt8KD86QXBwbGUpP1dlYktpdCkvKCg/OlxcZCtcXC4pK1xcZCspIik7dmFyIHU9ci5leGVjKGUpfHxbIiIsIiIsIiIsInVua25vd24iLCIwLjAiXTtkLkJyb3dzZXIubmFtZT0odVsxXSE9IiI/djoodVszXXx8dVs1XSkpO2QuQnJvd3Nlci52ZXJzaW9uPXVbMl18fHVbNF18fHVbNl07YnJlYWt9fX10cnl7ZC5Ccm93c2VyLlNlbGVjdCh7U2FmYXJpOmZ1bmN0aW9uKGope3ZhciBpPXBhcnNlSW50KChTdHJpbmcoai52ZXJzaW9uKS5zcGxpdCgiLiIpKVswXSk7aWYoaT44NSl7ai53ZWJraXQ9ai52ZXJzaW9ufWlmKGk+PTUzOCl7ai52ZXJzaW9uPSI4LjAifWVsc2V7aWYoaT49NTM3KXtqLnZlcnNpb249IjcuMCJ9ZWxzZXtpZihpPj01MzYpe2oudmVyc2lvbj0iNi4wIn1lbHNle2lmKGk+PTUzNCl7ai52ZXJzaW9uPSI1LjEifWVsc2V7aWYoaT49NTMzKXtqLnZlcnNpb249IjUuMCJ9ZWxzZXtpZihpPj01MjYpe2oudmVyc2lvbj0iNC4wIn1lbHNle2lmKGk+PTUyNSl7ai52ZXJzaW9uPSIzLjEifWVsc2V7aWYoaT41MDApe2oudmVyc2lvbj0iMy4wIn1lbHNle2lmKGk+NDAwKXtqLnZlcnNpb249IjIuMCJ9ZWxzZXtpZihpPjg1KXtqLnZlcnNpb249IjEuMCJ9fX19fX19fX19ai53ZWJraXQ9KG5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9XZWJLaXRcLyhcZCspXC4vKSlbMV07ai5pc01vYmlsZT0obmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL01vYmlsZS9pKSE9bnVsbCk7ai5ub0NvbnRleHRNZW51PWouaXNNb2JpbGV9LEZpcmVmb3g6ZnVuY3Rpb24oail7aWYoKGoudmVyc2lvbj09PSIwLjAifHxrLm1hdGNoKC9GaXJlZm94Lyk9PW51bGwpJiZuYXZpZ2F0b3IucHJvZHVjdD09PSJHZWNrbyIpe3ZhciBtPWsubWF0Y2goL1tcLyBdcnY6KFxkK1wuXGQuKj8pW1wpIF0vKTtpZihtKXtqLnZlcnNpb249bVsxXX1lbHNle3ZhciBpPShuYXZpZ2F0b3IuYnVpbGRJRHx8bmF2aWdhdG9yLnByb2R1Y3RTdWJ8fCIwIikuc3Vic3RyKDAsOCk7aWYoaT49IjIwMTExMjIwIil7ai52ZXJzaW9uPSI5LjAifWVsc2V7aWYoaT49IjIwMTExMTIwIil7ai52ZXJzaW9uPSI4LjAifWVsc2V7aWYoaT49IjIwMTEwOTI3Iil7ai52ZXJzaW9uPSI3LjAifWVsc2V7aWYoaT49IjIwMTEwODE2Iil7ai52ZXJzaW9uPSI2LjAifWVsc2V7aWYoaT49IjIwMTEwNjIxIil7ai52ZXJzaW9uPSI1LjAifWVsc2V7aWYoaT49IjIwMTEwMzIwIil7ai52ZXJzaW9uPSI0LjAifWVsc2V7aWYoaT49IjIwMTAwMTIxIil7ai52ZXJzaW9uPSIzLjYifWVsc2V7aWYoaT49IjIwMDkwNjMwIil7ai52ZXJzaW9uPSIzLjUifWVsc2V7aWYoaT49IjIwMDgwNjE3Iil7ai52ZXJzaW9uPSIzLjAifWVsc2V7aWYoaT49IjIwMDYxMDI0Iil7ai52ZXJzaW9uPSIyLjAifX19fX19fX19fX19ai5pc01vYmlsZT0obmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL0FuZHJvaWQvaSkhPW51bGx8fGsubWF0Y2goLyBGZW5uZWNcLy8pIT1udWxsfHxrLm1hdGNoKC9Nb2JpbGUvKSE9bnVsbCl9LENocm9tZTpmdW5jdGlvbihpKXtpLm5vQ29udGV4dE1lbnU9aS5pc01vYmlsZT0hIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyBNb2JpbGVbIFwvXS8pfSxPcGVyYTpmdW5jdGlvbihpKXtpLnZlcnNpb249b3BlcmEudmVyc2lvbigpfSxFZGdlOmZ1bmN0aW9uKGkpe2kuaXNNb2JpbGU9ISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8gUGhvbmUvKX0sTVNJRTpmdW5jdGlvbihqKXtqLmlzTW9iaWxlPSEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvIFBob25lLyk7ai5pc0lFOT0hIShkb2N1bWVudC5kb2N1bWVudE1vZGUmJih3aW5kb3cucGVyZm9ybWFuY2V8fHdpbmRvdy5tc1BlcmZvcm1hbmNlKSk7TWF0aEpheC5IVE1MLnNldFNjcmlwdEJ1Zz0hai5pc0lFOXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPDk7TWF0aEpheC5IdWIubXNpZUhUTUxDb2xsZWN0aW9uQnVnPShkb2N1bWVudC5kb2N1bWVudE1vZGU8OSk7aWYoZG9jdW1lbnQuZG9jdW1lbnRNb2RlPDEwJiYhcy5wYXJhbXMuTm9NYXRoUGxheWVyKXt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIk1hdGhQbGF5ZXIuRmFjdG9yeS4xIik7ai5oYXNNYXRoUGxheWVyPXRydWV9Y2F0Y2gobSl7fXRyeXtpZihqLmhhc01hdGhQbGF5ZXIpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2kuaWQ9Im1hdGhwbGF5ZXIiO2kuY2xhc3NpZD0iY2xzaWQ6MzJGNjZBMjAtNzYxNC0xMUQ0LUJEMTEtMDAxMDRCRDNGOTg3IjtnLmFwcGVuZENoaWxkKGkpO2RvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCJtIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIpO2oubXBOYW1lc3BhY2U9dHJ1ZTtpZihkb2N1bWVudC5yZWFkeVN0YXRlJiYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJsb2FkaW5nInx8ZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJpbnRlcmFjdGl2ZSIpKXtkb2N1bWVudC53cml0ZSgnPD9pbXBvcnQgbmFtZXNwYWNlPSJtIiBpbXBsZW1lbnRhdGlvbj0iI01hdGhQbGF5ZXIiPicpO2oubXBJbXBvcnRlZD10cnVlfX1lbHNle2RvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCJtanhfSUVfZml4IiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIpfX1jYXRjaChtKXt9fX19KX1jYXRjaChjKXtjb25zb2xlLmVycm9yKGMubWVzc2FnZSl9ZC5Ccm93c2VyLlNlbGVjdChNYXRoSmF4Lk1lc3NhZ2UuYnJvd3NlcnMpO2lmKGguQXV0aG9yQ29uZmlnJiZ0eXBlb2YgaC5BdXRob3JDb25maWcuQXV0aG9ySW5pdD09PSJmdW5jdGlvbiIpe2guQXV0aG9yQ29uZmlnLkF1dGhvckluaXQoKX1kLnF1ZXVlPWguQ2FsbGJhY2suUXVldWUoKTtkLnF1ZXVlLlB1c2goWyJQb3N0IixzLnNpZ25hbCwiQmVnaW4iXSxbIkNvbmZpZyIsc10sWyJDb29raWUiLHNdLFsiU3R5bGVzIixzXSxbIk1lc3NhZ2UiLHNdLGZ1bmN0aW9uKCl7dmFyIGk9aC5DYWxsYmFjay5RdWV1ZShzLkpheCgpLHMuRXh0ZW5zaW9ucygpKTtyZXR1cm4gaS5QdXNoKHt9KX0sWyJNZW51IixzXSxzLm9uTG9hZCgpLGZ1bmN0aW9uKCl7TWF0aEpheC5pc1JlYWR5PXRydWV9LFsiVHlwZXNldCIsc10sWyJIYXNoIixzXSxbIk1lbnVab29tIixzXSxbIlBvc3QiLHMuc2lnbmFsLCJFbmQiXSl9KSgiTWF0aEpheCIpfX07Cg==
Protocol
HTTP/1.1
Server
2606:4700:3034::ac43:ac56 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 13 Jul 2020 21:35:37 GMT
Content-Encoding
gzip
CF-Cache-Status
MISS
Server
cloudflare
Vary
Accept-Encoding
Content-Type
text/html
Cache-Control
private, max-age=14400, must-revalidate
Transfer-Encoding
chunked
Connection
keep-alive
CF-RAY
5b2622864bd6bf05-FRA
cf-request-id
03ebb3e7ec0000bf05d304c200000001
MathZoom.js
moodle.ucl.rrnn.me/extensions/
0
0
Script
General
Full URL
http://moodle.ucl.rrnn.me/extensions/MathZoom.js?V=2.7.5
Requested by
Host: application
URL: data:application/javascript;base64,LyoKICogIC9NYXRoSmF4LmpzCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDktMjAxOCBUaGUgTWF0aEpheCBDb25zb3J0aXVtCiAqCiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQmJmRvY3VtZW50LmNoaWxkTm9kZXMmJmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpe2lmKCEod2luZG93Lk1hdGhKYXgmJk1hdGhKYXguSHViKSl7aWYod2luZG93Lk1hdGhKYXgpe3dpbmRvdy5NYXRoSmF4PXtBdXRob3JDb25maWc6d2luZG93Lk1hdGhKYXh9fWVsc2V7d2luZG93Lk1hdGhKYXg9e319TWF0aEpheC5pc1BhY2tlZD10cnVlO01hdGhKYXgudmVyc2lvbj0iMi43LjUiO01hdGhKYXguZmlsZXZlcnNpb249IjIuNy41IjtNYXRoSmF4LmNkblZlcnNpb249IjIuNy41IjtNYXRoSmF4LmNkbkZpbGVWZXJzaW9ucz17fTsoZnVuY3Rpb24oZCl7dmFyIGI9d2luZG93W2RdO2lmKCFiKXtiPXdpbmRvd1tkXT17fX12YXIgZT1bXTt2YXIgYz1mdW5jdGlvbihmKXt2YXIgZz1mLmNvbnN0cnVjdG9yO2lmKCFnKXtnPWZ1bmN0aW9uKCl7fX1mb3IodmFyIGggaW4gZil7aWYoaCE9PSJjb25zdHJ1Y3RvciImJmYuaGFzT3duUHJvcGVydHkoaCkpe2dbaF09ZltoXX19cmV0dXJuIGd9O3ZhciBhPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5jYWxsZWUuSW5pdC5jYWxsKHRoaXMsYXJndW1lbnRzKX19O2IuT2JqZWN0PWMoe2NvbnN0cnVjdG9yOmEoKSxTdWJjbGFzczpmdW5jdGlvbihmLGgpe3ZhciBnPWEoKTtnLlNVUEVSPXRoaXM7Zy5Jbml0PXRoaXMuSW5pdDtnLlN1YmNsYXNzPXRoaXMuU3ViY2xhc3M7Zy5BdWdtZW50PXRoaXMuQXVnbWVudDtnLnByb3RvRnVuY3Rpb249dGhpcy5wcm90b0Z1bmN0aW9uO2cuY2FuPXRoaXMuY2FuO2cuaGFzPXRoaXMuaGFzO2cuaXNhPXRoaXMuaXNhO2cucHJvdG90eXBlPW5ldyB0aGlzKGUpO2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPWc7Zy5BdWdtZW50KGYsaCk7cmV0dXJuIGd9LEluaXQ6ZnVuY3Rpb24oZil7dmFyIGc9dGhpcztpZihmLmxlbmd0aD09PTEmJmZbMF09PT1lKXtyZXR1cm4gZ31pZighKGcgaW5zdGFuY2VvZiBmLmNhbGxlZSkpe2c9bmV3IGYuY2FsbGVlKGUpfXJldHVybiBnLkluaXQuYXBwbHkoZyxmKXx8Z30sQXVnbWVudDpmdW5jdGlvbihmLGcpe3ZhciBoO2lmKGYhPW51bGwpe2ZvcihoIGluIGYpe2lmKGYuaGFzT3duUHJvcGVydHkoaCkpe3RoaXMucHJvdG9GdW5jdGlvbihoLGZbaF0pfX1pZihmLnRvU3RyaW5nIT09dGhpcy5wcm90b3R5cGUudG9TdHJpbmcmJmYudG9TdHJpbmchPT17fS50b1N0cmluZyl7dGhpcy5wcm90b0Z1bmN0aW9uKCJ0b1N0cmluZyIsZi50b1N0cmluZyl9fWlmKGchPW51bGwpe2ZvcihoIGluIGcpe2lmKGcuaGFzT3duUHJvcGVydHkoaCkpe3RoaXNbaF09Z1toXX19fXJldHVybiB0aGlzfSxwcm90b0Z1bmN0aW9uOmZ1bmN0aW9uKGcsZil7dGhpcy5wcm90b3R5cGVbZ109ZjtpZih0eXBlb2YgZj09PSJmdW5jdGlvbiIpe2YuU1VQRVI9dGhpcy5TVVBFUi5wcm90b3R5cGV9fSxwcm90b3R5cGU6e0luaXQ6ZnVuY3Rpb24oKXt9LFNVUEVSOmZ1bmN0aW9uKGYpe3JldHVybiBmLmNhbGxlZS5TVVBFUn0sY2FuOmZ1bmN0aW9uKGYpe3JldHVybiB0eXBlb2YodGhpc1tmXSk9PT0iZnVuY3Rpb24ifSxoYXM6ZnVuY3Rpb24oZil7cmV0dXJuIHR5cGVvZih0aGlzW2ZdKSE9PSJ1bmRlZmluZWQifSxpc2E6ZnVuY3Rpb24oZil7cmV0dXJuKGYgaW5zdGFuY2VvZiBPYmplY3QpJiYodGhpcyBpbnN0YW5jZW9mIGYpfX0sY2FuOmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLnByb3RvdHlwZS5jYW4uY2FsbCh0aGlzLGYpfSxoYXM6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMucHJvdG90eXBlLmhhcy5jYWxsKHRoaXMsZil9LGlzYTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO3doaWxlKGYpe2lmKGY9PT1nKXtyZXR1cm4gdHJ1ZX1lbHNle2Y9Zi5TVVBFUn19cmV0dXJuIGZhbHNlfSxTaW1wbGVTVVBFUjpjKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5TaW1wbGVTVVBFUi5kZWZpbmUoZil9LGRlZmluZTpmdW5jdGlvbihmKXt2YXIgaD17fTtpZihmIT1udWxsKXtmb3IodmFyIGcgaW4gZil7aWYoZi5oYXNPd25Qcm9wZXJ0eShnKSl7aFtnXT10aGlzLndyYXAoZyxmW2ddKX19aWYoZi50b1N0cmluZyE9PXRoaXMucHJvdG90eXBlLnRvU3RyaW5nJiZmLnRvU3RyaW5nIT09e30udG9TdHJpbmcpe2gudG9TdHJpbmc9dGhpcy53cmFwKCJ0b1N0cmluZyIsZi50b1N0cmluZyl9fXJldHVybiBofSx3cmFwOmZ1bmN0aW9uKGksaCl7aWYodHlwZW9mKGgpIT09ImZ1bmN0aW9uInx8IWgudG9TdHJpbmcoKS5tYXRjaCgvXC5ccypTVVBFUlxzKlwoLykpe3JldHVybiBofXZhciBnPWZ1bmN0aW9uKCl7dGhpcy5TVVBFUj1nLlNVUEVSW2ldO3RyeXt2YXIgZj1oLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jYXRjaChqKXtkZWxldGUgdGhpcy5TVVBFUjt0aHJvdyBqfWRlbGV0ZSB0aGlzLlNVUEVSO3JldHVybiBmfTtnLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGgudG9TdHJpbmcuYXBwbHkoaCxhcmd1bWVudHMpfTtyZXR1cm4gZ319KX0pO2IuT2JqZWN0LmlzQXJyYXk9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmKT09PSJbb2JqZWN0IEFycmF5XSJ9O2IuT2JqZWN0LkFycmF5PUFycmF5fSkoIk1hdGhKYXgiKTsoZnVuY3Rpb24oQkFTRU5BTUUpe3ZhciBCQVNFPXdpbmRvd1tCQVNFTkFNRV07aWYoIUJBU0Upe0JBU0U9d2luZG93W0JBU0VOQU1FXT17fX12YXIgaXNBcnJheT1CQVNFLk9iamVjdC5pc0FycmF5O3ZhciBDQUxMQkFDSz1mdW5jdGlvbihkYXRhKXt2YXIgY2I9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmNhbGxlZS5leGVjdXRlLmFwcGx5KGFyZ3VtZW50cy5jYWxsZWUsYXJndW1lbnRzKX07Zm9yKHZhciBpZCBpbiBDQUxMQkFDSy5wcm90b3R5cGUpe2lmKENBTExCQUNLLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShpZCkpe2lmKHR5cGVvZihkYXRhW2lkXSkhPT0idW5kZWZpbmVkIil7Y2JbaWRdPWRhdGFbaWRdfWVsc2V7Y2JbaWRdPUNBTExCQUNLLnByb3RvdHlwZVtpZF19fX1jYi50b1N0cmluZz1DQUxMQkFDSy5wcm90b3R5cGUudG9TdHJpbmc7cmV0dXJuIGNifTtDQUxMQkFDSy5wcm90b3R5cGU9e2lzQ2FsbGJhY2s6dHJ1ZSxob29rOmZ1bmN0aW9uKCl7fSxkYXRhOltdLG9iamVjdDp3aW5kb3csZXhlY3V0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmNhbGxlZHx8dGhpcy5hdXRvUmVzZXQpe3RoaXMuY2FsbGVkPSF0aGlzLmF1dG9SZXNldDtyZXR1cm4gdGhpcy5ob29rLmFwcGx5KHRoaXMub2JqZWN0LHRoaXMuZGF0YS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpKX19LHJlc2V0OmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuY2FsbGVkfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhvb2sudG9TdHJpbmcuYXBwbHkodGhpcy5ob29rLGFyZ3VtZW50cyl9fTt2YXIgSVNDQUxMQkFDSz1mdW5jdGlvbihmKXtyZXR1cm4odHlwZW9mKGYpPT09ImZ1bmN0aW9uIiYmZi5pc0NhbGxiYWNrKX07dmFyIEVWQUw9ZnVuY3Rpb24oY29kZSl7cmV0dXJuIGV2YWwuY2FsbCh3aW5kb3csY29kZSl9O3ZhciBURVNURVZBTD1mdW5jdGlvbigpe0VWQUwoInZhciBfX1RlU3RfVmFSX18gPSAxIik7aWYod2luZG93Ll9fVGVTdF9WYVJfXyl7dHJ5e2RlbGV0ZSB3aW5kb3cuX19UZVN0X1ZhUl9ffWNhdGNoKGVycm9yKXt3aW5kb3cuX19UZVN0X1ZhUl9fPW51bGx9fWVsc2V7aWYod2luZG93LmV4ZWNTY3JpcHQpe0VWQUw9ZnVuY3Rpb24oY29kZSl7QkFTRS5fX2NvZGU9Y29kZTtjb2RlPSJ0cnkgeyIrQkFTRU5BTUUrIi5fX3Jlc3VsdCA9IGV2YWwoIitCQVNFTkFNRSsiLl9fY29kZSl9IGNhdGNoKGVycikgeyIrQkFTRU5BTUUrIi5fX3Jlc3VsdCA9IGVycn0iO3dpbmRvdy5leGVjU2NyaXB0KGNvZGUpO3ZhciByZXN1bHQ9QkFTRS5fX3Jlc3VsdDtkZWxldGUgQkFTRS5fX3Jlc3VsdDtkZWxldGUgQkFTRS5fX2NvZGU7aWYocmVzdWx0IGluc3RhbmNlb2YgRXJyb3Ipe3Rocm93IHJlc3VsdH1yZXR1cm4gcmVzdWx0fX1lbHNle0VWQUw9ZnVuY3Rpb24oY29kZSl7QkFTRS5fX2NvZGU9Y29kZTtjb2RlPSJ0cnkgeyIrQkFTRU5BTUUrIi5fX3Jlc3VsdCA9IGV2YWwoIitCQVNFTkFNRSsiLl9fY29kZSl9IGNhdGNoKGVycikgeyIrQkFTRU5BTUUrIi5fX3Jlc3VsdCA9IGVycn0iO3ZhciBoZWFkPShkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpKVswXTtpZighaGVhZCl7aGVhZD1kb2N1bWVudC5ib2R5fXZhciBzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7c2NyaXB0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvZGUpKTtoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7aGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpO3ZhciByZXN1bHQ9QkFTRS5fX3Jlc3VsdDtkZWxldGUgQkFTRS5fX3Jlc3VsdDtkZWxldGUgQkFTRS5fX2NvZGU7aWYocmVzdWx0IGluc3RhbmNlb2YgRXJyb3Ipe3Rocm93IHJlc3VsdH1yZXR1cm4gcmVzdWx0fX19VEVTVEVWQUw9bnVsbH07dmFyIFVTSU5HPWZ1bmN0aW9uKGFyZ3MsaSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MiYmISh0eXBlb2YgYXJndW1lbnRzWzBdPT09ImZ1bmN0aW9uIikmJmFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIE9iamVjdCYmdHlwZW9mIGFyZ3VtZW50c1sxXT09PSJudW1iZXIiKXthcmdzPVtdLnNsaWNlLmNhbGwoYXJncyxpKX1lbHNle2FyZ3M9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCl9fWlmKGlzQXJyYXkoYXJncykmJmFyZ3MubGVuZ3RoPT09MSYmdHlwZW9mKGFyZ3NbMF0pPT09ImZ1bmN0aW9uIil7YXJncz1hcmdzWzBdfWlmKHR5cGVvZiBhcmdzPT09ImZ1bmN0aW9uIil7aWYoYXJncy5leGVjdXRlPT09Q0FMTEJBQ0sucHJvdG90eXBlLmV4ZWN1dGUpe3JldHVybiBhcmdzfXJldHVybiBDQUxMQkFDSyh7aG9vazphcmdzfSl9ZWxzZXtpZihpc0FycmF5KGFyZ3MpKXtpZih0eXBlb2YoYXJnc1swXSk9PT0ic3RyaW5nIiYmYXJnc1sxXSBpbnN0YW5jZW9mIE9iamVjdCYmdHlwZW9mIGFyZ3NbMV1bYXJnc1swXV09PT0iZnVuY3Rpb24iKXtyZXR1cm4gQ0FMTEJBQ0soe2hvb2s6YXJnc1sxXVthcmdzWzBdXSxvYmplY3Q6YXJnc1sxXSxkYXRhOmFyZ3Muc2xpY2UoMil9KX1lbHNle2lmKHR5cGVvZiBhcmdzWzBdPT09ImZ1bmN0aW9uIil7cmV0dXJuIENBTExCQUNLKHtob29rOmFyZ3NbMF0sZGF0YTphcmdzLnNsaWNlKDEpfSl9ZWxzZXtpZih0eXBlb2YgYXJnc1sxXT09PSJmdW5jdGlvbiIpe3JldHVybiBDQUxMQkFDSyh7aG9vazphcmdzWzFdLG9iamVjdDphcmdzWzBdLGRhdGE6YXJncy5zbGljZSgyKX0pfX19fWVsc2V7aWYodHlwZW9mKGFyZ3MpPT09InN0cmluZyIpe2lmKFRFU1RFVkFMKXtURVNURVZBTCgpfXJldHVybiBDQUxMQkFDSyh7aG9vazpFVkFMLGRhdGE6W2FyZ3NdfSl9ZWxzZXtpZihhcmdzIGluc3RhbmNlb2YgT2JqZWN0KXtyZXR1cm4gQ0FMTEJBQ0soYXJncyl9ZWxzZXtpZih0eXBlb2YoYXJncyk9PT0idW5kZWZpbmVkIil7cmV0dXJuIENBTExCQUNLKHt9KX19fX19dGhyb3cgRXJyb3IoIkNhbid0IG1ha2UgY2FsbGJhY2sgZnJvbSBnaXZlbiBkYXRhIil9O3ZhciBERUxBWT1mdW5jdGlvbih0aW1lLGNhbGxiYWNrKXtjYWxsYmFjaz1VU0lORyhjYWxsYmFjayk7Y2FsbGJhY2sudGltZW91dD1zZXRUaW1lb3V0KGNhbGxiYWNrLHRpbWUpO3JldHVybiBjYWxsYmFja307dmFyIFdBSVRGT1I9ZnVuY3Rpb24oY2FsbGJhY2ssc2lnbmFsKXtjYWxsYmFjaz1VU0lORyhjYWxsYmFjayk7aWYoIWNhbGxiYWNrLmNhbGxlZCl7V0FJVFNJR05BTChjYWxsYmFjayxzaWduYWwpO3NpZ25hbC5wZW5kaW5nKyt9fTt2YXIgV0FJVEVYRUNVVEU9ZnVuY3Rpb24oKXt2YXIgc2lnbmFscz10aGlzLnNpZ25hbDtkZWxldGUgdGhpcy5zaWduYWw7dGhpcy5leGVjdXRlPXRoaXMub2xkRXhlY3V0ZTtkZWxldGUgdGhpcy5vbGRFeGVjdXRlO3ZhciByZXN1bHQ9dGhpcy5leGVjdXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihJU0NBTExCQUNLKHJlc3VsdCkmJiFyZXN1bHQuY2FsbGVkKXtXQUlUU0lHTkFMKHJlc3VsdCxzaWduYWxzKX1lbHNle2Zvcih2YXIgaT0wLG09c2lnbmFscy5sZW5ndGg7aTxtO2krKyl7c2lnbmFsc1tpXS5wZW5kaW5nLS07aWYoc2lnbmFsc1tpXS5wZW5kaW5nPD0wKXtzaWduYWxzW2ldLmNhbGwoKX19fX07dmFyIFdBSVRTSUdOQUw9ZnVuY3Rpb24oY2FsbGJhY2ssc2lnbmFscyl7aWYoIWlzQXJyYXkoc2lnbmFscykpe3NpZ25hbHM9W3NpZ25hbHNdfWlmKCFjYWxsYmFjay5zaWduYWwpe2NhbGxiYWNrLm9sZEV4ZWN1dGU9Y2FsbGJhY2suZXhlY3V0ZTtjYWxsYmFjay5leGVjdXRlPVdBSVRFWEVDVVRFO2NhbGxiYWNrLnNpZ25hbD1zaWduYWxzfWVsc2V7aWYoc2lnbmFscy5sZW5ndGg9PT0xKXtjYWxsYmFjay5zaWduYWwucHVzaChzaWduYWxzWzBdKX1lbHNle2NhbGxiYWNrLnNpZ25hbD1jYWxsYmFjay5zaWduYWwuY29uY2F0KHNpZ25hbHMpfX19O3ZhciBBRlRFUj1mdW5jdGlvbihjYWxsYmFjayl7Y2FsbGJhY2s9VVNJTkcoY2FsbGJhY2spO2NhbGxiYWNrLnBlbmRpbmc9MDtmb3IodmFyIGk9MSxtPWFyZ3VtZW50cy5sZW5ndGg7aTxtO2krKyl7aWYoYXJndW1lbnRzW2ldKXtXQUlURk9SKGFyZ3VtZW50c1tpXSxjYWxsYmFjayl9fWlmKGNhbGxiYWNrLnBlbmRpbmc9PT0wKXt2YXIgcmVzdWx0PWNhbGxiYWNrKCk7aWYoSVNDQUxMQkFDSyhyZXN1bHQpKXtjYWxsYmFjaz1yZXN1bHR9fXJldHVybiBjYWxsYmFja307dmFyIEhPT0tTPU1hdGhKYXguT2JqZWN0LlN1YmNsYXNzKHtJbml0OmZ1bmN0aW9uKHJlc2V0KXt0aGlzLmhvb2tzPVtdO3RoaXMucmVtb3ZlPVtdO3RoaXMucmVzZXQ9cmVzZXQ7dGhpcy5ydW5uaW5nPWZhbHNlfSxBZGQ6ZnVuY3Rpb24oaG9vayxwcmlvcml0eSl7aWYocHJpb3JpdHk9PW51bGwpe3ByaW9yaXR5PTEwfWlmKCFJU0NBTExCQUNLKGhvb2spKXtob29rPVVTSU5HKGhvb2spfWhvb2sucHJpb3JpdHk9cHJpb3JpdHk7dmFyIGk9dGhpcy5ob29rcy5sZW5ndGg7d2hpbGUoaT4wJiZwcmlvcml0eTx0aGlzLmhvb2tzW2ktMV0ucHJpb3JpdHkpe2ktLX10aGlzLmhvb2tzLnNwbGljZShpLDAsaG9vayk7cmV0dXJuIGhvb2t9LFJlbW92ZTpmdW5jdGlvbihob29rKXtmb3IodmFyIGk9MCxtPXRoaXMuaG9va3MubGVuZ3RoO2k8bTtpKyspe2lmKHRoaXMuaG9va3NbaV09PT1ob29rKXtpZih0aGlzLnJ1bm5pbmcpe3RoaXMucmVtb3ZlLnB1c2goaSl9ZWxzZXt0aGlzLmhvb2tzLnNwbGljZShpLDEpfXJldHVybn19fSxFeGVjdXRlOmZ1bmN0aW9uKCl7dmFyIGNhbGxiYWNrcz1be31dO3RoaXMucnVubmluZz10cnVlO2Zvcih2YXIgaT0wLG09dGhpcy5ob29rcy5sZW5ndGg7aTxtO2krKyl7aWYodGhpcy5yZXNldCl7dGhpcy5ob29rc1tpXS5yZXNldCgpfXZhciByZXN1bHQ9dGhpcy5ob29rc1tpXS5hcHBseSh3aW5kb3csYXJndW1lbnRzKTtpZihJU0NBTExCQUNLKHJlc3VsdCkmJiFyZXN1bHQuY2FsbGVkKXtjYWxsYmFja3MucHVzaChyZXN1bHQpfX10aGlzLnJ1bm5pbmc9ZmFsc2U7aWYodGhpcy5yZW1vdmUubGVuZ3RoKXt0aGlzLlJlbW92ZVBlbmRpbmcoKX1pZihjYWxsYmFja3MubGVuZ3RoPT09MSl7cmV0dXJuIG51bGx9aWYoY2FsbGJhY2tzLmxlbmd0aD09PTIpe3JldHVybiBjYWxsYmFja3NbMV19cmV0dXJuIEFGVEVSLmFwcGx5KHt9LGNhbGxiYWNrcyl9LFJlbW92ZVBlbmRpbmc6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZT10aGlzLnJlbW92ZS5zb3J0KCk7Zm9yKHZhciBpPXRoaXMucmVtb3ZlLmxlbmd0aC0xO2k+PTA7aS0tKXt0aGlzLmhvb2tzLnNwbGljZShpLDEpfXRoaXMucmVtb3ZlPVtdfX0pO3ZhciBFWEVDVVRFSE9PS1M9ZnVuY3Rpb24oaG9va3MsZGF0YSxyZXNldCl7aWYoIWhvb2tzKXtyZXR1cm4gbnVsbH1pZighaXNBcnJheShob29rcykpe2hvb2tzPVtob29rc119aWYoIWlzQXJyYXkoZGF0YSkpe2RhdGE9KGRhdGE9PW51bGw/W106W2RhdGFdKX12YXIgaGFuZGxlcj1IT09LUyhyZXNldCk7Zm9yKHZhciBpPTAsbT1ob29rcy5sZW5ndGg7aTxtO2krKyl7aGFuZGxlci5BZGQoaG9va3NbaV0pfXJldHVybiBoYW5kbGVyLkV4ZWN1dGUuYXBwbHkoaGFuZGxlcixkYXRhKX07dmFyIFFVRVVFPUJBU0UuT2JqZWN0LlN1YmNsYXNzKHtJbml0OmZ1bmN0aW9uKCl7dGhpcy5wZW5kaW5nPXRoaXMucnVubmluZz0wO3RoaXMucXVldWU9W107dGhpcy5QdXNoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sUHVzaDpmdW5jdGlvbigpe3ZhciBjYWxsYmFjaztmb3IodmFyIGk9MCxtPWFyZ3VtZW50cy5sZW5ndGg7aTxtO2krKyl7Y2FsbGJhY2s9VVNJTkcoYXJndW1lbnRzW2ldKTtpZihjYWxsYmFjaz09PWFyZ3VtZW50c1tpXSYmIWNhbGxiYWNrLmNhbGxlZCl7Y2FsbGJhY2s9VVNJTkcoWyJ3YWl0Iix0aGlzLGNhbGxiYWNrXSl9dGhpcy5xdWV1ZS5wdXNoKGNhbGxiYWNrKX1pZighdGhpcy5ydW5uaW5nJiYhdGhpcy5wZW5kaW5nKXt0aGlzLlByb2Nlc3MoKX1yZXR1cm4gY2FsbGJhY2t9LFByb2Nlc3M6ZnVuY3Rpb24ocXVldWUpe3doaWxlKCF0aGlzLnJ1bm5pbmcmJiF0aGlzLnBlbmRpbmcmJnRoaXMucXVldWUubGVuZ3RoKXt2YXIgY2FsbGJhY2s9dGhpcy5xdWV1ZVswXTtxdWV1ZT10aGlzLnF1ZXVlLnNsaWNlKDEpO3RoaXMucXVldWU9W107dGhpcy5TdXNwZW5kKCk7dmFyIHJlc3VsdD1jYWxsYmFjaygpO3RoaXMuUmVzdW1lKCk7aWYocXVldWUubGVuZ3RoKXt0aGlzLnF1ZXVlPXF1ZXVlLmNvbmNhdCh0aGlzLnF1ZXVlKX1pZihJU0NBTExCQUNLKHJlc3VsdCkmJiFyZXN1bHQuY2FsbGVkKXtXQUlURk9SKHJlc3VsdCx0aGlzKX19fSxTdXNwZW5kOmZ1bmN0aW9uKCl7dGhpcy5ydW5uaW5nKyt9LFJlc3VtZTpmdW5jdGlvbigpe2lmKHRoaXMucnVubmluZyl7dGhpcy5ydW5uaW5nLS19fSxjYWxsOmZ1bmN0aW9uKCl7dGhpcy5Qcm9jZXNzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2FpdDpmdW5jdGlvbihjYWxsYmFjayl7cmV0dXJuIGNhbGxiYWNrfX0pO3ZhciBTSUdOQUw9UVVFVUUuU3ViY2xhc3Moe0luaXQ6ZnVuY3Rpb24obmFtZSl7UVVFVUUucHJvdG90eXBlLkluaXQuY2FsbCh0aGlzKTt0aGlzLm5hbWU9bmFtZTt0aGlzLnBvc3RlZD1bXTt0aGlzLmxpc3RlbmVycz1IT09LUyh0cnVlKTt0aGlzLnBvc3Rpbmc9ZmFsc2U7dGhpcy5jYWxsYmFjaz1udWxsfSxQb3N0OmZ1bmN0aW9uKG1lc3NhZ2UsY2FsbGJhY2ssZm9yZ2V0KXtjYWxsYmFjaz1VU0lORyhjYWxsYmFjayk7aWYodGhpcy5wb3N0aW5nfHx0aGlzLnBlbmRpbmcpe3RoaXMuUHVzaChbIlBvc3QiLHRoaXMsbWVzc2FnZSxjYWxsYmFjayxmb3JnZXRdKX1lbHNle3RoaXMuY2FsbGJhY2s9Y2FsbGJhY2s7Y2FsbGJhY2sucmVzZXQoKTtpZighZm9yZ2V0KXt0aGlzLnBvc3RlZC5wdXNoKG1lc3NhZ2UpfXRoaXMuU3VzcGVuZCgpO3RoaXMucG9zdGluZz10cnVlO3ZhciByZXN1bHQ9dGhpcy5saXN0ZW5lcnMuRXhlY3V0ZShtZXNzYWdlKTtpZihJU0NBTExCQUNLKHJlc3VsdCkmJiFyZXN1bHQuY2FsbGVkKXtXQUlURk9SKHJlc3VsdCx0aGlzKX10aGlzLlJlc3VtZSgpO3RoaXMucG9zdGluZz1mYWxzZTtpZighdGhpcy5wZW5kaW5nKXt0aGlzLmNhbGwoKX19cmV0dXJuIGNhbGxiYWNrfSxDbGVhcjpmdW5jdGlvbihjYWxsYmFjayl7Y2FsbGJhY2s9VVNJTkcoY2FsbGJhY2spO2lmKHRoaXMucG9zdGluZ3x8dGhpcy5wZW5kaW5nKXtjYWxsYmFjaz10aGlzLlB1c2goWyJDbGVhciIsdGhpcyxjYWxsYmFja10pfWVsc2V7dGhpcy5wb3N0ZWQ9W107Y2FsbGJhY2soKX1yZXR1cm4gY2FsbGJhY2t9LGNhbGw6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNrKHRoaXMpO3RoaXMuUHJvY2VzcygpfSxJbnRlcmVzdDpmdW5jdGlvbihjYWxsYmFjayxpZ25vcmVQYXN0LHByaW9yaXR5KXtjYWxsYmFjaz1VU0lORyhjYWxsYmFjayk7dGhpcy5saXN0ZW5lcnMuQWRkKGNhbGxiYWNrLHByaW9yaXR5KTtpZighaWdub3JlUGFzdCl7Zm9yKHZhciBpPTAsbT10aGlzLnBvc3RlZC5sZW5ndGg7aTxtO2krKyl7Y2FsbGJhY2sucmVzZXQoKTt2YXIgcmVzdWx0PWNhbGxiYWNrKHRoaXMucG9zdGVkW2ldKTtpZihJU0NBTExCQUNLKHJlc3VsdCkmJmk9PT10aGlzLnBvc3RlZC5sZW5ndGgtMSl7V0FJVEZPUihyZXN1bHQsdGhpcyl9fX1yZXR1cm4gY2FsbGJhY2t9LE5vSW50ZXJlc3Q6ZnVuY3Rpb24oY2FsbGJhY2spe3RoaXMubGlzdGVuZXJzLlJlbW92ZShjYWxsYmFjayl9LE1lc3NhZ2VIb29rOmZ1bmN0aW9uKG1zZyxjYWxsYmFjayxwcmlvcml0eSl7Y2FsbGJhY2s9VVNJTkcoY2FsbGJhY2spO2lmKCF0aGlzLmhvb2tzKXt0aGlzLmhvb2tzPXt9O3RoaXMuSW50ZXJlc3QoWyJFeGVjdXRlSG9va3MiLHRoaXNdKX1pZighdGhpcy5ob29rc1ttc2ddKXt0aGlzLmhvb2tzW21zZ109SE9PS1ModHJ1ZSl9dGhpcy5ob29rc1ttc2ddLkFkZChjYWxsYmFjayxwcmlvcml0eSk7Zm9yKHZhciBpPTAsbT10aGlzLnBvc3RlZC5sZW5ndGg7aTxtO2krKyl7aWYodGhpcy5wb3N0ZWRbaV09PW1zZyl7Y2FsbGJhY2sucmVzZXQoKTtjYWxsYmFjayh0aGlzLnBvc3RlZFtpXSl9fWNhbGxiYWNrLm1zZz1tc2c7cmV0dXJuIGNhbGxiYWNrfSxFeGVjdXRlSG9va3M6ZnVuY3Rpb24obXNnKXt2YXIgdHlwZT0oaXNBcnJheShtc2cpP21zZ1swXTptc2cpO2lmKCF0aGlzLmhvb2tzW3R5cGVdKXtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5ob29rc1t0eXBlXS5FeGVjdXRlKG1zZyl9LFJlbW92ZUhvb2s6ZnVuY3Rpb24oaG9vayl7dGhpcy5ob29rc1tob29rLm1zZ10uUmVtb3ZlKGhvb2spfX0se3NpZ25hbHM6e30sZmluZDpmdW5jdGlvbihuYW1lKXtpZighU0lHTkFMLnNpZ25hbHNbbmFtZV0pe1NJR05BTC5zaWduYWxzW25hbWVdPW5ldyBTSUdOQUwobmFtZSl9cmV0dXJuIFNJR05BTC5zaWduYWxzW25hbWVdfX0pO0JBU0UuQ2FsbGJhY2s9QkFTRS5DYWxsQmFjaz1VU0lORztCQVNFLkNhbGxiYWNrLkRlbGF5PURFTEFZO0JBU0UuQ2FsbGJhY2suQWZ0ZXI9QUZURVI7QkFTRS5DYWxsYmFjay5RdWV1ZT1RVUVVRTtCQVNFLkNhbGxiYWNrLlNpZ25hbD1TSUdOQUwuZmluZDtCQVNFLkNhbGxiYWNrLkhvb2tzPUhPT0tTO0JBU0UuQ2FsbGJhY2suRXhlY3V0ZUhvb2tzPUVYRUNVVEVIT09LU30pKCJNYXRoSmF4Iik7KGZ1bmN0aW9uKGUpe3ZhciBhPXdpbmRvd1tlXTtpZighYSl7YT13aW5kb3dbZV09e319dmFyIGQ9KG5hdmlnYXRvci52ZW5kb3I9PT0iQXBwbGUgQ29tcHV0ZXIsIEluYy4iJiZ0eXBlb2YgbmF2aWdhdG9yLnZlbmRvclN1Yj09PSJ1bmRlZmluZWQiKTt2YXIgZz0wO3ZhciBoPWZ1bmN0aW9uKGkpe2lmKGRvY3VtZW50LnN0eWxlU2hlZXRzJiZkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg+Zyl7Zz1kb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGh9aWYoIWkpe2k9ZG9jdW1lbnQuaGVhZHx8KChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpKVswXSk7aWYoIWkpe2k9ZG9jdW1lbnQuYm9keX19cmV0dXJuIGl9O3ZhciBmPVtdO3ZhciBjPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPTAsaj1mLmxlbmd0aDtrPGo7aysrKXthLkFqYXguaGVhZC5yZW1vdmVDaGlsZChmW2tdKX1mPVtdfTt2YXIgYj17fTtiW2VdPSIiO2IuYTExeT0iW01hdGhKYXhdL2V4dGVuc2lvbnMvYTExeSI7Yi5Db250cmliPSJodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2NvbnRyaWIiO2EuQWpheD17bG9hZGVkOnt9LGxvYWRpbmc6e30sbG9hZEhvb2tzOnt9LHRpbWVvdXQ6MTUqMTAwMCxzdHlsZURlbGF5OjEsY29uZmlnOntyb290OiIiLHBhdGg6Yn0scGFyYW1zOnt9LFNUQVRVUzp7T0s6MSxFUlJPUjotMX0sZmlsZVVSTDpmdW5jdGlvbihqKXt2YXIgaTt3aGlsZSgoaT1qLm1hdGNoKC9eXFsoWy0uX2EtejAtOV0rKVxdL2kpKSYmYi5oYXNPd25Qcm9wZXJ0eShpWzFdKSl7aj0oYltpWzFdXXx8dGhpcy5jb25maWcucm9vdCkrai5zdWJzdHIoaVsxXS5sZW5ndGgrMil9cmV0dXJuIGp9LGZpbGVOYW1lOmZ1bmN0aW9uKGope3ZhciBpPXRoaXMuY29uZmlnLnJvb3Q7aWYoai5zdWJzdHIoMCxpLmxlbmd0aCk9PT1pKXtqPSJbIitlKyJdIitqLnN1YnN0cihpLmxlbmd0aCl9ZG97dmFyIGs9ZmFsc2U7Zm9yKHZhciBsIGluIGIpe2lmKGIuaGFzT3duUHJvcGVydHkobCkmJmJbbF0pe2lmKGouc3Vic3RyKDAsYltsXS5sZW5ndGgpPT09YltsXSl7aj0iWyIrbCsiXSIrai5zdWJzdHIoYltsXS5sZW5ndGgpO2s9dHJ1ZTticmVha319fX13aGlsZShrKTtyZXR1cm4gan0sZmlsZVJldjpmdW5jdGlvbihqKXt2YXIgaT1hLmNkbkZpbGVWZXJzaW9uc1tqXXx8YS5jZG5WZXJzaW9ufHwiIjtpZihpKXtpPSI/Vj0iK2l9cmV0dXJuIGl9LHVybFJldjpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5maWxlVVJMKGkpK3RoaXMuZmlsZVJldihpKX0sUmVxdWlyZTpmdW5jdGlvbihrLG4pe249YS5DYWxsYmFjayhuKTt2YXIgbDtpZihrIGluc3RhbmNlb2YgT2JqZWN0KXtmb3IodmFyIGogaW4gayl7aWYoay5oYXNPd25Qcm9wZXJ0eShqKSl7bD1qLnRvVXBwZXJDYXNlKCk7az1rW2pdfX19ZWxzZXtsPWsuc3BsaXQoL1wuLykucG9wKCkudG9VcHBlckNhc2UoKX1pZih0aGlzLnBhcmFtcy5ub0NvbnRyaWImJmsuc3Vic3RyKDAsOSk9PT0iW0NvbnRyaWJdIil7bih0aGlzLlNUQVRVUy5FUlJPUil9ZWxzZXtrPXRoaXMuZmlsZVVSTChrKTtpZih0aGlzLmxvYWRlZFtrXSl7bih0aGlzLmxvYWRlZFtrXSl9ZWxzZXt2YXIgbT17fTttW2xdPWs7dGhpcy5Mb2FkKG0sbil9fXJldHVybiBufSxMb2FkOmZ1bmN0aW9uKGssbSl7bT1hLkNhbGxiYWNrKG0pO3ZhciBsO2lmKGsgaW5zdGFuY2VvZiBPYmplY3Qpe2Zvcih2YXIgaiBpbiBrKXtpZihrLmhhc093blByb3BlcnR5KGopKXtsPWoudG9VcHBlckNhc2UoKTtrPWtbal19fX1lbHNle2w9ay5zcGxpdCgvXC4vKS5wb3AoKS50b1VwcGVyQ2FzZSgpfWs9dGhpcy5maWxlVVJMKGspO2lmKHRoaXMubG9hZGluZ1trXSl7dGhpcy5hZGRIb29rKGssbSl9ZWxzZXt0aGlzLmhlYWQ9aCh0aGlzLmhlYWQpO2lmKHRoaXMubG9hZGVyW2xdKXt0aGlzLmxvYWRlcltsXS5jYWxsKHRoaXMsayxtKX1lbHNle3Rocm93IEVycm9yKCJDYW4ndCBsb2FkIGZpbGVzIG9mIHR5cGUgIitsKX19cmV0dXJuIG19LExvYWRIb29rOmZ1bmN0aW9uKGwsbSxrKXttPWEuQ2FsbGJhY2sobSk7aWYobCBpbnN0YW5jZW9mIE9iamVjdCl7Zm9yKHZhciBqIGluIGwpe2lmKGwuaGFzT3duUHJvcGVydHkoaikpe2w9bFtqXX19fWw9dGhpcy5maWxlVVJMKGwpO2lmKHRoaXMubG9hZGVkW2xdKXttKHRoaXMubG9hZGVkW2xdKX1lbHNle3RoaXMuYWRkSG9vayhsLG0sayl9cmV0dXJuIG19LGFkZEhvb2s6ZnVuY3Rpb24oaixrLGkpe2lmKCF0aGlzLmxvYWRIb29rc1tqXSl7dGhpcy5sb2FkSG9va3Nbal09TWF0aEpheC5DYWxsYmFjay5Ib29rcygpfXRoaXMubG9hZEhvb2tzW2pdLkFkZChrLGkpO2suZmlsZT1qfSxyZW1vdmVIb29rOmZ1bmN0aW9uKGkpe2lmKHRoaXMubG9hZEhvb2tzW2kuZmlsZV0pe3RoaXMubG9hZEhvb2tzW2kuZmlsZV0uUmVtb3ZlKGkpO2lmKCF0aGlzLmxvYWRIb29rc1tpLmZpbGVdLmhvb2tzLmxlbmd0aCl7ZGVsZXRlIHRoaXMubG9hZEhvb2tzW2kuZmlsZV19fX0sUHJlbG9hZGluZzpmdW5jdGlvbigpe2Zvcih2YXIgbD0wLGo9YXJndW1lbnRzLmxlbmd0aDtsPGo7bCsrKXt2YXIgaz10aGlzLmZpbGVVUkwoYXJndW1lbnRzW2xdKTtpZighdGhpcy5sb2FkaW5nW2tdKXt0aGlzLmxvYWRpbmdba109e3ByZWxvYWRlZDp0cnVlfX19fSxsb2FkZXI6e0pTOmZ1bmN0aW9uKGssbSl7dmFyIGo9dGhpcy5maWxlTmFtZShrKTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt2YXIgbD1hLkNhbGxiYWNrKFsibG9hZFRpbWVvdXQiLHRoaXMsa10pO3RoaXMubG9hZGluZ1trXT17Y2FsbGJhY2s6bSx0aW1lb3V0OnNldFRpbWVvdXQobCx0aGlzLnRpbWVvdXQpLHN0YXR1czp0aGlzLlNUQVRVUy5PSyxzY3JpcHQ6aX07dGhpcy5sb2FkaW5nW2tdLm1lc3NhZ2U9YS5NZXNzYWdlLkZpbGUoaik7aS5vbmVycm9yPWw7aS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2kuc3JjPWsrdGhpcy5maWxlUmV2KGopO3RoaXMuaGVhZC5hcHBlbmRDaGlsZChpKX0sQ1NTOmZ1bmN0aW9uKGosbCl7dmFyIGk9dGhpcy5maWxlTmFtZShqKTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7ay5yZWw9InN0eWxlc2hlZXQiO2sudHlwZT0idGV4dC9jc3MiO2suaHJlZj1qK3RoaXMuZmlsZVJldihpKTt0aGlzLmxvYWRpbmdbal09e2NhbGxiYWNrOmwsbWVzc2FnZTphLk1lc3NhZ2UuRmlsZShpKSxzdGF0dXM6dGhpcy5TVEFUVVMuT0t9O3RoaXMuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLnRpbWVyLmNyZWF0ZS5jYWxsKHRoaXMsW3RoaXMudGltZXIuZmlsZSxqXSxrKX19LHRpbWVyOntjcmVhdGU6ZnVuY3Rpb24oaixpKXtqPWEuQ2FsbGJhY2soaik7aWYoaS5ub2RlTmFtZT09PSJTVFlMRSImJmkuc3R5bGVTaGVldCYmdHlwZW9mKGkuc3R5bGVTaGVldC5jc3NUZXh0KSE9PSJ1bmRlZmluZWQiKXtqKHRoaXMuU1RBVFVTLk9LKX1lbHNle2lmKHdpbmRvdy5jaHJvbWUmJmkubm9kZU5hbWU9PT0iTElOSyIpe2oodGhpcy5TVEFUVVMuT0spfWVsc2V7aWYoZCl7dGhpcy50aW1lci5zdGFydCh0aGlzLFt0aGlzLnRpbWVyLmNoZWNrU2FmYXJpMixnKyssal0sdGhpcy5zdHlsZURlbGF5KX1lbHNle3RoaXMudGltZXIuc3RhcnQodGhpcyxbdGhpcy50aW1lci5jaGVja0xlbmd0aCxpLGpdLHRoaXMuc3R5bGVEZWxheSl9fX1yZXR1cm4gan0sc3RhcnQ6ZnVuY3Rpb24oaixpLGssbCl7aT1hLkNhbGxiYWNrKGkpO2kuZXhlY3V0ZT10aGlzLmV4ZWN1dGU7aS50aW1lPXRoaXMudGltZTtpLlNUQVRVUz1qLlNUQVRVUztpLnRpbWVvdXQ9bHx8ai50aW1lb3V0O2kuZGVsYXk9aS50b3RhbD1rfHwwO2lmKGspe3NldFRpbWVvdXQoaSxrKX1lbHNle2koKX19LHRpbWU6ZnVuY3Rpb24oaSl7dGhpcy50b3RhbCs9dGhpcy5kZWxheTt0aGlzLmRlbGF5PU1hdGguZmxvb3IodGhpcy5kZWxheSoxLjA1KzUpO2lmKHRoaXMudG90YWw+PXRoaXMudGltZW91dCl7aSh0aGlzLlNUQVRVUy5FUlJPUik7cmV0dXJuIDF9cmV0dXJuIDB9LGZpbGU6ZnVuY3Rpb24oaixpKXtpZihpPDApe2EuQWpheC5sb2FkVGltZW91dChqKX1lbHNle2EuQWpheC5sb2FkQ29tcGxldGUoail9fSxleGVjdXRlOmZ1bmN0aW9uKCl7dGhpcy5ob29rLmNhbGwodGhpcy5vYmplY3QsdGhpcyx0aGlzLmRhdGFbMF0sdGhpcy5kYXRhWzFdKX0sY2hlY2tTYWZhcmkyOmZ1bmN0aW9uKGksaixrKXtpZihpLnRpbWUoaykpe3JldHVybn1pZihkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg+aiYmZG9jdW1lbnQuc3R5bGVTaGVldHNbal0uY3NzUnVsZXMmJmRvY3VtZW50LnN0eWxlU2hlZXRzW2pdLmNzc1J1bGVzLmxlbmd0aCl7ayhpLlNUQVRVUy5PSyl9ZWxzZXtzZXRUaW1lb3V0KGksaS5kZWxheSl9fSxjaGVja0xlbmd0aDpmdW5jdGlvbihpLGwsbil7aWYoaS50aW1lKG4pKXtyZXR1cm59dmFyIG09MDt2YXIgaj0obC5zaGVldHx8bC5zdHlsZVNoZWV0KTt0cnl7aWYoKGouY3NzUnVsZXN8fGoucnVsZXN8fFtdKS5sZW5ndGg+MCl7bT0xfX1jYXRjaChrKXtpZihrLm1lc3NhZ2UubWF0Y2goL3Byb3RlY3RlZCB2YXJpYWJsZXxyZXN0cmljdGVkIFVSSS8pKXttPTF9ZWxzZXtpZihrLm1lc3NhZ2UubWF0Y2goL1NlY3VyaXR5IGVycm9yLykpe209MX19fWlmKG0pe3NldFRpbWVvdXQoYS5DYWxsYmFjayhbbixpLlNUQVRVUy5PS10pLDApfWVsc2V7c2V0VGltZW91dChpLGkuZGVsYXkpfX19LGxvYWRDb21wbGV0ZTpmdW5jdGlvbihpKXtpPXRoaXMuZmlsZVVSTChpKTt2YXIgaj10aGlzLmxvYWRpbmdbaV07aWYoaiYmIWoucHJlbG9hZGVkKXthLk1lc3NhZ2UuQ2xlYXIoai5tZXNzYWdlKTtjbGVhclRpbWVvdXQoai50aW1lb3V0KTtpZihqLnNjcmlwdCl7aWYoZi5sZW5ndGg9PT0wKXtzZXRUaW1lb3V0KGMsMCl9Zi5wdXNoKGouc2NyaXB0KX10aGlzLmxvYWRlZFtpXT1qLnN0YXR1cztkZWxldGUgdGhpcy5sb2FkaW5nW2ldO3RoaXMuYWRkSG9vayhpLGouY2FsbGJhY2spfWVsc2V7aWYoail7ZGVsZXRlIHRoaXMubG9hZGluZ1tpXX10aGlzLmxvYWRlZFtpXT10aGlzLlNUQVRVUy5PSztqPXtzdGF0dXM6dGhpcy5TVEFUVVMuT0t9fWlmKCF0aGlzLmxvYWRIb29rc1tpXSl7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMubG9hZEhvb2tzW2ldLkV4ZWN1dGUoai5zdGF0dXMpfSxsb2FkVGltZW91dDpmdW5jdGlvbihpKXtpZih0aGlzLmxvYWRpbmdbaV0udGltZW91dCl7Y2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1tpXS50aW1lb3V0KX10aGlzLmxvYWRpbmdbaV0uc3RhdHVzPXRoaXMuU1RBVFVTLkVSUk9SO3RoaXMubG9hZEVycm9yKGkpO3RoaXMubG9hZENvbXBsZXRlKGkpfSxsb2FkRXJyb3I6ZnVuY3Rpb24oaSl7YS5NZXNzYWdlLlNldChbIkxvYWRGYWlsZWQiLCJGaWxlIGZhaWxlZCB0byBsb2FkOiAlMSIsaV0sbnVsbCwyMDAwKTthLkh1Yi5zaWduYWwuUG9zdChbImZpbGUgbG9hZCBlcnJvciIsaV0pfSxTdHlsZXM6ZnVuY3Rpb24oayxsKXt2YXIgaT10aGlzLlN0eWxlU3RyaW5nKGspO2lmKGk9PT0iIil7bD1hLkNhbGxiYWNrKGwpO2woKX1lbHNle3ZhciBqPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ai50eXBlPSJ0ZXh0L2NzcyI7dGhpcy5oZWFkPWgodGhpcy5oZWFkKTt0aGlzLmhlYWQuYXBwZW5kQ2hpbGQoaik7aWYoai5zdHlsZVNoZWV0JiZ0eXBlb2Yoai5zdHlsZVNoZWV0LmNzc1RleHQpIT09InVuZGVmaW5lZCIpe2ouc3R5bGVTaGVldC5jc3NUZXh0PWl9ZWxzZXtqLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGkpKX1sPXRoaXMudGltZXIuY3JlYXRlLmNhbGwodGhpcyxsLGopfXJldHVybiBsfSxTdHlsZVN0cmluZzpmdW5jdGlvbihuKXtpZih0eXBlb2Yobik9PT0ic3RyaW5nIil7cmV0dXJuIG59dmFyIGs9IiIsbyxtO2ZvcihvIGluIG4pe2lmKG4uaGFzT3duUHJvcGVydHkobykpe2lmKHR5cGVvZiBuW29dPT09InN0cmluZyIpe2srPW8rIiB7IituW29dKyJ9XG4ifWVsc2V7aWYoYS5PYmplY3QuaXNBcnJheShuW29dKSl7Zm9yKHZhciBsPTA7bDxuW29dLmxlbmd0aDtsKyspe209e307bVtvXT1uW29dW2xdO2srPXRoaXMuU3R5bGVTdHJpbmcobSl9fWVsc2V7aWYoby5zdWJzdHIoMCw2KT09PSJAbWVkaWEiKXtrKz1vKyIgeyIrdGhpcy5TdHlsZVN0cmluZyhuW29dKSsifVxuIn1lbHNle2lmKG5bb10hPW51bGwpe209W107Zm9yKHZhciBqIGluIG5bb10pe2lmKG5bb10uaGFzT3duUHJvcGVydHkoaikpe2lmKG5bb11bal0hPW51bGwpe21bbS5sZW5ndGhdPWorIjogIituW29dW2pdfX19ays9bysiIHsiK20uam9pbigiOyAiKSsifVxuIn19fX19fXJldHVybiBrfX19KSgiTWF0aEpheCIpO01hdGhKYXguSFRNTD17RWxlbWVudDpmdW5jdGlvbihkLGYsZSl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkKSxoO2lmKGYpe2lmKGYuaGFzT3duUHJvcGVydHkoInN0eWxlIikpe3ZhciBjPWYuc3R5bGU7Zi5zdHlsZT17fTtmb3IoaCBpbiBjKXtpZihjLmhhc093blByb3BlcnR5KGgpKXtmLnN0eWxlW2gucmVwbGFjZSgvLShbYS16XSkvZyx0aGlzLnVjTWF0Y2gpXT1jW2hdfX19TWF0aEpheC5IdWIuSW5zZXJ0KGcsZik7Zm9yKGggaW4gZil7aWYoaD09PSJyb2xlInx8aC5zdWJzdHIoMCw1KT09PSJhcmlhLSIpe2cuc2V0QXR0cmlidXRlKGgsZltoXSl9fX1pZihlKXtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShlKSl7ZT1bZV19Zm9yKHZhciBiPTAsYT1lLmxlbmd0aDtiPGE7YisrKXtpZihNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGVbYl0pKXtnLmFwcGVuZENoaWxkKHRoaXMuRWxlbWVudChlW2JdWzBdLGVbYl1bMV0sZVtiXVsyXSkpfWVsc2V7aWYoZD09PSJzY3JpcHQiKXt0aGlzLnNldFNjcmlwdChnLGVbYl0pfWVsc2V7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlW2JdKSl9fX19cmV0dXJuIGd9LHVjTWF0Y2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSxhZGRFbGVtZW50OmZ1bmN0aW9uKGIsYSxkLGMpe3JldHVybiBiLmFwcGVuZENoaWxkKHRoaXMuRWxlbWVudChhLGQsYykpfSxUZXh0Tm9kZTpmdW5jdGlvbihhKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSl9LGFkZFRleHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5hcHBlbmRDaGlsZCh0aGlzLlRleHROb2RlKGIpKX0sc2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7aWYodGhpcy5zZXRTY3JpcHRCdWcpe2EudGV4dD1ifWVsc2V7d2hpbGUoYS5maXJzdENoaWxkKXthLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9dGhpcy5hZGRUZXh0KGEsYil9fSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSl7dmFyIGI9KGEudGV4dD09PSIiP2EuaW5uZXJIVE1MOmEudGV4dCk7cmV0dXJuIGIucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX0sQ29va2llOntwcmVmaXg6Im1qeCIsZXhwaXJlczozNjUsU2V0OmZ1bmN0aW9uKGEsZSl7dmFyIGQ9W107aWYoZSl7Zm9yKHZhciBnIGluIGUpe2lmKGUuaGFzT3duUHJvcGVydHkoZykpe2QucHVzaChnKyI6IitlW2ddLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCImJiIpKX19fXZhciBiPXRoaXMucHJlZml4KyIuIithKyI9Iitlc2NhcGUoZC5qb2luKCImOyIpKTtpZih0aGlzLmV4cGlyZXMpe3ZhciBmPW5ldyBEYXRlKCk7Zi5zZXREYXRlKGYuZ2V0RGF0ZSgpK3RoaXMuZXhwaXJlcyk7Yis9IjsgZXhwaXJlcz0iK2YudG9HTVRTdHJpbmcoKX10cnl7ZG9jdW1lbnQuY29va2llPWIrIjsgcGF0aD0vIn1jYXRjaChjKXt9fSxHZXQ6ZnVuY3Rpb24oYSxkKXtpZighZCl7ZD17fX12YXIgZz1uZXcgUmVnRXhwKCIoPzpefDtcXHMqKSIrdGhpcy5wcmVmaXgrIlxcLiIrYSsiPShbXjtdKikoPzo7fCQpIik7dmFyIGY7dHJ5e2Y9Zy5leGVjKGRvY3VtZW50LmNvb2tpZSl9Y2F0Y2goYyl7fWlmKGYmJmZbMV0hPT0iIil7dmFyIGo9dW5lc2NhcGUoZlsxXSkuc3BsaXQoIiY7Iik7Zm9yKHZhciBlPTAsYj1qLmxlbmd0aDtlPGI7ZSsrKXtmPWpbZV0ubWF0Y2goLyhbXjpdKyk6KC4qKS8pO3ZhciBoPWZbMl0ucmVwbGFjZSgvJiYvZywiJiIpO2lmKGg9PT0idHJ1ZSIpe2g9dHJ1ZX1lbHNle2lmKGg9PT0iZmFsc2UiKXtoPWZhbHNlfWVsc2V7aWYoaC5tYXRjaCgvXi0/KFxkKyhcLlxkKyk/fFwuXGQrKSQvKSl7aD1wYXJzZUZsb2F0KGgpfX19ZFtmWzFdXT1ofX1yZXR1cm4gZH19fTtNYXRoSmF4LkxvY2FsaXphdGlvbj17bG9jYWxlOiJlbiIsZGlyZWN0b3J5OiJbTWF0aEpheF0vbG9jYWxpemF0aW9uIixzdHJpbmdzOnthcjp7bWVudVRpdGxlOiJcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NEFcdTA2MjkifSxhc3Q6e21lbnVUaXRsZToiYXN0dXJpYW51In0sYmc6e21lbnVUaXRsZToiXHUwNDMxXHUwNDRBXHUwNDNCXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNBXHUwNDM4In0sYmNjOnttZW51VGl0bGU6Ilx1MDYyOFx1MDY0NFx1MDY0OFx1MDY4Nlx1MDZDQyJ9LGJyOnttZW51VGl0bGU6ImJyZXpob25lZyJ9LGNhOnttZW51VGl0bGU6ImNhdGFsXHUwMEUwIn0sY2RvOnttZW51VGl0bGU6Ik1cdTAwRUNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFFNzNcdTAzMDQifSxjczp7bWVudVRpdGxlOiJcdTAxMERlXHUwMTYxdGluYSJ9LGRhOnttZW51VGl0bGU6ImRhbnNrIn0sZGU6e21lbnVUaXRsZToiRGV1dHNjaCJ9LGRpcTp7bWVudVRpdGxlOiJaYXpha2kifSxlbjp7bWVudVRpdGxlOiJFbmdsaXNoIixpc0xvYWRlZDp0cnVlfSxlbzp7bWVudVRpdGxlOiJFc3BlcmFudG8ifSxlczp7bWVudVRpdGxlOiJlc3BhXHUwMEYxb2wifSxmYTp7bWVudVRpdGxlOiJcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Q0MifSxmaTp7bWVudVRpdGxlOiJzdW9taSJ9LGZyOnttZW51VGl0bGU6ImZyYW5cdTAwRTdhaXMifSxnbDp7bWVudVRpdGxlOiJnYWxlZ28ifSxoZTp7bWVudVRpdGxlOiJcdTA1RTJcdTA1RDFcdTA1RThcdTA1RDlcdTA1RUEifSxpYTp7bWVudVRpdGxlOiJpbnRlcmxpbmd1YSJ9LGl0OnttZW51VGl0bGU6Iml0YWxpYW5vIn0samE6e21lbnVUaXRsZToiXHU2NUU1XHU2NzJDXHU4QTlFIn0sa246e21lbnVUaXRsZToiXHUwQzk1XHUwQ0E4XHUwQ0NEXHUwQ0E4XHUwQ0ExIn0sa286e21lbnVUaXRsZToiXHVENTVDXHVBRDZEXHVDNUI0In0sbGI6e21lbnVUaXRsZToiTFx1MDBFQnR6ZWJ1ZXJnZXNjaCJ9LGxraTp7bWVudVRpdGxlOiJcdTA2NDRcdTA2RDVcdTA2QTlcdTA2Q0MifSxsdDp7bWVudVRpdGxlOiJsaWV0dXZpXHUwMTczIn0sbWs6e21lbnVUaXRsZToiXHUwNDNDXHUwNDMwXHUwNDNBXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDNEXHUwNDQxXHUwNDNBXHUwNDM4In0sbmw6e21lbnVUaXRsZToiTmVkZXJsYW5kcyJ9LG9jOnttZW51VGl0bGU6Im9jY2l0YW4ifSxwbDp7bWVudVRpdGxlOiJwb2xza2kifSxwdDp7bWVudVRpdGxlOiJwb3J0dWd1XHUwMEVBcyJ9LCJwdC1iciI6e21lbnVUaXRsZToicG9ydHVndVx1MDBFQXMgZG8gQnJhc2lsIn0scnU6e21lbnVUaXRsZToiXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5In0sc2NvOnttZW51VGl0bGU6IlNjb3RzIn0sc2NuOnttZW51VGl0bGU6InNpY2lsaWFudSJ9LHNrOnttZW51VGl0bGU6InNsb3Zlblx1MDEwRGluYSJ9LHNsOnttZW51VGl0bGU6InNsb3Zlblx1MDE2MVx1MDEwRGluYSJ9LHN2OnttZW51VGl0bGU6InN2ZW5za2EifSx0aDp7bWVudVRpdGxlOiJcdTBFNDRcdTBFMTdcdTBFMjIifSx0cjp7bWVudVRpdGxlOiJUXHUwMEZDcmtcdTAwRTdlIn0sdWs6e21lbnVUaXRsZToiXHUwNDQzXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNEXHUwNDQxXHUwNDRDXHUwNDNBXHUwNDMwIn0sdmk6e21lbnVUaXRsZToiVGlcdTFFQkZuZyBWaVx1MUVDN3QifSwiemgtaGFucyI6e21lbnVUaXRsZToiXHU0RTJEXHU2NTg3XHVGRjA4XHU3QjgwXHU0RjUzXHVGRjA5In0sInpoLWhhbnQiOnttZW51VGl0bGU6Ilx1NkM0OVx1OEJFRCJ9fSxwYXR0ZXJuOi8lKFxkK3xce1xkK1x9fFx7W2Etel0rOlwlXGQrKD86XHwoPzolXHtcZCtcfXwlLnxbXlx9XSkqKStcfXwuKS9nLFNQTElUOigiYXhiIi5zcGxpdCgvKHgpLykubGVuZ3RoPT09Mz9mdW5jdGlvbihhLGIpe3JldHVybiBhLnNwbGl0KGIpfTpmdW5jdGlvbihjLGUpe3ZhciBhPVtdLGIsZD0wO2UubGFzdEluZGV4PTA7d2hpbGUoKGI9ZS5leGVjKGMpKSl7YS5wdXNoKGMuc3Vic3RyKGQsYi5pbmRleC1kKSk7YS5wdXNoLmFwcGx5KGEsYi5zbGljZSgxKSk7ZD1iLmluZGV4K2JbMF0ubGVuZ3RofWEucHVzaChjLnN1YnN0cihkKSk7cmV0dXJuIGF9KSxfOmZ1bmN0aW9uKGIsYSl7aWYoTWF0aEpheC5PYmplY3QuaXNBcnJheShhKSl7cmV0dXJuIHRoaXMucHJvY2Vzc1NuaXBwZXQoYixhKX1yZXR1cm4gdGhpcy5wcm9jZXNzU3RyaW5nKHRoaXMubG9va3VwUGhyYXNlKGIsYSksW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSxwcm9jZXNzU3RyaW5nOmZ1bmN0aW9uKGwscCxnKXt2YXIgaixlLG89TWF0aEpheC5PYmplY3QuaXNBcnJheTtmb3Ioaj0wLGU9cC5sZW5ndGg7ajxlO2orKyl7aWYoZyYmbyhwW2pdKSl7cFtqXT10aGlzLnByb2Nlc3NTbmlwcGV0KGcscFtqXSl9fXZhciBmPXRoaXMuU1BMSVQobCx0aGlzLnBhdHRlcm4pO2ZvcihqPTEsZT1mLmxlbmd0aDtqPGU7ais9Mil7dmFyIHE9ZltqXS5jaGFyQXQoMCk7aWYocT49IjAiJiZxPD0iOSIpe2Zbal09cFtmW2pdLTFdO2lmKHR5cGVvZiBmW2pdPT09Im51bWJlciIpe2Zbal09dGhpcy5udW1iZXIoZltqXSl9fWVsc2V7aWYocT09PSJ7Iil7cT1mW2pdLnN1YnN0cigxKTtpZihxPj0iMCImJnE8PSI5Iil7ZltqXT1wW2Zbal0uc3Vic3RyKDEsZltqXS5sZW5ndGgtMiktMV07aWYodHlwZW9mIGZbal09PT0ibnVtYmVyIil7ZltqXT10aGlzLm51bWJlcihmW2pdKX19ZWxzZXt2YXIgaz1mW2pdLm1hdGNoKC9eXHsoW2Etel0rKTolKFxkKylcfCguKilcfSQvKTtpZihrKXtpZihrWzFdPT09InBsdXJhbCIpe3ZhciBkPXBba1syXS0xXTtpZih0eXBlb2YgZD09PSJ1bmRlZmluZWQiKXtmW2pdPSI/Pz8ifWVsc2V7ZD10aGlzLnBsdXJhbChkKS0xO3ZhciBoPWtbM10ucmVwbGFjZSgvKF58W14lXSkoJSUpKiVcfC9nLCIkMSQyJVx1RUZFRiIpLnNwbGl0KC9cfC8pO2lmKGQ+PTAmJmQ8aC5sZW5ndGgpe2Zbal09dGhpcy5wcm9jZXNzU3RyaW5nKGhbZF0ucmVwbGFjZSgvXHVFRkVGL2csInwiKSxwLGcpfWVsc2V7ZltqXT0iPz8/In19fWVsc2V7ZltqXT0iJSIrZltqXX19fX19aWYoZltqXT09bnVsbCl7ZltqXT0iPz8/In19aWYoIWcpe3JldHVybiBmLmpvaW4oIiIpfXZhciBhPVtdLGI9IiI7Zm9yKGo9MDtqPGU7aisrKXtiKz1mW2pdO2orKztpZihqPGUpe2lmKG8oZltqXSkpe2EucHVzaChiKTthPWEuY29uY2F0KGZbal0pO2I9IiJ9ZWxzZXtiKz1mW2pdfX19aWYoYiE9PSIiKXthLnB1c2goYil9cmV0dXJuIGF9LHByb2Nlc3NTbmlwcGV0OmZ1bmN0aW9uKGcsZSl7dmFyIGM9W107Zm9yKHZhciBkPTAsYj1lLmxlbmd0aDtkPGI7ZCsrKXtpZihNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGVbZF0pKXt2YXIgZj1lW2RdO2lmKHR5cGVvZiBmWzFdPT09InN0cmluZyIpe3ZhciBoPWZbMF07aWYoIU1hdGhKYXguT2JqZWN0LmlzQXJyYXkoaCkpe2g9W2csaF19dmFyIGE9dGhpcy5sb29rdXBQaHJhc2UoaCxmWzFdKTtjPWMuY29uY2F0KHRoaXMucHJvY2Vzc01hcmtkb3duKGEsZi5zbGljZSgyKSxnKSl9ZWxzZXtpZihNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGZbMV0pKXtjPWMuY29uY2F0KHRoaXMucHJvY2Vzc1NuaXBwZXQuYXBwbHkodGhpcyxmKSl9ZWxzZXtpZihmLmxlbmd0aD49Myl7Yy5wdXNoKFtmWzBdLGZbMV0sdGhpcy5wcm9jZXNzU25pcHBldChnLGZbMl0pXSl9ZWxzZXtjLnB1c2goZVtkXSl9fX19ZWxzZXtjLnB1c2goZVtkXSl9fXJldHVybiBjfSxtYXJrZG93blBhdHRlcm46LyglLil8KFwqezEsM30pKCg/OiUufC4pKz8pXDJ8KGArKSgoPzolLnwuKSs/KVw0fFxbKCg/OiUufC4pKz8pXF1cKChbXlxzXCldKylcKS8scHJvY2Vzc01hcmtkb3duOmZ1bmN0aW9uKGIsaCxkKXt2YXIgaj1bXSxlO3ZhciBjPWIuc3BsaXQodGhpcy5tYXJrZG93blBhdHRlcm4pO3ZhciBnPWNbMF07Zm9yKHZhciBmPTEsYT1jLmxlbmd0aDtmPGE7Zis9OCl7aWYoY1tmKzFdKXtlPXRoaXMucHJvY2Vzc1N0cmluZyhjW2YrMl0saCxkKTtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShlKSl7ZT1bZV19ZT1bWyJiIiwiaSIsImkiXVtjW2YrMV0ubGVuZ3RoLTFdLHt9LGVdO2lmKGNbZisxXS5sZW5ndGg9PT0zKXtlPVsiYiIse30sZV19fWVsc2V7aWYoY1tmKzNdKXtlPXRoaXMucHJvY2Vzc1N0cmluZyhjW2YrNF0ucmVwbGFjZSgvXlxzLywiIikucmVwbGFjZSgvXHMkLywiIiksaCxkKTtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShlKSl7ZT1bZV19ZT1bImNvZGUiLHt9LGVdfWVsc2V7aWYoY1tmKzVdKXtlPXRoaXMucHJvY2Vzc1N0cmluZyhjW2YrNV0saCxkKTtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShlKSl7ZT1bZV19ZT1bImEiLHtocmVmOnRoaXMucHJvY2Vzc1N0cmluZyhjW2YrNl0saCksdGFyZ2V0OiJfYmxhbmsifSxlXX1lbHNle2crPWNbZl07ZT1udWxsfX19aWYoZSl7aj10aGlzLmNvbmNhdFN0cmluZyhqLGcsaCxkKTtqLnB1c2goZSk7Zz0iIn1pZihjW2YrN10hPT0iIil7Zys9Y1tmKzddfX1qPXRoaXMuY29uY2F0U3RyaW5nKGosZyxoLGQpO3JldHVybiBqfSxjb25jYXRTdHJpbmc6ZnVuY3Rpb24oYSxjLGIsZCl7aWYoYyE9IiIpe2M9dGhpcy5wcm9jZXNzU3RyaW5nKGMsYixkKTtpZighTWF0aEpheC5PYmplY3QuaXNBcnJheShjKSl7Yz1bY119YT1hLmNvbmNhdChjKX1yZXR1cm4gYX0sbG9va3VwUGhyYXNlOmZ1bmN0aW9uKGYsYSxkKXtpZighZCl7ZD0iXyJ9aWYoTWF0aEpheC5PYmplY3QuaXNBcnJheShmKSl7ZD0oZlswXXx8Il8iKTtmPShmWzFdfHwiIil9dmFyIGM9dGhpcy5sb2FkRG9tYWluKGQpO2lmKGMpe01hdGhKYXguSHViLlJlc3RhcnRBZnRlcihjKX12YXIgYj10aGlzLnN0cmluZ3NbdGhpcy5sb2NhbGVdO2lmKGIpe2lmKGIuZG9tYWlucyYmZCBpbiBiLmRvbWFpbnMpe3ZhciBlPWIuZG9tYWluc1tkXTtpZihlLnN0cmluZ3MmJmYgaW4gZS5zdHJpbmdzKXthPWUuc3RyaW5nc1tmXX19fXJldHVybiBhfSxsb2FkRmlsZTpmdW5jdGlvbihiLGQsZSl7ZT1NYXRoSmF4LkNhbGxiYWNrKGUpO2I9KGQuZmlsZXx8Yik7aWYoIWIubWF0Y2goL1wuanMkLykpe2IrPSIuanMifWlmKCFiLm1hdGNoKC9eKFthLXpdKzp8XFtNYXRoSmF4XF0pLykpe3ZhciBhPSh0aGlzLnN0cmluZ3NbdGhpcy5sb2NhbGVdLmRpcmVjdG9yeXx8dGhpcy5kaXJlY3RvcnkrIi8iK3RoaXMubG9jYWxlfHwiW01hdGhKYXhdL2xvY2FsaXphdGlvbi8iK3RoaXMubG9jYWxlKTtiPWErIi8iK2J9dmFyIGM9TWF0aEpheC5BamF4LlJlcXVpcmUoYixmdW5jdGlvbigpe2QuaXNMb2FkZWQ9dHJ1ZTtyZXR1cm4gZSgpfSk7cmV0dXJuKGMuY2FsbGVkP251bGw6Yyl9LGxvYWREb21haW46ZnVuY3Rpb24oYyxlKXt2YXIgYixhPXRoaXMuc3RyaW5nc1t0aGlzLmxvY2FsZV07aWYoYSl7aWYoIWEuaXNMb2FkZWQpe2I9dGhpcy5sb2FkRmlsZSh0aGlzLmxvY2FsZSxhKTtpZihiKXtyZXR1cm4gTWF0aEpheC5DYWxsYmFjay5RdWV1ZShiLFsibG9hZERvbWFpbiIsdGhpcyxjXSkuUHVzaChlfHx7fSl9fWlmKGEuZG9tYWlucyYmYyBpbiBhLmRvbWFpbnMpe3ZhciBkPWEuZG9tYWluc1tjXTtpZighZC5pc0xvYWRlZCl7Yj10aGlzLmxvYWRGaWxlKGMsZCk7aWYoYil7cmV0dXJuIE1hdGhKYXguQ2FsbGJhY2suUXVldWUoYikuUHVzaChlKX19fX1yZXR1cm4gTWF0aEpheC5DYWxsYmFjayhlKSgpfSxUcnk6ZnVuY3Rpb24oYSl7YT1NYXRoSmF4LkNhbGxiYWNrKGEpO2EuYXV0b1Jlc2V0PXRydWU7dHJ5e2EoKX1jYXRjaChiKXtpZighYi5yZXN0YXJ0KXt0aHJvdyBifU1hdGhKYXguQ2FsbGJhY2suQWZ0ZXIoWyJUcnkiLHRoaXMsYV0sYi5yZXN0YXJ0KX19LHJlc2V0TG9jYWxlOmZ1bmN0aW9uKGEpe2lmKCFhKXtyZXR1cm59YT1hLnRvTG93ZXJDYXNlKCk7d2hpbGUoIXRoaXMuc3RyaW5nc1thXSl7dmFyIGM9YS5sYXN0SW5kZXhPZigiLSIpO2lmKGM9PT0tMSl7cmV0dXJufWE9YS5zdWJzdHJpbmcoMCxjKX12YXIgYj10aGlzLnN0cmluZ3NbYV0ucmVtYXA7dGhpcy5sb2NhbGU9Yj9iOmE7TWF0aEpheC5DYWxsYmFjay5TaWduYWwoIkh1YiIpLlBvc3QoWyJMb2NhbGUgUmVzZXQiLHRoaXMubG9jYWxlXSl9LHNldExvY2FsZTpmdW5jdGlvbihhKXt0aGlzLnJlc2V0TG9jYWxlKGEpO2lmKE1hdGhKYXguTWVudSl7dGhpcy5sb2FkRG9tYWluKCJNYXRoTWVudSIpfX0sYWRkVHJhbnNsYXRpb246ZnVuY3Rpb24oYixlLGMpe3ZhciBkPXRoaXMuc3RyaW5nc1tiXSxhPWZhbHNlO2lmKCFkKXtkPXRoaXMuc3RyaW5nc1tiXT17fTthPXRydWV9aWYoIWQuZG9tYWlucyl7ZC5kb21haW5zPXt9fWlmKGUpe2lmKCFkLmRvbWFpbnNbZV0pe2QuZG9tYWluc1tlXT17fX1kPWQuZG9tYWluc1tlXX1NYXRoSmF4Lkh1Yi5JbnNlcnQoZCxjKTtpZihhJiZNYXRoSmF4Lk1lbnUubWVudSl7TWF0aEpheC5NZW51LkNyZWF0ZUxvY2FsZU1lbnUoKX19LHNldENTUzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnN0cmluZ3NbdGhpcy5sb2NhbGVdO2lmKGEpe2lmKGEuZm9udEZhbWlseSl7Yi5zdHlsZS5mb250RmFtaWx5PWEuZm9udEZhbWlseX1pZihhLmZvbnREaXJlY3Rpb24pe2Iuc3R5bGUuZGlyZWN0aW9uPWEuZm9udERpcmVjdGlvbjtpZihhLmZvbnREaXJlY3Rpb249PT0icnRsIil7Yi5zdHlsZS50ZXh0QWxpZ249InJpZ2h0In19fXJldHVybiBifSxmb250RmFtaWx5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zdHJpbmdzW3RoaXMubG9jYWxlXTtyZXR1cm4oYT9hLmZvbnRGYW1pbHk6bnVsbCl9LGZvbnREaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnN0cmluZ3NbdGhpcy5sb2NhbGVdO3JldHVybihhP2EuZm9udERpcmVjdGlvbjpudWxsKX0scGx1cmFsOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuc3RyaW5nc1t0aGlzLmxvY2FsZV07aWYoYSYmYS5wbHVyYWwpe3JldHVybiBhLnBsdXJhbChiKX1pZihiPT0xKXtyZXR1cm4gMX1yZXR1cm4gMn0sbnVtYmVyOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuc3RyaW5nc1t0aGlzLmxvY2FsZV07aWYoYSYmYS5udW1iZXIpe3JldHVybiBhLm51bWJlcihiKX1yZXR1cm4gYn19O01hdGhKYXguTWVzc2FnZT17cmVhZHk6ZmFsc2UsbG9nOlt7fV0sY3VycmVudDpudWxsLHRleHROb2RlQnVnOihuYXZpZ2F0b3IudmVuZG9yPT09IkFwcGxlIENvbXB1dGVyLCBJbmMuIiYmdHlwZW9mIG5hdmlnYXRvci52ZW5kb3JTdWI9PT0idW5kZWZpbmVkIil8fCh3aW5kb3cuaGFzT3duUHJvcGVydHkmJndpbmRvdy5oYXNPd25Qcm9wZXJ0eSgia29ucXVlcm9yIikpLHN0eWxlczp7IiNNYXRoSmF4X01lc3NhZ2UiOntwb3NpdGlvbjoiZml4ZWQiLGxlZnQ6IjFweCIsYm90dG9tOiIycHgiLCJiYWNrZ3JvdW5kLWNvbG9yIjoiI0U2RTZFNiIsYm9yZGVyOiIxcHggc29saWQgIzk1OTU5NSIsbWFyZ2luOiIwcHgiLHBhZGRpbmc6IjJweCA4cHgiLCJ6LWluZGV4IjoiMTAyIixjb2xvcjoiYmxhY2siLCJmb250LXNpemUiOiI4MCUiLHdpZHRoOiJhdXRvIiwid2hpdGUtc3BhY2UiOiJub3dyYXAifSwiI01hdGhKYXhfTVNJRV9GcmFtZSI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHdpZHRoOiIwcHgiLCJ6LWluZGV4IjoxMDEsYm9yZGVyOiIwcHgiLG1hcmdpbjoiMHB4IixwYWRkaW5nOiIwcHgifX0sYnJvd3NlcnM6e01TSUU6ZnVuY3Rpb24oYSl7TWF0aEpheC5NZXNzYWdlLm1zaWVGaXhlZFBvc2l0aW9uQnVnPSgoZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHwwKTw3KTtpZihNYXRoSmF4Lk1lc3NhZ2UubXNpZUZpeGVkUG9zaXRpb25CdWcpe01hdGhKYXguSHViLmNvbmZpZy5zdHlsZXNbIiNNYXRoSmF4X01lc3NhZ2UiXS5wb3NpdGlvbj0iYWJzb2x1dGUifU1hdGhKYXguTWVzc2FnZS5xdWlya3M9KGRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQmFja0NvbXBhdCIpfSxDaHJvbWU6ZnVuY3Rpb24oYSl7TWF0aEpheC5IdWIuY29uZmlnLnN0eWxlc1siI01hdGhKYXhfTWVzc2FnZSJdLmJvdHRvbT0iMS41ZW0iO01hdGhKYXguSHViLmNvbmZpZy5zdHlsZXNbIiNNYXRoSmF4X01lc3NhZ2UiXS5sZWZ0PSIxZW0ifX0sSW5pdDpmdW5jdGlvbihhKXtpZihhKXt0aGlzLnJlYWR5PXRydWV9aWYoIWRvY3VtZW50LmJvZHl8fCF0aGlzLnJlYWR5KXtyZXR1cm4gZmFsc2V9aWYodGhpcy5kaXYmJnRoaXMuZGl2LnBhcmVudE5vZGU9PW51bGwpe3RoaXMuZGl2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNYXRoSmF4X01lc3NhZ2UiKTt0aGlzLnRleHQ9KHRoaXMuZGl2P3RoaXMuZGl2LmZpcnN0Q2hpbGQ6bnVsbCl9aWYoIXRoaXMuZGl2KXt2YXIgYj1kb2N1bWVudC5ib2R5O2lmKHRoaXMubXNpZUZpeGVkUG9zaXRpb25CdWcmJndpbmRvdy5hdHRhY2hFdmVudCl7Yj10aGlzLmZyYW1lPXRoaXMuYWRkRGl2KGRvY3VtZW50LmJvZHkpO2IucmVtb3ZlQXR0cmlidXRlKCJpZCIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLmJvcmRlcj1iLnN0eWxlLm1hcmdpbj1iLnN0eWxlLnBhZGRpbmc9IjBweCI7Yi5zdHlsZS56SW5kZXg9IjEwMSI7Yi5zdHlsZS5oZWlnaHQ9IjBweCI7Yj10aGlzLmFkZERpdihiKTtiLmlkPSJNYXRoSmF4X01TSUVfRnJhbWUiO3dpbmRvdy5hdHRhY2hFdmVudCgib25zY3JvbGwiLHRoaXMuTW92ZUZyYW1lKTt3aW5kb3cuYXR0YWNoRXZlbnQoIm9ucmVzaXplIix0aGlzLk1vdmVGcmFtZSk7dGhpcy5Nb3ZlRnJhbWUoKX10aGlzLmRpdj10aGlzLmFkZERpdihiKTt0aGlzLmRpdi5zdHlsZS5kaXNwbGF5PSJub25lIn1pZighdGhpcy50ZXh0KXt0aGlzLnRleHQ9dGhpcy5kaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpKX1yZXR1cm4gdHJ1ZX0sYWRkRGl2OmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9Ik1hdGhKYXhfTWVzc2FnZSI7aWYoYS5maXJzdENoaWxkKXthLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCl9ZWxzZXthLmFwcGVuZENoaWxkKGIpfXJldHVybiBifSxNb3ZlRnJhbWU6ZnVuY3Rpb24oKXt2YXIgYT0oTWF0aEpheC5NZXNzYWdlLnF1aXJrcz9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7dmFyIGI9TWF0aEpheC5NZXNzYWdlLmZyYW1lO2Iuc3R5bGUubGVmdD1hLnNjcm9sbExlZnQrInB4IjtiLnN0eWxlLnRvcD1hLnNjcm9sbFRvcCsicHgiO2Iuc3R5bGUud2lkdGg9YS5jbGllbnRXaWR0aCsicHgiO2I9Yi5maXJzdENoaWxkO2Iuc3R5bGUuaGVpZ2h0PWEuY2xpZW50SGVpZ2h0KyJweCJ9LGxvY2FsaXplOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoSmF4LkxvY2FsaXphdGlvbi5fKGEsYSl9LGZpbHRlclRleHQ6ZnVuY3Rpb24oYSxjLGIpe2lmKE1hdGhKYXguSHViLmNvbmZpZy5tZXNzYWdlU3R5bGU9PT0ic2ltcGxlIil7aWYoYj09PSJMb2FkRmlsZSIpe2lmKCF0aGlzLmxvYWRpbmcpe3RoaXMubG9hZGluZz10aGlzLmxvY2FsaXplKCJMb2FkaW5nIikrIiAifWE9dGhpcy5sb2FkaW5nO3RoaXMubG9hZGluZys9Ii4ifWVsc2V7aWYoYj09PSJQcm9jZXNzTWF0aCIpe2lmKCF0aGlzLnByb2Nlc3Npbmcpe3RoaXMucHJvY2Vzc2luZz10aGlzLmxvY2FsaXplKCJQcm9jZXNzaW5nIikrIiAifWE9dGhpcy5wcm9jZXNzaW5nO3RoaXMucHJvY2Vzc2luZys9Ii4ifWVsc2V7aWYoYj09PSJUeXBlc2V0TWF0aCIpe2lmKCF0aGlzLnR5cGVzZXR0aW5nKXt0aGlzLnR5cGVzZXR0aW5nPXRoaXMubG9jYWxpemUoIlR5cGVzZXR0aW5nIikrIiAifWE9dGhpcy50eXBlc2V0dGluZzt0aGlzLnR5cGVzZXR0aW5nKz0iLiJ9fX19cmV0dXJuIGF9LGNsZWFyQ291bnRzOmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMubG9hZGluZztkZWxldGUgdGhpcy5wcm9jZXNzaW5nO2RlbGV0ZSB0aGlzLnR5cGVzZXR0aW5nfSxTZXQ6ZnVuY3Rpb24oYyxlLGIpe2lmKGU9PW51bGwpe2U9dGhpcy5sb2cubGVuZ3RoO3RoaXMubG9nW2VdPXt9fXZhciBkPSIiO2lmKE1hdGhKYXguT2JqZWN0LmlzQXJyYXkoYykpe2Q9Y1swXTtpZihNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGQpKXtkPWRbMV19dHJ5e2M9TWF0aEpheC5Mb2NhbGl6YXRpb24uXy5hcHBseShNYXRoSmF4LkxvY2FsaXphdGlvbixjKX1jYXRjaChhKXtpZighYS5yZXN0YXJ0KXt0aHJvdyBhfWlmKCFhLnJlc3RhcnQuY2FsbGVkKXtpZih0aGlzLmxvZ1tlXS5yZXN0YXJ0ZWQ9PW51bGwpe3RoaXMubG9nW2VdLnJlc3RhcnRlZD0wfXRoaXMubG9nW2VdLnJlc3RhcnRlZCsrO2RlbGV0ZSB0aGlzLmxvZ1tlXS5jbGVhcmVkO01hdGhKYXguQ2FsbGJhY2suQWZ0ZXIoWyJTZXQiLHRoaXMsYyxlLGJdLGEucmVzdGFydCk7cmV0dXJuIGV9fX1pZih0aGlzLnRpbWVyKXtjbGVhclRpbWVvdXQodGhpcy50aW1lcik7ZGVsZXRlIHRoaXMudGltZXJ9dGhpcy5sb2dbZV0udGV4dD1jO3RoaXMubG9nW2VdLmZpbHRlcmVkVGV4dD1jPXRoaXMuZmlsdGVyVGV4dChjLGUsZCk7aWYodHlwZW9mKHRoaXMubG9nW2VdLm5leHQpPT09InVuZGVmaW5lZCIpe3RoaXMubG9nW2VdLm5leHQ9dGhpcy5jdXJyZW50O2lmKHRoaXMuY3VycmVudCE9bnVsbCl7dGhpcy5sb2dbdGhpcy5jdXJyZW50XS5wcmV2PWV9dGhpcy5jdXJyZW50PWV9aWYodGhpcy5jdXJyZW50PT09ZSYmTWF0aEpheC5IdWIuY29uZmlnLm1lc3NhZ2VTdHlsZSE9PSJub25lIil7aWYodGhpcy5Jbml0KCkpe2lmKHRoaXMudGV4dE5vZGVCdWcpe3RoaXMuZGl2LmlubmVySFRNTD1jfWVsc2V7dGhpcy50ZXh0Lm5vZGVWYWx1ZT1jfXRoaXMuZGl2LnN0eWxlLmRpc3BsYXk9IiI7aWYodGhpcy5zdGF0dXMpe3dpbmRvdy5zdGF0dXM9IiI7ZGVsZXRlIHRoaXMuc3RhdHVzfX1lbHNle3dpbmRvdy5zdGF0dXM9Yzt0aGlzLnN0YXR1cz10cnVlfX1pZih0aGlzLmxvZ1tlXS5yZXN0YXJ0ZWQpe2lmKHRoaXMubG9nW2VdLmNsZWFyZWQpe2I9MH1pZigtLXRoaXMubG9nW2VdLnJlc3RhcnRlZD09PTApe2RlbGV0ZSB0aGlzLmxvZ1tlXS5jbGVhcmVkfX1pZihiKXtzZXRUaW1lb3V0KE1hdGhKYXguQ2FsbGJhY2soWyJDbGVhciIsdGhpcyxlXSksYil9ZWxzZXtpZihiPT0wKXt0aGlzLkNsZWFyKGUsMCl9fXJldHVybiBlfSxDbGVhcjpmdW5jdGlvbihiLGEpe2lmKHRoaXMubG9nW2JdLnByZXYhPW51bGwpe3RoaXMubG9nW3RoaXMubG9nW2JdLnByZXZdLm5leHQ9dGhpcy5sb2dbYl0ubmV4dH1pZih0aGlzLmxvZ1tiXS5uZXh0IT1udWxsKXt0aGlzLmxvZ1t0aGlzLmxvZ1tiXS5uZXh0XS5wcmV2PXRoaXMubG9nW2JdLnByZXZ9aWYodGhpcy5jdXJyZW50PT09Yil7dGhpcy5jdXJyZW50PXRoaXMubG9nW2JdLm5leHQ7aWYodGhpcy50ZXh0KXtpZih0aGlzLmRpdi5wYXJlbnROb2RlPT1udWxsKXt0aGlzLkluaXQoKX1pZih0aGlzLmN1cnJlbnQ9PW51bGwpe2lmKHRoaXMudGltZXIpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtkZWxldGUgdGhpcy50aW1lcn1pZihhPT1udWxsKXthPTYwMH1pZihhPT09MCl7dGhpcy5SZW1vdmUoKX1lbHNle3RoaXMudGltZXI9c2V0VGltZW91dChNYXRoSmF4LkNhbGxiYWNrKFsiUmVtb3ZlIix0aGlzXSksYSl9fWVsc2V7aWYoTWF0aEpheC5IdWIuY29uZmlnLm1lc3NhZ2VTdHlsZSE9PSJub25lIil7aWYodGhpcy50ZXh0Tm9kZUJ1Zyl7dGhpcy5kaXYuaW5uZXJIVE1MPXRoaXMubG9nW3RoaXMuY3VycmVudF0uZmlsdGVyZWRUZXh0fWVsc2V7dGhpcy50ZXh0Lm5vZGVWYWx1ZT10aGlzLmxvZ1t0aGlzLmN1cnJlbnRdLmZpbHRlcmVkVGV4dH19fWlmKHRoaXMuc3RhdHVzKXt3aW5kb3cuc3RhdHVzPSIiO2RlbGV0ZSB0aGlzLnN0YXR1c319ZWxzZXtpZih0aGlzLnN0YXR1cyl7d2luZG93LnN0YXR1cz0odGhpcy5jdXJyZW50PT1udWxsPyIiOnRoaXMubG9nW3RoaXMuY3VycmVudF0udGV4dCl9fX1kZWxldGUgdGhpcy5sb2dbYl0ubmV4dDtkZWxldGUgdGhpcy5sb2dbYl0ucHJldjtkZWxldGUgdGhpcy5sb2dbYl0uZmlsdGVyZWRUZXh0O2lmKHRoaXMubG9nW2JdLnJlc3RhcnRlZCl7dGhpcy5sb2dbYl0uY2xlYXJlZD10cnVlfX0sUmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy50ZXh0Lm5vZGVWYWx1ZT0iIjt0aGlzLmRpdi5zdHlsZS5kaXNwbGF5PSJub25lIn0sRmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TZXQoWyJMb2FkRmlsZSIsIkxvYWRpbmcgJTEiLGFdLG51bGwsbnVsbCl9LExvZzpmdW5jdGlvbigpe3ZhciBiPVtdO2Zvcih2YXIgYz0xLGE9dGhpcy5sb2cubGVuZ3RoO2M8YTtjKyspe2JbY109dGhpcy5sb2dbY10udGV4dH1yZXR1cm4gYi5qb2luKCJcbiIpfX07TWF0aEpheC5IdWI9e2NvbmZpZzp7cm9vdDoiIixjb25maWc6W10sc3R5bGVTaGVldHM6W10sc3R5bGVzOnsiLk1hdGhKYXhfUHJldmlldyI6e2NvbG9yOiIjODg4In19LGpheDpbXSxleHRlbnNpb25zOltdLHByZUpheDpudWxsLHBvc3RKYXg6bnVsbCxkaXNwbGF5QWxpZ246ImNlbnRlciIsZGlzcGxheUluZGVudDoiMCIscHJlUmVtb3ZlQ2xhc3M6Ik1hdGhKYXhfUHJldmlldyIsc2hvd1Byb2Nlc3NpbmdNZXNzYWdlczp0cnVlLG1lc3NhZ2VTdHlsZToibm9ybWFsIixkZWxheVN0YXJ0dXBVbnRpbDoibm9uZSIsc2tpcFN0YXJ0dXBUeXBlc2V0OmZhbHNlLGVsZW1lbnRzOltdLHBvc2l0aW9uVG9IYXNoOnRydWUsc2hvd01hdGhNZW51OnRydWUsc2hvd01hdGhNZW51TVNJRTp0cnVlLG1lbnVTZXR0aW5nczp7em9vbToiTm9uZSIsQ1RSTDpmYWxzZSxBTFQ6ZmFsc2UsQ01EOmZhbHNlLFNoaWZ0OmZhbHNlLGRpc2NvdmVyYWJsZTpmYWxzZSx6c2NhbGU6IjIwMCUiLHJlbmRlcmVyOm51bGwsZm9udDoiQXV0byIsY29udGV4dDoiTWF0aEpheCIsbG9jYWxlOm51bGwsbXBDb250ZXh0OmZhbHNlLG1wTW91c2U6ZmFsc2UsdGV4SGludHM6dHJ1ZSxGYXN0UHJldmlldzpudWxsLGFzc2lzdGl2ZU1NTDpudWxsLGluVGFiT3JkZXI6dHJ1ZSxzZW1hbnRpY3M6ZmFsc2V9LGVycm9yU2V0dGluZ3M6e21lc3NhZ2U6WyJbIixbIk1hdGhQcm9jZXNzaW5nRXJyb3IiLCJNYXRoIFByb2Nlc3NpbmcgRXJyb3IiXSwiXSJdLHN0eWxlOntjb2xvcjoiI0NDMDAwMCIsImZvbnQtc3R5bGUiOiJpdGFsaWMifX0saWdub3JlTU1MYXR0cmlidXRlczp7fX0scHJlUHJvY2Vzc29yczpNYXRoSmF4LkNhbGxiYWNrLkhvb2tzKHRydWUpLGlucHV0SmF4Ont9LG91dHB1dEpheDp7b3JkZXI6e319LHByb2Nlc3NTZWN0aW9uRGVsYXk6NTAscHJvY2Vzc1VwZGF0ZVRpbWU6MjUwLHByb2Nlc3NVcGRhdGVEZWxheToxMCxzaWduYWw6TWF0aEpheC5DYWxsYmFjay5TaWduYWwoIkh1YiIpLENvbmZpZzpmdW5jdGlvbihhKXt0aGlzLkluc2VydCh0aGlzLmNvbmZpZyxhKTtpZih0aGlzLmNvbmZpZy5BdWdtZW50KXt0aGlzLkF1Z21lbnQodGhpcy5jb25maWcuQXVnbWVudCl9fSxDb21iaW5lQ29uZmlnOmZ1bmN0aW9uKGMsZil7dmFyIGI9dGhpcy5jb25maWcsZyxlO2M9Yy5zcGxpdCgvXC4vKTtmb3IodmFyIGQ9MCxhPWMubGVuZ3RoO2Q8YTtkKyspe2c9Y1tkXTtpZighYltnXSl7YltnXT17fX1lPWI7Yj1iW2ddfWVbZ109Yj10aGlzLkluc2VydChmLGIpO3JldHVybiBifSxSZWdpc3Rlcjp7UHJlUHJvY2Vzc29yOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGhKYXguSHViLnByZVByb2Nlc3NvcnMuQWRkLmFwcGx5KE1hdGhKYXguSHViLnByZVByb2Nlc3NvcnMsYXJndW1lbnRzKX0sTWVzc2FnZUhvb2s6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aEpheC5IdWIuc2lnbmFsLk1lc3NhZ2VIb29rLmFwcGx5KE1hdGhKYXguSHViLnNpZ25hbCxhcmd1bWVudHMpfSxTdGFydHVwSG9vazpmdW5jdGlvbigpe3JldHVybiBNYXRoSmF4Lkh1Yi5TdGFydHVwLnNpZ25hbC5NZXNzYWdlSG9vay5hcHBseShNYXRoSmF4Lkh1Yi5TdGFydHVwLnNpZ25hbCxhcmd1bWVudHMpfSxMb2FkSG9vazpmdW5jdGlvbigpe3JldHVybiBNYXRoSmF4LkFqYXguTG9hZEhvb2suYXBwbHkoTWF0aEpheC5BamF4LGFyZ3VtZW50cyl9fSxVblJlZ2lzdGVyOntQcmVQcm9jZXNzb3I6ZnVuY3Rpb24oYSl7TWF0aEpheC5IdWIucHJlUHJvY2Vzc29ycy5SZW1vdmUoYSl9LE1lc3NhZ2VIb29rOmZ1bmN0aW9uKGEpe01hdGhKYXguSHViLnNpZ25hbC5SZW1vdmVIb29rKGEpfSxTdGFydHVwSG9vazpmdW5jdGlvbihhKXtNYXRoSmF4Lkh1Yi5TdGFydHVwLnNpZ25hbC5SZW1vdmVIb29rKGEpfSxMb2FkSG9vazpmdW5jdGlvbihhKXtNYXRoSmF4LkFqYXgucmVtb3ZlSG9vayhhKX19LGdldEFsbEpheDpmdW5jdGlvbihlKXt2YXIgYz1bXSxiPXRoaXMuZWxlbWVudFNjcmlwdHMoZSk7Zm9yKHZhciBkPTAsYT1iLmxlbmd0aDtkPGE7ZCsrKXtpZihiW2RdLk1hdGhKYXgmJmJbZF0uTWF0aEpheC5lbGVtZW50SmF4KXtjLnB1c2goYltkXS5NYXRoSmF4LmVsZW1lbnRKYXgpfX1yZXR1cm4gY30sZ2V0SmF4QnlUeXBlOmZ1bmN0aW9uKGYsZSl7dmFyIGM9W10sYj10aGlzLmVsZW1lbnRTY3JpcHRzKGUpO2Zvcih2YXIgZD0wLGE9Yi5sZW5ndGg7ZDxhO2QrKyl7aWYoYltkXS5NYXRoSmF4JiZiW2RdLk1hdGhKYXguZWxlbWVudEpheCYmYltkXS5NYXRoSmF4LmVsZW1lbnRKYXgubWltZVR5cGU9PT1mKXtjLnB1c2goYltkXS5NYXRoSmF4LmVsZW1lbnRKYXgpfX1yZXR1cm4gY30sZ2V0SmF4QnlJbnB1dFR5cGU6ZnVuY3Rpb24oZixlKXt2YXIgYz1bXSxiPXRoaXMuZWxlbWVudFNjcmlwdHMoZSk7Zm9yKHZhciBkPTAsYT1iLmxlbmd0aDtkPGE7ZCsrKXtpZihiW2RdLk1hdGhKYXgmJmJbZF0uTWF0aEpheC5lbGVtZW50SmF4JiZiW2RdLnR5cGUmJmJbZF0udHlwZS5yZXBsYWNlKC8gKjsoLnxccykqLywiIik9PT1mKXtjLnB1c2goYltkXS5NYXRoSmF4LmVsZW1lbnRKYXgpfX1yZXR1cm4gY30sZ2V0SmF4Rm9yOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZihhKT09PSJzdHJpbmciKXthPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpfWlmKGEmJmEuTWF0aEpheCl7cmV0dXJuIGEuTWF0aEpheC5lbGVtZW50SmF4fWlmKHRoaXMuaXNNYXRoSmF4Tm9kZShhKSl7aWYoIWEuaXNNYXRoSmF4KXthPWEuZmlyc3RDaGlsZH13aGlsZShhJiYhYS5qYXhJRCl7YT1hLnBhcmVudE5vZGV9aWYoYSl7cmV0dXJuIE1hdGhKYXguT3V0cHV0SmF4W2EuamF4SURdLmdldEpheEZyb21NYXRoKGEpfX1yZXR1cm4gbnVsbH0saXNKYXg6ZnVuY3Rpb24oYSl7aWYodHlwZW9mKGEpPT09InN0cmluZyIpe2E9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSl9aWYodGhpcy5pc01hdGhKYXhOb2RlKGEpKXtyZXR1cm4gMX1pZihhJiYoYS50YWdOYW1lfHwiIikudG9Mb3dlckNhc2UoKT09PSJzY3JpcHQiKXtpZihhLk1hdGhKYXgpe3JldHVybihhLk1hdGhKYXguc3RhdGU9PT1NYXRoSmF4LkVsZW1lbnRKYXguU1RBVEUuUFJPQ0VTU0VEPzE6LTEpfWlmKGEudHlwZSYmdGhpcy5pbnB1dEpheFthLnR5cGUucmVwbGFjZSgvICo7KC58XHMpKi8sIiIpXSl7cmV0dXJuIC0xfX1yZXR1cm4gMH0saXNNYXRoSmF4Tm9kZTpmdW5jdGlvbihhKXtyZXR1cm4gISFhJiYoYS5pc01hdGhKYXh8fChhLmNsYXNzTmFtZXx8IiIpPT09Ik1hdGhKYXhfTWF0aE1MIil9LHNldFJlbmRlcmVyOmZ1bmN0aW9uKGQsYyl7aWYoIWQpe3JldHVybn12YXIgZT1NYXRoSmF4Lk91dHB1dEpheFtkXTtpZighZSl7TWF0aEpheC5PdXRwdXRKYXhbZF09TWF0aEpheC5PdXRwdXRKYXgoe2lkOiJ1bmtub3duIix2ZXJzaW9uOiIxLjAuMCIsaXNVbmtub3duOnRydWV9KTt0aGlzLmNvbmZpZy5tZW51U2V0dGluZ3MucmVuZGVyZXI9IiI7dmFyIGI9IltNYXRoSmF4XS9qYXgvb3V0cHV0LyIrZCsiL2NvbmZpZy5qcyI7cmV0dXJuIE1hdGhKYXguQWpheC5SZXF1aXJlKGIsWyJzZXRSZW5kZXJlciIsdGhpcyxkLGNdKX1lbHNle3RoaXMuY29uZmlnLm1lbnVTZXR0aW5ncy5yZW5kZXJlcj1kO2lmKGM9PW51bGwpe2M9ImpheC9tbWwifWlmKGUuaXNVbmtub3duKXtlLlJlZ2lzdGVyKGMpfXZhciBhPXRoaXMub3V0cHV0SmF4O2lmKGFbY10mJmFbY10ubGVuZ3RoKXtpZihkIT09YVtjXVswXS5pZCl7YVtjXS51bnNoaWZ0KGUpO3JldHVybiB0aGlzLnNpZ25hbC5Qb3N0KFsiUmVuZGVyZXIgU2VsZWN0ZWQiLGRdKX19cmV0dXJuIG51bGx9fSxRdWV1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXVlLlB1c2guYXBwbHkodGhpcy5xdWV1ZSxhcmd1bWVudHMpfSxUeXBlc2V0OmZ1bmN0aW9uKGMsZCl7aWYoIU1hdGhKYXguaXNSZWFkeSl7cmV0dXJuIG51bGx9dmFyIGI9dGhpcy5lbGVtZW50Q2FsbGJhY2soYyxkKTtpZihiLmNvdW50KXt2YXIgYT1NYXRoSmF4LkNhbGxiYWNrLlF1ZXVlKFsiUHJlUHJvY2VzcyIsdGhpcyxiLmVsZW1lbnRzXSxbIlByb2Nlc3MiLHRoaXMsYi5lbGVtZW50c10pfXJldHVybiBhLlB1c2goYi5jYWxsYmFjayl9LFByZVByb2Nlc3M6ZnVuY3Rpb24oZSxnKXt2YXIgYz10aGlzLmVsZW1lbnRDYWxsYmFjayhlLGcpO3ZhciBiPU1hdGhKYXguQ2FsbGJhY2suUXVldWUoKTtpZihjLmNvdW50KXt2YXIgZj0oYy5jb3VudD09PTE/W2MuZWxlbWVudHNdOmMuZWxlbWVudHMpO2IuUHVzaChbIlBvc3QiLHRoaXMuc2lnbmFsLFsiQmVnaW4gUHJlUHJvY2VzcyIsYy5lbGVtZW50c11dKTtmb3IodmFyIGQ9MCxhPWYubGVuZ3RoO2Q8YTtkKyspe2lmKGZbZF0pe2IuUHVzaChbIkV4ZWN1dGUiLHRoaXMucHJlUHJvY2Vzc29ycyxmW2RdXSl9fWIuUHVzaChbIlBvc3QiLHRoaXMuc2lnbmFsLFsiRW5kIFByZVByb2Nlc3MiLGMuZWxlbWVudHNdXSl9cmV0dXJuIGIuUHVzaChjLmNhbGxiYWNrKX0sUHJvY2VzczpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRha2VBY3Rpb24oIlByb2Nlc3MiLGEsYil9LFVwZGF0ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRha2VBY3Rpb24oIlVwZGF0ZSIsYSxiKX0sUmVwcm9jZXNzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMudGFrZUFjdGlvbigiUmVwcm9jZXNzIixhLGIpfSxSZXJlbmRlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRha2VBY3Rpb24oIlJlcmVuZGVyIixhLGIpfSx0YWtlQWN0aW9uOmZ1bmN0aW9uKGcsZCxoKXt2YXIgYz10aGlzLmVsZW1lbnRDYWxsYmFjayhkLGgpO3ZhciBmPWMuZWxlbWVudHM7dmFyIGE9TWF0aEpheC5DYWxsYmFjay5RdWV1ZShbIkNsZWFyIix0aGlzLnNpZ25hbF0pO3ZhciBlPXtzY3JpcHRzOltdLHN0YXJ0Om5ldyBEYXRlKCkuZ2V0VGltZSgpLGk6MCxqOjAsamF4Ont9LGpheElEczpbXX07aWYoYy5jb3VudCl7dmFyIGI9WyJEZWxheSIsTWF0aEpheC5DYWxsYmFjayx0aGlzLnByb2Nlc3NTZWN0aW9uRGVsYXldO2lmKCFiWzJdKXtiPXt9fWEuUHVzaChbImNsZWFyQ291bnRzIixNYXRoSmF4Lk1lc3NhZ2VdLFsiUG9zdCIsdGhpcy5zaWduYWwsWyJCZWdpbiAiK2csZl1dLFsiUG9zdCIsdGhpcy5zaWduYWwsWyJCZWdpbiBNYXRoIixmLGddXSxbInByZXBhcmVTY3JpcHRzIix0aGlzLGcsZixlXSxbIlBvc3QiLHRoaXMuc2lnbmFsLFsiQmVnaW4gTWF0aCBJbnB1dCIsZixnXV0sWyJwcm9jZXNzSW5wdXQiLHRoaXMsZV0sWyJQb3N0Iix0aGlzLnNpZ25hbCxbIkVuZCBNYXRoIElucHV0IixmLGddXSxiLFsicHJlcGFyZU91dHB1dCIsdGhpcyxlLCJwcmVQcm9jZXNzIl0sYixbIlBvc3QiLHRoaXMuc2lnbmFsLFsiQmVnaW4gTWF0aCBPdXRwdXQiLGYsZ11dLFsicHJvY2Vzc091dHB1dCIsdGhpcyxlXSxbIlBvc3QiLHRoaXMuc2lnbmFsLFsiRW5kIE1hdGggT3V0cHV0IixmLGddXSxiLFsicHJlcGFyZU91dHB1dCIsdGhpcyxlLCJwb3N0UHJvY2VzcyJdLGIsWyJQb3N0Iix0aGlzLnNpZ25hbCxbIkVuZCBNYXRoIixmLGddXSxbIlBvc3QiLHRoaXMuc2lnbmFsLFsiRW5kICIrZyxmXV0sWyJjbGVhckNvdW50cyIsTWF0aEpheC5NZXNzYWdlXSl9cmV0dXJuIGEuUHVzaChjLmNhbGxiYWNrKX0sc2NyaXB0QWN0aW9uOntQcm9jZXNzOmZ1bmN0aW9uKGEpe30sVXBkYXRlOmZ1bmN0aW9uKGIpe3ZhciBhPWIuTWF0aEpheC5lbGVtZW50SmF4O2lmKGEmJmEubmVlZHNVcGRhdGUoKSl7YS5SZW1vdmUodHJ1ZSk7Yi5NYXRoSmF4LnN0YXRlPWEuU1RBVEUuVVBEQVRFfWVsc2V7Yi5NYXRoSmF4LnN0YXRlPWEuU1RBVEUuUFJPQ0VTU0VEfX0sUmVwcm9jZXNzOmZ1bmN0aW9uKGIpe3ZhciBhPWIuTWF0aEpheC5lbGVtZW50SmF4O2lmKGEpe2EuUmVtb3ZlKHRydWUpO2IuTWF0aEpheC5zdGF0ZT1hLlNUQVRFLlVQREFURX19LFJlcmVuZGVyOmZ1bmN0aW9uKGIpe3ZhciBhPWIuTWF0aEpheC5lbGVtZW50SmF4O2lmKGEpe2EuUmVtb3ZlKHRydWUpO2IuTWF0aEpheC5zdGF0ZT1hLlNUQVRFLk9VVFBVVH19fSxwcmVwYXJlU2NyaXB0czpmdW5jdGlvbihoLGUsZyl7aWYoYXJndW1lbnRzLmNhbGxlZS5kaXNhYmxlZCl7cmV0dXJufXZhciBiPXRoaXMuZWxlbWVudFNjcmlwdHMoZSk7dmFyIGY9TWF0aEpheC5FbGVtZW50SmF4LlNUQVRFO2Zvcih2YXIgZD0wLGE9Yi5sZW5ndGg7ZDxhO2QrKyl7dmFyIGM9YltkXTtpZihjLnR5cGUmJnRoaXMuaW5wdXRKYXhbYy50eXBlLnJlcGxhY2UoLyAqOygufFxuKSovLCIiKV0pe2lmKGMuTWF0aEpheCl7aWYoYy5NYXRoSmF4LmVsZW1lbnRKYXgmJmMuTWF0aEpheC5lbGVtZW50SmF4LmhvdmVyKXtNYXRoSmF4LkV4dGVuc2lvbi5NYXRoRXZlbnRzLkhvdmVyLkNsZWFySG92ZXIoYy5NYXRoSmF4LmVsZW1lbnRKYXgpfWlmKGMuTWF0aEpheC5zdGF0ZSE9PWYuUEVORElORyl7dGhpcy5zY3JpcHRBY3Rpb25baF0oYyl9fWlmKCFjLk1hdGhKYXgpe2MuTWF0aEpheD17c3RhdGU6Zi5QRU5ESU5HfX1pZihjLk1hdGhKYXguZXJyb3Ipe2RlbGV0ZSBjLk1hdGhKYXguZXJyb3J9aWYoYy5NYXRoSmF4LnN0YXRlIT09Zi5QUk9DRVNTRUQpe2cuc2NyaXB0cy5wdXNoKGMpfX19fSxjaGVja1NjcmlwdFNpYmxpbmdzOmZ1bmN0aW9uKGEpe2lmKGEuTWF0aEpheC5jaGVja2VkKXtyZXR1cm59dmFyIGI9dGhpcy5jb25maWcsZj1hLnByZXZpb3VzU2libGluZztpZihmJiZmLm5vZGVOYW1lPT09IiN0ZXh0Iil7dmFyIGQsZSxjPWEubmV4dFNpYmxpbmc7aWYoYyYmYy5ub2RlTmFtZSE9PSIjdGV4dCIpe2M9bnVsbH1pZihiLnByZUpheCl7aWYodHlwZW9mKGIucHJlSmF4KT09PSJzdHJpbmciKXtiLnByZUpheD1uZXcgUmVnRXhwKGIucHJlSmF4KyIkIil9ZD1mLm5vZGVWYWx1ZS5tYXRjaChiLnByZUpheCl9aWYoYi5wb3N0SmF4JiZjKXtpZih0eXBlb2YoYi5wb3N0SmF4KT09PSJzdHJpbmciKXtiLnBvc3RKYXg9bmV3IFJlZ0V4cCgiXiIrYi5wb3N0SmF4KX1lPWMubm9kZVZhbHVlLm1hdGNoKGIucG9zdEpheCl9aWYoZCYmKCFiLnBvc3RKYXh8fGUpKXtmLm5vZGVWYWx1ZT1mLm5vZGVWYWx1ZS5yZXBsYWNlKGIucHJlSmF4LChkLmxlbmd0aD4xP2RbMV06IiIpKTtmPW51bGx9aWYoZSYmKCFiLnByZUpheHx8ZCkpe2Mubm9kZVZhbHVlPWMubm9kZVZhbHVlLnJlcGxhY2UoYi5wb3N0SmF4LChlLmxlbmd0aD4xP2VbMV06IiIpKX1pZihmJiYhZi5ub2RlVmFsdWUubWF0Y2goL1xTLykpe2Y9Zi5wcmV2aW91c1NpYmxpbmd9fWlmKGIucHJlUmVtb3ZlQ2xhc3MmJmYmJmYuY2xhc3NOYW1lPT09Yi5wcmVSZW1vdmVDbGFzcyl7YS5NYXRoSmF4LnByZXZpZXc9Zn1hLk1hdGhKYXguY2hlY2tlZD0xfSxwcm9jZXNzSW5wdXQ6ZnVuY3Rpb24oYSl7dmFyIGIsaT1NYXRoSmF4LkVsZW1lbnRKYXguU1RBVEU7dmFyIGgsZSxkPWEuc2NyaXB0cy5sZW5ndGg7dHJ5e3doaWxlKGEuaTxkKXtoPWEuc2NyaXB0c1thLmldO2lmKCFoKXthLmkrKztjb250aW51ZX1lPWgucHJldmlvdXNTaWJsaW5nO2lmKGUmJmUuY2xhc3NOYW1lPT09Ik1hdGhKYXhfRXJyb3IiKXtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9aWYoIWgucGFyZW50Tm9kZXx8IWguTWF0aEpheHx8aC5NYXRoSmF4LnN0YXRlPT09aS5QUk9DRVNTRUQpe2EuaSsrO2NvbnRpbnVlfWlmKCFoLk1hdGhKYXguZWxlbWVudEpheHx8aC5NYXRoSmF4LnN0YXRlPT09aS5VUERBVEUpe3RoaXMuY2hlY2tTY3JpcHRTaWJsaW5ncyhoKTt2YXIgZz1oLnR5cGUucmVwbGFjZSgvICo7KC58XHMpKi8sIiIpO3ZhciBqPXRoaXMuaW5wdXRKYXhbZ107Yj1qLlByb2Nlc3MoaCxhKTtpZih0eXBlb2YgYj09PSJmdW5jdGlvbiIpe2lmKGIuY2FsbGVkKXtjb250aW51ZX10aGlzLlJlc3RhcnRBZnRlcihiKX1iPWIuQXR0YWNoKGgsai5pZCk7dGhpcy5zYXZlU2NyaXB0KGIsYSxoLGkpO3RoaXMucG9zdElucHV0SG9va3MuRXhlY3V0ZShiLGouaWQsaCl9ZWxzZXtpZihoLk1hdGhKYXguc3RhdGU9PT1pLk9VVFBVVCl7dGhpcy5zYXZlU2NyaXB0KGguTWF0aEpheC5lbGVtZW50SmF4LGEsaCxpKX19YS5pKys7dmFyIGM9bmV3IERhdGUoKS5nZXRUaW1lKCk7aWYoYy1hLnN0YXJ0PnRoaXMucHJvY2Vzc1VwZGF0ZVRpbWUmJmEuaTxhLnNjcmlwdHMubGVuZ3RoKXthLnN0YXJ0PWM7dGhpcy5SZXN0YXJ0QWZ0ZXIoTWF0aEpheC5DYWxsYmFjay5EZWxheSgxKSl9fX1jYXRjaChmKXtyZXR1cm4gdGhpcy5wcm9jZXNzRXJyb3IoZixhLCJJbnB1dCIpfWlmKGEuc2NyaXB0cy5sZW5ndGgmJnRoaXMuY29uZmlnLnNob3dQcm9jZXNzaW5nTWVzc2FnZXMpe01hdGhKYXguTWVzc2FnZS5TZXQoWyJQcm9jZXNzTWF0aCIsIlByb2Nlc3NpbmcgbWF0aDogJTElJSIsMTAwXSwwKX1hLnN0YXJ0PW5ldyBEYXRlKCkuZ2V0VGltZSgpO2EuaT1hLmo9MDtyZXR1cm4gbnVsbH0scG9zdElucHV0SG9va3M6TWF0aEpheC5DYWxsYmFjay5Ib29rcyh0cnVlKSxzYXZlU2NyaXB0OmZ1bmN0aW9uKGEsZCxiLGMpe2lmKCF0aGlzLm91dHB1dEpheFthLm1pbWVUeXBlXSl7Yi5NYXRoSmF4LnN0YXRlPWMuVVBEQVRFO3Rocm93IEVycm9yKCJObyBvdXRwdXQgamF4IHJlZ2lzdGVyZWQgZm9yICIrYS5taW1lVHlwZSl9YS5vdXRwdXRKYXg9dGhpcy5vdXRwdXRKYXhbYS5taW1lVHlwZV1bMF0uaWQ7aWYoIWQuamF4W2Eub3V0cHV0SmF4XSl7aWYoZC5qYXhJRHMubGVuZ3RoPT09MCl7ZC5qYXhbYS5vdXRwdXRKYXhdPWQuc2NyaXB0c31lbHNle2lmKGQuamF4SURzLmxlbmd0aD09PTEpe2QuamF4W2QuamF4SURzWzBdXT1kLnNjcmlwdHMuc2xpY2UoMCxkLmkpfWQuamF4W2Eub3V0cHV0SmF4XT1bXX1kLmpheElEcy5wdXNoKGEub3V0cHV0SmF4KX1pZihkLmpheElEcy5sZW5ndGg+MSl7ZC5qYXhbYS5vdXRwdXRKYXhdLnB1c2goYil9Yi5NYXRoSmF4LnN0YXRlPWMuT1VUUFVUfSxwcmVwYXJlT3V0cHV0OmZ1bmN0aW9uKGMsZil7d2hpbGUoYy5qPGMuamF4SURzLmxlbmd0aCl7dmFyIGU9Yy5qYXhJRHNbYy5qXSxkPU1hdGhKYXguT3V0cHV0SmF4W2VdO2lmKGRbZl0pe3RyeXt2YXIgYT1kW2ZdKGMpO2lmKHR5cGVvZiBhPT09ImZ1bmN0aW9uIil7aWYoYS5jYWxsZWQpe2NvbnRpbnVlfXRoaXMuUmVzdGFydEFmdGVyKGEpfX1jYXRjaChiKXtpZighYi5yZXN0YXJ0KXtNYXRoSmF4Lk1lc3NhZ2UuU2V0KFsiUHJlcEVycm9yIiwiRXJyb3IgcHJlcGFyaW5nICUxIG91dHB1dCAoJTIpIixlLGZdLG51bGwsNjAwKTtNYXRoSmF4Lkh1Yi5sYXN0UHJlcEVycm9yPWI7Yy5qKyt9cmV0dXJuIE1hdGhKYXguQ2FsbGJhY2suQWZ0ZXIoWyJwcmVwYXJlT3V0cHV0Iix0aGlzLGMsZl0sYi5yZXN0YXJ0KX19Yy5qKyt9cmV0dXJuIG51bGx9LHByb2Nlc3NPdXRwdXQ6ZnVuY3Rpb24oaCl7dmFyIGIsZz1NYXRoSmF4LkVsZW1lbnRKYXguU1RBVEUsZCxhPWguc2NyaXB0cy5sZW5ndGg7dHJ5e3doaWxlKGguaTxhKXtkPWguc2NyaXB0c1toLmldO2lmKCFkfHwhZC5wYXJlbnROb2RlfHwhZC5NYXRoSmF4fHxkLk1hdGhKYXguZXJyb3Ipe2guaSsrO2NvbnRpbnVlfXZhciBjPWQuTWF0aEpheC5lbGVtZW50SmF4O2lmKCFjKXtoLmkrKztjb250aW51ZX1iPU1hdGhKYXguT3V0cHV0SmF4W2Mub3V0cHV0SmF4XS5Qcm9jZXNzKGQsaCk7aWYoYiE9PWZhbHNlKXtkLk1hdGhKYXguc3RhdGU9Zy5QUk9DRVNTRUQ7aWYoZC5NYXRoSmF4LnByZXZpZXcpe2QuTWF0aEpheC5wcmV2aWV3LmlubmVySFRNTD0iIjtkLk1hdGhKYXgucHJldmlldy5zdHlsZS5kaXNwbGF5PSJub25lIn10aGlzLnNpZ25hbC5Qb3N0KFsiTmV3IE1hdGgiLGMuaW5wdXRJRF0pfWguaSsrO3ZhciBlPW5ldyBEYXRlKCkuZ2V0VGltZSgpO2lmKGUtaC5zdGFydD50aGlzLnByb2Nlc3NVcGRhdGVUaW1lJiZoLmk8aC5zY3JpcHRzLmxlbmd0aCl7aC5zdGFydD1lO3RoaXMuUmVzdGFydEFmdGVyKE1hdGhKYXguQ2FsbGJhY2suRGVsYXkodGhpcy5wcm9jZXNzVXBkYXRlRGVsYXkpKX19fWNhdGNoKGYpe3JldHVybiB0aGlzLnByb2Nlc3NFcnJvcihmLGgsIk91dHB1dCIpfWlmKGguc2NyaXB0cy5sZW5ndGgmJnRoaXMuY29uZmlnLnNob3dQcm9jZXNzaW5nTWVzc2FnZXMpe01hdGhKYXguTWVzc2FnZS5TZXQoWyJUeXBlc2V0TWF0aCIsIlR5cGVzZXR0aW5nIG1hdGg6ICUxJSUiLDEwMF0sMCk7TWF0aEpheC5NZXNzYWdlLkNsZWFyKDApfWguaT1oLmo9MDtyZXR1cm4gbnVsbH0scHJvY2Vzc01lc3NhZ2U6ZnVuY3Rpb24oZCxiKXt2YXIgYT1NYXRoLmZsb29yKGQuaS8oZC5zY3JpcHRzLmxlbmd0aCkqMTAwKTt2YXIgYz0oYj09PSJPdXRwdXQiP1siVHlwZXNldE1hdGgiLCJUeXBlc2V0dGluZyBtYXRoOiAlMSUlIl06WyJQcm9jZXNzTWF0aCIsIlByb2Nlc3NpbmcgbWF0aDogJTElJSJdKTtpZih0aGlzLmNvbmZpZy5zaG93UHJvY2Vzc2luZ01lc3NhZ2VzKXtNYXRoSmF4Lk1lc3NhZ2UuU2V0KGMuY29uY2F0KGEpLDApfX0scHJvY2Vzc0Vycm9yOmZ1bmN0aW9uKGIsYyxhKXtpZighYi5yZXN0YXJ0KXtpZighdGhpcy5jb25maWcuZXJyb3JTZXR0aW5ncy5tZXNzYWdlKXt0aHJvdyBifXRoaXMuZm9ybWF0RXJyb3IoYy5zY3JpcHRzW2MuaV0sYik7Yy5pKyt9dGhpcy5wcm9jZXNzTWVzc2FnZShjLGEpO3JldHVybiBNYXRoSmF4LkNhbGxiYWNrLkFmdGVyKFsicHJvY2VzcyIrYSx0aGlzLGNdLGIucmVzdGFydCl9LGZvcm1hdEVycm9yOmZ1bmN0aW9uKGIsZil7dmFyIGg9ZnVuY3Rpb24obCxrLGosaSl7cmV0dXJuIE1hdGhKYXguTG9jYWxpemF0aW9uLl8obCxrLGosaSl9O3ZhciBlPWgoIkVycm9yTWVzc2FnZSIsIkVycm9yOiAlMSIsZi5tZXNzYWdlKSsiXG4iO2lmKGYuc291cmNlVVJMfHxmLmZpbGVOYW1lKXtlKz0iXG4iK2goIkVycm9yRmlsZSIsImZpbGU6ICUxIixmLnNvdXJjZVVSTHx8Zi5maWxlTmFtZSl9aWYoZi5saW5lfHxmLmxpbmVOdW1iZXIpe2UrPSJcbiIraCgiRXJyb3JMaW5lIiwibGluZTogJTEiLGYubGluZXx8Zi5saW5lTnVtYmVyKX1lKz0iXG5cbiIraCgiRXJyb3JUaXBzIiwiRGVidWdnaW5nIHRpcHM6IHVzZSAlMSwgaW5zcGVjdCAlMiBpbiB0aGUgYnJvd3NlciBjb25zb2xlIiwiJ3VucGFja2VkL01hdGhKYXguanMnIiwiJ01hdGhKYXguSHViLmxhc3RFcnJvciciKTtiLk1hdGhKYXguZXJyb3I9TWF0aEpheC5PdXRwdXRKYXguRXJyb3IuSmF4KGUsYik7aWYoYi5NYXRoSmF4LmVsZW1lbnRKYXgpe2IuTWF0aEpheC5lcnJvci5pbnB1dElEPWIuTWF0aEpheC5lbGVtZW50SmF4LmlucHV0SUR9dmFyIGc9dGhpcy5jb25maWcuZXJyb3JTZXR0aW5nczt2YXIgYT1oKGcubWVzc2FnZUlkLGcubWVzc2FnZSk7dmFyIGM9TWF0aEpheC5IVE1MLkVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Ik1hdGhKYXhfRXJyb3IiLGpheElEOiJFcnJvciIsaXNNYXRoSmF4OnRydWUsaWQ6Yi5NYXRoSmF4LmVycm9yLmlucHV0SUQrIi1GcmFtZSJ9LFtbInNwYW4iLG51bGwsYV1dKTtNYXRoSmF4LkFqYXguUmVxdWlyZSgiW01hdGhKYXhdL2V4dGVuc2lvbnMvTWF0aEV2ZW50cy5qcyIsZnVuY3Rpb24oKXt2YXIgaj1NYXRoSmF4LkV4dGVuc2lvbi5NYXRoRXZlbnRzLkV2ZW50LGk9TWF0aEpheC5IdWI7Yy5vbmNvbnRleHRtZW51PWouTWVudTtjLm9ubW91c2Vkb3duPWouTW91c2Vkb3duO2Mub25rZXlkb3duPWouS2V5ZG93bjtjLnRhYkluZGV4PWkuZ2V0VGFiT3JkZXIoaS5nZXRKYXhGb3IoYikpfSk7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5pZCk7aWYoZCl7ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpfWlmKGIucGFyZW50Tm9kZSl7Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjLGIpfWlmKGIuTWF0aEpheC5wcmV2aWV3KXtiLk1hdGhKYXgucHJldmlldy5pbm5lckhUTUw9IiI7Yi5NYXRoSmF4LnByZXZpZXcuc3R5bGUuZGlzcGxheT0ibm9uZSJ9dGhpcy5sYXN0RXJyb3I9Zjt0aGlzLnNpZ25hbC5Qb3N0KFsiTWF0aCBQcm9jZXNzaW5nIEVycm9yIixiLGZdKX0sUmVzdGFydEFmdGVyOmZ1bmN0aW9uKGEpe3Rocm93IHRoaXMuSW5zZXJ0KEVycm9yKCJyZXN0YXJ0Iikse3Jlc3RhcnQ6TWF0aEpheC5DYWxsYmFjayhhKX0pfSxlbGVtZW50Q2FsbGJhY2s6ZnVuY3Rpb24oYyxmKXtpZihmPT1udWxsJiYoTWF0aEpheC5PYmplY3QuaXNBcnJheShjKXx8dHlwZW9mIGM9PT0iZnVuY3Rpb24iKSl7dHJ5e01hdGhKYXguQ2FsbGJhY2soYyk7Zj1jO2M9bnVsbH1jYXRjaChkKXt9fWlmKGM9PW51bGwpe2M9dGhpcy5jb25maWcuZWxlbWVudHN8fFtdfWlmKHRoaXMuaXNIVE1MQ29sbGVjdGlvbihjKSl7Yz10aGlzLkhUTUxDb2xsZWN0aW9uMkFycmF5KGMpfWlmKCFNYXRoSmF4Lk9iamVjdC5pc0FycmF5KGMpKXtjPVtjXX1jPVtdLmNvbmNhdChjKTtmb3IodmFyIGI9MCxhPWMubGVuZ3RoO2I8YTtiKyspe2lmKHR5cGVvZihjW2JdKT09PSJzdHJpbmciKXtjW2JdPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNbYl0pfX1pZighZG9jdW1lbnQuYm9keSl7ZG9jdW1lbnQuYm9keT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdfWlmKGMubGVuZ3RoPT0wKXtjLnB1c2goZG9jdW1lbnQuYm9keSl9aWYoIWYpe2Y9e319cmV0dXJue2NvdW50OmMubGVuZ3RoLGVsZW1lbnRzOihjLmxlbmd0aD09PTE/Y1swXTpjKSxjYWxsYmFjazpmfX0sZWxlbWVudFNjcmlwdHM6ZnVuY3Rpb24oZSl7dmFyIGI9W107aWYoTWF0aEpheC5PYmplY3QuaXNBcnJheShlKXx8dGhpcy5pc0hUTUxDb2xsZWN0aW9uKGUpKXtmb3IodmFyIGQ9MCxhPWUubGVuZ3RoO2Q8YTtkKyspe3ZhciBmPTA7Zm9yKHZhciBjPTA7YzxkJiYhZjtjKyspe2Y9ZVtjXS5jb250YWlucyhlW2RdKX1pZighZil7Yi5wdXNoLmFwcGx5KGIsdGhpcy5lbGVtZW50U2NyaXB0cyhlW2RdKSl9fXJldHVybiBifWlmKHR5cGVvZihlKT09PSJzdHJpbmciKXtlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpfWlmKCFkb2N1bWVudC5ib2R5KXtkb2N1bWVudC5ib2R5PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF19aWYoZT09bnVsbCl7ZT1kb2N1bWVudC5ib2R5fWlmKGUudGFnTmFtZSE9bnVsbCYmZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic2NyaXB0Iil7cmV0dXJuW2VdfWI9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7aWYodGhpcy5tc2llSFRNTENvbGxlY3Rpb25CdWcpe2I9dGhpcy5IVE1MQ29sbGVjdGlvbjJBcnJheShiKX1yZXR1cm4gYn0saXNIVE1MQ29sbGVjdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4oIkhUTUxDb2xsZWN0aW9uIiBpbiB3aW5kb3cmJnR5cGVvZihhKT09PSJvYmplY3QiJiZhIGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb24pfSxIVE1MQ29sbGVjdGlvbjJBcnJheTpmdW5jdGlvbihjKXtpZighdGhpcy5tc2llSFRNTENvbGxlY3Rpb25CdWcpe3JldHVybltdLnNsaWNlLmNhbGwoYyl9dmFyIGI9W107Zm9yKHZhciBkPTAsYT1jLmxlbmd0aDtkPGE7ZCsrKXtiW2RdPWNbZF19cmV0dXJuIGJ9LEluc2VydDpmdW5jdGlvbihjLGEpe2Zvcih2YXIgYiBpbiBhKXtpZihhLmhhc093blByb3BlcnR5KGIpKXtpZih0eXBlb2YgYVtiXT09PSJvYmplY3QiJiYhKE1hdGhKYXguT2JqZWN0LmlzQXJyYXkoYVtiXSkpJiYodHlwZW9mIGNbYl09PT0ib2JqZWN0Inx8dHlwZW9mIGNbYl09PT0iZnVuY3Rpb24iKSl7dGhpcy5JbnNlcnQoY1tiXSxhW2JdKX1lbHNle2NbYl09YVtiXX19fXJldHVybiBjfSxnZXRUYWJPcmRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb25maWcubWVudVNldHRpbmdzLmluVGFiT3JkZXI/MDotMX0sU3BsaXRMaXN0OigidHJpbSIgaW4gU3RyaW5nLnByb3RvdHlwZT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCkuc3BsaXQoL1xzKy8pfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpLnNwbGl0KC9ccysvKX0pfTtNYXRoSmF4Lkh1Yi5JbnNlcnQoTWF0aEpheC5IdWIuY29uZmlnLnN0eWxlcyxNYXRoSmF4Lk1lc3NhZ2Uuc3R5bGVzKTtNYXRoSmF4Lkh1Yi5JbnNlcnQoTWF0aEpheC5IdWIuY29uZmlnLnN0eWxlcyx7Ii5NYXRoSmF4X0Vycm9yIjpNYXRoSmF4Lkh1Yi5jb25maWcuZXJyb3JTZXR0aW5ncy5zdHlsZX0pO01hdGhKYXguRXh0ZW5zaW9uPXt9O01hdGhKYXguSHViLkNvbmZpZ3VyZWQ9TWF0aEpheC5DYWxsYmFjayh7fSk7TWF0aEpheC5IdWIuU3RhcnR1cD17c2NyaXB0OiIiLHF1ZXVlOk1hdGhKYXguQ2FsbGJhY2suUXVldWUoKSxzaWduYWw6TWF0aEpheC5DYWxsYmFjay5TaWduYWwoIlN0YXJ0dXAiKSxwYXJhbXM6e30sQ29uZmlnOmZ1bmN0aW9uKCl7dGhpcy5xdWV1ZS5QdXNoKFsiUG9zdCIsdGhpcy5zaWduYWwsIkJlZ2luIENvbmZpZyJdKTtpZihNYXRoSmF4LkF1dGhvckNvbmZpZyYmTWF0aEpheC5BdXRob3JDb25maWcucm9vdCl7TWF0aEpheC5BamF4LmNvbmZpZy5yb290PU1hdGhKYXguQXV0aG9yQ29uZmlnLnJvb3R9aWYodGhpcy5wYXJhbXMubG9jYWxlKXtNYXRoSmF4LkxvY2FsaXphdGlvbi5yZXNldExvY2FsZSh0aGlzLnBhcmFtcy5sb2NhbGUpO01hdGhKYXguSHViLmNvbmZpZy5tZW51U2V0dGluZ3MubG9jYWxlPXRoaXMucGFyYW1zLmxvY2FsZX1pZih0aGlzLnBhcmFtcy5jb25maWcpe3ZhciBjPXRoaXMucGFyYW1zLmNvbmZpZy5zcGxpdCgvLC8pO2Zvcih2YXIgYj0wLGE9Yy5sZW5ndGg7YjxhO2IrKyl7aWYoIWNbYl0ubWF0Y2goL1wuanMkLykpe2NbYl0rPSIuanMifXRoaXMucXVldWUuUHVzaChbIlJlcXVpcmUiLE1hdGhKYXguQWpheCx0aGlzLlVSTCgiY29uZmlnIixjW2JdKV0pfX10aGlzLnF1ZXVlLlB1c2goWyJDb25maWciLE1hdGhKYXguSHViLE1hdGhKYXguQXV0aG9yQ29uZmlnXSk7aWYodGhpcy5zY3JpcHQubWF0Y2goL1xTLykpe3RoaXMucXVldWUuUHVzaCh0aGlzLnNjcmlwdCsiO1xuMTsiKX10aGlzLnF1ZXVlLlB1c2goWyJDb25maWdEZWxheSIsdGhpc10sWyJDb25maWdCbG9ja3MiLHRoaXNdLFtmdW5jdGlvbihkKXtyZXR1cm4gZC5sb2FkQXJyYXkoTWF0aEpheC5IdWIuY29uZmlnLmNvbmZpZywiY29uZmlnIixudWxsLHRydWUpfSx0aGlzXSxbIlBvc3QiLHRoaXMuc2lnbmFsLCJFbmQgQ29uZmlnIl0pfSxDb25maWdEZWxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGFyYW1zLmRlbGF5U3RhcnR1cFVudGlsfHxNYXRoSmF4Lkh1Yi5jb25maWcuZGVsYXlTdGFydHVwVW50aWw7aWYoYT09PSJvbmxvYWQiKXtyZXR1cm4gdGhpcy5vbmxvYWR9aWYoYT09PSJjb25maWd1cmVkIil7cmV0dXJuIE1hdGhKYXguSHViLkNvbmZpZ3VyZWR9cmV0dXJuIGF9LENvbmZpZ0Jsb2NrczpmdW5jdGlvbigpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTt2YXIgYj1NYXRoSmF4LkNhbGxiYWNrLlF1ZXVlKCk7Zm9yKHZhciBkPTAsYT1jLmxlbmd0aDtkPGE7ZCsrKXt2YXIgZT1TdHJpbmcoY1tkXS50eXBlKS5yZXBsYWNlKC8gL2csIiIpO2lmKGUubWF0Y2goL150ZXh0XC94LW1hdGhqYXgtY29uZmlnKDsuKik/JC8pJiYhZS5tYXRjaCgvO2V4ZWN1dGVkPXRydWUvKSl7Y1tkXS50eXBlKz0iO2V4ZWN1dGVkPXRydWUiO2IuUHVzaChjW2RdLmlubmVySFRNTCsiO1xuMTsiKX19cmV0dXJuIGIuUHVzaChmdW5jdGlvbigpe01hdGhKYXguQWpheC5jb25maWcucm9vdD1NYXRoSmF4Lkh1Yi5jb25maWcucm9vdH0pfSxDb29raWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWV1ZS5QdXNoKFsiUG9zdCIsdGhpcy5zaWduYWwsIkJlZ2luIENvb2tpZSJdLFsiR2V0IixNYXRoSmF4LkhUTUwuQ29va2llLCJtZW51IixNYXRoSmF4Lkh1Yi5jb25maWcubWVudVNldHRpbmdzXSxbZnVuY3Rpb24oZSl7dmFyIGQ9ZS5tZW51U2V0dGluZ3M7aWYoZC5sb2NhbGUpe01hdGhKYXguTG9jYWxpemF0aW9uLnJlc2V0TG9jYWxlKGQubG9jYWxlKX12YXIgZz1lLm1lbnVTZXR0aW5ncy5yZW5kZXJlcixiPWUuamF4O2lmKGcpe3ZhciBjPSJvdXRwdXQvIitnO2Iuc29ydCgpO2Zvcih2YXIgZj0wLGE9Yi5sZW5ndGg7ZjxhO2YrKyl7aWYoYltmXS5zdWJzdHIoMCw3KT09PSJvdXRwdXQvIil7YnJlYWt9fWlmKGY9PWEtMSl7Yi5wb3AoKX1lbHNle3doaWxlKGY8YSl7aWYoYltmXT09PWMpe2Iuc3BsaWNlKGYsMSk7YnJlYWt9ZisrfX1iLnVuc2hpZnQoYyl9aWYoZC5DSFRNTHByZXZpZXchPW51bGwpe2lmKGQuRmFzdFByZXZpZXc9PW51bGwpe2QuRmFzdFByZXZpZXc9ZC5DSFRNTHByZXZpZXd9ZGVsZXRlIGQuQ0hUTUxwcmV2aWV3fWlmKGQuRmFzdFByZXZpZXcmJiFNYXRoSmF4LkV4dGVuc2lvblsiZmFzdC1wcmV2aWV3Il0pe01hdGhKYXguSHViLmNvbmZpZy5leHRlbnNpb25zLnB1c2goImZhc3QtcHJldmlldy5qcyIpfWlmKGUubWVudVNldHRpbmdzLmFzc2lzdGl2ZU1NTCYmIU1hdGhKYXguRXh0ZW5zaW9uLkFzc2lzdGl2ZU1NTCl7TWF0aEpheC5IdWIuY29uZmlnLmV4dGVuc2lvbnMucHVzaCgiQXNzaXN0aXZlTU1MLmpzIil9fSxNYXRoSmF4Lkh1Yi5jb25maWddLFsiUG9zdCIsdGhpcy5zaWduYWwsIkVuZCBDb29raWUiXSl9LFN0eWxlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXVlLlB1c2goWyJQb3N0Iix0aGlzLnNpZ25hbCwiQmVnaW4gU3R5bGVzIl0sWyJsb2FkQXJyYXkiLHRoaXMsTWF0aEpheC5IdWIuY29uZmlnLnN0eWxlU2hlZXRzLCJjb25maWciXSxbIlN0eWxlcyIsTWF0aEpheC5BamF4LE1hdGhKYXguSHViLmNvbmZpZy5zdHlsZXNdLFsiUG9zdCIsdGhpcy5zaWduYWwsIkVuZCBTdHlsZXMiXSl9LEpheDpmdW5jdGlvbigpe3ZhciBmPU1hdGhKYXguSHViLmNvbmZpZyxjPU1hdGhKYXguSHViLm91dHB1dEpheDtmb3IodmFyIGc9MCxiPWYuamF4Lmxlbmd0aCxkPTA7ZzxiO2crKyl7dmFyIGU9Zi5qYXhbZ10uc3Vic3RyKDcpO2lmKGYuamF4W2ddLnN1YnN0cigwLDcpPT09Im91dHB1dC8iJiZjLm9yZGVyW2VdPT1udWxsKXtjLm9yZGVyW2VdPWQ7ZCsrfX12YXIgYT1NYXRoSmF4LkNhbGxiYWNrLlF1ZXVlKCk7cmV0dXJuIGEuUHVzaChbIlBvc3QiLHRoaXMuc2lnbmFsLCJCZWdpbiBKYXgiXSxbImxvYWRBcnJheSIsdGhpcyxmLmpheCwiamF4IiwiY29uZmlnLmpzIl0sWyJQb3N0Iix0aGlzLnNpZ25hbCwiRW5kIEpheCJdKX0sRXh0ZW5zaW9uczpmdW5jdGlvbigpe3ZhciBhPU1hdGhKYXguQ2FsbGJhY2suUXVldWUoKTtyZXR1cm4gYS5QdXNoKFsiUG9zdCIsdGhpcy5zaWduYWwsIkJlZ2luIEV4dGVuc2lvbnMiXSxbImxvYWRBcnJheSIsdGhpcyxNYXRoSmF4Lkh1Yi5jb25maWcuZXh0ZW5zaW9ucywiZXh0ZW5zaW9ucyJdLFsiUG9zdCIsdGhpcy5zaWduYWwsIkVuZCBFeHRlbnNpb25zIl0pfSxNZXNzYWdlOmZ1bmN0aW9uKCl7TWF0aEpheC5NZXNzYWdlLkluaXQodHJ1ZSl9LE1lbnU6ZnVuY3Rpb24oKXt2YXIgYj1NYXRoSmF4Lkh1Yi5jb25maWcubWVudVNldHRpbmdzLGE9TWF0aEpheC5IdWIub3V0cHV0SmF4LGQ7Zm9yKHZhciBjIGluIGEpe2lmKGEuaGFzT3duUHJvcGVydHkoYykpe2lmKGFbY10ubGVuZ3RoKXtkPWFbY107YnJlYWt9fX1pZihkJiZkLmxlbmd0aCl7aWYoYi5yZW5kZXJlciYmYi5yZW5kZXJlciE9PWRbMF0uaWQpe2QudW5zaGlmdChNYXRoSmF4Lk91dHB1dEpheFtiLnJlbmRlcmVyXSl9Yi5yZW5kZXJlcj1kWzBdLmlkfX0sSGFzaDpmdW5jdGlvbigpe2lmKE1hdGhKYXguSHViLmNvbmZpZy5wb3NpdGlvblRvSGFzaCYmZG9jdW1lbnQubG9jYXRpb24uaGFzaCYmZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5zY3JvbGxJbnRvVmlldyl7dmFyIGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmxvY2F0aW9uLmhhc2guc3Vic3RyKDEpKTt2YXIgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKTtpZighZil7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTtmb3IodmFyIGU9MCxiPWMubGVuZ3RoO2U8YjtlKyspe2lmKGNbZV0ubmFtZT09PWQpe2Y9Y1tlXTticmVha319fWlmKGYpe3doaWxlKCFmLnNjcm9sbEludG9WaWV3KXtmPWYucGFyZW50Tm9kZX1mPXRoaXMuSGFzaENoZWNrKGYpO2lmKGYmJmYuc2Nyb2xsSW50b1ZpZXcpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNjcm9sbEludG9WaWV3KHRydWUpfSwxKX19fX0sSGFzaENoZWNrOmZ1bmN0aW9uKGIpe3ZhciBhPU1hdGhKYXguSHViLmdldEpheEZvcihiKTtpZihhJiZNYXRoSmF4Lk91dHB1dEpheFthLm91dHB1dEpheF0uaGFzaENoZWNrKXtiPU1hdGhKYXguT3V0cHV0SmF4W2Eub3V0cHV0SmF4XS5oYXNoQ2hlY2soYil9cmV0dXJuIGJ9LE1lbnVab29tOmZ1bmN0aW9uKCl7aWYoTWF0aEpheC5IdWIuY29uZmlnLnNob3dNYXRoTWVudSl7aWYoIU1hdGhKYXguRXh0ZW5zaW9uLk1hdGhNZW51KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TWF0aEpheC5DYWxsYmFjay5RdWV1ZShbIlJlcXVpcmUiLE1hdGhKYXguQWpheCwiW01hdGhKYXhdL2V4dGVuc2lvbnMvTWF0aE1lbnUuanMiLHt9XSxbImxvYWREb21haW4iLE1hdGhKYXguTG9jYWxpemF0aW9uLCJNYXRoTWVudSJdKX0sMTAwMCl9ZWxzZXtzZXRUaW1lb3V0KE1hdGhKYXguQ2FsbGJhY2soWyJsb2FkRG9tYWluIixNYXRoSmF4LkxvY2FsaXphdGlvbiwiTWF0aE1lbnUiXSksMTAwMCl9aWYoIU1hdGhKYXguRXh0ZW5zaW9uLk1hdGhab29tKXtzZXRUaW1lb3V0KE1hdGhKYXguQ2FsbGJhY2soWyJSZXF1aXJlIixNYXRoSmF4LkFqYXgsIltNYXRoSmF4XS9leHRlbnNpb25zL01hdGhab29tLmpzIix7fV0pLDIwMDApfX19LG9uTG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub25sb2FkPU1hdGhKYXguQ2FsbGJhY2soZnVuY3Rpb24oKXtNYXRoSmF4Lkh1Yi5TdGFydHVwLnNpZ25hbC5Qb3N0KCJvbkxvYWQiKX0pO2lmKGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LnJlYWR5U3RhdGUpe2lmKE1hdGhKYXguSHViLkJyb3dzZXIuaXNNU0lFKXtpZihkb2N1bWVudC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIil7cmV0dXJuW2FdfX1lbHNle2lmKGRvY3VtZW50LnJlYWR5U3RhdGUhPT0ibG9hZGluZyIpe3JldHVyblthXX19fWlmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYSxmYWxzZSk7aWYoIXRoaXMucGFyYW1zLm5vRE9NQ29udGVudEV2ZW50KXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsYSxmYWxzZSl9fWVsc2V7aWYod2luZG93LmF0dGFjaEV2ZW50KXt3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsYSl9ZWxzZXt3aW5kb3cub25sb2FkPWF9fXJldHVybiBhfSxUeXBlc2V0OmZ1bmN0aW9uKGEsYil7aWYoTWF0aEpheC5IdWIuY29uZmlnLnNraXBTdGFydHVwVHlwZXNldCl7cmV0dXJuIGZ1bmN0aW9uKCl7fX1yZXR1cm4gdGhpcy5xdWV1ZS5QdXNoKFsiUG9zdCIsdGhpcy5zaWduYWwsIkJlZ2luIFR5cGVzZXQiXSxbIlR5cGVzZXQiLE1hdGhKYXguSHViLGEsYl0sWyJQb3N0Iix0aGlzLnNpZ25hbCwiRW5kIFR5cGVzZXQiXSl9LFVSTDpmdW5jdGlvbihiLGEpe2lmKCFhLm1hdGNoKC9eKFthLXpdKzpcL1wvfFxbfFwvKS8pKXthPSJbTWF0aEpheF0vIitiKyIvIithfXJldHVybiBhfSxsb2FkQXJyYXk6ZnVuY3Rpb24oYixmLGMsYSl7aWYoYil7aWYoIU1hdGhKYXguT2JqZWN0LmlzQXJyYXkoYikpe2I9W2JdfWlmKGIubGVuZ3RoKXt2YXIgaD1NYXRoSmF4LkNhbGxiYWNrLlF1ZXVlKCksaj17fSxlO2Zvcih2YXIgZz0wLGQ9Yi5sZW5ndGg7ZzxkO2crKyl7ZT10aGlzLlVSTChmLGJbZ10pO2lmKGMpe2UrPSIvIitjfWlmKGEpe2guUHVzaChbIlJlcXVpcmUiLE1hdGhKYXguQWpheCxlLGpdKX1lbHNle2guUHVzaChNYXRoSmF4LkFqYXguUmVxdWlyZShlLGopKX19cmV0dXJuIGguUHVzaCh7fSl9fXJldHVybiBudWxsfX07KGZ1bmN0aW9uKGQpe3ZhciBiPXdpbmRvd1tkXSxlPSJbIitkKyJdIjt2YXIgYz1iLkh1YixhPWIuQWpheCxmPWIuQ2FsbGJhY2s7dmFyIGc9TWF0aEpheC5PYmplY3QuU3ViY2xhc3Moe0pBWEZJTEU6ImpheC5qcyIscmVxdWlyZTpudWxsLGNvbmZpZzp7fSxJbml0OmZ1bmN0aW9uKGksaCl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3JldHVybiB0aGlzfXJldHVybih0aGlzLmNvbnN0cnVjdG9yLlN1YmNsYXNzKGksaCkpKCl9LEF1Z21lbnQ6ZnVuY3Rpb24oayxqKXt2YXIgaT10aGlzLmNvbnN0cnVjdG9yLGg9e307aWYoayE9bnVsbCl7Zm9yKHZhciBsIGluIGspe2lmKGsuaGFzT3duUHJvcGVydHkobCkpe2lmKHR5cGVvZiBrW2xdPT09ImZ1bmN0aW9uIil7aS5wcm90b0Z1bmN0aW9uKGwsa1tsXSl9ZWxzZXtoW2xdPWtbbF19fX1pZihrLnRvU3RyaW5nIT09aS5wcm90b3R5cGUudG9TdHJpbmcmJmsudG9TdHJpbmchPT17fS50b1N0cmluZyl7aS5wcm90b0Z1bmN0aW9uKCJ0b1N0cmluZyIsay50b1N0cmluZyl9fWMuSW5zZXJ0KGkucHJvdG90eXBlLGgpO2kuQXVnbWVudChudWxsLGopO3JldHVybiB0aGlzfSxUcmFuc2xhdGU6ZnVuY3Rpb24oaCxpKXt0aHJvdyBFcnJvcih0aGlzLmRpcmVjdG9yeSsiLyIrdGhpcy5KQVhGSUxFKyIgZmFpbGVkIHRvIGRlZmluZSB0aGUgVHJhbnNsYXRlKCkgbWV0aG9kIil9LFJlZ2lzdGVyOmZ1bmN0aW9uKGgpe30sQ29uZmlnOmZ1bmN0aW9uKCl7dGhpcy5jb25maWc9Yy5Db21iaW5lQ29uZmlnKHRoaXMuaWQsdGhpcy5jb25maWcpO2lmKHRoaXMuY29uZmlnLkF1Z21lbnQpe3RoaXMuQXVnbWVudCh0aGlzLmNvbmZpZy5BdWdtZW50KX19LFN0YXJ0dXA6ZnVuY3Rpb24oKXt9LGxvYWRDb21wbGV0ZTpmdW5jdGlvbihpKXtpZihpPT09ImNvbmZpZy5qcyIpe3JldHVybiBhLmxvYWRDb21wbGV0ZSh0aGlzLmRpcmVjdG9yeSsiLyIraSl9ZWxzZXt2YXIgaD1mLlF1ZXVlKCk7aC5QdXNoKGMuUmVnaXN0ZXIuU3RhcnR1cEhvb2soIkVuZCBDb25maWciLHt9KSxbIlBvc3QiLGMuU3RhcnR1cC5zaWduYWwsdGhpcy5pZCsiIEpheCBDb25maWciXSxbIkNvbmZpZyIsdGhpc10sWyJQb3N0IixjLlN0YXJ0dXAuc2lnbmFsLHRoaXMuaWQrIiBKYXggUmVxdWlyZSJdLFtmdW5jdGlvbihqKXtyZXR1cm4gTWF0aEpheC5IdWIuU3RhcnR1cC5sb2FkQXJyYXkoai5yZXF1aXJlLHRoaXMuZGlyZWN0b3J5KX0sdGhpc10sW2Z1bmN0aW9uKGosayl7cmV0dXJuIE1hdGhKYXguSHViLlN0YXJ0dXAubG9hZEFycmF5KGouZXh0ZW5zaW9ucywiZXh0ZW5zaW9ucy8iK2spfSx0aGlzLmNvbmZpZ3x8e30sdGhpcy5pZF0sWyJQb3N0IixjLlN0YXJ0dXAuc2lnbmFsLHRoaXMuaWQrIiBKYXggU3RhcnR1cCJdLFsiU3RhcnR1cCIsdGhpc10sWyJQb3N0IixjLlN0YXJ0dXAuc2lnbmFsLHRoaXMuaWQrIiBKYXggUmVhZHkiXSk7aWYodGhpcy5jb3B5VHJhbnNsYXRlKXtoLlB1c2goW2Z1bmN0aW9uKGope2oucHJlUHJvY2Vzcz1qLnByZVRyYW5zbGF0ZTtqLlByb2Nlc3M9ai5UcmFuc2xhdGU7ai5wb3N0UHJvY2Vzcz1qLnBvc3RUcmFuc2xhdGV9LHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlXSl9cmV0dXJuIGguUHVzaChbImxvYWRDb21wbGV0ZSIsYSx0aGlzLmRpcmVjdG9yeSsiLyIraV0pfX19LHtpZDoiSmF4Iix2ZXJzaW9uOiIyLjcuNSIsZGlyZWN0b3J5OmUrIi9qYXgiLGV4dGVuc2lvbkRpcjplKyIvZXh0ZW5zaW9ucyJ9KTtiLklucHV0SmF4PWcuU3ViY2xhc3Moe2VsZW1lbnRKYXg6Im1tbCIsc291cmNlTWVudVRpdGxlOlsiT3JpZ2luYWwiLCJPcmlnaW5hbCBGb3JtIl0sY29weVRyYW5zbGF0ZTp0cnVlLFByb2Nlc3M6ZnVuY3Rpb24obCxxKXt2YXIgaj1mLlF1ZXVlKCksbzt2YXIgaz10aGlzLmVsZW1lbnRKYXg7aWYoIWIuT2JqZWN0LmlzQXJyYXkoaykpe2s9W2tdfWZvcih2YXIgbj0wLGg9ay5sZW5ndGg7bjxoO24rKyl7bz1iLkVsZW1lbnRKYXguZGlyZWN0b3J5KyIvIitrW25dKyIvIit0aGlzLkpBWEZJTEU7aWYoIXRoaXMucmVxdWlyZSl7dGhpcy5yZXF1aXJlPVtdfWVsc2V7aWYoIWIuT2JqZWN0LmlzQXJyYXkodGhpcy5yZXF1aXJlKSl7dGhpcy5yZXF1aXJlPVt0aGlzLnJlcXVpcmVdfX10aGlzLnJlcXVpcmUucHVzaChvKTtqLlB1c2goYS5SZXF1aXJlKG8pKX1vPXRoaXMuZGlyZWN0b3J5KyIvIit0aGlzLkpBWEZJTEU7dmFyIHA9ai5QdXNoKGEuUmVxdWlyZShvKSk7aWYoIXAuY2FsbGVkKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5Qcm9jZXNzPWZ1bmN0aW9uKCl7aWYoIXAuY2FsbGVkKXtyZXR1cm4gcH10aHJvdyBFcnJvcihvKyIgZmFpbGVkIHRvIGxvYWQgcHJvcGVybHkiKX19az1jLm91dHB1dEpheFsiamF4LyIra1swXV07aWYoayl7ai5QdXNoKGEuUmVxdWlyZShrWzBdLmRpcmVjdG9yeSsiLyIrdGhpcy5KQVhGSUxFKSl9cmV0dXJuIGouUHVzaCh7fSl9LG5lZWRzVXBkYXRlOmZ1bmN0aW9uKGgpe3ZhciBpPWguU291cmNlRWxlbWVudCgpO3JldHVybihoLm9yaWdpbmFsVGV4dCE9PWIuSFRNTC5nZXRTY3JpcHQoaSkpfSxSZWdpc3RlcjpmdW5jdGlvbihoKXtpZighYy5pbnB1dEpheCl7Yy5pbnB1dEpheD17fX1jLmlucHV0SmF4W2hdPXRoaXN9fSx7aWQ6IklucHV0SmF4Iix2ZXJzaW9uOiIyLjcuNSIsZGlyZWN0b3J5OmcuZGlyZWN0b3J5KyIvaW5wdXQiLGV4dGVuc2lvbkRpcjpnLmV4dGVuc2lvbkRpcn0pO2IuT3V0cHV0SmF4PWcuU3ViY2xhc3Moe2NvcHlUcmFuc2xhdGU6dHJ1ZSxwcmVQcm9jZXNzOmZ1bmN0aW9uKGope3ZhciBpLGg9dGhpcy5kaXJlY3RvcnkrIi8iK3RoaXMuSkFYRklMRTt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5wcmVQcm9jZXNzPWZ1bmN0aW9uKGspe2lmKCFpLmNhbGxlZCl7cmV0dXJuIGl9dGhyb3cgRXJyb3IoaCsiIGZhaWxlZCB0byBsb2FkIHByb3Blcmx5Iil9O2k9YS5SZXF1aXJlKGgpO3JldHVybiBpfSxQcm9jZXNzOmZ1bmN0aW9uKGgpe3Rocm93IEVycm9yKHRoaXMuaWQrIiBvdXRwdXQgamF4IGZhaWxlZCB0byBsb2FkIHByb3Blcmx5Iil9LFJlZ2lzdGVyOmZ1bmN0aW9uKGkpe3ZhciBoPWMub3V0cHV0SmF4O2lmKCFoW2ldKXtoW2ldPVtdfWlmKGhbaV0ubGVuZ3RoJiYodGhpcy5pZD09PWMuY29uZmlnLm1lbnVTZXR0aW5ncy5yZW5kZXJlcnx8KGgub3JkZXJbdGhpcy5pZF18fDApPChoLm9yZGVyW2hbaV1bMF0uaWRdfHwwKSkpe2hbaV0udW5zaGlmdCh0aGlzKX1lbHNle2hbaV0ucHVzaCh0aGlzKX1pZighdGhpcy5yZXF1aXJlKXt0aGlzLnJlcXVpcmU9W119ZWxzZXtpZighYi5PYmplY3QuaXNBcnJheSh0aGlzLnJlcXVpcmUpKXt0aGlzLnJlcXVpcmU9W3RoaXMucmVxdWlyZV19fXRoaXMucmVxdWlyZS5wdXNoKGIuRWxlbWVudEpheC5kaXJlY3RvcnkrIi8iKyhpLnNwbGl0KC9cLy8pWzFdKSsiLyIrdGhpcy5KQVhGSUxFKX0sUmVtb3ZlOmZ1bmN0aW9uKGgpe319LHtpZDoiT3V0cHV0SmF4Iix2ZXJzaW9uOiIyLjcuNSIsZGlyZWN0b3J5OmcuZGlyZWN0b3J5KyIvb3V0cHV0IixleHRlbnNpb25EaXI6Zy5leHRlbnNpb25EaXIsZm9udERpcjplKyhiLmlzUGFja2VkPyIiOiIvLi4iKSsiL2ZvbnRzIixpbWFnZURpcjplKyhiLmlzUGFja2VkPyIiOiIvLi4iKSsiL2ltYWdlcyJ9KTtiLkVsZW1lbnRKYXg9Zy5TdWJjbGFzcyh7SW5pdDpmdW5jdGlvbihpLGgpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLlN1YmNsYXNzKGksaCl9LGlucHV0SmF4Om51bGwsb3V0cHV0SmF4Om51bGwsaW5wdXRJRDpudWxsLG9yaWdpbmFsVGV4dDoiIixtaW1lVHlwZToiIixzb3VyY2VNZW51VGl0bGU6WyJNYXRoTUxjb2RlIiwiTWF0aE1MIENvZGUiXSxUZXh0OmZ1bmN0aW9uKGksail7dmFyIGg9dGhpcy5Tb3VyY2VFbGVtZW50KCk7Yi5IVE1MLnNldFNjcmlwdChoLGkpO2guTWF0aEpheC5zdGF0ZT10aGlzLlNUQVRFLlVQREFURTtyZXR1cm4gYy5VcGRhdGUoaCxqKX0sUmVwcm9jZXNzOmZ1bmN0aW9uKGkpe3ZhciBoPXRoaXMuU291cmNlRWxlbWVudCgpO2guTWF0aEpheC5zdGF0ZT10aGlzLlNUQVRFLlVQREFURTtyZXR1cm4gYy5SZXByb2Nlc3MoaCxpKX0sVXBkYXRlOmZ1bmN0aW9uKGgpe3JldHVybiB0aGlzLlJlcmVuZGVyKGgpfSxSZXJlbmRlcjpmdW5jdGlvbihpKXt2YXIgaD10aGlzLlNvdXJjZUVsZW1lbnQoKTtoLk1hdGhKYXguc3RhdGU9dGhpcy5TVEFURS5PVVRQVVQ7cmV0dXJuIGMuUHJvY2VzcyhoLGkpfSxSZW1vdmU6ZnVuY3Rpb24oaCl7aWYodGhpcy5ob3Zlcil7dGhpcy5ob3Zlci5jbGVhcih0aGlzKX1iLk91dHB1dEpheFt0aGlzLm91dHB1dEpheF0uUmVtb3ZlKHRoaXMpO2lmKCFoKXtjLnNpZ25hbC5Qb3N0KFsiUmVtb3ZlIE1hdGgiLHRoaXMuaW5wdXRJRF0pO3RoaXMuRGV0YWNoKCl9fSxuZWVkc1VwZGF0ZTpmdW5jdGlvbigpe3JldHVybiBiLklucHV0SmF4W3RoaXMuaW5wdXRKYXhdLm5lZWRzVXBkYXRlKHRoaXMpfSxTb3VyY2VFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaW5wdXRJRCl9LEF0dGFjaDpmdW5jdGlvbihpLGope3ZhciBoPWkuTWF0aEpheC5lbGVtZW50SmF4O2lmKGkuTWF0aEpheC5zdGF0ZT09PXRoaXMuU1RBVEUuVVBEQVRFKXtoLkNsb25lKHRoaXMpfWVsc2V7aD1pLk1hdGhKYXguZWxlbWVudEpheD10aGlzO2lmKGkuaWQpe3RoaXMuaW5wdXRJRD1pLmlkfWVsc2V7aS5pZD10aGlzLmlucHV0SUQ9Yi5FbGVtZW50SmF4LkdldElEKCk7dGhpcy5uZXdJRD0xfX1oLm9yaWdpbmFsVGV4dD1iLkhUTUwuZ2V0U2NyaXB0KGkpO2guaW5wdXRKYXg9ajtpZihoLnJvb3Qpe2gucm9vdC5pbnB1dElEPWguaW5wdXRJRH1yZXR1cm4gaH0sRGV0YWNoOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5Tb3VyY2VFbGVtZW50KCk7aWYoIWgpe3JldHVybn10cnl7ZGVsZXRlIGguTWF0aEpheH1jYXRjaChpKXtoLk1hdGhKYXg9bnVsbH1pZih0aGlzLm5ld0lEKXtoLmlkPSIifX0sQ2xvbmU6ZnVuY3Rpb24oaCl7dmFyIGk7Zm9yKGkgaW4gdGhpcyl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoaSkpe2NvbnRpbnVlfWlmKHR5cGVvZihoW2ldKT09PSJ1bmRlZmluZWQiJiZpIT09Im5ld0lEIil7ZGVsZXRlIHRoaXNbaV19fWZvcihpIGluIGgpe2lmKCFoLmhhc093blByb3BlcnR5KGkpKXtjb250aW51ZX1pZih0eXBlb2YodGhpc1tpXSk9PT0idW5kZWZpbmVkInx8KHRoaXNbaV0hPT1oW2ldJiZpIT09ImlucHV0SUQiKSl7dGhpc1tpXT1oW2ldfX19fSx7aWQ6IkVsZW1lbnRKYXgiLHZlcnNpb246IjIuNy41IixkaXJlY3Rvcnk6Zy5kaXJlY3RvcnkrIi9lbGVtZW50IixleHRlbnNpb25EaXI6Zy5leHRlbnNpb25EaXIsSUQ6MCxTVEFURTp7UEVORElORzoxLFBST0NFU1NFRDoyLFVQREFURTozLE9VVFBVVDo0fSxHZXRJRDpmdW5jdGlvbigpe3RoaXMuSUQrKztyZXR1cm4iTWF0aEpheC1FbGVtZW50LSIrdGhpcy5JRH0sU3ViY2xhc3M6ZnVuY3Rpb24oKXt2YXIgaD1nLlN1YmNsYXNzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtoLmxvYWRDb21wbGV0ZT10aGlzLnByb3RvdHlwZS5sb2FkQ29tcGxldGU7cmV0dXJuIGh9fSk7Yi5FbGVtZW50SmF4LnByb3RvdHlwZS5TVEFURT1iLkVsZW1lbnRKYXguU1RBVEU7Yi5PdXRwdXRKYXguRXJyb3I9e2lkOiJFcnJvciIsdmVyc2lvbjoiMi43LjUiLGNvbmZpZzp7fSxlcnJvcnM6MCxDb250ZXh0TWVudTpmdW5jdGlvbigpe3JldHVybiBiLkV4dGVuc2lvbi5NYXRoRXZlbnRzLkV2ZW50LkNvbnRleHRNZW51LmFwcGx5KGIuRXh0ZW5zaW9uLk1hdGhFdmVudHMuRXZlbnQsYXJndW1lbnRzKX0sTW91c2Vkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRXh0ZW5zaW9uLk1hdGhFdmVudHMuRXZlbnQuQWx0Q29udGV4dE1lbnUuYXBwbHkoYi5FeHRlbnNpb24uTWF0aEV2ZW50cy5FdmVudCxhcmd1bWVudHMpfSxnZXRKYXhGcm9tTWF0aDpmdW5jdGlvbihoKXtyZXR1cm4oaC5uZXh0U2libGluZy5NYXRoSmF4fHx7fSkuZXJyb3J9LEpheDpmdW5jdGlvbihqLGkpe3ZhciBoPU1hdGhKYXguSHViLmlucHV0SmF4W2kudHlwZS5yZXBsYWNlKC8gKjsoLnxccykqLywiIildO3RoaXMuZXJyb3JzKys7cmV0dXJue2lucHV0SmF4OihofHx7aWQ6IkVycm9yIn0pLmlkLG91dHB1dEpheDoiRXJyb3IiLGlucHV0SUQ6Ik1hdGhKYXgtRXJyb3ItIit0aGlzLmVycm9ycyxzb3VyY2VNZW51VGl0bGU6WyJFcnJvck1lc3NhZ2UiLCJFcnJvciBNZXNzYWdlIl0sc291cmNlTWVudUZvcm1hdDoiRXJyb3IiLG9yaWdpbmFsVGV4dDpNYXRoSmF4LkhUTUwuZ2V0U2NyaXB0KGkpLGVycm9yVGV4dDpqfX19O2IuSW5wdXRKYXguRXJyb3I9e2lkOiJFcnJvciIsdmVyc2lvbjoiMi43LjUiLGNvbmZpZzp7fSxzb3VyY2VNZW51VGl0bGU6WyJPcmlnaW5hbCIsIk9yaWdpbmFsIEZvcm0iXX19KSgiTWF0aEpheCIpOyhmdW5jdGlvbihvKXt2YXIgaD13aW5kb3dbb107aWYoIWgpe2g9d2luZG93W29dPXt9fXZhciBkPWguSHViO3ZhciBzPWQuU3RhcnR1cDt2YXIgdz1kLmNvbmZpZzt2YXIgZz1kb2N1bWVudC5oZWFkfHwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSk7aWYoIWcpe2c9ZG9jdW1lbnQuY2hpbGROb2Rlc1swXX12YXIgYj0oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2lmKGIubGVuZ3RoPT09MCYmZy5uYW1lc3BhY2VVUkkpe2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhnLm5hbWVzcGFjZVVSSSwic2NyaXB0Iil9dmFyIGY9bmV3IFJlZ0V4cCgiKF58LykiK28rIlxcLmpzKFxcPy4qKT8kIik7Zm9yKHZhciBxPWIubGVuZ3RoLTE7cT49MDtxLS0pe2lmKChiW3FdLnNyY3x8IiIpLm1hdGNoKGYpKXtzLnNjcmlwdD1iW3FdLmlubmVySFRNTDtpZihSZWdFeHAuJDIpe3ZhciB0PVJlZ0V4cC4kMi5zdWJzdHIoMSkuc3BsaXQoL1wmLyk7Zm9yKHZhciBwPTAsbD10Lmxlbmd0aDtwPGw7cCsrKXt2YXIgbj10W3BdLm1hdGNoKC8oLiopPSguKikvKTtpZihuKXtzLnBhcmFtc1t1bmVzY2FwZShuWzFdKV09dW5lc2NhcGUoblsyXSl9ZWxzZXtzLnBhcmFtc1t0W3BdXT10cnVlfX19dy5yb290PWJbcV0uc3JjLnJlcGxhY2UoLyhefFwvKVteXC9dKihcPy4qKT8kLywiIik7aC5BamF4LmNvbmZpZy5yb290PXcucm9vdDtoLkFqYXgucGFyYW1zPXMucGFyYW1zO2JyZWFrfX12YXIgaz1uYXZpZ2F0b3IudXNlckFnZW50O3ZhciBhPXtpc01hYzoobmF2aWdhdG9yLnBsYXRmb3JtLnN1YnN0cigwLDMpPT09Ik1hYyIpLGlzUEM6KG5hdmlnYXRvci5wbGF0Zm9ybS5zdWJzdHIoMCwzKT09PSJXaW4iKSxpc01TSUU6KCJBY3RpdmVYT2JqZWN0IiBpbiB3aW5kb3cmJiJjbGlwYm9hcmREYXRhIiBpbiB3aW5kb3cpLGlzRWRnZTooIk1TR2VzdHVyZUV2ZW50IiBpbiB3aW5kb3cmJiJjaHJvbWUiIGluIHdpbmRvdyYmd2luZG93LmNocm9tZS5sb2FkVGltZXM9PW51bGwpLGlzRmlyZWZveDooISFrLm1hdGNoKC9HZWNrb1wvLykmJiFrLm1hdGNoKC9saWtlIEdlY2tvLykpLGlzU2FmYXJpOighIWsubWF0Y2goLyAoQXBwbGUpP1dlYktpdFwvLykmJiFrLm1hdGNoKC8gbGlrZSBpUGhvbmUgLykmJighd2luZG93LmNocm9tZXx8d2luZG93LmNocm9tZS5hcHA9PW51bGwpKSxpc0Nocm9tZTooImNocm9tZSIgaW4gd2luZG93JiZ3aW5kb3cuY2hyb21lLmxvYWRUaW1lcyE9bnVsbCksaXNPcGVyYTooIm9wZXJhIiBpbiB3aW5kb3cmJndpbmRvdy5vcGVyYS52ZXJzaW9uIT1udWxsKSxpc0tvbnF1ZXJvcjooImtvbnF1ZXJvciIgaW4gd2luZG93JiZuYXZpZ2F0b3IudmVuZG9yPT0iS0RFIiksdmVyc2lvbkF0TGVhc3Q6ZnVuY3Rpb24oeSl7dmFyIHg9KHRoaXMudmVyc2lvbikuc3BsaXQoIi4iKTt5PShuZXcgU3RyaW5nKHkpKS5zcGxpdCgiLiIpO2Zvcih2YXIgej0wLGo9eS5sZW5ndGg7ejxqO3orKyl7aWYoeFt6XSE9eVt6XSl7cmV0dXJuIHBhcnNlSW50KHhbel18fCIwIik+PXBhcnNlSW50KHlbel0pfX1yZXR1cm4gdHJ1ZX0sU2VsZWN0OmZ1bmN0aW9uKGope3ZhciBpPWpbZC5Ccm93c2VyXTtpZihpKXtyZXR1cm4gaShkLkJyb3dzZXIpfXJldHVybiBudWxsfX07dmFyIGU9ay5yZXBsYWNlKC9eTW96aWxsYVwvKFxkK1wuKStcZCsgLywiIikucmVwbGFjZSgvW2Etel1bLWEtejAtOS5fOiBdK1wvXGQrW14gXSotW14gXSpcLihbYS16XVthLXpdKT9cZCsgL2ksIiIpLnJlcGxhY2UoL0dlbnRvbyB8VWJ1bnR1XC8oXGQrXC4pKlxkKyAoXChbXildKlwpICk/LywiIik7ZC5Ccm93c2VyPWQuSW5zZXJ0KGQuSW5zZXJ0KG5ldyBTdHJpbmcoIlVua25vd24iKSx7dmVyc2lvbjoiMC4wIn0pLGEpO2Zvcih2YXIgdiBpbiBhKXtpZihhLmhhc093blByb3BlcnR5KHYpKXtpZihhW3ZdJiZ2LnN1YnN0cigwLDIpPT09ImlzIil7dj12LnNsaWNlKDIpO2lmKHY9PT0iTWFjInx8dj09PSJQQyIpe2NvbnRpbnVlfWQuQnJvd3Nlcj1kLkluc2VydChuZXcgU3RyaW5nKHYpLGEpO3ZhciByPW5ldyBSZWdFeHAoIi4qKFZlcnNpb24vfCBUcmlkZW50Ly4qOyBydjopKCg/OlxcZCtcXC4pK1xcZCspfC4qKCIrdisiKSIrKHY9PSJNU0lFIj8iICI6Ii8iKSsiKCg/OlxcZCtcXC4pKlxcZCspfCg/Ol58XFwofCApKFthLXpdWy1hLXowLTkuXzogXSt8KD86QXBwbGUpP1dlYktpdCkvKCg/OlxcZCtcXC4pK1xcZCspIik7dmFyIHU9ci5leGVjKGUpfHxbIiIsIiIsIiIsInVua25vd24iLCIwLjAiXTtkLkJyb3dzZXIubmFtZT0odVsxXSE9IiI/djoodVszXXx8dVs1XSkpO2QuQnJvd3Nlci52ZXJzaW9uPXVbMl18fHVbNF18fHVbNl07YnJlYWt9fX10cnl7ZC5Ccm93c2VyLlNlbGVjdCh7U2FmYXJpOmZ1bmN0aW9uKGope3ZhciBpPXBhcnNlSW50KChTdHJpbmcoai52ZXJzaW9uKS5zcGxpdCgiLiIpKVswXSk7aWYoaT44NSl7ai53ZWJraXQ9ai52ZXJzaW9ufWlmKGk+PTUzOCl7ai52ZXJzaW9uPSI4LjAifWVsc2V7aWYoaT49NTM3KXtqLnZlcnNpb249IjcuMCJ9ZWxzZXtpZihpPj01MzYpe2oudmVyc2lvbj0iNi4wIn1lbHNle2lmKGk+PTUzNCl7ai52ZXJzaW9uPSI1LjEifWVsc2V7aWYoaT49NTMzKXtqLnZlcnNpb249IjUuMCJ9ZWxzZXtpZihpPj01MjYpe2oudmVyc2lvbj0iNC4wIn1lbHNle2lmKGk+PTUyNSl7ai52ZXJzaW9uPSIzLjEifWVsc2V7aWYoaT41MDApe2oudmVyc2lvbj0iMy4wIn1lbHNle2lmKGk+NDAwKXtqLnZlcnNpb249IjIuMCJ9ZWxzZXtpZihpPjg1KXtqLnZlcnNpb249IjEuMCJ9fX19fX19fX19ai53ZWJraXQ9KG5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9XZWJLaXRcLyhcZCspXC4vKSlbMV07ai5pc01vYmlsZT0obmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL01vYmlsZS9pKSE9bnVsbCk7ai5ub0NvbnRleHRNZW51PWouaXNNb2JpbGV9LEZpcmVmb3g6ZnVuY3Rpb24oail7aWYoKGoudmVyc2lvbj09PSIwLjAifHxrLm1hdGNoKC9GaXJlZm94Lyk9PW51bGwpJiZuYXZpZ2F0b3IucHJvZHVjdD09PSJHZWNrbyIpe3ZhciBtPWsubWF0Y2goL1tcLyBdcnY6KFxkK1wuXGQuKj8pW1wpIF0vKTtpZihtKXtqLnZlcnNpb249bVsxXX1lbHNle3ZhciBpPShuYXZpZ2F0b3IuYnVpbGRJRHx8bmF2aWdhdG9yLnByb2R1Y3RTdWJ8fCIwIikuc3Vic3RyKDAsOCk7aWYoaT49IjIwMTExMjIwIil7ai52ZXJzaW9uPSI5LjAifWVsc2V7aWYoaT49IjIwMTExMTIwIil7ai52ZXJzaW9uPSI4LjAifWVsc2V7aWYoaT49IjIwMTEwOTI3Iil7ai52ZXJzaW9uPSI3LjAifWVsc2V7aWYoaT49IjIwMTEwODE2Iil7ai52ZXJzaW9uPSI2LjAifWVsc2V7aWYoaT49IjIwMTEwNjIxIil7ai52ZXJzaW9uPSI1LjAifWVsc2V7aWYoaT49IjIwMTEwMzIwIil7ai52ZXJzaW9uPSI0LjAifWVsc2V7aWYoaT49IjIwMTAwMTIxIil7ai52ZXJzaW9uPSIzLjYifWVsc2V7aWYoaT49IjIwMDkwNjMwIil7ai52ZXJzaW9uPSIzLjUifWVsc2V7aWYoaT49IjIwMDgwNjE3Iil7ai52ZXJzaW9uPSIzLjAifWVsc2V7aWYoaT49IjIwMDYxMDI0Iil7ai52ZXJzaW9uPSIyLjAifX19fX19fX19fX19ai5pc01vYmlsZT0obmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL0FuZHJvaWQvaSkhPW51bGx8fGsubWF0Y2goLyBGZW5uZWNcLy8pIT1udWxsfHxrLm1hdGNoKC9Nb2JpbGUvKSE9bnVsbCl9LENocm9tZTpmdW5jdGlvbihpKXtpLm5vQ29udGV4dE1lbnU9aS5pc01vYmlsZT0hIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyBNb2JpbGVbIFwvXS8pfSxPcGVyYTpmdW5jdGlvbihpKXtpLnZlcnNpb249b3BlcmEudmVyc2lvbigpfSxFZGdlOmZ1bmN0aW9uKGkpe2kuaXNNb2JpbGU9ISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8gUGhvbmUvKX0sTVNJRTpmdW5jdGlvbihqKXtqLmlzTW9iaWxlPSEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvIFBob25lLyk7ai5pc0lFOT0hIShkb2N1bWVudC5kb2N1bWVudE1vZGUmJih3aW5kb3cucGVyZm9ybWFuY2V8fHdpbmRvdy5tc1BlcmZvcm1hbmNlKSk7TWF0aEpheC5IVE1MLnNldFNjcmlwdEJ1Zz0hai5pc0lFOXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPDk7TWF0aEpheC5IdWIubXNpZUhUTUxDb2xsZWN0aW9uQnVnPShkb2N1bWVudC5kb2N1bWVudE1vZGU8OSk7aWYoZG9jdW1lbnQuZG9jdW1lbnRNb2RlPDEwJiYhcy5wYXJhbXMuTm9NYXRoUGxheWVyKXt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIk1hdGhQbGF5ZXIuRmFjdG9yeS4xIik7ai5oYXNNYXRoUGxheWVyPXRydWV9Y2F0Y2gobSl7fXRyeXtpZihqLmhhc01hdGhQbGF5ZXIpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2kuaWQ9Im1hdGhwbGF5ZXIiO2kuY2xhc3NpZD0iY2xzaWQ6MzJGNjZBMjAtNzYxNC0xMUQ0LUJEMTEtMDAxMDRCRDNGOTg3IjtnLmFwcGVuZENoaWxkKGkpO2RvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCJtIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIpO2oubXBOYW1lc3BhY2U9dHJ1ZTtpZihkb2N1bWVudC5yZWFkeVN0YXRlJiYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJsb2FkaW5nInx8ZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJpbnRlcmFjdGl2ZSIpKXtkb2N1bWVudC53cml0ZSgnPD9pbXBvcnQgbmFtZXNwYWNlPSJtIiBpbXBsZW1lbnRhdGlvbj0iI01hdGhQbGF5ZXIiPicpO2oubXBJbXBvcnRlZD10cnVlfX1lbHNle2RvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCJtanhfSUVfZml4IiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIpfX1jYXRjaChtKXt9fX19KX1jYXRjaChjKXtjb25zb2xlLmVycm9yKGMubWVzc2FnZSl9ZC5Ccm93c2VyLlNlbGVjdChNYXRoSmF4Lk1lc3NhZ2UuYnJvd3NlcnMpO2lmKGguQXV0aG9yQ29uZmlnJiZ0eXBlb2YgaC5BdXRob3JDb25maWcuQXV0aG9ySW5pdD09PSJmdW5jdGlvbiIpe2guQXV0aG9yQ29uZmlnLkF1dGhvckluaXQoKX1kLnF1ZXVlPWguQ2FsbGJhY2suUXVldWUoKTtkLnF1ZXVlLlB1c2goWyJQb3N0IixzLnNpZ25hbCwiQmVnaW4iXSxbIkNvbmZpZyIsc10sWyJDb29raWUiLHNdLFsiU3R5bGVzIixzXSxbIk1lc3NhZ2UiLHNdLGZ1bmN0aW9uKCl7dmFyIGk9aC5DYWxsYmFjay5RdWV1ZShzLkpheCgpLHMuRXh0ZW5zaW9ucygpKTtyZXR1cm4gaS5QdXNoKHt9KX0sWyJNZW51IixzXSxzLm9uTG9hZCgpLGZ1bmN0aW9uKCl7TWF0aEpheC5pc1JlYWR5PXRydWV9LFsiVHlwZXNldCIsc10sWyJIYXNoIixzXSxbIk1lbnVab29tIixzXSxbIlBvc3QiLHMuc2lnbmFsLCJFbmQiXSl9KSgiTWF0aEpheCIpfX07Cg==
Protocol
HTTP/1.1
Server
2606:4700:3034::ac43:ac56 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 13 Jul 2020 21:35:38 GMT
Content-Encoding
gzip
CF-Cache-Status
MISS
Server
cloudflare
Vary
Accept-Encoding
Content-Type
text/html
Cache-Control
private, max-age=14400, must-revalidate
Transfer-Encoding
chunked
Connection
keep-alive
CF-RAY
5b26228c88bfbf05-FRA
cf-request-id
03ebb3ebd30000bf05d307e200000001
e208fce074
bam.nr-data.net/events/1/
24 B
184 B
XHR
General
Full URL
https://bam.nr-data.net/events/1/e208fce074?a=84293272&v=1167.2a4546b&to=Y1BXZBRVV0dUWkUKXFoaYEIPG1VbUlBfTFpaUVBISERRRA%3D%3D&rst=11827&ref=http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Requested by
Host: moodle.ucl.rrnn.me
URL: http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
162.247.242.19 San Francisco, United States, ASN23467 (NEWRELIC-AS-1, US),
Reverse DNS
Software
/
Resource Hash
0c9cf152a0ad00d4f102c93c613c104914be5517ac8f8e0831727f8bfbe8b300

Request headers

Referer
http://moodle.ucl.rrnn.me/client2request2id2e23d4a8d264aa2477a2aea326192e90104e52username22wa2wsignin1.02wtrealm2urn23afederation23aMicrosoftOnline2wctx2estsredirect/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
content-type
text/plain

Response headers

Access-Control-Allow-Origin
http://moodle.ucl.rrnn.me
Access-Control-Allow-Credentials
true
Content-Length
24
Content-Type
image/gif

Verdicts & Comments Add Verdict or Comment

52 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| google_tag_data function| ga object| gaplugins object| NREUM object| newrelic function| __nr_require object| MathJax object| M function| yui1ConfigFn function| yui2ConfigFn object| YUI_config function| gtag object| dataLayer object| google_tag_manager string| GoogleAnalyticsObject object| gaGlobal object| gaData object| Mustache function| $ function| jQuery function| YUI object| Y object| Pace function| checkall function| checknone function| select_all_in_element_with_id function| select_all_in function| deselect_all_in function| confirm_if function| findParentNode function| unmaskPassword function| filterByParent function| fix_column_widths function| fix_column_width function| insertAtCursor function| increment_filename function| right_to_left function| openpopup function| close_window function| focuscontrol function| old_onload_focus function| build_querystring function| build_windowoptionsstring function| convert_object_to_string function| stripHTML function| updateProgressBar object| ally_module_maps object| ally_section_maps object| ally_annotation_maps function| require function| requirejs function| define

4 Cookies

Domain/Path Name / Value
.rrnn.me/ Name: _gat_gtag_UA_4551567_3
Value: 1
.rrnn.me/ Name: _gid
Value: GA1.2.1883344776.1594676136
.rrnn.me/ Name: _ga
Value: GA1.2.1655290074.1594676136
.rrnn.me/ Name: __cfduid
Value: d4c90a0cf2f6d9e7068c59ffe78a317571594676136

Indicators

This is a term in the security industry to describe indicators such as IPs, Domains, Hashes, etc. This does not imply that any of these indicate malicious activity.

bam.nr-data.net
js-agent.newrelic.com
moodle.ucl.ac.uk
moodle.ucl.rrnn.me
www.google-analytics.com
www.ucl.ac.uk
151.101.114.110
162.247.242.19
193.60.250.24
193.60.250.82
2606:4700:3034::ac43:ac56
2a00:1450:4001:806::200e
0c86543afe1a6bbdb9a74fba061e2ca664557ddda1f299edf8ac8c5a25adeba8
0c9cf152a0ad00d4f102c93c613c104914be5517ac8f8e0831727f8bfbe8b300
13eaaadfa414f262b7964320054bb2b322b9ef9f3522bc25c9d60dc83b5141cf
1491de1b31182d38593bcf660c99bc6018af8e192d91663f67ec9d045a3b5ccc
15ac14c1ca8764c893d3d9afb8363d40e2ad97ef775d4c74122a6896e892a070
26d1a45d173703f01ca9bb8be4335bae6005c3bc0a5f78b380ad18fb152b8835
2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe
423ff14c52ec6925a505b7dc8420af419e877f056ea7a9d98b04b15c6c2ac1d1
449723b1d16bcd4fd32e34bcbd8f41a2ff7cfe84b939740a9417f71dd4f61479
4716cba143c796ec52cb2a097d569aef24d42df2b959f9dde09379664846ad5c
4b9f572393f50aa7fd63ba6ac5d3b39c1a4ee71e27766757a76821418c040650
4d8b560b0de451450b378976aadf95623e77714bfdcddf7a4602332d2c98d394
7d54882ec2e47c8a561f969a92d4694b9756c95bc2d02f8c1a03de8ea31fe3d8
7ff92f6245d134ec1746843c28b1710e468bf6d5731024426938e17680122c7e
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
87d3c5e03355bf60f1603a860425b44d849425708463613a57c354a2b18405c1
9c50a96c859b9beea47b71740bd14e7f69a4df586d015f47434037f8def53b52
9ef249bfdc162849bcf2abe8425f5e90bd89fa4fd1588b1a492731c65b2bbfc9
af44c83f737c501b3862145a4a30d18f780168a429f94c9a6ef90b71f464c858
bc44e3c31ade476e79495064cf8ff4f6bf63a8f3da772da617acacc39e221ac1
c0d8568fe6f9d837f664000f1973f22009d776aabb49bd6daf692912825f6e28
c84ccd409bc5fb9c6775ac51687454412823f821965d0cf80fc8f51986485dec
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
f4ae8a2c83e0a851fd331bbf34d7a6f9184b3e31b6f2e681e8377fb8a8edc10f
f69a13217482dc43f25e74cfcb9391d0f06d22501f10f5cb5e413d2d98a5cd23
fd361b57998c76f86335afa28b8a62527d88a8200fb5c428d6f0fff73383e955