Sailing Voyages
Offers
DESTINATIONS
Ships
Inspire Me
All Courses
Articles & News
More
Community Interest Company
Ask a Skipper
Contact Us
The Classic Sailing Team
Articles, News & Useful Guides
Frequently Asked Questions
Send Us Your Content!
Ask a Skipper
Find a Voyage
01326 531 234
Vessels
Any Vessel
Eendracht
Eye of the Wind
Johanna Lucretia
Moosk
Morgenster
Oosterschelde
Provident
Santa Maria Manuela
Tallulah
Tecla
The Boat Building Academy
Sailing Area
All Areas
Norway
Antarctica
Arctic
Atlantic
Azores
Baltic
Bay of Biscay
Brittany and Normandy
Canary Islands
Cape Verde
Caribbean
Cornwall
Devon
English Channel & Channel Islands
Europe
Falkland Isles
Faroes
France
Germany
Greenland
Hebrides
Holland
Iceland
Isles of Scilly
Lyme Regis
Madeira
North Sea
Ocean
Polar Regions
Scandinavia
Scotland
Shetland, Orkney & Fair Isle
South America
South Georgia
Spain and Portugal
St Kilda
UK
West Country
Voyage Type
Any Voyage Type
All Except Courses
Courses - afloat or ashore
Mile-Builder / Delivery
Residential Voyage with Night Watches & 24hr Sailing
Residential Voyage with Occasional Overnight Sailing
Residential Voyages, anchoring overnight
Round Trip (A to A)
RYA Courses
Taster Voyage
Voyages with Youth Prices
Voyaging (A to B)
Weekend Voyage
Duration
Any Duration
Day Trip
All but day sails
1-4 Nights
5-7 Nights
8-14 Nights
15+ Nights
Berth Type
Any Berth Type
4/5 person cabin pp
Youngster 18 -25 per person 4/5 person cabin
2 Person Cabin for Sole Occupancy
3 Berth Cabin Per Person
Double Bed berth, price per person
Ensuite Cabin
Four berth Cabin
Price per person
Single Berth in a Communal Space
Two Berth Cabins
Various berth and cabin options available
Voyage Activity
Any Voyage Activity
Boat building & woodwork
Coastal Sailing
Courses
Dinghy / Small Boat Sailing
Engineless Sailing
Events & Festivals
Expedition
Hiking
Island Hopping
Learn Traditional Navigation
Ocean passage
Sail and SUPs
Stargazing
Wellbeing & Health
Wild Camping
Wild Swimming
Wildlife & Bird Spotting
Winter Sun
Yoga
Voyage Skills
Any Voyage Skills
All comers including beginners
Beginners
Learn to sail a gaff rigged vessel
Learn to sail square rig
Practical navigation & pilotage
Recommended for Experienced Sailors
RYA Competent Crew
RYA Day Skipper
RYA Practical Courses at Sea
RYA Yachtmaster Prep & Exam
Sailing skills course
Small boat skills & beach craft
Try Astro Nav at Sea
Watch Leader Training
Woodwork & boatbuilding
More
Voyage Filters
My Voyage Planner
Classic Sailing Voyage Planner v0.20, 25 October 2026
PCEtLQogIENsYXNzaWMgU2FpbGluZyBQZXJzb25hbCBWb3lhZ2UgUGxhbm5lcgogIERyYWZ0IEhUTUwgdjAuMjAgKHRlc3QgYnVpbGQpIHwgMjUgT2N0b2JlciAyMDI2CiAgQ2hhbmdlcyBmcm9tIHYwLjE5OiBCb29rIHRoaXMgdm95YWdlIGJ1dHRvbiAobGlua3MgdG8gdGhlIHZveWFnZSBwYWdlLCBvcGVucyBpbiBhIG5ldyB0YWIpIGZvciBDbGFzc2ljIFNhaWxpbmcgdm95YWdlcywgaW4gUGxhbiBkZXRhaWxzIGFuZCBCdWRnZXQuCiAgQ2hhbmdlcyBmcm9tIHYwLjE4OiBwdWJsaWMgQmV0YSB3b3JkaW5nOyBhY2NvdW50IGFuZCBlbWFpbCB3b3JkaW5nIHJlbW92ZWQgdW50aWwgc2lnbiBpbiBleGlzdHM7IGFkdmljZSB0byBrZWVwIGEgY29weTsgQWxwaGEgd2lsbCBhZGQgc2lnbiBpbiBhbmQgZW5jcnlwdGlvbi4KICBDaGFuZ2VzIGZyb20gdjAuMTc6IERlbGV0ZSB0aGlzIHBsYW4gbGluayBvbiBlYWNoIHBsYW4gaW4gdGhlIGxpc3Q7IERlbGV0ZSBteSBwbGFubmVyICh3aG9sZSBwbGFubmVyKSByZW1vdmVkIGZyb20gdGhlIGxpc3QsIHRvIHJldHVybiBpbiBhY2NvdW50IHNldHRpbmdzIGluIFN0YWdlIDIuCiAgQ2hhbmdlcyBmcm9tIHYwLjE2OiAxOCBraXQgaXRlbXMgYWRkZWQgKGFsbCB2b3lhZ2VzLCBwbHVzIGNvbGQgYW5kIHBvbGFyIGl0ZW1zIHdpdGggY29tbWVudHMpOyA1IEZpbmFsIHdlZWsgaXRlbXMgYWRkZWQ7IHZveWFnZSBwYWdlIGtpdCBsaXN0cyBmb2xsb3dlZCBieSAiQWxzbyBzdWdnZXN0ZWQgYnkgQ2xhc3NpYyBTYWlsaW5nIi4KICBDaGFuZ2VzIGZyb20gdjAuMTU6IHZveWFnZSBudW1iZXJzIHdpdGggc2xhc2hlcyAoZm9yIGV4YW1wbGUgRVlFMjcvMDQpIHJlY29nbmlzZWQsIGFuZCB0aGUgc2VhcmNoIGNoZWNrcyBlYWNoIHBhZ2UgZm9yIHRoZSBudW1iZXI7IHByb2dyZXNzIHNob3duIGFzIHNlY3Rpb25zIGNvbXBsZXRlOyBjaGVja2xpc3Qgc2VjdGlvbnMgYXJlIGFjY29yZGlvbnMsIG9uZSBvcGVuIGF0IGEgdGltZTsgUERGIGNoZWNrbGlzdCBzZWN0aW9ucyBpbiB0d28gY29sdW1ucy4KICBDaGFuZ2VzIGZyb20gdjAuMTQ6IGJlcnRoIHR5cGVzLCBhdmFpbGFiaWxpdHksIHByaWNlIGFuZCBvZmZlciBwcmljZSBpbXBvcnRlZDsgbnVtYmVyIG9mIHBlb3BsZSBwZXIgYmVydGg7IHZveWFnZSBjb3N0IGluIFBsYW4gZGV0YWlscywgQnVkZ2V0LCB0b3RhbHMsIHByaW50IGFuZCBjb3B5OyB3YWl0aW5nIGxpc3Qgbm90ZSBmb3IgZnVsbCBiZXJ0aHM7IG9mZmVyIHByaWNlIHdhcm5pbmc7IG51bWJlciBvZiBwZW9wbGUgZm9yIG90aGVyIHBsYW4gdHlwZXMuCiAgQ2hhbmdlcyBmcm9tIHYwLjEzOiBwbGFuIHR5cGUgY2hvc2VuIG9uY2UgYXQgdGhlIHN0YXJ0OyBQbGFuIGRldGFpbHMgc2hvd3MgaXQgYXMgb25lIGxpbmUgd2l0aCBhIGNoYW5nZSBsaW5rLgogIENoYW5nZXMgZnJvbSB2MC4xMjogdmVyc2lvbiBudW1iZXIgc2hvd24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBXb3JkUHJlc3MgcGFzdGUgZmlsZSBhbmQgYXQgdGhlIGZvb3Qgb2YgdGhlIHBsYW5uZXIuCiAgQ2hhbmdlcyBmcm9tIHYwLjExOiBQbGFuIHR5cGUgY2hvaWNlIHJlcGxhY2VzIFJlc2VhcmNoaW5nIG9yIEJvb2tlZDsgdm95YWdlIGxvb2t1cCBvbmx5IGZvciBDbGFzc2ljIFNhaWxpbmcgdm95YWdlczsgIkp1c3QgcmVzZWFyY2hpbmc/IiBwcml2YWN5IG5vdGU7IHBsYWNlaG9sZGVyIHRleHQgc3R5bGVkIGdyZXkgYW5kIG5vcm1hbCBjYXNlIHNvIGVtcHR5IGJveGVzIG5vIGxvbmdlciBsb29rIGZpbGxlZCBpbi4KICBDaGFuZ2VzIGZyb20gdjAuMTA6IG1vcmUgc3BhY2UgYmV0d2VlbiBmcmFtZXMgYW5kIHRleHQgaW4gdGhlIHByaW50ZWQgUERGLgogIENoYW5nZXMgZnJvbSB2MC45OiBQcmludCBvciBzYXZlIGFzIFBERiBub3cgcHJvZHVjZXMgYSBjbGVhbiBBNCBkb2N1bWVudCB3aXRoIGEgQ2xhc3NpYyBTYWlsaW5nIGhlYWRpbmcsIHRpY2sgYm94ZXMsIHBhZ2UgbnVtYmVycyBhbmQgbm9uZSBvZiB0aGUgd2Vic2l0ZSBhcm91bmQgaXQ7IGVtcHR5IG9yIG5vbiB2b3lhZ2UgbGlua3Mgbm8gbG9uZ2VyIHNhdmVkIGFzIHRoZSB2b3lhZ2UgcGFnZS4KICBDaGFuZ2VzIGZyb20gdjAuODogY2F1dGlvbiBhZGRlZCB0byBTZWN0aW9uIEQgcGFzc3BvcnQgaXRlbSAoYWx3YXlzIHNob3duKS4KICBDaGFuZ2VzIGZyb20gdjAuNzogY2hlY2tsaXN0IHNpbXBsaWZpZWQ7IGVhY2ggaXRlbSBpcyBhIHRpY2sgZm9yIERvbmUsIHBsdXMgQWRkIG5vdGUsIHBsdXMgZGV0YWlscyBvbmx5IHdoZXJlIHRoZSBpdGVtIGhvbGRzIGZhY3RzIChwYXltZW50cywgaW5zdXJhbmNlLCB0cmF2ZWwsIGNvbnRhY3QpLiBOb3QgeWV0IGJ1dHRvbiByZW1vdmVkLiBOb3RlcyBhbmQgZGV0YWlscyBzdGF5IHZpc2libGUgd2hlbiBkb25lLgogIENoYW5nZXMgZnJvbSB2MC42OiBmaXhlZCBpbnZpc2libGUgdGV4dCBpbiB0aGUgdm95YWdlIG51bWJlciBib3gsIGJ1dHRvbnMgYW5kIGxhYmVscyAoY2xhc2ggd2l0aCB0aGUgdGhlbWUgY2xhc3MgInJvdyIpOyBwb3NzaWJsZSBzdG9wb3ZlcnMgbm93IHJlYWQgZnJvbSB0aGUgaGVhZGluZ3MgdXNlZCBvbiBsaXZlIHZveWFnZSBwYWdlcy4KICBDaGFuZ2VzIGZyb20gdjAuNTogbGFyZ2VyIHRleHQgKHNpemVzIG5vdyBzZXQgYnkgdGhlIHBsYW5uZXIsIG5vdCB0aGUgd2Vic2l0ZSB0aGVtZSk7IGR1cGxpY2F0ZSBoZWFkaW5nIHJlbW92ZWQgZnJvbSB0aGUgaG9tZSB2aWV3LgogIENoYW5nZXMgZnJvbSB2MC40OiBuZXcgcGxhbiBzdGFydHMgYnkgY2hvb3NpbmcgQSBDbGFzc2ljIFNhaWxpbmcgdm95YWdlLCBBbm90aGVyIHNhaWxpbmcgdm95YWdlIG9yIEFub3RoZXIgdHJpcDsgQ2xhc3NpYyBTYWlsaW5nIHZveWFnZXMKICB0YWtlIGEgdm95YWdlIG51bWJlciBvciBwYWdlIGxpbmssIHBsdXMgUmVzZWFyY2hpbmcgb3IgQm9va2VkOyB2b3lhZ2UgbnVtYmVyIHBpY2tzIHRoZSBleGFjdCBkYXRlOyBDaGVja2xpc3QgbW92ZWQgbmVhciB0aGUgZW5kIG9mIHRoZSB0YWJzLgogIENoYW5nZXMgZnJvbSB2MC4zOiB2b3lhZ2UgaW1wb3J0IGFsc28gcmVhZHMgdGhlIEtpdCBMaXN0IChXaGF0IHRvIEJyaW5nIGFzIHRpY2sgYm94ZXM7IEluY2x1ZGVkIGFuZCBOb3QgaW5jbHVkZWQgc2hvd24gZm9yIGluZm9ybWF0aW9uKS4KICBDaGFuZ2VzIGZyb20gdjAuMjogS2l0IGFuZCBwYWNraW5nIGlzIG5vdyBhIHNpbXBsZSB0aWNrIGxpc3QuCiAgQ2hhbmdlcyBmcm9tIHYwLjE6IE15IGN1cnJlbmN5IHNldHRpbmcgd2l0aCBhcHByb3hpbWF0ZSBjb252ZXJzaW9uczsgY3VycmVuY3kgb24gZXZlcnkgY29zdDsgdGltZXMgb24gcGxhbiBkYXRlcyBhbmQgZHVlIGRhdGVzOwogIGltcG9ydCBmcm9tIGEgQ2xhc3NpYyBTYWlsaW5nIHZveWFnZSBwYWdlOyBkYXRlIHJhbmdlcyBpbiB0aGUgb3V0bGluZTsgcGxhbm5pbmcgYXNzaXN0YW50IHdvcmRpbmcgYW5kIGdyZXllZCBvdXQgYnV0dG9uOwogIFNoYXJlIG9yIHByaW50IHRhYiByZXBsYWNlZCBieSBhIGZ1bGwgUmV2aWV3LCBwcmludCBvciBzaGFyZSB2aWV3LgogIFBhc3RlIGludG8gYSBjbGFzc2ljLXNhaWxpbmcuY29tIHBhZ2UgKEN1c3RvbSBIVE1MIGJsb2NrKS4gVGhlIHNpdGUgaGVhZGVyIGFuZCBmb290ZXIgc3RheSBhcyB0aGV5IGFyZS4KICBURVNUIEJVSUxEOiBwbGFucyBhcmUgc2F2ZWQgb25seSBpbiB0aGUgdGVzdGVyJ3Mgb3duIGJyb3dzZXIgKGxvY2FsU3RvcmFnZSkuIE5vIGxvZ2luLCBubyBlbmNyeXB0aW9uLgogIEV4Y2hhbmdlIHJhdGVzIGNvbWUgZnJvbSBmcmFua2Z1cnRlci5hcHAgKEV1cm9wZWFuIENlbnRyYWwgQmFuayByZWZlcmVuY2UgcmF0ZXMsIG5vIGFjY291bnQgbmVlZGVkKS4KICBWb3lhZ2UgaW1wb3J0IG9ubHkgd29ya3Mgd2hlbiB0aGlzIHBhZ2UgaXMgb24gY2xhc3NpYy1zYWlsaW5nLmNvbSAodGhlIGJyb3dzZXIgYmxvY2tzIHJlYWRpbmcgb3RoZXIgc2l0ZXMpLgotLT4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUZyYXVuY2VzOndnaHRANTAwOzYwMCZmYW1pbHk9SUJNK1BsZXgrU2Fuczp3Z2h0QDQwMDs2MDA7NzAwJmZhbWlseT1JQk0rUGxleCtNb25vOndnaHRANDAwOzYwMCZkaXNwbGF5PXN3YXAiPgo8c3R5bGU+CiNjc3ZwewogIC0tYmc6I2Y1ZjZmODsgLS1zdXJmYWNlOiNmZmZmZmY7IC0taW5rOiMwMDNmNTA7IC0tbXV0ZWQ6IzVhNzQ4MDsgLS1saW5lOiNkNmUwZTQ7CiAgLS1ibHVlOiMxZGFkYzI7IC0tb3JhbmdlOiNlZmEyMzk7IC0tZ29vZDojMWY3YTRkOyAtLWNyaXQ6I2E4MzMyYzsgLS1jaGlwOiNlYWYzZjU7CiAgYmFja2dyb3VuZDp2YXIoLS1iZyk7IGNvbG9yOnZhcigtLWluayk7CiAgZm9udC1mYW1pbHk6IklCTSBQbGV4IFNhbnMiLCJTZWdvZSBVSSIsc3lzdGVtLXVpLHNhbnMtc2VyaWYhaW1wb3J0YW50O2ZvbnQtc2l6ZToxN3B4IWltcG9ydGFudDtsaW5lLWhlaWdodDoxLjUhaW1wb3J0YW50OwogIHBhZGRpbmc6MjRweCAxNnB4IDQ4cHg7IGJvcmRlci1yYWRpdXM6MTRweDsgYm94LXNpemluZzpib3JkZXItYm94Owp9CiNjc3ZwICp7Ym94LXNpemluZzpib3JkZXItYm94fQojY3N2cCBkaXYsI2NzdnAgcCwjY3N2cCBzcGFuLCNjc3ZwIGxhYmVsLCNjc3ZwIGxpLCNjc3ZwIHRkLCNjc3ZwIGR0LCNjc3ZwIGRkLCNjc3ZwIGEsI2NzdnAgYiwjY3N2cCBpe2xpbmUtaGVpZ2h0OjEuNX0KI2NzdnAgLmxibHtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZToxLjAyZW07Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLWluayl9CiNjc3ZwIC5oaW50e2ZvbnQtc2l6ZTouOTJlbSFpbXBvcnRhbnR9CiNjc3ZwIGJ1dHRvbiwjY3N2cCBpbnB1dCwjY3N2cCBzZWxlY3QsI2NzdnAgdGV4dGFyZWF7Zm9udC1zaXplOi45NWVtIWltcG9ydGFudDtsaW5lLWhlaWdodDoxLjN9CiNjc3ZwIC53cmFwe21heC13aWR0aDo4NjBweDttYXJnaW46MCBhdXRvfQojY3N2cCBoMiwjY3N2cCBoMywjY3N2cCBoNCwjY3N2cCAuZGlzcGxheXtmb250LWZhbWlseToiRnJhdW5jZXMiLEdlb3JnaWEsc2VyaWY7Y29sb3I6dmFyKC0taW5rKTttYXJnaW46MH0KI2NzdnAgaDJ7Zm9udC1zaXplOjEuNmVtO2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjRweH0KI2NzdnAgaDN7Zm9udC1zaXplOjEuMWVtO2ZvbnQtd2VpZ2h0OjYwMH0KI2NzdnAgaDR7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo2MDA7bWFyZ2luOjE2cHggMCA2cHh9CiNjc3ZwIC5zdWJ7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTouOTJlbTttYXJnaW46MCAwIDE2cHh9CiNjc3ZwIC5tb25ve2ZvbnQtZmFtaWx5OiJJQk0gUGxleCBNb25vIixtb25vc3BhY2U7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zfQojY3N2cCAuYmFubmVye2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlKTtib3JkZXItbGVmdDo0cHggc29saWQgdmFyKC0tYmx1ZSk7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MTRweDtmb250LXNpemU6LjllbX0KI2NzdnAgLmJhbm5lciBzdHJvbmd7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjJweH0KI2NzdnAgLmJhbm5lci50ZXN0e2JvcmRlci1sZWZ0LWNvbG9yOnZhcigtLW9yYW5nZSk7YmFja2dyb3VuZDojZmZmOGVjfQojY3N2cCAuY2FyZHtiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6MTRweCAxNnB4O21hcmdpbi1ib3R0b206MTBweDtwb3NpdGlvbjpyZWxhdGl2ZX0KI2NzdnAgLmNhcmQuc3QtZG9uZXtib3JkZXItbGVmdDo0cHggc29saWQgdmFyKC0tZ29vZCl9CiNjc3ZwIC5jYXJkLnN0LW5vdHlldHtib3JkZXItbGVmdDo0cHggc29saWQgdmFyKC0tY3JpdCl9CiNjc3ZwIC5jYXJkLm92ZXJkdWV7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkIHZhcigtLWNyaXQpO2JhY2tncm91bmQ6I2ZkZjNmMn0KI2NzdnAgLmN2cm93e2ZvbnQtc2l6ZTppbmhlcml0IWltcG9ydGFudDtjbGVhcjpub25lO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcH0KI2NzdnAgLmdyb3d7ZmxleDoxIDEgYXV0bzttaW4td2lkdGg6MH0KCiNjc3ZwIC5oaW50e2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6Ljg0ZW07bWFyZ2luLXRvcDoycHh9CiNjc3ZwIC5hcHByb3h7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTouOGVtO2ZvbnQtZmFtaWx5OiJJQk0gUGxleCBNb25vIixtb25vc3BhY2V9CiNjc3ZwIGJ1dHRvbntmb250OmluaGVyaXQ7Y3Vyc29yOnBvaW50ZXJ9CiNjc3ZwIC5idG57Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzo3cHggMTRweDtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOi44MmVtO2NvbG9yOiNmZmY7YmFja2dyb3VuZDp2YXIoLS1pbmspfQojY3N2cCAuYnRuOmRpc2FibGVke2JhY2tncm91bmQ6I2I5YzdjYztjb2xvcjojZWVmM2Y1O2N1cnNvcjpub3QtYWxsb3dlZH0KI2NzdnAgLmJ0bjpmb2N1cy12aXNpYmxlLCNjc3ZwIC5saW5rOmZvY3VzLXZpc2libGUsI2NzdnAgaW5wdXQ6Zm9jdXMtdmlzaWJsZSwjY3N2cCBzZWxlY3Q6Zm9jdXMtdmlzaWJsZSwjY3N2cCB0ZXh0YXJlYTpmb2N1cy12aXNpYmxle291dGxpbmU6MnB4IHNvbGlkIHZhcigtLWJsdWUpO291dGxpbmUtb2Zmc2V0OjJweH0KI2NzdnAgLmJ0bi5kb25le2JhY2tncm91bmQ6dmFyKC0tZ29vZCl9CiNjc3ZwIC5idG4ubm90eWV0e2JhY2tncm91bmQ6dmFyKC0tY3JpdCl9CiNjc3ZwIC5idG4ubm90ZXtiYWNrZ3JvdW5kOnZhcigtLWJsdWUpfQojY3N2cCAuYnRuLmZpbmFse2JhY2tncm91bmQ6dmFyKC0tb3JhbmdlKTtjb2xvcjojM2EyNTAwfQojY3N2cCAuYnRuLmdob3N0e2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6dmFyKC0taW5rKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2ZvbnQtd2VpZ2h0OjYwMH0KI2NzdnAgLmJ0bi5zbWFsbHtwYWRkaW5nOjRweCAxMHB4O2ZvbnQtc2l6ZTouNzhlbX0KI2NzdnAgLmFjdGlvbnN7ZGlzcGxheTpmbGV4O2dhcDo2cHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLXRvcDoxMHB4fQojY3N2cCAubGlua3tiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y29sb3I6dmFyKC0tbXV0ZWQpO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Zm9udC1zaXplOi44ZW07cGFkZGluZzowfQojY3N2cCBhLmF7Y29sb3I6dmFyKC0tYmx1ZSl9CiNjc3ZwIC5jaGlwe2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7cGFkZGluZzozcHggMTBweDtib3JkZXItcmFkaXVzOjk5cHg7Zm9udC1zaXplOi43NmVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojZmZmfQojY3N2cCAuY2hpcC5kb25le2JhY2tncm91bmQ6dmFyKC0tZ29vZCl9CiNjc3ZwIC5jaGlwLm5vdHlldHtiYWNrZ3JvdW5kOnZhcigtLWNyaXQpfQojY3N2cCAuY2hpcC5ub3Rle2JhY2tncm91bmQ6dmFyKC0tYmx1ZSl9CiNjc3ZwIC5jaGlwLmZpbmFse2JhY2tncm91bmQ6dmFyKC0tb3JhbmdlKTtjb2xvcjojM2EyNTAwfQojY3N2cCAuY2hpcC5wbGFpbntiYWNrZ3JvdW5kOnZhcigtLWNoaXApO2NvbG9yOnZhcigtLWluayl9CiNjc3ZwIC5jaGlwIC50e2ZvbnQtd2VpZ2h0OjQwMDtvcGFjaXR5Oi45O2ZvbnQtZmFtaWx5OiJJQk0gUGxleCBNb25vIixtb25vc3BhY2V9CiNjc3ZwIC5wYW5lbHttYXJnaW4tdG9wOjEwcHg7cGFkZGluZzoxMHB4IDEycHg7YmFja2dyb3VuZDp2YXIoLS1jaGlwKTtib3JkZXItcmFkaXVzOjhweH0KI2NzdnAgLm5vdGV0ZXh0e3doaXRlLXNwYWNlOnByZS13cmFwO2ZvbnQtc2l6ZTouODhlbTtjb2xvcjp2YXIoLS1pbmspO21hcmdpbi10b3A6OHB4O3BhZGRpbmc6OHB4IDEwcHg7YmFja2dyb3VuZDp2YXIoLS1jaGlwKTtib3JkZXItcmFkaXVzOjhweH0KI2NzdnAgLmZhY3Rze21hcmdpbi10b3A6OHB4O2ZvbnQtc2l6ZTouODZlbTtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOm1heC1jb250ZW50IDFmcjtnYXA6MnB4IDEycHh9CiNjc3ZwIC5mYWN0cyBkdHtjb2xvcjp2YXIoLS1tdXRlZCl9ICNjc3ZwIC5mYWN0cyBkZHttYXJnaW46MDtmb250LXdlaWdodDo2MDB9CiNjc3ZwIGxhYmVsLmZ7ZGlzcGxheTpibG9jaztmb250LXNpemU6LjhlbTtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbjo2cHggMCAycHh9CiNjc3ZwIGlucHV0W3R5cGU9dGV4dF0sI2NzdnAgaW5wdXRbdHlwZT11cmxdLCNjc3ZwIGlucHV0W3R5cGU9ZGF0ZV0sI2NzdnAgaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sI2NzdnAgaW5wdXRbdHlwZT1udW1iZXJdLCNjc3ZwIHNlbGVjdCwjY3N2cCB0ZXh0YXJlYXsKICB3aWR0aDoxMDAlO2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzo3cHggMTBweDtmb250OmluaGVyaXQ7Zm9udC1zaXplOi45ZW07YmFja2dyb3VuZDojZmZmO2NvbG9yOnZhcigtLWluayl9CiNjc3ZwIHRleHRhcmVhe21pbi1oZWlnaHQ6NjRweDtyZXNpemU6dmVydGljYWx9CiNjc3ZwIC5ncmlkMntkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjAgMTJweH0KI2NzdnAgLmdyaWQze2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MmZyIDFmciAxZnI7Z2FwOjAgMTJweH0KQG1lZGlhIChtYXgtd2lkdGg6NjAwcHgpeyNjc3ZwIC5ncmlkMiwjY3N2cCAuZ3JpZDN7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn19CiNjc3ZwIC53YXJue2ZvbnQtc2l6ZTouNzhlbTtjb2xvcjp2YXIoLS1jcml0KTttYXJnaW4tdG9wOjZweH0KI2NzdnAgLm9re2ZvbnQtc2l6ZTouODRlbTtjb2xvcjp2YXIoLS1nb29kKTttYXJnaW4tdG9wOjZweH0KI2NzdnAgZGV0YWlscy5zZWN7bWFyZ2luOjAgMCA4cHg7YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JvcmRlci1yYWRpdXM6MTJweDtvdmVyZmxvdzpoaWRkZW59CiNjc3ZwIGRldGFpbHMuc2VjID4gc3VtbWFyeXtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtwYWRkaW5nOjE0cHggMTZweH0KI2NzdnAgZGV0YWlscy5zZWMgPiBzdW1tYXJ5OmhvdmVye2JhY2tncm91bmQ6I2Y4ZmJmY30KI2NzdnAgZGV0YWlscy5zZWMgPiBzdW1tYXJ5Ojotd2Via2l0LWRldGFpbHMtbWFya2Vye2Rpc3BsYXk6bm9uZX0KI2NzdnAgZGV0YWlscy5zZWMgLmNoZXZ7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItdG9wOjdweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOjdweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItbGVmdDoxMXB4IHNvbGlkIHZhcigtLWJsdWUpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4yc30KI2NzdnAgZGV0YWlscy5zZWNbb3Blbl0gLmNoZXZ7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9CiNjc3ZwIGRldGFpbHMuc2VjW29wZW5dID4gc3VtbWFyeXtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1saW5lKX0KI2NzdnAgZGV0YWlscy5zZWMuY29tcCAuY291bnR7Y29sb3I6dmFyKC0tZ29vZCk7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtZmFtaWx5OmluaGVyaXR9CiNjc3ZwIGRldGFpbHMuc2VjIC5zZWNib2R5e3BhZGRpbmc6NHB4IDE2cHggMTJweH0KI2NzdnAgZGV0YWlscy5zZWMgLnNlY2JvZHkgPiAuY2FyZHtib3JkZXI6bm9uZTtwYWRkaW5nOjA7bWFyZ2luOjB9CiNjc3ZwIC5jb3VudHtmb250LWZhbWlseToiSUJNIFBsZXggTW9ubyIsbW9ub3NwYWNlO2ZvbnQtc2l6ZTouOGVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tbGVmdDphdXRvfQojY3N2cCAuYmFye2hlaWdodDo4cHg7YmFja2dyb3VuZDp2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjk5cHg7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbjo2cHggMCAycHh9CiNjc3ZwIC5iYXIgPiBpe2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDp2YXIoLS1nb29kKTtib3JkZXItcmFkaXVzOjk5cHh9CiNjc3ZwIC50YWJze2Rpc3BsYXk6ZmxleDtnYXA6NnB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbjoxNHB4IDB9CiNjc3ZwIC50YWJ7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UpO2NvbG9yOnZhcigtLWluayk7Ym9yZGVyLXJhZGl1czo5OXB4O3BhZGRpbmc6NnB4IDE0cHg7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZTouODZlbX0KI2NzdnAgLnRhYlthcmlhLXNlbGVjdGVkPXRydWVde2JhY2tncm91bmQ6dmFyKC0taW5rKTtjb2xvcjojZmZmO2JvcmRlci1jb2xvcjp2YXIoLS1pbmspfQojY3N2cCB0YWJsZXt3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6Ljg2ZW19CiNjc3ZwIHRoe3RleHQtYWxpZ246bGVmdDtmb250LXNpemU6LjcyZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi4wNGVtO2NvbG9yOnZhcigtLW11dGVkKTtwYWRkaW5nOjZweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1saW5lKX0KI2NzdnAgdGR7cGFkZGluZzo2cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tbGluZSk7dmVydGljYWwtYWxpZ246dG9wfQojY3N2cCAudGFibGV3cmFwe292ZXJmbG93LXg6YXV0b30KI2NzdnAgLnRvdGFsc3tkaXNwbGF5OmZsZXg7Z2FwOjE2cHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLXRvcDoxMHB4O2ZvbnQtc2l6ZTouOWVtfQojY3N2cCAudG90YWxzIGJ7Zm9udC1mYW1pbHk6IklCTSBQbGV4IE1vbm8iLG1vbm9zcGFjZX0KI2NzdnAgLnBsYW5jYXJke2N1cnNvcjpwb2ludGVyfQojY3N2cCAucGxhbmNhcmQ6aG92ZXJ7Ym9yZGVyLWNvbG9yOnZhcigtLWJsdWUpfQojY3N2cCAudGFne2ZvbnQtc2l6ZTouN2VtO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjA0ZW07cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTlweDtiYWNrZ3JvdW5kOnZhcigtLWNoaXApO2NvbG9yOnZhcigtLWluayl9CiNjc3ZwIC5ydi1pdGVte3BhZGRpbmc6NXB4IDA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tbGluZSk7Zm9udC1zaXplOi45ZW19CiNjc3ZwIC5ydi1pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lfQojY3N2cCAucnYtbWFya3tkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDo1LjJlbTtmb250LXNpemU6LjcyZW07Zm9udC13ZWlnaHQ6NzAwO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouMDNlbX0KI2NzdnAgLnJ2LW1hcmsuZG9uZXtjb2xvcjp2YXIoLS1nb29kKX0gI2NzdnAgLnJ2LW1hcmsubm90eWV0e2NvbG9yOnZhcigtLWNyaXQpfSAjY3N2cCAucnYtbWFyay5vcGVue2NvbG9yOnZhcigtLW11dGVkKX0KI2NzdnAgLnJ2LXN1YnttYXJnaW4tbGVmdDo1LjJlbTtmb250LXNpemU6Ljg0ZW07Y29sb3I6dmFyKC0tbXV0ZWQpfQojY3N2cCBpbnB1dDo6cGxhY2Vob2xkZXIsI2NzdnAgdGV4dGFyZWE6OnBsYWNlaG9sZGVye2NvbG9yOiM4ZmEzYWIhaW1wb3J0YW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiM4ZmEzYWIhaW1wb3J0YW50O3RleHQtdHJhbnNmb3JtOm5vbmUhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OjQwMCFpbXBvcnRhbnQ7bGV0dGVyLXNwYWNpbmc6MCFpbXBvcnRhbnQ7Zm9udC1zdHlsZTppdGFsaWMhaW1wb3J0YW50O29wYWNpdHk6MSFpbXBvcnRhbnR9CiNjc3ZwIC50aWNre2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzo3cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1saW5lKX0KI2NzdnAgLnRpY2s6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOm5vbmV9CiNjc3ZwIC50aWNrIGxhYmVse2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDoxMHB4O2ZsZXg6MSAxIGF1dG87Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOi45MmVtfQojY3N2cCAudGljayBpbnB1dHt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O21hcmdpbjoxcHggMCAwO2FjY2VudC1jb2xvcjojMWY3YTRkO2ZsZXg6MCAwIGF1dG99CiNjc3ZwIC50aWNrIGlucHV0OmNoZWNrZWQgKyBzcGFue2NvbG9yOnZhcigtLW11dGVkKTt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdofQojY3N2cCAuY3ZpdGVte3BhZGRpbmc6NnB4IDA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tbGluZSl9CiNjc3ZwIC5jdml0ZW06bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOm5vbmV9CiNjc3ZwIC5jdml0ZW0gLnRpY2t7Ym9yZGVyLWJvdHRvbTpub25lO3BhZGRpbmc6NHB4IDB9CiNjc3ZwIC5jdml0ZW0ub3ZlcmR1ZXtiYWNrZ3JvdW5kOiNmZGYzZjI7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkIHZhcigtLWNyaXQpO3BhZGRpbmctbGVmdDoxMHB4O21hcmdpbi1sZWZ0Oi0xNHB4fQojY3N2cCAuaXRlbXN1YnttYXJnaW4tbGVmdDozMHB4fQojY3N2cCAuaXRlbWxpbmtze2Rpc3BsYXk6ZmxleDtnYXA6MTRweDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tdG9wOjJweH0KI2NzdnAgLml0ZW1saW5rcyAubGlua3tjb2xvcjp2YXIoLS1ibHVlKTt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LXdlaWdodDo2MDB9CiNjc3ZwIC5pdGVtbGlua3MgLmxpbms6bGFzdC1jaGlsZHtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC13ZWlnaHQ6NDAwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9CiNjc3ZwIC50b2FzdHtwb3NpdGlvbjpmaXhlZDtsZWZ0OjE2cHg7cmlnaHQ6MTZweDtib3R0b206MTZweDttYXgtd2lkdGg6NTIwcHg7bWFyZ2luOjAgYXV0bztiYWNrZ3JvdW5kOnZhcigtLWluayk7Y29sb3I6I2ZmZjtwYWRkaW5nOjEwcHggMTRweDtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOi44OGVtO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDE0MCUpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4yNXMgZWFzZTt6LWluZGV4Ojk5OTl9CiNjc3ZwIC50b2FzdC5zaG93e3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfQojY3N2cCAuaGlkZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fQpAbWVkaWEgcHJpbnR7CiAgI2NzdnB7YmFja2dyb3VuZDojZmZmO3BhZGRpbmc6MH0KICAjY3N2cCAubm9wcmludCwjY3N2cCAuYWN0aW9ucywjY3N2cCAubGluaywjY3N2cCAudGFicywjY3N2cCAudG9hc3R7ZGlzcGxheTpub25lIWltcG9ydGFudH0KICAjY3N2cCAuY2FyZHticmVhay1pbnNpZGU6YXZvaWR9Cn0KPC9zdHlsZT4KCjxkaXYgaWQ9ImNzdnAiIGFyaWEtbGl2ZT0icG9saXRlIj4KICA8ZGl2IGNsYXNzPSJ3cmFwIiBpZD0iY3N2cC1hcHAiPjwvZGl2PgogIDxkaXYgY2xhc3M9Im5vcHJpbnQiIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0O2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiM4ZmEzYWI7bWFyZ2luLXRvcDoxMHB4Ij5Wb3lhZ2UgUGxhbm5lciB2MC4yMCBCZXRhPC9kaXY+CiAgPGRpdiBjbGFzcz0idG9hc3QiIGlkPSJjc3ZwLXRvYXN0IiByb2xlPSJzdGF0dXMiPjwvZGl2Pgo8L2Rpdj4KCjxzY3JpcHQ+CihmdW5jdGlvbigpewoidXNlIHN0cmljdCI7Cgp2YXIgQ1VSUkVOQ0lFUz1bIkdCUCIsIkVVUiIsIlVTRCIsIk5PSyIsIlNFSyIsIkRLSyIsIkNIRiIsIkNBRCIsIkFVRCIsIk5aRCJdOwoKLyogLS0tLS0tLS0tLSBNYXN0ZXIgY2hlY2tsaXN0IChvd25lcjogQWRhbSkgLS0tLS0tLS0tLSAqLwp2YXIgRiA9IHsKICBkYXRlOntrOiJkYXRlIixsOiJEYXRlIix0OiJkYXRlIn0sCiAgcmVmOntrOiJyZWYiLGw6IlJlZmVyZW5jZSIsdDoidGV4dCJ9LAogIGFtb3VudDp7azoiYW1vdW50IixsOiJBbW91bnQiLHQ6Im51bWJlciJ9LAogIGN1cjp7azoiY3VyIixsOiJDdXJyZW5jeSIsdDoiY3VycmVuY3kifSwKICBkdWU6e2s6ImR1ZSIsbDoiRHVlIGRhdGUgYW5kIHRpbWUiLHQ6ImRhdGV0aW1lLWxvY2FsIn0sCiAgcGFpZDp7azoicGFpZCIsbDoiRGF0ZSBwYWlkIix0OiJkYXRlIn0sCiAgd2hhdDp7azoid2hhdCIsbDoiV2hhdCBmb3IiLHQ6InRleHQifSwKICB0cmF2ZWw6W3trOiJtb2RlIixsOiJUcmFuc3BvcnQiLHQ6InRleHQifSx7azoicmVmIixsOiJCb29raW5nIHJlZmVyZW5jZSIsdDoidGV4dCJ9LHtrOiJkZXAiLGw6IkRlcGFydHMiLHQ6ImRhdGV0aW1lLWxvY2FsIn0se2s6ImFyciIsbDoiQXJyaXZlcyIsdDoiZGF0ZXRpbWUtbG9jYWwifV0sCiAgc3RheTpbe2s6Im5hbWUiLGw6Ik5hbWUiLHQ6InRleHQifSx7azoiYWRkciIsbDoiQWRkcmVzcyIsdDoidGV4dCJ9LHtrOiJwaG9uZSIsbDoiUGhvbmUiLHQ6InRleHQifSx7azoiY2hlY2tpbiIsbDoiQ2hlY2sgaW4iLHQ6ImRhdGV0aW1lLWxvY2FsIn1dLAogIGpvaW5pbmc6W3trOiJ0aW1lIixsOiJKb2luaW5nIGRhdGUgYW5kIHRpbWUiLHQ6ImRhdGV0aW1lLWxvY2FsIn0se2s6InBsYWNlIixsOiJCZXJ0aCBvciBxdWF5Iix0OiJ0ZXh0In0se2s6InBob25lIixsOiJWZXNzZWwgcGhvbmUiLHQ6InRleHQifV0sCiAgaW5zdXJhbmNlOlt7azoiaW5zdXJlciIsbDoiSW5zdXJlciIsdDoidGV4dCJ9LHtrOiJwb2xpY3kiLGw6IlBvbGljeSBudW1iZXIiLHQ6InRleHQifSx7azoiaGVscGxpbmUiLGw6IkVtZXJnZW5jeSBoZWxwbGluZSIsdDoidGV4dCJ9XSwKICBjb250YWN0Olt7azoibmFtZSIsbDoiTmFtZSIsdDoidGV4dCJ9LHtrOiJyZWwiLGw6IlJlbGF0aW9uc2hpcCIsdDoidGV4dCJ9LHtrOiJwaG9uZSIsbDoiUGhvbmUiLHQ6InRleHQifV0sCiAgZ2VuZXJhbDpbe2s6ImRldGFpbCIsbDoiQ29uZmlybWVkIGRldGFpbCIsdDoidGV4dCJ9XQp9Owp2YXIgTUFTVEVSID0gWwoge2lkOiJBIix0aXRsZToiQ2hvb3NpbmcgeW91ciB2b3lhZ2UiLHNhaWxpbmc6dHJ1ZSxpdGVtczpbCiAge2lkOiJBMSIsbDoiUmVhZCB0aGUgZnVsbCB2b3lhZ2UgcGFnZSwgaW5jbHVkaW5nIHRoZSDigJxXaG8gdGhpcyB2b3lhZ2Ugc3VpdHPigJ0gc2VjdGlvbiJ9LAogIHtpZDoiQTIiLGw6IkNoZWNrIHRoZSBmaXRuZXNzIGFuZCBtb2JpbGl0eSBndWlkYW5jZSBmb3IgdGhpcyB2ZXNzZWwifSwKICB7aWQ6IkEzIixsOiJDaGVjayB0aGUgYWdlIGxpbWl0cyBhbmQgYW55IGV4cGVyaWVuY2UgbmVlZGVkIn0sCiAge2lkOiJBNCIsbDoiVW5kZXJzdGFuZCB0aGUgdm95YWdlIHN0eWxlIChBY3RpdmUgU2FpbGluZyBWb3lhZ2Ugb3IgU2FpbGluZyBIb2xpZGF5KSBhbmQgd2hldGhlciB0aGVyZSBhcmUgbmlnaHQgd2F0Y2hlcyJ9LAogIHtpZDoiQTUiLGw6IkNoZWNrIHRoZSBhY2NvbW1vZGF0aW9uIChzaGFyZWQgY2FiaW5zLCBtaXhlZCBvciBzaW5nbGUgc2V4LCBidW5rIHR5cGUpIn0sCiAge2lkOiJBNiIsbDoiUXVlc3Rpb25zIGFuc3dlcmVkIGJ5IENsYXNzaWMgU2FpbGluZyIsaDoiVXNlIEFkZCBub3RlIGZvciB0aGUgYW5zd2VycyJ9XX0sCiB7aWQ6IkIiLHRpdGxlOiJCb29raW5nIGFuZCBwYXltZW50cyIsc2FpbGluZzp0cnVlLGl0ZW1zOlsKICB7aWQ6IkIxIixsOiJCb29raW5nIGZvcm0gc3VibWl0dGVkIixmOltGLmRhdGVdfSwKICB7aWQ6IkIyIixsOiJCb29raW5nIGNvbmZpcm1hdGlvbiByZWNlaXZlZCIsZjpbRi5yZWZdfSwKICB7aWQ6IkIzIixsOiJEZXBvc2l0IGR1ZSIsZjpbRi5hbW91bnQsRi5jdXIsRi5kdWVdLHBheTp0cnVlfSwKICB7aWQ6IkI0IixsOiJEZXBvc2l0IHBhaWQiLGY6W0YucGFpZF19LAogIHtpZDoiQjUiLGw6IkJhbGFuY2UgZHVlIixmOltGLmFtb3VudCxGLmN1cixGLmR1ZV0scGF5OnRydWV9LAogIHtpZDoiQjYiLGw6IkJhbGFuY2UgcGFpZCIsZjpbRi5wYWlkXX0sCiAge2lkOiJCNyIsbDoiQW55IG90aGVyIHBheW1lbnRzIGR1ZSIsaDoiRm9yIGV4YW1wbGUgYSBzdXBwbGVtZW50IG9yIG9wdGlvbmFsIGV4dHJhIixmOltGLndoYXQsRi5hbW91bnQsRi5jdXIsRi5kdWUsRi5wYWlkXSxwYXk6dHJ1ZX0sCiAge2lkOiJCOCIsbDoiSm9pbmluZyBpbnN0cnVjdGlvbnMgcmVjZWl2ZWQiLGY6Ri5qb2luaW5nfSwKICB7aWQ6IkI5IixsOiJWZXNzZWwncyBvd24gZm9ybXMgY29tcGxldGVkIGFuZCByZXR1cm5lZCIsaDoiRm9yIGV4YW1wbGUgdGhlIGhlYWx0aCBkZWNsYXJhdGlvbi4gU2VuZCB0aGVzZSBkaXJlY3QgdG8gdGhlIHZlc3NlbDsgZG8gbm90IHN0b3JlIHRoZW0gaGVyZS4ifV19LAoge2lkOiJDIix0aXRsZToiSW5zdXJhbmNlIGFuZCBoZWFsdGgiLGl0ZW1zOlsKICB7aWQ6IkMxIixsOiJUcmF2ZWwgaW5zdXJhbmNlIGJvdWdodCB0aGF0IGNvdmVycyBzYWlsaW5nIG9uIGEgdHJhZGl0aW9uYWwgdmVzc2VsIGF0IHNlYSwgYW5kIHJlcGF0cmlhdGlvbiIsZjpGLmluc3VyYW5jZX0sCiAge2lkOiJDMiIsbDoiR0hJQyAob3IgRUhJQykgcGFja2VkLCBmb3IgRXVyb3BlYW4gdm95YWdlcyJ9LAogIHtpZDoiQzMiLGw6IkVub3VnaCBwcmVzY3JpcHRpb24gbWVkaWNpbmUgZm9yIHRoZSB0cmlwIHBsdXMgYSBmZXcgc3BhcmUgZGF5cywgaW4gaGFuZCBsdWdnYWdlIn0sCiAge2lkOiJDNCIsbDoiU2Vhc2lja25lc3MgcmVtZWR5IGNob3NlbiBhbmQgdHJpZWQgYmVmb3JlIHRoZSB2b3lhZ2UiLHNhaWxpbmc6dHJ1ZX0sCiAge2lkOiJDNSIsbDoiVmFjY2luYXRpb25zIG9yIGhlYWx0aCBhZHZpY2UgY2hlY2tlZCwgZm9yIGxvbmcgaGF1bCBkZXN0aW5hdGlvbnMifSwKICB7aWQ6IkM2IixsOiJEZW50YWwgY2hlY2sgaWYgdGhlIHRyaXAgaXMgbG9uZyBvciByZW1vdGUifV19LAoge2lkOiJEIix0aXRsZToiVHJhdmVsIGRvY3VtZW50cyIsaXRlbXM6WwogIHtpZDoiRDEiLGw6IlBhc3Nwb3J0IHZhbGlkIGZvciB0aGUgd2hvbGUgdHJpcCAoYW5kIGZvciBhbnkgbGVuZ3RoIHRoZSBkZXN0aW5hdGlvbiByZXF1aXJlcykiLHc6Ik5vIHBhc3Nwb3J0IG51bWJlcnMsIG1lZGljYWwgZGV0YWlscyBvciBjYXJkIGRldGFpbHMsIHBsZWFzZS4ifSwKICB7aWQ6IkQyIixsOiJFbnRyeSBydWxlcyBjaGVja2VkIG9uIEdPVi5VSyBmb3JlaWduIHRyYXZlbCBhZHZpY2UiLGg6IlZpc2FzIG9yIGVsZWN0cm9uaWMgdHJhdmVsIGF1dGhvcmlzYXRpb25zIixsaW5rOiJodHRwczovL3d3dy5nb3YudWsvZm9yZWlnbi10cmF2ZWwtYWR2aWNlIn0sCiAge2lkOiJEMyIsbDoiQ29waWVzIG9mIGRvY3VtZW50cyBrZXB0IHNlcGFyYXRlbHkgZnJvbSB0aGUgb3JpZ2luYWxzIixoOiJOb3QgdXBsb2FkZWQgaGVyZSJ9LAogIHtpZDoiRDQiLGw6IkVtZXJnZW5jeSBjb250YWN0IGdpdmVuIHRvIENsYXNzaWMgU2FpbGluZyBhbmQgdGhlIHZlc3NlbCIsZjpGLmNvbnRhY3R9XX0sCiB7aWQ6IkUiLHRpdGxlOiJHZXR0aW5nIHRoZXJlIGFuZCBob21lIixpdGVtczpbCiAge2lkOiJFMSIsbDoiVHJhdmVsIHRvIHRoZSBqb2luaW5nIHBvcnQgYm9va2VkIixmOkYudHJhdmVsfSwKICB7aWQ6IkUyIixsOiJBcnJpdmFsIHRpbWUgbGVhdmVzIGEgbWFyZ2luIGJlZm9yZSBqb2luaW5nIHRpbWUifSwKICB7aWQ6IkUzIixsOiJBY2NvbW1vZGF0aW9uIGJvb2tlZCBmb3IgdGhlIG5pZ2h0IGJlZm9yZSwgaWYgbmVlZGVkIixmOkYuc3RheX0sCiAge2lkOiJFNCIsbDoiUm91dGUgZnJvbSBzdGF0aW9uIG9yIGFpcnBvcnQgdG8gdGhlIHF1YXkgY2hlY2tlZCIsaDoiVXNlIHRoZSBtYXAgbGluayBpbiBQbGFuIGRldGFpbHMifSwKICB7aWQ6IkU1IixsOiJUcmF2ZWwgaG9tZSBib29rZWQgd2l0aCBhIG1hcmdpbiIsaDoiVm95YWdlcyBjYW4gZmluaXNoIGxhdGUgb3IgZWFybHkgYmVjYXVzZSBvZiB3ZWF0aGVyIixmOkYudHJhdmVsfSwKICB7aWQ6IkU2IixsOiJBY2NvbW1vZGF0aW9uIGFmdGVyIHRoZSB0cmlwIGJvb2tlZCwgaWYgbmVlZGVkIixmOkYuc3RheX1dfSwKIHtpZDoiRiIsdGl0bGU6Ik1vbmV5IixpdGVtczpbCiAge2lkOiJGMSIsbDoiVHJpcCBjb3N0cyByZWNvcmRlZCBpbiB0aGUgYnVkZ2V0In0sCiAge2lkOiJGMiIsbDoiQ3VycmVuY3kgYW5kIGNhcmQgYXJyYW5nZW1lbnRzIGZvciB0aGUgZGVzdGluYXRpb24ifSwKICB7aWQ6IkYzIixsOiJDYXNoIGZvciBzaG9yZSB2aXNpdHMgYW5kIHRoZSBzaGlwJ3MgYmFyLCBpZiB0aGVyZSBpcyBvbmUifSwKICB7aWQ6IkY0IixsOiJCYW5rIHRvbGQgYWJvdXQgdHJhdmVsLCBpZiBuZWVkZWQifV19LAoge2lkOiJHIix0aXRsZToiS2l0IGFuZCBwYWNraW5nIixzYWlsaW5nOnRydWUsc2ltcGxlOnRydWUsaW50cm86IlRpY2sgZWFjaCBpdGVtIGFzIGl0IGdvZXMgaW4geW91ciBiYWcuIFlvdXIgdmVzc2VsJ3Mgb3duIGtpdCBsaXN0IChpbiB5b3VyIGpvaW5pbmcgaW5zdHJ1Y3Rpb25zKSBjb21lcyBmaXJzdCBpZiBpdCBkaWZmZXJzLiIsaXRlbXM6WwogIHtpZDoiRzEiLGw6IlZlc3NlbCBraXQgbGlzdCByZWFkIChmcm9tIGpvaW5pbmcgaW5zdHJ1Y3Rpb25zKSJ9LAogIHtpZDoiRzIiLGw6IlNvZnQgYmFnLCBub3QgYSBoYXJkIHN1aXRjYXNlIChzdG93cyBvbiBib2FyZCkifSwKICB7aWQ6IkczIixsOiJXYXRlcnByb29mIGphY2tldCBhbmQgdHJvdXNlcnMifSwKICB7aWQ6Ikc0IixsOiJOb24gbWFya2luZywgc29mdCBzb2xlZCBkZWNrIHNob2VzLCBwbHVzIHNlYSBib290cyBpZiBhZHZpc2VkIn0sCiAge2lkOiJHNSIsbDoiV2FybSBsYXllcnMgKGZsZWVjZSwgdGhlcm1hbCBiYXNlIGxheWVyKSwgZXZlbiBpbiBzdW1tZXIifSwKICB7aWQ6Ikc2IixsOiJIYXQsIGdsb3Zlcywgc3VuIGhhdCwgc3VuZ2xhc3NlcyB3aXRoIGEgc3RyYXAifSwKICB7aWQ6Ikc3IixsOiJTdW4gY3JlYW0gYW5kIGxpcCBiYWxtIn0sCiAge2lkOiJHOCIsbDoiSGVhZCB0b3JjaCwgaWRlYWxseSB3aXRoIGEgcmVkIGxpZ2h0IGZvciBuaWdodCB3YXRjaGVzIn0sCiAge2lkOiJHOSIsbDoiUmVmaWxsYWJsZSB3YXRlciBib3R0bGUifSwKICB7aWQ6IkcxMCIsbDoiU2xlZXBpbmcgYmFnIG9yIGJlZGRpbmcsIGlmIHRoZSB2ZXNzZWwgYXNrcyBmb3Igb25lIn0sCiAge2lkOiJHMTEiLGw6IkVhciBwbHVncyBhbmQgYW4gZXllIG1hc2sifSwKICB7aWQ6IkcxMiIsbDoiRHJ5IGJhZ3MgZm9yIHBob25lIGFuZCB2YWx1YWJsZXMifSwKICB7aWQ6IkcxMyIsbDoiUGhvbmUgY2hhcmdlciwgcG93ZXIgYmFuaywgcGx1ZyBhZGFwdG9yIn0sCiAge2lkOiJHMTQiLGw6IlNtYWxsIHdhdGVycHJvb2YgZGF5IHBhY2sgZm9yIHRyaXBzIGFzaG9yZSIseDp0cnVlfSwKICB7aWQ6IkcxNSIsbDoiTWVyaW5vIG9yIHdvb2wgYmFzZSBsYXllcnMgKHRoZXJtYWwgdG9wIGFuZCBsb25nIGpvaG5zKSIseDp0cnVlLGg6Ik5vdCBuZWVkZWQgaW4gaG90IGNsaW1hdGVzIn0sCiAge2lkOiJHMTYiLGw6Ildhcm0gaGF0IHRoYXQgY292ZXJzIHRoZSBlYXJzLCBhbmQgYSBuZWNrIGdhaXRlciAoYnVmZikgcmF0aGVyIHRoYW4gYSBzY2FyZiIseDp0cnVlLGg6Ik5vdCBuZWVkZWQgaW4gaG90IGNsaW1hdGVzIn0sCiAge2lkOiJHMTciLGw6IldvcmsgZ2xvdmVzIGZvciBoYW5kbGluZyB3ZXQgcm9wZXMiLHg6dHJ1ZX0sCiAge2lkOiJHMTgiLGw6IkNhc3VhbCBjbG90aGVzIGZvciBvZmYgd2F0Y2gsIGFuZCBvbmUgc2V0IGZvciBhbiBldmVuaW5nIGFzaG9yZSIseDp0cnVlfSwKICB7aWQ6IkcxOSIsbDoiU3dpbXdlYXIiLHg6dHJ1ZX0sCiAge2lkOiJHMjAiLGw6IlF1aWNrIGRyeWluZyB0cmF2ZWwgdG93ZWwiLHg6dHJ1ZX0sCiAge2lkOiJHMjEiLGw6Ildhc2ggYmFnLCBoYW5kIGdlbCBhbmQgYmlvZGVncmFkYWJsZSB3aXBlcyIseDp0cnVlfSwKICB7aWQ6IkcyMiIsbDoiU21hbGwgZmlyc3QgYWlkIGtpdCAocGxhc3RlcnMsIGJsaXN0ZXIgcGxhc3RlcnMsIHBhaW5raWxsZXJzLCByZWh5ZHJhdGlvbiBzYWNoZXRzLCBhbnRpc2VwdGljIGNyZWFtKSIseDp0cnVlfSwKICB7aWQ6IkcyMyIsbDoiU3BhcmUgZ2xhc3NlcyBvciBjb250YWN0IGxlbnNlcyIseDp0cnVlfSwKICB7aWQ6IkcyNCIsbDoiTmFtZSBsYWJlbHMgZm9yIHlvdXIga2l0Iix4OnRydWUsaDoiR2xvdmVzIGFuZCBqYWNrZXRzIGFsbCBsb29rIGFsaWtlIn0sCiAge2lkOiJHMjUiLGw6IkxhdW5kcnkgYmFnIix4OnRydWV9LAogIHtpZDoiRzI2IixsOiJOb3RlYm9vaywgcGVucyBhbmQgYSBib29rIix4OnRydWV9LAogIHtpZDoiRzI3IixsOiJEb3duIG9yIHN5bnRoZXRpYyBpbnN1bGF0ZWQgamFja2V0Iix4OnRydWUsaDoiRm9yIHBvbGFyIGFuZCBjb2xkIHJlZ2lvbnMifSwKICB7aWQ6IkcyOCIsbDoiV2F0ZXJwcm9vZiBvdmVyLW1pdHRlbnMgd2l0aCBsaW5lciBnbG92ZXMsIHBsdXMgc2tpLXR5cGUgZ2xvdmVzIix4OnRydWUsaDoiRm9yIHBvbGFyIGFuZCBjb2xkIHJlZ2lvbnMifSwKICB7aWQ6IkcyOSIsbDoiV2F0ZXJwcm9vZiBib290cyBmb3Igd2V0IGxhbmRpbmdzIix4OnRydWUsaDoiRm9yIHBvbGFyIHJlZ2lvbnMgYW5kIHdldCBsYW5kaW5ncyJ9LAogIHtpZDoiRzMwIixsOiJIYW5kIHdhcm1lcnMiLHg6dHJ1ZSxoOiJGb3IgcG9sYXIgYW5kIGNvbGQgcmVnaW9ucyJ9LAogIHtpZDoiRzMxIixsOiJDbG90aGluZywgYm9vdHMgYW5kIGJhZ3MgY2xlYW5lZCBvZiBzb2lsIGFuZCBzZWVkcyIseDp0cnVlLGg6IkZvciBBbnRhcmN0aWMgdm95YWdlcywgdG8gcHJvdGVjdCB0aGUgd2lsZGxpZmUifV19LAoge2lkOiJIIix0aXRsZToiRmluYWwgd2VlayIsaXRlbXM6WwogIHtpZDoiSDEiLGw6IkpvaW5pbmcgaW5zdHJ1Y3Rpb25zIHJlIHJlYWQiLHNhaWxpbmc6dHJ1ZX0sCiAge2lkOiJIMiIsbDoiV2VhdGhlciBvdXRsb29rIGNoZWNrZWQgZm9yIHRoZSBqb2luaW5nIHBvcnQiLHNhaWxpbmc6dHJ1ZX0sCiAge2lkOiJIMyIsbDoiVmVzc2VsIGFuZCBDbGFzc2ljIFNhaWxpbmcgcGhvbmUgbnVtYmVycyBzYXZlZCBpbiBwaG9uZSIsc2FpbGluZzp0cnVlfSwKICB7aWQ6Ikg0IixsOiJQbGFubmVyIHByaW50ZWQgb3Igc2F2ZWQgYXMgUERGIGZvciB1c2Ugd2l0aG91dCBzaWduYWwifSwKICB7aWQ6Ikg1IixsOiJIb21lIGFycmFuZ2VtZW50cyBtYWRlIChwZXRzLCBwb3N0LCBwbGFudHMpIn0sCiAge2lkOiJINiIsbDoiUGV0IGNhcmUgb3IgaG91c2Ugc2l0dGVyIGFycmFuZ2VkIn0sCiAge2lkOiJINyIsbDoiTmVpZ2hib3VycyB0b2xkIHlvdSBhcmUgYXdheSJ9LAogIHtpZDoiSDgiLGw6IkhlYXRpbmcsIHdhdGVyIGFuZCBmcmlkZ2Ugc29ydGVkIn0sCiAge2lkOiJIOSIsbDoiRW1lcmdlbmN5IHBob25lIG51bWJlcnMgd3JpdHRlbiBvbiBwYXBlciIsaDoiSW4gY2FzZSB5b3VyIHBob25lIGlzIGxvc3Qgb3IgZmxhdCJ9LAogIHtpZDoiSDEwIixsOiJQaG9uZSBzZXQgdXAgZm9yIHVzZSBhYnJvYWQgKHJvYW1pbmcgb3IgbG9jYWwgU0lNKSJ9XX0sCiB7aWQ6IkkiLHRpdGxlOiJBZnRlciB0aGUgdm95YWdlIixzYWlsaW5nOnRydWUsaXRlbXM6WwogIHtpZDoiSTEiLGw6IlNlYSBtaWxlcyBhbmQgZXhwZXJpZW5jZSBub3RlZCBpbiBhIGxvZyBib29rIn0sCiAge2lkOiJJMiIsbDoiUGhvdG9zIHNhdmVkIGFuZCBzaGFyZWQgd2l0aCBmZWxsb3cgY3JldyBpZiB3aXNoZWQifSwKICB7aWQ6IkkzIixsOiJSZXZpZXcgbGVmdCBmb3IgdGhlIHZveWFnZSJ9LAogIHtpZDoiSTQiLGw6Ik5leHQgdm95YWdlIGlkZWFzIG5vdGVkIixsaW5rOiJodHRwczovL3d3dy5jbGFzc2ljLXNhaWxpbmcuY29tLyJ9XX0sCiB7aWQ6IkoiLHRpdGxlOiJPdGhlciBkZXRhaWxzIixpdGVtczpbXX0KXTsKCi8qIC0tLS0tLS0tLS0gU3RvcmFnZSAodGVzdCBidWlsZDogdGhpcyBicm93c2VyIG9ubHkpIC0tLS0tLS0tLS0gKi8KdmFyIEtFWT0iY3N2cF90ZXN0X3YxIiwgc3RhdGU9e3BsYW5zOltdLGhvbWU6IkdCUCIscmF0ZXM6bnVsbH0sIHZpZXc9e3BsYW46bnVsbCx0YWI6ImNoZWNrbGlzdCIsb3Blbjp7fSxpbXBvcnRNc2c6IiJ9OwpmdW5jdGlvbiBsb2FkKCl7dHJ5e3ZhciBzPWxvY2FsU3RvcmFnZS5nZXRJdGVtKEtFWSk7IGlmKHMpe3N0YXRlPUpTT04ucGFyc2Uocyl8fHt9O319Y2F0Y2goZSl7c3RhdGU9e307fSBpZighc3RhdGUucGxhbnMpc3RhdGUucGxhbnM9W107IGlmKCFzdGF0ZS5ob21lKXN0YXRlLmhvbWU9IkdCUCI7CiAgc3RhdGUucGxhbnMuZm9yRWFjaChmdW5jdGlvbihwKXtpZighcC5jdXJyZW5jeSlwLmN1cnJlbmN5PSJHQlAiOyBpZighcC5kYXlzKXAuZGF5cz1bXTsgaWYoIXAuYnVkZ2V0KXAuYnVkZ2V0PVtdOyBpZighcC5wZW9wbGUpcC5wZW9wbGU9W107IGlmKCFwLmN1c3RvbSlwLmN1c3RvbT1bXTsgaWYoIXAuaGlkZGVuKXAuaGlkZGVuPVtdO30pO30KZnVuY3Rpb24gc2F2ZShtc2cpe3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShLRVksSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTt9Y2F0Y2goZSl7fSBpZihtc2cpdG9hc3QobXNnKTt9CmZ1bmN0aW9uIHVpZCgpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLDEwKTt9CmZ1bmN0aW9uIG5vdygpe3JldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7fQpmdW5jdGlvbiBwYWQobil7cmV0dXJuIChuPDEwPyIwIjoiIikrbjt9CmZ1bmN0aW9uIG5vd0xvY2FsKCl7dmFyIGQ9bmV3IERhdGUoKTsgcmV0dXJuIGQuZ2V0RnVsbFllYXIoKSsiLSIrcGFkKGQuZ2V0TW9udGgoKSsxKSsiLSIrcGFkKGQuZ2V0RGF0ZSgpKSsiVCIrcGFkKGQuZ2V0SG91cnMoKSkrIjoiK3BhZChkLmdldE1pbnV0ZXMoKSk7fQpmdW5jdGlvbiBmbXREYXRlKHYpewogIGlmKCF2KXJldHVybiAiIjsgdmFyIHM9U3RyaW5nKHYpOwogIHZhciBtPXMubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KSg/OlQoXGR7Mn0pOihcZHsyfSkpPy8pOwogIGlmKG0pe3ZhciBkPW5ldyBEYXRlKCttWzFdLCttWzJdLTEsK21bM10pOyB2YXIgb3V0PWQudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1HQiIse3dlZWtkYXk6InNob3J0IixkYXk6Im51bWVyaWMiLG1vbnRoOiJzaG9ydCIseWVhcjoibnVtZXJpYyJ9KTsKICAgIGlmKG1bNF0mJnMubGVuZ3RoPD0xNilvdXQrPSIsICIrbVs0XSsiOiIrbVs1XTsgcmV0dXJuIG91dDt9CiAgdmFyIGQyPW5ldyBEYXRlKHMpOyByZXR1cm4gaXNOYU4oZDIpP3M6ZDIudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1HQiIse2RheToibnVtZXJpYyIsbW9udGg6InNob3J0Iix5ZWFyOiJudW1lcmljIn0pOwp9CmZ1bmN0aW9uIGVzYyhzKXtyZXR1cm4gU3RyaW5nKHM9PW51bGw/IiI6cykucmVwbGFjZSgvWyY8PiInXS9nLGZ1bmN0aW9uKGMpe3JldHVybiB7IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCJcIiI6IiZxdW90OyIsIiciOiImIzM5OyJ9W2NdO30pO30KdmFyIHRvYXN0VDsgZnVuY3Rpb24gdG9hc3QobSl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNzdnAtdG9hc3QiKTsgdC50ZXh0Q29udGVudD1tOyB0LmNsYXNzTGlzdC5hZGQoInNob3ciKTsgY2xlYXJUaW1lb3V0KHRvYXN0VCk7IHRvYXN0VD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93Iik7fSwyNDAwKTt9CmZ1bmN0aW9uIG1vbmV5KG4sY3VyKXt2YXIgdj1OdW1iZXIobil8fDA7IHRyeXtyZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCJlbi1HQiIse3N0eWxlOiJjdXJyZW5jeSIsY3VycmVuY3k6Y3VyfHwiR0JQIn0pLmZvcm1hdCh2KTt9Y2F0Y2goZSl7cmV0dXJuIChjdXJ8fCIiKSsiICIrdi50b0ZpeGVkKDIpO319CmZ1bmN0aW9uIGN1clNlbGVjdChhdHRycyx2YWwpe3JldHVybiAnPHNlbGVjdCAnK2F0dHJzKyc+JytDVVJSRU5DSUVTLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gJzxvcHRpb24nKyh2YWw9PT1jPyIgc2VsZWN0ZWQiOiIiKSsnPicrYysnPC9vcHRpb24+Jzt9KS5qb2luKCIiKSsnPC9zZWxlY3Q+Jzt9CgovKiAtLS0tLS0tLS0tIEV4Y2hhbmdlIHJhdGVzIChhcHByb3hpbWF0ZSkgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiByYXRlc0ZyZXNoKCl7cmV0dXJuIHN0YXRlLnJhdGVzJiZzdGF0ZS5yYXRlcy5iYXNlPT09c3RhdGUuaG9tZSYmc3RhdGUucmF0ZXMuZmV0Y2hlZCYmKERhdGUubm93KCktc3RhdGUucmF0ZXMuZmV0Y2hlZDwxMiozNjAwKjEwMDApO30KZnVuY3Rpb24gZmV0Y2hSYXRlcyhmb3JjZSl7CiAgaWYoIWZvcmNlJiZyYXRlc0ZyZXNoKCkpcmV0dXJuOwogIHZhciB1cmxzPVsiaHR0cHM6Ly9hcGkuZnJhbmtmdXJ0ZXIuYXBwL2xhdGVzdD9mcm9tPSIrc3RhdGUuaG9tZSwiaHR0cHM6Ly9hcGkuZnJhbmtmdXJ0ZXIuZGV2L3YxL2xhdGVzdD9iYXNlPSIrc3RhdGUuaG9tZV07CiAgKGZ1bmN0aW9uIHRyeVVybChpKXsKICAgIGlmKGk+PXVybHMubGVuZ3RofHwhd2luZG93LmZldGNoKXJldHVybjsKICAgIGZldGNoKHVybHNbaV0pLnRoZW4oZnVuY3Rpb24ocil7aWYoIXIub2spdGhyb3cgMDsgcmV0dXJuIHIuanNvbigpO30pLnRoZW4oZnVuY3Rpb24oail7CiAgICAgIGlmKCFqfHwhai5yYXRlcyl0aHJvdyAwOyBzdGF0ZS5yYXRlcz17YmFzZTpzdGF0ZS5ob21lLGRhdGU6ai5kYXRlLHJhdGVzOmoucmF0ZXMsZmV0Y2hlZDpEYXRlLm5vdygpfTsgc2F2ZSgpOyByZW5kZXIoKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCl7dHJ5VXJsKGkrMSk7fSk7CiAgfSkoMCk7Cn0KLyogY29udmVydHMgYW1vdW50IGluIGN1ciB0byBob21lIGN1cnJlbmN5OyBudWxsIGlmIG5vdCBwb3NzaWJsZSAqLwpmdW5jdGlvbiB0b0hvbWUoYW10LGN1cil7CiAgYW10PU51bWJlcihhbXQpfHwwOyBpZighY3VyfHxjdXI9PT1zdGF0ZS5ob21lKXJldHVybiBhbXQ7CiAgaWYoIXN0YXRlLnJhdGVzfHxzdGF0ZS5yYXRlcy5iYXNlIT09c3RhdGUuaG9tZXx8IXN0YXRlLnJhdGVzLnJhdGVzW2N1cl0pcmV0dXJuIG51bGw7CiAgcmV0dXJuIGFtdC9zdGF0ZS5yYXRlcy5yYXRlc1tjdXJdOwp9CmZ1bmN0aW9uIGFwcHJveChhbXQsY3VyKXtpZighY3VyfHxjdXI9PT1zdGF0ZS5ob21lfHwhTnVtYmVyKGFtdCkpcmV0dXJuICIiOyB2YXIgdj10b0hvbWUoYW10LGN1cik7IHJldHVybiB2PT1udWxsPyc8c3BhbiBjbGFzcz0iYXBwcm94Ij4ocmF0ZSBub3QgYXZhaWxhYmxlKTwvc3Bhbj4nOic8c3BhbiBjbGFzcz0iYXBwcm94Ij7iiYggJyttb25leSh2LHN0YXRlLmhvbWUpKyc8L3NwYW4+Jzt9CmZ1bmN0aW9uIHJhdGVOb3RlKCl7cmV0dXJuIHN0YXRlLnJhdGVzJiZzdGF0ZS5yYXRlcy5iYXNlPT09c3RhdGUuaG9tZT8nQXBwcm94aW1hdGUgdmFsdWVzIHVzZSByZWZlcmVuY2UgcmF0ZXMgZnJvbSAnK2ZtdERhdGUoc3RhdGUucmF0ZXMuZGF0ZSkrJy4gQ2hlY2sgd2l0aCB5b3VyIGJhbmsgZm9yIHRoZSByZWFsIHJhdGUuJzonQXBwcm94aW1hdGUgdmFsdWVzIGFwcGVhciBvbmNlIGV4Y2hhbmdlIHJhdGVzIGhhdmUgbG9hZGVkLic7fQoKZnVuY3Rpb24gbmV3UGxhbih0eXBlKXsKICByZXR1cm4ge2lkOnVpZCgpLG5hbWU6dHlwZT09PSJzYWlsaW5nIj8iTXkgc2FpbGluZyBob2xpZGF5IjoiTXkgdHJpcCIsdHlwZTp0eXBlLHZlc3NlbDoiIixzdGFydDoiIixlbmQ6IiIsam9pblBvcnQ6IiIsbGVhdmVQb3J0OiIiLHZveWFnZVVybDoiIix2b3lhZ2VObzoiIixuaWdodHM6IiIscHJpY2U6IiIsCiAgICBjdXJyZW5jeTpzdGF0ZS5ob21lLGl0ZW1zOnt9LGN1c3RvbTpbXSxoaWRkZW46W10sb3RoZXJOb3RlczoiIixkYXlzOltdLGJ1ZGdldDpbXSxzcGxpdDpmYWxzZSxwZW9wbGU6W10sY3JlYXRlZDpub3coKX07Cn0KZnVuY3Rpb24gcGxhbigpe2Zvcih2YXIgaT0wO2k8c3RhdGUucGxhbnMubGVuZ3RoO2krKylpZihzdGF0ZS5wbGFuc1tpXS5pZD09PXZpZXcucGxhbilyZXR1cm4gc3RhdGUucGxhbnNbaV07IHJldHVybiBudWxsO30KCmZ1bmN0aW9uIHNlY3Rpb25zRm9yKHApewogIHZhciBvdXQ9W107CiAgTUFTVEVSLmZvckVhY2goZnVuY3Rpb24ocyl7CiAgICBpZihzLnNhaWxpbmcgJiYgcC50eXBlIT09InNhaWxpbmciKXJldHVybjsKICAgIHZhciBpdGVtcywgdmVzc2VsS2l0PWZhbHNlOwogICAgaWYocy5pZD09PSJHIiYmaGFzS2l0KHApJiYhcC5zaG93R2VuZXJhbEtpdCl7CiAgICAgIHZlc3NlbEtpdD10cnVlOyBpdGVtcz1wLmtpdC5icmluZy5tYXAoZnVuY3Rpb24obCxpKXtyZXR1cm4ge2lkOiJrIitpLGw6bH07fSkuY29uY2F0KHMuaXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGl0KXtyZXR1cm4gaXQueDt9KS5tYXAoZnVuY3Rpb24oaXQpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LGl0KTt9KSk7CiAgICB9IGVsc2UgaXRlbXM9cy5pdGVtcy5maWx0ZXIoZnVuY3Rpb24oaXQpe3JldHVybiAhKGl0LnNhaWxpbmcgJiYgcC50eXBlIT09InNhaWxpbmciKTt9KS5tYXAoZnVuY3Rpb24oaXQpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LGl0KTt9KTsKICAgIHAuY3VzdG9tLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoYy5zZWN0aW9uPT09cy5pZClpdGVtcy5wdXNoKHtpZDpjLmlkLGw6Yy5sLGY6Ri5nZW5lcmFsLGN1c3RvbTp0cnVlfSk7fSk7CiAgICBvdXQucHVzaCh7aWQ6cy5pZCx0aXRsZTpzLnRpdGxlLGl0ZW1zOml0ZW1zLHNpbXBsZTohIXMuc2ltcGxlLGludHJvOnMuaW50cm98fCIiLHZlc3NlbEtpdDp2ZXNzZWxLaXR9KTsKICB9KTsKICByZXR1cm4gb3V0Owp9CmZ1bmN0aW9uIGJlcnRoQ29zdChwKXt2YXIgdD0wLGM9IiIsbj0wOyAocC5iZXJ0aHN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBrPStiLm58fDA7IGlmKCFrKXJldHVybjsgdCs9ayooYi5vZmZlcnx8Yi5wcmljZSk7IGM9Y3x8Yi5jdXI7IG4rPWs7fSk7IHJldHVybiB7YW10OnQsY3VyOmN8fHAuY3VycmVuY3kscGVvcGxlOm59O30KZnVuY3Rpb24gcGFydHlTaXplKHApe3ZhciBiYz1iZXJ0aENvc3QocCk7IHJldHVybiBiYy5wZW9wbGV8fCgrcC5wYXJ0eXx8MCk7fQpmdW5jdGlvbiBib29rQmxvY2socCx0b3ApewogIGlmKHNyY09mKHApIT09ImNzInx8IXAudm95YWdlVXJsfHwhL2NsYXNzaWMtc2FpbGluZ1wuY29tXC92b3lhZ2VzXC8vaS50ZXN0KHAudm95YWdlVXJsKSlyZXR1cm4gIiI7CiAgcmV0dXJuICc8ZGl2IGNsYXNzPSJub3ByaW50IiBzdHlsZT0iJysodG9wPydtYXJnaW46MTJweCAwIDAnOidtYXJnaW46MTJweCAwIDA7cGFkZGluZy10b3A6MTJweDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lKScpKyciPicrCiAgICAnPGEgY2xhc3M9ImJ0biIgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQ6dmFyKC0tb3JhbmdlKTtjb2xvcjojM2EyNTAwO2ZvbnQtc2l6ZTouOTVlbTtwYWRkaW5nOjEwcHggMjBweCIgaHJlZj0iJytlc2MocC52b3lhZ2VVcmwpKyciIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj5Cb29rIHRoaXMgdm95YWdlPC9hPicrCiAgICAnPGRpdiBjbGFzcz0iaGludCI+T3BlbnMgdGhlIHZveWFnZSBwYWdlLCB3aGVyZSB5b3UgY2FuIGNob29zZSB5b3VyIGJlcnRoIGFuZCBib29rLiBOb3RoaW5nIGZyb20geW91ciBwbGFubmVyIGlzIHNlbnQgdG8gQ2xhc3NpYyBTYWlsaW5nLjwvZGl2PjwvZGl2Pic7Cn0KZnVuY3Rpb24gc3JjT2YocCl7cmV0dXJuIHAuc291cmNlfHwocC50eXBlPT09InNhaWxpbmciPyJjcyI6Im90aGVyIik7fQpmdW5jdGlvbiBoYXNLaXQocCl7cmV0dXJuIHAudHlwZT09PSJzYWlsaW5nIiYmcC5raXQmJnAua2l0LmJyaW5nJiZwLmtpdC5icmluZy5sZW5ndGg+MDt9CmZ1bmN0aW9uIHJlYyhwLGlkKXtyZXR1cm4gcC5pdGVtc1tpZF18fChwLml0ZW1zW2lkXT17c3RhdHVzOiIiLG5vdGU6IiIsZGV0YWlsczp7fSxhdDoiIn0pO30KZnVuY3Rpb24gaXNPdmVyZHVlKHAsaXQpewogIGlmKCFpdC5wYXkpcmV0dXJuIGZhbHNlOyB2YXIgcj1wLml0ZW1zW2l0LmlkXTsgaWYoIXJ8fCFyLmRldGFpbHN8fCFyLmRldGFpbHMuZHVlKXJldHVybiBmYWxzZTsKICByZXR1cm4gci5zdGF0dXMhPT0iZG9uZSIgJiYgIXIuZGV0YWlscy5wYWlkICYmIHIuZGV0YWlscy5kdWU8bm93TG9jYWwoKTsKfQoKLyogLS0tLS0tLS0tLSBSZW5kZXJpbmcgLS0tLS0tLS0tLSAqLwp2YXIgYXBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjc3ZwLWFwcCIpOwpmdW5jdGlvbiByZW5kZXIoKXsgaWYodmlldy5wbGFuICYmIHBsYW4oKSkgcmVuZGVyUGxhbigpOyBlbHNlIHt2aWV3LnBsYW49bnVsbDsgcmVuZGVySG9tZSgpO30gfQoKZnVuY3Rpb24gcHJpdmFjeUJhbm5lcigpewogIHJldHVybiAnPGRpdiBjbGFzcz0iYmFubmVyIj48c3Ryb25nPllvdXIgcGxhbm5lciBpcyBwcml2YXRlIHRvIHlvdS48L3N0cm9uZz5Ob3RoaW5nIHlvdSBlbnRlciBpcyBzZW50IHRvIENsYXNzaWMgU2FpbGluZywgc28gd2UgY2Fubm90IHNlZSB5b3VyIHBsYW5zLiAnKwogICdQbGVhc2UgZG8gbm90IHJlY29yZCBwYXNzcG9ydCBudW1iZXJzLCBtZWRpY2FsIGRldGFpbHMgb3IgcGF5bWVudCBjYXJkIGRldGFpbHMgaGVyZS48L2Rpdj4nKwogICc8ZGl2IGNsYXNzPSJiYW5uZXIgdGVzdCBub3ByaW50Ij48c3Ryb25nPkJldGEgdGVzdCB2ZXJzaW9uPC9zdHJvbmc+WW91ciBwbGFucyBhcmUgc2F2ZWQgb25seSBpbiB0aGlzIHdlYiBicm93c2VyIG9uIHRoaXMgZGV2aWNlLiBJZiB5b3UgY2xlYXIgeW91ciBicm93c2VyIGhpc3Rvcnkgb3IgdXNlIGFub3RoZXIgZGV2aWNlLCB0aGV5IHdpbGwgbm90IGJlIHRoZXJlLCAnKwogICdzbyB1c2UgRG93bmxvYWQgYSBjb3B5IG9mIG15IHBsYW5zLCBvciBwcmludCB5b3VyIHBsYW4sIHRvIGtlZXAgYSBjb3B5LiBXaGVuIHRoZSBwbGFubmVyIG1vdmVzIHRvIGl0cyBBbHBoYSB2ZXJzaW9uIHlvdSB3aWxsIHNpZ24gaW4sIHlvdXIgcGxhbnMgd2lsbCBiZSBlbmNyeXB0ZWQgc28gb25seSB5b3UgY2FuIHJlYWQgdGhlbSwgYW5kIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZW0gb24gYW55IGRldmljZS48L2Rpdj4nOwp9CgpmdW5jdGlvbiByZW5kZXJIb21lKCl7CiAgdmFyIGg9JzxwIGNsYXNzPSJzdWIiIHN0eWxlPSJmb250LXNpemU6MS4wNWVtIj5Zb3VyIHZveWFnZSBwbGFubmluZyBjaGVja2xpc3QsIHRyYXZlbCBkZXRhaWxzIGFuZCBjb3N0cyBpbiBvbmUgcHJpdmF0ZSBwbGFjZS48L3A+Jytwcml2YWN5QmFubmVyKCk7CiAgaCs9JzxkaXYgY2xhc3M9ImNhcmQgbm9wcmludCI+PGRpdiBjbGFzcz0iY3Zyb3ciPjxkaXYgY2xhc3M9Imdyb3ciPjxkaXYgY2xhc3M9ImxibCI+TXkgY3VycmVuY3k8L2Rpdj48ZGl2IGNsYXNzPSJoaW50Ij5Db3N0cyBpbiBvdGhlciBjdXJyZW5jaWVzIGFsc28gc2hvdyBhbiBhcHByb3hpbWF0ZSB2YWx1ZSBpbiB0aGlzIGN1cnJlbmN5LjwvZGl2PjwvZGl2PicrCiAgICAgJzxkaXYgc3R5bGU9IndpZHRoOjEyMHB4Ij4nK2N1clNlbGVjdCgnZGF0YS1hY3Q9ImhvbWVjdXIiIGFyaWEtbGFiZWw9Ik15IGN1cnJlbmN5Iicsc3RhdGUuaG9tZSkrJzwvZGl2PjwvZGl2PjwvZGl2Pic7CiAgaCs9JzxkaXYgY2xhc3M9ImNhcmQgbm9wcmludCI+PGRpdiBjbGFzcz0ibGJsIj5TdGFydCBhIG5ldyBwbGFuPC9kaXY+PGRpdiBjbGFzcz0iaGludCI+V2hhdCBhcmUgeW91IHBsYW5uaW5nPzwvZGl2PicrCiAgICAgJzxkaXYgY2xhc3M9ImFjdGlvbnMiPjxidXR0b24gY2xhc3M9ImJ0biIgZGF0YS1hY3Q9Im5ldyIgZGF0YS10eXBlPSJzYWlsaW5nIiBkYXRhLXNvdXJjZT0iY3MiPkEgQ2xhc3NpYyBTYWlsaW5nIHZveWFnZTwvYnV0dG9uPicrCiAgICAgJzxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCIgZGF0YS1hY3Q9Im5ldyIgZGF0YS10eXBlPSJzYWlsaW5nIiBkYXRhLXNvdXJjZT0ib3RoZXJzYWlsIj5Bbm90aGVyIHNhaWxpbmcgdm95YWdlPC9idXR0b24+JysKICAgICAnPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBkYXRhLWFjdD0ibmV3IiBkYXRhLXR5cGU9Im90aGVyIiBkYXRhLXNvdXJjZT0ib3RoZXIiPkFub3RoZXIgdHJpcDwvYnV0dG9uPjwvZGl2PicrCiAgICAgJzxkaXYgY2xhc3M9ImhpbnQiIHN0eWxlPSJtYXJnaW4tdG9wOjhweCI+Rm9yIGEgQ2xhc3NpYyBTYWlsaW5nIHZveWFnZSwgeW91IHRoZW4gdHlwZSB0aGUgdm95YWdlIG51bWJlciB0byBmaWxsIGluIHRoZSBkZXRhaWxzLjwvZGl2PjwvZGl2Pic7CiAgaWYoIXN0YXRlLnBsYW5zLmxlbmd0aCl7aCs9JzxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImxibCI+Tm8gcGxhbnMgeWV0PC9kaXY+PGRpdiBjbGFzcz0iaGludCI+U3RhcnQgYSBwbGFuIGFib3ZlLiBZb3UgY2FuIGtlZXAgYXMgbWFueSBwbGFucyBhcyB5b3UgbGlrZS48L2Rpdj48L2Rpdj4nO30KICBzdGF0ZS5wbGFucy5mb3JFYWNoKGZ1bmN0aW9uKHApewogICAgdmFyIHByPXByb2dyZXNzKHApOwogICAgaCs9JzxkaXYgY2xhc3M9ImNhcmQgcGxhbmNhcmQiIGRhdGEtYWN0PSJvcGVuIiBkYXRhLWlkPSInK3AuaWQrJyIgdGFiaW5kZXg9IjAiIHJvbGU9ImJ1dHRvbiI+PGRpdiBjbGFzcz0iY3Zyb3ciPjxkaXYgY2xhc3M9Imdyb3ciPjxkaXYgY2xhc3M9ImRpc3BsYXkiIHN0eWxlPSJmb250LXNpemU6MS4xZW0iPicrZXNjKHAubmFtZSkrJzwvZGl2PicrCiAgICAgICAnPGRpdiBjbGFzcz0iaGludCI+JysocC52ZXNzZWw/ZXNjKHAudmVzc2VsKSsnIMK3ICc6JycpKyhwLnN0YXJ0P2ZtdERhdGUocC5zdGFydCk6J0RhdGVzIG5vdCBzZXQnKSsocC5lbmQ/JyB0byAnK2ZtdERhdGUocC5lbmQpOicnKSsnPC9kaXY+PC9kaXY+JysKICAgICAgICc8c3BhbiBjbGFzcz0idGFnIj4nKyhwLnR5cGU9PT0ic2FpbGluZyI/IlNhaWxpbmcgdm95YWdlIjoiT3RoZXIgdHJpcCIpKyc8L3NwYW4+PC9kaXY+JysKICAgICAgICc8ZGl2IGNsYXNzPSJiYXIiPjxpIHN0eWxlPSJ3aWR0aDonK3ByLnBjdCsnJSI+PC9pPjwvZGl2PjxkaXYgY2xhc3M9ImN2cm93Ij48ZGl2IGNsYXNzPSJoaW50IGdyb3ciPicrcHJvZ3Jlc3NUZXh0KHByKSsnPC9kaXY+JysKICAgICAgICc8YnV0dG9uIGNsYXNzPSJsaW5rIG5vcHJpbnQiIGRhdGEtYWN0PSJkZWxwbGFuIiBkYXRhLWlkPSInK3AuaWQrJyIgYXJpYS1sYWJlbD0iRGVsZXRlICcrZXNjKHAubmFtZSkrJyIgc3R5bGU9ImNvbG9yOnZhcigtLWNyaXQpIj5EZWxldGUgdGhpcyBwbGFuPC9idXR0b24+PC9kaXY+PC9kaXY+JzsKICB9KTsKICBpZihzdGF0ZS5wbGFucy5sZW5ndGgpaCs9JzxkaXYgY2xhc3M9ImN2cm93IG5vcHJpbnQiIHN0eWxlPSJtYXJnaW4tdG9wOjE4cHgiPjxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCBzbWFsbCIgZGF0YS1hY3Q9ImRvd25sb2FkIj5Eb3dubG9hZCBhIGNvcHkgb2YgbXkgcGxhbnM8L2J1dHRvbj48L2Rpdj4nOwogIGFwcC5pbm5lckhUTUw9aDsKfQoKZnVuY3Rpb24gcHJvZ3Jlc3MocCl7CiAgdmFyIHQ9MCxkPTAsc3Q9MCxzZD0wOyBzZWN0aW9uc0ZvcihwKS5mb3JFYWNoKGZ1bmN0aW9uKHMpe3ZhciBuPTAsaz0wOyBzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXQpe2lmKHAuaGlkZGVuLmluZGV4T2YoaXQuaWQpPi0xKXJldHVybjsgbisrOyBpZihwLml0ZW1zW2l0LmlkXSYmcC5pdGVtc1tpdC5pZF0uc3RhdHVzPT09ImRvbmUiKWsrKzt9KTsKICAgIHQrPW47IGQrPWs7IGlmKG4pe3N0Kys7IGlmKGs9PT1uKXNkKys7fX0pOwogIHJldHVybiB7dG90YWw6dCxkb25lOmQscGN0OnN0P01hdGgucm91bmQoc2Qvc3QqMTAwKTowLHNlY3Rpb25zOnN0LHNlY0RvbmU6c2Qsc2VjTGVmdDpzdC1zZH07Cn0KZnVuY3Rpb24gcHJvZ3Jlc3NUZXh0KHByKXtyZXR1cm4gcHIuc2VjTGVmdD9wci5zZWNEb25lKycgb2YgJytwci5zZWN0aW9ucysnIGNoZWNrbGlzdCBzZWN0aW9ucyBjb21wbGV0ZSwgJytwci5zZWNMZWZ0KycgdG8gZ28nOidBbGwgJytwci5zZWN0aW9ucysnIGNoZWNrbGlzdCBzZWN0aW9ucyBjb21wbGV0ZSc7fQoKZnVuY3Rpb24gYWxsUGF5bWVudHMocCl7CiAgdmFyIGxpc3Q9W107CiAgc2VjdGlvbnNGb3IocCkuZm9yRWFjaChmdW5jdGlvbihzKXtzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXQpe3ZhciByPXAuaXRlbXNbaXQuaWRdOyBpZihpdC5wYXkmJnImJnIuZGV0YWlscyYmKHIuZGV0YWlscy5hbW91bnR8fHIuZGV0YWlscy5kdWUpKXsKICAgIGxpc3QucHVzaCh7aWQ6aXQuaWQsbDooaXQuaWQ9PT0iQjciJiZyLmRldGFpbHMud2hhdCk/ci5kZXRhaWxzLndoYXQ6aXQubCxhbXQ6ci5kZXRhaWxzLmFtb3VudCxjdXI6ci5kZXRhaWxzLmN1cnx8cC5jdXJyZW5jeSxkdWU6ci5kZXRhaWxzLmR1ZSxwYWlkOnIuZGV0YWlscy5wYWlkfHwoci5zdGF0dXM9PT0iZG9uZSI/InllcyI6IiIpfSk7fX0pO30pOwogIHAuYnVkZ2V0LmZvckVhY2goZnVuY3Rpb24oYil7aWYoYi5sYWJlbHx8Yi5hbW91bnQpbGlzdC5wdXNoKHtsOmIubGFiZWx8fCJDb3N0IixhbXQ6Yi5hbW91bnQsY3VyOmIuY3VyfHxwLmN1cnJlbmN5LGR1ZTpiLmR1ZSxwYWlkOmIucGFpZCxidWRnZXQ6dHJ1ZX0pO30pOwogIHJldHVybiBsaXN0Owp9CmZ1bmN0aW9uIG5leHRQYXltZW50KHApewogIHZhciBsaXN0PWFsbFBheW1lbnRzKHApLmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5kdWUmJiF4LnBhaWQ7fSk7IGxpc3Quc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmR1ZTxiLmR1ZT8tMToxO30pOyByZXR1cm4gbGlzdFswXXx8bnVsbDsKfQoKZnVuY3Rpb24gcmVuZGVyUGxhbigpewogIHZhciBwPXBsYW4oKSwgcHI9cHJvZ3Jlc3MocCksIG5wPW5leHRQYXltZW50KHApOwogIHZhciBoPSc8ZGl2IGNsYXNzPSJub3ByaW50Ij48YnV0dG9uIGNsYXNzPSJsaW5rIiBkYXRhLWFjdD0iaG9tZSI+4oaQIEFsbCBteSBwbGFuczwvYnV0dG9uPjwvZGl2Pic7CiAgaCs9JzxoMiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPicrZXNjKHAubmFtZSkrJzwvaDI+PHAgY2xhc3M9InN1YiI+JysocC5zb3VyY2U9PT0iY3MiPyJDbGFzc2ljIFNhaWxpbmcgdm95YWdlIjpwLnR5cGU9PT0ic2FpbGluZyI/IlNhaWxpbmcgdm95YWdlIjoiT3RoZXIgdHJpcCIpKwogICAgIChwLnZlc3NlbCYmcC50eXBlPT09InNhaWxpbmciPycgwrcgJytlc2MocC52ZXNzZWwpOicnKSsocC5zdGFydD8nIMK3ICcrZm10RGF0ZShwLnN0YXJ0KTonJykrKHAuZW5kPycgdG8gJytmbXREYXRlKHAuZW5kKTonJykrJzwvcD4nOwogIGgrPXByaXZhY3lCYW5uZXIoKTsKICBoKz0nPGRpdiBjbGFzcz0iY2FyZCI+PGRpdiBjbGFzcz0ibGJsIj5Qcm9ncmVzczwvZGl2PjxkaXYgY2xhc3M9ImJhciI+PGkgc3R5bGU9IndpZHRoOicrcHIucGN0KyclIj48L2k+PC9kaXY+JysKICAgICAnPGRpdiBjbGFzcz0iaGludCI+Jytwcm9ncmVzc1RleHQocHIpKyc8L2Rpdj4nKwogICAgIChucD8nPGRpdiBjbGFzcz0iaGludCIgc3R5bGU9Im1hcmdpbi10b3A6NnB4Ij5OZXh0IHBheW1lbnQ6IDxiPicrZXNjKG5wLmwpKyc8L2I+ICcrKG5wLmFtdD9tb25leShucC5hbXQsbnAuY3VyKSsnICcrYXBwcm94KG5wLmFtdCxucC5jdXIpKycgJzonJykrJ2R1ZSA8c3BhbiBjbGFzcz0ibW9ubyI+JytmbXREYXRlKG5wLmR1ZSkrJzwvc3Bhbj48L2Rpdj4nOicnKSsnPC9kaXY+JzsKICB2YXIgdGFicz1bWyJkZXRhaWxzIiwiUGxhbiBkZXRhaWxzIl0sWyJvdXRsaW5lIixwLnR5cGU9PT0ic2FpbGluZyI/IlZveWFnZSBvdXRsaW5lIjoiRGF5IGJ5IGRheSJdLFsiYnVkZ2V0IiwiQnVkZ2V0Il0sWyJhc3Npc3RhbnQiLCJQbGFubmluZyBhc3Npc3RhbnQiXSxbImNoZWNrbGlzdCIsIkNoZWNrbGlzdCJdLFsicmV2aWV3IiwiUmV2aWV3LCBwcmludCBvciBzaGFyZSJdXTsKICBoKz0nPGRpdiBjbGFzcz0idGFicyBub3ByaW50IiByb2xlPSJ0YWJsaXN0Ij4nK3RhYnMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiAnPGJ1dHRvbiBjbGFzcz0idGFiIiByb2xlPSJ0YWIiIGFyaWEtc2VsZWN0ZWQ9IicrKHZpZXcudGFiPT09dFswXSkrJyIgZGF0YS1hY3Q9InRhYiIgZGF0YS10YWI9IicrdFswXSsnIj4nK3RbMV0rJzwvYnV0dG9uPic7fSkuam9pbigiIikrJzwvZGl2Pic7CiAgaCs9JzxkaXYgaWQ9ImNzdnAtdGFiIj4nKyh7Y2hlY2tsaXN0OnRhYkNoZWNrbGlzdCxkZXRhaWxzOnRhYkRldGFpbHMsb3V0bGluZTp0YWJPdXRsaW5lLGJ1ZGdldDp0YWJCdWRnZXQsYXNzaXN0YW50OnRhYkFzc2lzdGFudCxyZXZpZXc6dGFiUmV2aWV3fVt2aWV3LnRhYl18fHRhYkNoZWNrbGlzdCkocCkrJzwvZGl2Pic7CiAgYXBwLmlubmVySFRNTD1oOwp9CgovKiBDaGVja2xpc3QgKi8KZnVuY3Rpb24gdGFiQ2hlY2tsaXN0KHApewogIHZhciBoPScnOwogIHNlY3Rpb25zRm9yKHApLmZvckVhY2goZnVuY3Rpb24ocyl7CiAgICB2YXIgdmlzPXMuaXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGl0KXtyZXR1cm4gcC5oaWRkZW4uaW5kZXhPZihpdC5pZCk8MDt9KTsKICAgIHZhciBkb25lPXZpcy5maWx0ZXIoZnVuY3Rpb24oaXQpe3JldHVybiBwLml0ZW1zW2l0LmlkXSYmcC5pdGVtc1tpdC5pZF0uc3RhdHVzPT09ImRvbmUiO30pLmxlbmd0aDsKICAgIHZhciBvcGVuPXZpZXcub3BlblNlYz09PXMuaWQsIGNvbXA9dmlzLmxlbmd0aCYmZG9uZT09PXZpcy5sZW5ndGg7CiAgICBoKz0nPGRldGFpbHMgY2xhc3M9InNlYycrKGNvbXA/JyBjb21wJzonJykrJyIgZGF0YS1zZWM9Iicrcy5pZCsnIicrKG9wZW4/JyBvcGVuJzonJykrJz48c3VtbWFyeT48aDM+JytzLmlkKycuICcrZXNjKHMudGl0bGUpKyc8L2gzPjxzcGFuIGNsYXNzPSJjb3VudCI+JysoY29tcD8nXHUyNzEzIENvbXBsZXRlJzp2aXMubGVuZ3RoP2RvbmUrJyBvZiAnK3Zpcy5sZW5ndGg6JycpKyc8L3NwYW4+PHNwYW4gY2xhc3M9ImNoZXYiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L3NwYW4+PC9zdW1tYXJ5PjxkaXYgY2xhc3M9InNlY2JvZHkiPic7CiAgICBpZihzLnNpbXBsZSl7CiAgICAgIGlmKHMudmVzc2VsS2l0KXsKICAgICAgICBoKz0nPGRpdiBjbGFzcz0iaGludCIgc3R5bGU9Im1hcmdpbjo4cHggMCI+VGhpcyBpcyB0aGUga2l0IGxpc3QgZnJvbSB5b3VyIHZveWFnZSBwYWdlJysocC52ZXNzZWw/JyBmb3IgJytlc2MocC52ZXNzZWwpOicnKSsnLiBUaWNrIGVhY2ggaXRlbSBhcyBpdCBnb2VzIGluIHlvdXIgYmFnLjwvZGl2Pic7CiAgICAgICAgaWYocC5raXQuaW50cm8paCs9JzxkaXYgY2xhc3M9ImJhbm5lciIgc3R5bGU9Im1hcmdpbi1ib3R0b206OHB4Ij4nK2VzYyhwLmtpdC5pbnRybykrJzwvZGl2Pic7CiAgICAgICAgaWYocC5raXQuaW5jbHVkZWQubGVuZ3RoKWgrPSc8ZGl2IGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJsYmwiPlByb3ZpZGVkIG9uIGJvYXJkPC9kaXY+PGRpdiBjbGFzcz0iaGludCI+JytwLmtpdC5pbmNsdWRlZC5tYXAoZXNjKS5qb2luKCIgwrcgIikrJzwvZGl2PicrCiAgICAgICAgICAocC5raXQubm90SW5jbHVkZWQubGVuZ3RoPyc8ZGl2IGNsYXNzPSJsYmwiIHN0eWxlPSJtYXJnaW4tdG9wOjhweCI+Tm90IGluY2x1ZGVkPC9kaXY+PGRpdiBjbGFzcz0iaGludCI+JytwLmtpdC5ub3RJbmNsdWRlZC5tYXAoZXNjKS5qb2luKCIgwrcgIikrJzwvZGl2Pic6JycpKyc8L2Rpdj4nOwogICAgICAgIGgrPSc8ZGl2IGNsYXNzPSJub3ByaW50IiBzdHlsZT0ibWFyZ2luOjAgMCA4cHgiPjxidXR0b24gY2xhc3M9ImxpbmsiIGRhdGEtYWN0PSJnZW5lcmFsa2l0Ij5Vc2UgdGhlIGdlbmVyYWwgQ2xhc3NpYyBTYWlsaW5nIGtpdCBsaXN0IGluc3RlYWQ8L2J1dHRvbj48L2Rpdj4nOwogICAgICB9IGVsc2UgewogICAgICAgIGlmKHMuaW50cm8paCs9JzxkaXYgY2xhc3M9ImhpbnQiIHN0eWxlPSJtYXJnaW46OHB4IDAiPicrZXNjKHMuaW50cm8pKyc8L2Rpdj4nOwogICAgICAgIGlmKGhhc0tpdChwKSloKz0nPGRpdiBjbGFzcz0ibm9wcmludCIgc3R5bGU9Im1hcmdpbjowIDAgOHB4Ij48YnV0dG9uIGNsYXNzPSJsaW5rIiBkYXRhLWFjdD0idmVzc2Vsa2l0Ij5Vc2UgdGhlIGtpdCBsaXN0IGZyb20geW91ciB2b3lhZ2UgcGFnZSBpbnN0ZWFkPC9idXR0b24+PC9kaXY+JzsKICAgICAgfQogICAgICB2YXIgc2hvd25IZHI9ZmFsc2U7CiAgICAgIGgrPSc8ZGl2IGNsYXNzPSJjYXJkIj4nK3Zpcy5tYXAoZnVuY3Rpb24oaXQpe3ZhciBkbj1wLml0ZW1zW2l0LmlkXSYmcC5pdGVtc1tpdC5pZF0uc3RhdHVzPT09ImRvbmUiLCBoZD0iIjsKICAgICAgICBpZihzLnZlc3NlbEtpdCYmaXQueCYmIXNob3duSGRyKXtzaG93bkhkcj10cnVlOyBoZD0nPGRpdiBjbGFzcz0ibGJsIiBzdHlsZT0ibWFyZ2luOjE0cHggMCAycHgiPkFsc28gc3VnZ2VzdGVkIGJ5IENsYXNzaWMgU2FpbGluZzwvZGl2Pic7fQogICAgICAgIHJldHVybiBoZCsnPGRpdiBjbGFzcz0idGljayI+PGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS10aWNrPSInK2l0LmlkKyciJysoZG4/JyBjaGVja2VkJzonJykrJz4gPHNwYW4+Jytlc2MoaXQubCkrKGl0Lmg/JyA8ZW0gY2xhc3M9ImFwcHJveCIgc3R5bGU9ImZvbnQtZmFtaWx5OmluaGVyaXQiPignK2VzYyhpdC5oKSsnKTwvZW0+JzonJykrJzwvc3Bhbj48L2xhYmVsPicrCiAgICAgICAgICAoaXQuY3VzdG9tPyc8YnV0dG9uIGNsYXNzPSJsaW5rIG5vcHJpbnQiIGRhdGEtYWN0PSJkZWxjdXN0b20iIGRhdGEtaWQ9IicraXQuaWQrJyI+cmVtb3ZlPC9idXR0b24+JzonPGJ1dHRvbiBjbGFzcz0ibGluayBub3ByaW50IiBkYXRhLWFjdD0iaGlkZSIgZGF0YS1pZD0iJytpdC5pZCsnIj5ub3QgZm9yIG1lPC9idXR0b24+JykrJzwvZGl2Pic7fSkuam9pbigiIikrJzwvZGl2Pic7CiAgICB9IGVsc2UgaWYodmlzLmxlbmd0aCkgaCs9JzxkaXYgY2xhc3M9ImNhcmQiPicrdmlzLm1hcChmdW5jdGlvbihpdCl7cmV0dXJuIGl0ZW1DYXJkKHAsaXQpO30pLmpvaW4oIiIpKyc8L2Rpdj4nOwogICAgaWYocy5pZD09PSJKIil7CiAgICAgIGgrPSc8ZGl2IGNsYXNzPSJjYXJkIj48bGFiZWwgY2xhc3M9ImYiIGZvcj0iY3N2cC1vdGhlciI+T3RoZXIgZGV0YWlscyBmb3IgdGhpcyBwbGFuPC9sYWJlbD48dGV4dGFyZWEgaWQ9ImNzdnAtb3RoZXIiIGRhdGEtYWN0PSJvdGhlcm5vdGVzIj4nK2VzYyhwLm90aGVyTm90ZXMpKyc8L3RleHRhcmVhPicrCiAgICAgICAgICc8ZGl2IGNsYXNzPSJ3YXJuIj5ObyBwYXNzcG9ydCBudW1iZXJzLCBtZWRpY2FsIGRldGFpbHMgb3IgY2FyZCBkZXRhaWxzLCBwbGVhc2UuPC9kaXY+PC9kaXY+JzsKICAgIH0KICAgIGgrPSc8ZGl2IGNsYXNzPSJjdnJvdyBub3ByaW50IiBzdHlsZT0ibWFyZ2luOjZweCAwIDRweCI+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJBZGQgeW91ciBvd24gaXRlbSB0byB0aGlzIHNlY3Rpb24iIGRhdGEtYWRkaW5wdXQ9Iicrcy5pZCsnIiBzdHlsZT0iZmxleDoxIDEgMjIwcHgiPicrCiAgICAgICAnPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IHNtYWxsIiBkYXRhLWFjdD0iYWRkaXRlbSIgZGF0YS1zZWM9Iicrcy5pZCsnIj5BZGQgaXRlbTwvYnV0dG9uPjwvZGl2Pic7CiAgICB2YXIgaGlkPXMuaXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGl0KXtyZXR1cm4gcC5oaWRkZW4uaW5kZXhPZihpdC5pZCk+LTE7fSk7CiAgICBpZihoaWQubGVuZ3RoKWgrPSc8ZGl2IGNsYXNzPSJoaW50IG5vcHJpbnQiPicraGlkLmxlbmd0aCsnIGhpZGRlbiBpdGVtJysoaGlkLmxlbmd0aD4xPydzJzonJykrJy4gPGJ1dHRvbiBjbGFzcz0ibGluayIgZGF0YS1hY3Q9InVuaGlkZSIgZGF0YS1zZWM9Iicrcy5pZCsnIj5TaG93IHRoZW0gYWdhaW48L2J1dHRvbj48L2Rpdj4nOwogICAgaCs9JzwvZGl2PjwvZGV0YWlscz4nOwogIH0pOwogIHJldHVybiBoOwp9CmZ1bmN0aW9uIGZhY3RzSHRtbChwLGl0LGRldCl7CiAgdmFyIGZpZWxkcz0oaXQuZnx8Ri5nZW5lcmFsKSwgY3VyPWRldC5jdXJ8fHAuY3VycmVuY3k7CiAgcmV0dXJuIGZpZWxkcy5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIGRldFtmLmtdJiZmLnQhPT0iY3VycmVuY3kiO30pLm1hcChmdW5jdGlvbihmKXt2YXIgdj1kZXRbZi5rXSwgb3V0OwogICAgaWYoZi50PT09ImRhdGUifHxmLnQ9PT0iZGF0ZXRpbWUtbG9jYWwiKW91dD1lc2MoZm10RGF0ZSh2KSk7IGVsc2UgaWYoZi5rPT09ImFtb3VudCIpb3V0PWVzYyhtb25leSh2LGN1cikpKycgJythcHByb3godixjdXIpOyBlbHNlIG91dD1lc2Modik7CiAgICByZXR1cm4gJzxkdD4nK2VzYyhmLmwpKyc8L2R0PjxkZD4nK291dCsnPC9kZD4nO30pLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGl0ZW1DYXJkKHAsaXQpewogIC8qIFNpbXBsZSByb3c6IHRpY2sgZm9yIERvbmUsIGEgbm90ZSwgYW5kIGRldGFpbHMgb25seSB3aGVyZSB0aGUgaXRlbSBob2xkcyByZWFsIGZhY3RzICovCiAgdmFyIHI9cC5pdGVtc1tpdC5pZF18fHt9LCBkb25lPXIuc3RhdHVzPT09ImRvbmUiLCBvdmVyPWlzT3ZlcmR1ZShwLGl0KSwgaGFzTm90ZT0hIXIubm90ZSwgZGV0PXIuZGV0YWlsc3x8e30sCiAgICAgIGhhc0Y9ISFpdC5mJiYhaXQuY3VzdG9tLCBoYXNEZXQ9aGFzRiYmT2JqZWN0LmtleXMoZGV0KS5zb21lKGZ1bmN0aW9uKGspe3JldHVybiBkZXRba10mJmshPT0iY3VyIjt9KTsKICB2YXIgaD0nPGRpdiBjbGFzcz0iY3ZpdGVtJysob3Zlcj8nIG92ZXJkdWUnOicnKSsnIiBkYXRhLWl0ZW09IicraXQuaWQrJyI+JysKICAgICc8ZGl2IGNsYXNzPSJ0aWNrIj48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLXRpY2s9IicraXQuaWQrJyInKyhkb25lPycgY2hlY2tlZCc6JycpKyc+IDxzcGFuPicrZXNjKGl0LmwpKyc8L3NwYW4+PC9sYWJlbD4nKwogICAgKGRvbmUmJnIuYXQ/JzxzcGFuIGNsYXNzPSJhcHByb3ggbm9wcmludCI+Jytlc2MoZm10RGF0ZShyLmF0KS5yZXBsYWNlKC8sPyBcZHsyfTpcZHsyfSQvLCIiKSkrJzwvc3Bhbj4nOicnKSsnPC9kaXY+JzsKICB2YXIgc3ViPScnOwogIGlmKCFkb25lKXsKICAgIGlmKGl0Lmgpc3ViKz0nPGRpdiBjbGFzcz0iaGludCI+Jytlc2MoaXQuaCkrJzwvZGl2Pic7CiAgICBpZihpdC5saW5rKXN1Yis9JzxkaXYgY2xhc3M9ImhpbnQiPjxhIGNsYXNzPSJhIiBocmVmPSInK2VzYyhpdC5saW5rKSsnIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+T3BlbiBsaW5rPC9hPjwvZGl2Pic7CiAgfQogIGlmKGl0Lncpc3ViKz0nPGRpdiBjbGFzcz0id2FybiI+Jytlc2MoaXQudykrJzwvZGl2Pic7CiAgaWYob3ZlcilzdWIrPSc8ZGl2IGNsYXNzPSJ3YXJuIj5EdWUgZGF0ZSBoYXMgcGFzc2VkPC9kaXY+JzsKICBpZihoYXNEZXQpc3ViKz0nPGRsIGNsYXNzPSJmYWN0cyI+JytmYWN0c0h0bWwocCxpdCxkZXQpKyc8L2RsPic7CiAgaWYoaGFzTm90ZSlzdWIrPSc8ZGl2IGNsYXNzPSJub3RldGV4dCI+Jytlc2Moci5ub3RlKSsnPC9kaXY+JzsKICBzdWIrPSc8ZGl2IGNsYXNzPSJpdGVtbGlua3Mgbm9wcmludCI+PGJ1dHRvbiBjbGFzcz0ibGluayIgZGF0YS1hY3Q9Im5vdGVib3giIGRhdGEtaWQ9IicraXQuaWQrJyI+JysoaGFzTm90ZT8iRWRpdCBub3RlIjoiQWRkIG5vdGUiKSsnPC9idXR0b24+JysKICAgIChoYXNGPyc8YnV0dG9uIGNsYXNzPSJsaW5rIiBkYXRhLWFjdD0iZGV0Ym94IiBkYXRhLWlkPSInK2l0LmlkKyciPicrKGhhc0RldD8iRWRpdCBkZXRhaWxzIjooaXQucGF5PyJBZGQgYW1vdW50IGFuZCBkdWUgZGF0ZSI6IkFkZCBkZXRhaWxzIikpKyc8L2J1dHRvbj4nOicnKSsKICAgIChpdC5jdXN0b20/JzxidXR0b24gY2xhc3M9ImxpbmsiIGRhdGEtYWN0PSJkZWxjdXN0b20iIGRhdGEtaWQ9IicraXQuaWQrJyI+cmVtb3ZlPC9idXR0b24+JzonPGJ1dHRvbiBjbGFzcz0ibGluayIgZGF0YS1hY3Q9ImhpZGUiIGRhdGEtaWQ9IicraXQuaWQrJyI+bm90IGZvciBtZTwvYnV0dG9uPicpKyc8L2Rpdj4nOwogIGgrPSc8ZGl2IGNsYXNzPSJpdGVtc3ViIj4nK3N1YisnPC9kaXY+JzsKICBoKz0nPGRpdiBjbGFzcz0icGFuZWwgaGlkZSIgZGF0YS1ub3RlcGFuZWw9IicraXQuaWQrJyI+PGxhYmVsIGNsYXNzPSJmIj5Zb3VyIG5vdGU8L2xhYmVsPjx0ZXh0YXJlYSBkYXRhLW5vdGVpbnB1dD0iJytpdC5pZCsnIj4nK2VzYyhyLm5vdGV8fCIiKSsnPC90ZXh0YXJlYT4nKwogICAgICc8ZGl2IGNsYXNzPSJ3YXJuIj5ObyBwYXNzcG9ydCBudW1iZXJzLCBtZWRpY2FsIGRldGFpbHMgb3IgY2FyZCBkZXRhaWxzLCBwbGVhc2UuPC9kaXY+JysKICAgICAnPGRpdiBjbGFzcz0iYWN0aW9ucyI+PGJ1dHRvbiBjbGFzcz0iYnRuIHNtYWxsIiBkYXRhLWFjdD0ic2F2ZW5vdGUiIGRhdGEtaWQ9IicraXQuaWQrJyI+U2F2ZSBub3RlPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IHNtYWxsIiBkYXRhLWFjdD0iY2xvc2VwYW5lbCI+Q2FuY2VsPC9idXR0b24+PC9kaXY+PC9kaXY+JzsKICBpZihoYXNGKXsKICAgIGgrPSc8ZGl2IGNsYXNzPSJwYW5lbCBoaWRlIiBkYXRhLWRldHBhbmVsPSInK2l0LmlkKyciPjxkaXYgY2xhc3M9ImdyaWQyIj4nK2l0LmYubWFwKGZ1bmN0aW9uKGYpewogICAgICBpZihmLnQ9PT0iY3VycmVuY3kiKXJldHVybiAnPGRpdj48bGFiZWwgY2xhc3M9ImYiPicrZXNjKGYubCkrJzwvbGFiZWw+JytjdXJTZWxlY3QoJ2RhdGEtZGV0ZmllbGQ9ImN1ciInLGRldC5jdXJ8fHAuY3VycmVuY3kpKyc8L2Rpdj4nOwogICAgICByZXR1cm4gJzxkaXY+PGxhYmVsIGNsYXNzPSJmIj4nK2VzYyhmLmwpKyc8L2xhYmVsPjxpbnB1dCB0eXBlPSInK2YudCsnIiAnKyhmLnQ9PT0ibnVtYmVyIj8nc3RlcD0iMC4wMSIgbWluPSIwIic6JycpKycgZGF0YS1kZXRmaWVsZD0iJytmLmsrJyIgdmFsdWU9IicrZXNjKGRldFtmLmtdfHwiIikrJyI+PC9kaXY+Jzt9KS5qb2luKCIiKSsKICAgICAnPC9kaXY+PGRpdiBjbGFzcz0id2FybiI+Qm9va2luZyBhbmQgcG9saWN5IHJlZmVyZW5jZXMgYXJlIGZpbmUuIFBhc3Nwb3J0IGFuZCBjYXJkIG51bWJlcnMgYXJlIG5vdC48L2Rpdj4nKwogICAgICc8ZGl2IGNsYXNzPSJhY3Rpb25zIj48YnV0dG9uIGNsYXNzPSJidG4gc21hbGwiIGRhdGEtYWN0PSJzYXZlZGV0IiBkYXRhLWlkPSInK2l0LmlkKyciPlNhdmUgZGV0YWlsczwvYnV0dG9uPjxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCBzbWFsbCIgZGF0YS1hY3Q9ImNsb3NlcGFuZWwiPkNhbmNlbDwvYnV0dG9uPjwvZGl2PjwvZGl2Pic7CiAgfQogIHJldHVybiBoKyc8L2Rpdj4nOwp9CgovKiBQbGFuIGRldGFpbHMsIHdpdGggaW1wb3J0IGZyb20gYSB2b3lhZ2UgcGFnZSAqLwpmdW5jdGlvbiB0YWJEZXRhaWxzKHApewogIGZ1bmN0aW9uIGlucChrLGwsdCl7cmV0dXJuICc8ZGl2PjxsYWJlbCBjbGFzcz0iZiIgZm9yPSJjc3ZwLWQtJytrKyciPicrbCsnPC9sYWJlbD48aW5wdXQgaWQ9ImNzdnAtZC0nK2srJyIgdHlwZT0iJysodHx8InRleHQiKSsnIiBkYXRhLXBsYW49IicraysnIiB2YWx1ZT0iJytlc2MocFtrXXx8IiIpKyciPjwvZGl2Pic7fQogIHZhciBtYXBzPWZ1bmN0aW9uKHBvcnQpe3JldHVybiBwb3J0PycgPGEgY2xhc3M9ImEiIGhyZWY9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9zZWFyY2gvP2FwaT0xJnF1ZXJ5PScrZW5jb2RlVVJJQ29tcG9uZW50KHBvcnQpKyciIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIiBzdHlsZT0iZm9udC1zaXplOi44MmVtIj5tYXA8L2E+JzonJzt9OwogIHZhciBoPScnOwogIHZhciBzcmM9c3JjT2YocCk7CiAgdmFyIFRZUEVTPVtbImNzIiwiQSBDbGFzc2ljIFNhaWxpbmcgdm95YWdlIl0sWyJvdGhlcnNhaWwiLCJBbm90aGVyIHNhaWxpbmcgdm95YWdlIl0sWyJvdGhlciIsIkFub3RoZXIgdHJpcCJdXTsKICB2YXIgdG5hbWU9VFlQRVMuZmlsdGVyKGZ1bmN0aW9uKG8pe3JldHVybiBvWzBdPT09c3JjO30pWzBdWzFdOwogIGgrPSc8ZGl2IGNsYXNzPSJjYXJkIG5vcHJpbnQiPjxkaXYgY2xhc3M9ImhpbnQiIHN0eWxlPSJtYXJnaW4tdG9wOjAiPlBsYW4gdHlwZTogPGIgc3R5bGU9ImNvbG9yOnZhcigtLWluaykiPicrdG5hbWUrJzwvYj4gPGJ1dHRvbiBjbGFzcz0ibGluayIgZGF0YS1hY3Q9ImNoYW5nZXR5cGUiIHN0eWxlPSJtYXJnaW4tbGVmdDo2cHgiPicrKHZpZXcuY2hhbmdlVHlwZT8nY2FuY2VsJzonY2hhbmdlJykrJzwvYnV0dG9uPjwvZGl2Pic7CiAgaWYodmlldy5jaGFuZ2VUeXBlKXsKICAgIGgrPSc8ZGl2IGNsYXNzPSJjdnJvdyIgc3R5bGU9ImdhcDoxOHB4O21hcmdpbi10b3A6NnB4Ij4nK1RZUEVTLm1hcChmdW5jdGlvbihvKXsKICAgICAgIHJldHVybiAnPGxhYmVsIGNsYXNzPSJjdnJvdyIgc3R5bGU9ImdhcDo2cHg7Y3Vyc29yOnBvaW50ZXIiPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iY3N2cC1zcmMiIGRhdGEtYWN0PSJzcmMiIHZhbHVlPSInK29bMF0rJyInKyhzcmM9PT1vWzBdPycgY2hlY2tlZCc6JycpKyc+ICcrb1sxXSsnPC9sYWJlbD4nO30pLmpvaW4oIiIpKyc8L2Rpdj4nOwogIH0KICBpZihzcmM9PT0iY3MiKXsKICAgIGgrPSc8bGFiZWwgY2xhc3M9ImYiIGZvcj0iY3N2cC1pbXAiIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHgiPlZveWFnZSBudW1iZXI8L2xhYmVsPicrCiAgICAgICAnPGRpdiBjbGFzcz0iaGludCIgc3R5bGU9Im1hcmdpbi10b3A6MCI+VHlwZSB0aGUgdm95YWdlIG51bWJlciBmcm9tIHRoZSB2b3lhZ2UgcGFnZSBvciB5b3VyIGJvb2tpbmcgY29uZmlybWF0aW9uLCBmb3IgZXhhbXBsZSBKTDE4MDQyNy4gWW91IGNhbiBwYXN0ZSB0aGUgdm95YWdlIHBhZ2UgbGluayBpbnN0ZWFkLjwvZGl2PicrCiAgICAgICAnPGRpdiBjbGFzcz0iY3Zyb3ciIHN0eWxlPSJtYXJnaW4tdG9wOjZweCI+PGlucHV0IHR5cGU9InRleHQiIGlkPSJjc3ZwLWltcCIgYXV0b2NvbXBsZXRlPSJvZmYiIHNwZWxsY2hlY2s9ImZhbHNlIiBwbGFjZWhvbGRlcj0iVHlwZSB0aGUgdm95YWdlIG51bWJlciBoZXJlIiB2YWx1ZT0iJytlc2MocC52b3lhZ2VOb3x8KHAudm95YWdlVXJsJiYvXC92b3lhZ2VzXC8vLnRlc3QocC52b3lhZ2VVcmwpP3Audm95YWdlVXJsOiIiKSkrJyIgc3R5bGU9ImZsZXg6MSAxIDI2MHB4Ij4nKwogICAgICAgJzxidXR0b24gY2xhc3M9ImJ0biIgZGF0YS1hY3Q9ImltcG9ydCI+R2V0IHZveWFnZSBkZXRhaWxzPC9idXR0b24+PC9kaXY+JysKICAgICAgICc8ZGl2IGNsYXNzPSJoaW50Ij5GaWxscyBpbiB0aGUgcGxhbiBkZXRhaWxzLCB2b3lhZ2Ugb3V0bGluZSBhbmQga2l0IGxpc3QuIFlvdSBjYW4gY2hhbmdlIGFueXRoaW5nIGFmdGVyd2FyZHMuPC9kaXY+PGRpdiBpZD0iY3N2cC1pbXAtbXNnIj4nK3ZpZXcuaW1wb3J0TXNnKyc8L2Rpdj4nKwogICAgICAgJzxkaXYgY2xhc3M9ImJhbm5lciIgc3R5bGU9Im1hcmdpbjoxMnB4IDAgMCI+PHN0cm9uZz5KdXN0IHJlc2VhcmNoaW5nPzwvc3Ryb25nPkNsYXNzaWMgU2FpbGluZyBkb2VzIG5vdCBrbm93IHlvdSBhcmUgbG9va2luZyBhdCB0aGlzIHZveWFnZSwgYW5kIG5vdGhpbmcgeW91IGVudGVyIGluIHlvdXIgcGxhbm5lciBpcyBzZWVuIGJ5IHVzIG9yIHVzZWQgZm9yIG1hcmtldGluZy4gJysKICAgICAgICdJZiB5b3Ugd291bGQgbGlrZSBhZHZpY2Ugb3IgdG8gaG9sZCBhIGJlcnRoLCBjb250YWN0IHVzIG9uIDxhIGNsYXNzPSJhIiBocmVmPSJ0ZWw6MDEzMjY1MzEyMzQiPjAxMzI2IDUzMSAyMzQ8L2E+LjwvZGl2PicrCiAgICAgICAocC5iZXJ0aHMmJnAuYmVydGhzLmxlbmd0aD8nJzpib29rQmxvY2socCx0cnVlKSk7CiAgfQogIGgrPSc8L2Rpdj4nOwogIGlmKHNyYz09PSJjcyImJnAuYmVydGhzJiZwLmJlcnRocy5sZW5ndGgpewogICAgdmFyIGJjPWJlcnRoQ29zdChwKSwgYW55T2ZmZXI9cC5iZXJ0aHMuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5vZmZlcjt9KTsKICAgIGgrPSc8ZGl2IGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJsYmwiPkJlcnRocyBhbmQgcHJpY2VzPC9kaXY+PGRpdiBjbGFzcz0iaGludCIgc3R5bGU9Im1hcmdpbi10b3A6MCI+RW50ZXIgaG93IG1hbnkgcGVvcGxlIG9mIGVhY2ggYmVydGggdHlwZSB0aGlzIHBsYW4gaXMgZm9yLiBUaGUgdm95YWdlIGNvc3QgaXMgd29ya2VkIG91dCBmb3IgeW91LjwvZGl2PicrCiAgICAgICAnPGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRyPjx0aD5CZXJ0aDwvdGg+PHRoPkF2YWlsYWJpbGl0eTwvdGg+PHRoPlByaWNlIHBlciBwZXJzb248L3RoPjx0aCBzdHlsZT0id2lkdGg6OTBweCI+UGVvcGxlPC90aD48L3RyPicrCiAgICAgICBwLmJlcnRocy5tYXAoZnVuY3Rpb24oYixpKXt2YXIgZnVsbD0vZnVsbC9pLnRlc3QoYi5hdmFpbCk7CiAgICAgICAgIHJldHVybiAnPHRyPjx0ZD48Yj4nK2VzYyhiLmxhYmVsKSsnPC9iPjwvdGQ+PHRkPicrZXNjKGIuYXZhaWwpKyhmdWxsPyc8ZGl2IGNsYXNzPSJ3YXJuIiBzdHlsZT0ibWFyZ2luLXRvcDoycHgiPkNvbnRhY3QgdXMgdG8gam9pbiB0aGUgd2FpdGluZyBsaXN0LCAwMTMyNiA1MzEgMjM0PC9kaXY+JzonJykrJzwvdGQ+JysKICAgICAgICAgICAnPHRkIGNsYXNzPSJtb25vIj4nKyhiLm9mZmVyPyc8ZGVsIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXRlZCkiPicrbW9uZXkoYi5wcmljZSxiLmN1cikrJzwvZGVsPjxicj48YiBzdHlsZT0iY29sb3I6dmFyKC0tZ29vZCkiPicrbW9uZXkoYi5vZmZlcixiLmN1cikrJzwvYj4gb2ZmZXInOm1vbmV5KGIucHJpY2UsYi5jdXIpKSsnPC90ZD4nKwogICAgICAgICAgICc8dGQ+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjIwIiBzdGVwPSIxIiBkYXRhLWJlcnRoPSInK2krJyIgdmFsdWU9IicrKGIubnx8MCkrJyIgYXJpYS1sYWJlbD0iUGVvcGxlIGluICcrZXNjKGIubGFiZWwpKyciPjwvdGQ+PC90cj4nO30pLmpvaW4oIiIpKyc8L3RhYmxlPjwvZGl2PicrCiAgICAgICAnPGRpdiBjbGFzcz0idG90YWxzIj48c3Bhbj5QZW9wbGUgPGI+JytiYy5wZW9wbGUrJzwvYj48L3NwYW4+PHNwYW4+Vm95YWdlIGNvc3QgPGI+Jyttb25leShiYy5hbXQsYmMuY3VyKSsnPC9iPiAnK2FwcHJveChiYy5hbXQsYmMuY3VyKSsnPC9zcGFuPjwvZGl2PicrCiAgICAgICAnPGRpdiBjbGFzcz0iaGludCI+UHJpY2VzIGFzIHNob3duIG9uIHRoZSB2b3lhZ2UgcGFnZSBvbiAnK2VzYyhmbXREYXRlKHAucHJpY2VzQXQpKSsnLjwvZGl2PicrCiAgICAgICAoYW55T2ZmZXI/JzxkaXYgY2xhc3M9ImJhbm5lciB0ZXN0IiBzdHlsZT0ibWFyZ2luOjEwcHggMCAwIj48c3Ryb25nPk9mZmVyIHByaWNlPC9zdHJvbmc+VG9kYXlcdTIwMTlzIG9mZmVyIHByaWNlIG1heSBjaGFuZ2UuIEJlZm9yZSB5b3UgYm9vaywgY2hlY2sgdGhlIHZveWFnZSBwYWdlIG9yIHByZXNzIEdldCB2b3lhZ2UgZGV0YWlscyBhZ2Fpbi48L2Rpdj4nOicnKStib29rQmxvY2socCxmYWxzZSkrJzwvZGl2Pic7CiAgfQogIGgrPSc8ZGl2IGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJncmlkMiI+JytpbnAoIm5hbWUiLCJQbGFuIG5hbWUiKSsoc3JjIT09ImNzInx8IShwLmJlcnRocyYmcC5iZXJ0aHMubGVuZ3RoKT9pbnAoInBhcnR5IiwiTnVtYmVyIG9mIHBlb3BsZSBpbiB0aGlzIHBsYW4iLCJudW1iZXIiKTonJykrCiAgICAocC50eXBlPT09InNhaWxpbmciP2lucCgidmVzc2VsIiwiVmVzc2VsIikraW5wKCJ2b3lhZ2VObyIsIlZveWFnZSBudW1iZXIiKTonJykraW5wKCJ2b3lhZ2VVcmwiLHAudHlwZT09PSJzYWlsaW5nIj8iVm95YWdlIHBhZ2UgbGluayI6IlRyaXAgbGluayIsInVybCIpKwogICAgaW5wKCJzdGFydCIscC50eXBlPT09InNhaWxpbmciPyJKb2luaW5nIGRhdGUgYW5kIHRpbWUiOiJTdGFydCBkYXRlIGFuZCB0aW1lIiwiZGF0ZXRpbWUtbG9jYWwiKStpbnAoImVuZCIscC50eXBlPT09InNhaWxpbmciPyJMZWF2aW5nIGRhdGUgYW5kIHRpbWUiOiJFbmQgZGF0ZSBhbmQgdGltZSIsImRhdGV0aW1lLWxvY2FsIikrCiAgICBpbnAoImpvaW5Qb3J0IixwLnR5cGU9PT0ic2FpbGluZyI/IkpvaW5pbmcgcG9ydCI6IlN0YXJ0aW5nIHBvaW50IikraW5wKCJsZWF2ZVBvcnQiLHAudHlwZT09PSJzYWlsaW5nIj8iTGVhdmluZyBwb3J0IjoiRW5kIHBvaW50IikrCiAgICAocC50eXBlPT09InNhaWxpbmciP2lucCgibmlnaHRzIiwiTmlnaHRzIG9uIGJvYXJkIik6JycpK2lucCgicHJpY2UiLCJBZHZlcnRpc2VkIHByaWNlIChmb3IgcmVmZXJlbmNlKSIpKwogICAgJzxkaXY+PGxhYmVsIGNsYXNzPSJmIiBmb3I9ImNzdnAtZC1jdXIiPk1haW4gY3VycmVuY3kgZm9yIHRoaXMgcGxhbjwvbGFiZWw+JytjdXJTZWxlY3QoJ2lkPSJjc3ZwLWQtY3VyIiBkYXRhLXBsYW49ImN1cnJlbmN5IicscC5jdXJyZW5jeSkrJzwvZGl2PicrCiAgICAnPC9kaXY+PGRpdiBjbGFzcz0iaGludCIgc3R5bGU9Im1hcmdpbi10b3A6OHB4Ij4nKyhwLmpvaW5Qb3J0PydKb2luaW5nOiAnK2VzYyhwLmpvaW5Qb3J0KSttYXBzKHAuam9pblBvcnQpKycgJzonJykrKHAubGVhdmVQb3J0PycgwrcgTGVhdmluZzogJytlc2MocC5sZWF2ZVBvcnQpK21hcHMocC5sZWF2ZVBvcnQpOicnKSsKICAgIChwLnZveWFnZVVybD8nIMK3IDxhIGNsYXNzPSJhIiBocmVmPSInK2VzYyhwLnZveWFnZVVybCkrJyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIiPm9wZW4gdm95YWdlIHBhZ2U8L2E+JzonJykrJzwvZGl2PicrCiAgICAnPGRpdiBjbGFzcz0iYWN0aW9ucyI+PGJ1dHRvbiBjbGFzcz0iYnRuIiBkYXRhLWFjdD0ic2F2ZWRldGFpbHMiPlNhdmUgcGxhbiBkZXRhaWxzPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBkYXRhLWFjdD0iZGVsZXRlcGxhbiI+RGVsZXRlIHRoaXMgcGxhbjwvYnV0dG9uPjwvZGl2PjwvZGl2Pic7CiAgaCs9JzxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImxibCI+VXNlZnVsIGxpbmtzPC9kaXY+PGRpdiBjbGFzcz0iaGludCI+JysKICAgICc8YSBjbGFzcz0iYSIgaHJlZj0iaHR0cHM6Ly93d3cuY2xhc3NpYy1zYWlsaW5nLmNvbS8iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj5DbGFzc2ljIFNhaWxpbmcgdm95YWdlczwvYT4gwrcgJysKICAgICc8YSBjbGFzcz0iYSIgaHJlZj0iaHR0cHM6Ly93d3cuZ292LnVrL2ZvcmVpZ24tdHJhdmVsLWFkdmljZSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIiPkdPVi5VSyBmb3JlaWduIHRyYXZlbCBhZHZpY2U8L2E+PC9kaXY+PC9kaXY+JzsKICByZXR1cm4gaDsKfQoKLyogUGFyc2UgYSBDbGFzc2ljIFNhaWxpbmcgdm95YWdlIHBhZ2UuIEJ1aWx0IGZyb20gdGhlIHBhZ2UgbGF5b3V0IHNlZW4gb24gMjQgT2N0IDIwMjY7IHRlc3Qgb24gdGhlIGxpdmUgc2l0ZS4gKi8KZnVuY3Rpb24gcGFyc2VWb3lhZ2UoaHRtbCx1cmwpewogIHZhciBkb2M9bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCJ0ZXh0L2h0bWwiKSwgb3V0PXtyb3dzOltdLHN0b3BzOltdfTsKICB2YXIgaDE9ZG9jLnF1ZXJ5U2VsZWN0b3IoImgxIik7IG91dC50aXRsZT1oMT9oMS50ZXh0Q29udGVudC5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKToiIjsKICB2YXIgdGFibGVzPWRvYy5xdWVyeVNlbGVjdG9yQWxsKCJ0YWJsZSIpOwogIGZvcih2YXIgdD0wO3Q8dGFibGVzLmxlbmd0aDt0KyspewogICAgdmFyIGhlYWRzPVtdLm1hcC5jYWxsKHRhYmxlc1t0XS5xdWVyeVNlbGVjdG9yQWxsKCJ0aCIpLGZ1bmN0aW9uKHgpe3JldHVybiB4LnRleHRDb250ZW50LnRyaW0oKS50b0xvd2VyQ2FzZSgpO30pOwogICAgaWYoIWhlYWRzLmxlbmd0aCl7dmFyIGZyPXRhYmxlc1t0XS5xdWVyeVNlbGVjdG9yKCJ0ciIpOyBpZihmciloZWFkcz1bXS5tYXAuY2FsbChmci5jaGlsZHJlbixmdW5jdGlvbih4KXtyZXR1cm4geC50ZXh0Q29udGVudC50cmltKCkudG9Mb3dlckNhc2UoKTt9KTt9CiAgICB2YXIgaUU9LTEsaUQ9LTEsaUR1cj0tMSxpTm89LTEsaVY9LTE7CiAgICBoZWFkcy5mb3JFYWNoKGZ1bmN0aW9uKHgsaSl7aWYoL15lbWJhcmsvLnRlc3QoeCkpaUU9aTsgZWxzZSBpZigvXmRpc2VtYmFyay8udGVzdCh4KSlpRD1pOyBlbHNlIGlmKC9kdXJhdGlvbi8udGVzdCh4KSlpRHVyPWk7IGVsc2UgaWYoL3ZveWFnZVxzKm5vLy50ZXN0KHgpKWlObz1pOyBlbHNlIGlmKC92ZXNzZWwvLnRlc3QoeCkpaVY9aTt9KTsKICAgIGlmKGlFPDB8fGlEPDApY29udGludWU7CiAgICBbXS5mb3JFYWNoLmNhbGwodGFibGVzW3RdLnF1ZXJ5U2VsZWN0b3JBbGwoInRyIiksZnVuY3Rpb24odHIpewogICAgICB2YXIgYz10ci5xdWVyeVNlbGVjdG9yQWxsKCJ0ZCIpOyBpZihjLmxlbmd0aDw9TWF0aC5tYXgoaUUsaUQpKXJldHVybjsKICAgICAgdmFyIGU9c3BsaXRDZWxsKGNbaUVdKSwgZD1zcGxpdENlbGwoY1tpRF0pOyBpZighZS5kdClyZXR1cm47CiAgICAgIG91dC5yb3dzLnB1c2goe3N0YXJ0OmUuZHQsam9pblBvcnQ6ZS5wb3J0LGVuZDpkLmR0LGxlYXZlUG9ydDpkLnBvcnQsbmlnaHRzOmlEdXI+LTEmJmNbaUR1cl0/Y1tpRHVyXS50ZXh0Q29udGVudC50cmltKCk6IiIsCiAgICAgICAgdm95YWdlTm86aU5vPi0xJiZjW2lOb10/Y1tpTm9dLnRleHRDb250ZW50LnRyaW0oKToiIix2ZXNzZWw6aVY+LTEmJmNbaVZdP2NbaVZdLnRleHRDb250ZW50LnRyaW0oKToiIn0pOwogICAgfSk7CiAgICBpZihvdXQucm93cy5sZW5ndGgpYnJlYWs7CiAgfQogIC8qIHBvc3NpYmxlIHN0b3BvdmVycyAqLwogIFtdLmZvckVhY2guY2FsbChkb2MucXVlcnlTZWxlY3RvckFsbCgiaDIsaDMsaDQsaDUsc3Ryb25nIiksZnVuY3Rpb24oaGQpewogICAgaWYob3V0LnN0b3BzLmxlbmd0aHx8IS9wb3NzaWJsZSBzdG9wb3ZlcnMvaS50ZXN0KGhkLnRleHRDb250ZW50KSlyZXR1cm47CiAgICB2YXIgZWw9aGQubmV4dEVsZW1lbnRTaWJsaW5nLCBndWFyZD0wLCBsdmw9L15IWzEtNl0kLy50ZXN0KGhkLnRhZ05hbWUpPytoZC50YWdOYW1lWzFdOjIsIGhlYWRzPVtdOwogICAgd2hpbGUoZWwmJmd1YXJkKys8NDApewogICAgICBpZigvXkhbMS02XSQvLnRlc3QoZWwudGFnTmFtZSkpe3ZhciBsMj0rZWwudGFnTmFtZVsxXTsgaWYobDI8PWx2bClicmVhazsgaGVhZHMucHVzaChlbC50ZXh0Q29udGVudC5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKS5yZXBsYWNlKC9ebmVhcmJ5XHMrL2ksIiIpKTt9CiAgICAgIGVsc2UgaWYoIWhlYWRzLmxlbmd0aCYmZWwucXVlcnlTZWxlY3RvckFsbCl7dmFyIGxpcz1lbC5xdWVyeVNlbGVjdG9yQWxsKCJsaSIpOyBpZihsaXMubGVuZ3RoKXtvdXQuc3RvcHM9W10ubWFwLmNhbGwobGlzLGZ1bmN0aW9uKGxpKXtyZXR1cm4gbGkudGV4dENvbnRlbnQucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCkuc3BsaXQoL1s6LixdLylbMF07fSk7IGJyZWFrO319CiAgICAgIGVsPWVsLm5leHRFbGVtZW50U2libGluZzt9CiAgICBpZighb3V0LnN0b3BzLmxlbmd0aCYmaGVhZHMubGVuZ3RoKW91dC5zdG9wcz1oZWFkcy5zbGljZSgwLDEyKTsKICB9KTsKICAvKiBraXQgbGlzdDogSW5jbHVkZWQsIFdoYXQncyBOb3QgSW5jbHVkZWQsIFdoYXQgdG8gQnJpbmcgKGNvbnRlbnQgc2l0cyBpbiB0aGUgcGFnZSBldmVuIHdoZW4gdGhlIGFjY29yZGlvbiBpcyBjbG9zZWQpICovCiAgb3V0LmtpdD17YnJpbmc6bGlzdEFmdGVyKGRvYywvXndoYXQgdG8gYnJpbmcvaSksaW5jbHVkZWQ6bGlzdEFmdGVyKGRvYywvXmluY2x1ZGVkXGIvaSksbm90SW5jbHVkZWQ6bGlzdEFmdGVyKGRvYywvbm90IGluY2x1ZGVkL2kpLGludHJvOiIifTsKICB2YXIgd3RiPWZpbmRIZWFkaW5nKGRvYywvXndoYXQgdG8gYnJpbmcvaSk7CiAgaWYod3RiKXt2YXIgbng9d3RiLm5leHRFbGVtZW50U2libGluZzsgaWYobngmJm54LnRhZ05hbWU9PT0iUCIpb3V0LmtpdC5pbnRybz1ueC50ZXh0Q29udGVudC5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKTt9CiAgLyogYmVydGhzOiBvbmUgZm9ybSBwZXIgYmVydGggdHlwZSBpbiB0aGUgYm9va2luZyBib3guIFByaWNlIHNob3dzIHRoZSBvZmZlciBmaXJzdCB3aXRoIHRoZSBmdWxsIHByaWNlIHN0cnVjayB0aHJvdWdoICovCiAgb3V0LmJlcnRocz1bXTsgdmFyIHNlZW5CPXt9OwogIFtdLmZvckVhY2guY2FsbChkb2MucXVlcnlTZWxlY3RvckFsbCgiLnZveWFnZS1ib29rLWJvZHkgZm9ybSwgZm9ybS5yZWdpc3Rlcl9mb3JtIiksZnVuY3Rpb24oZm0pewogICAgaWYoc2VlbkJbZm0ub3V0ZXJIVE1MXSlyZXR1cm47IHNlZW5CW2ZtLm91dGVySFRNTF09MTsKICAgIHZhciBwZT1mbS5xdWVyeVNlbGVjdG9yKCIucHJpY2UiKTsgaWYoIXBlKXJldHVybjsKICAgIHZhciBsYWJlbD0iIixhdmFpbD0iIjsKICAgIFtdLmZvckVhY2guY2FsbChmbS5xdWVyeVNlbGVjdG9yQWxsKCJwIiksZnVuY3Rpb24ocHApe2lmKHBwPT09cGUpcmV0dXJuOyB2YXIgc3Q9cHAucXVlcnlTZWxlY3Rvcigic3Ryb25nLGIiKTsgdmFyIHQ9cHAudGV4dENvbnRlbnQucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCk7IGlmKHN0JiYhYXZhaWwpYXZhaWw9dDsgZWxzZSBpZighbGFiZWwmJnQpbGFiZWw9dDt9KTsKICAgIHZhciBkZWw9cGUucXVlcnlTZWxlY3RvcigiZGVsLHMsc3RyaWtlIiksIGFsbD1wZS50ZXh0Q29udGVudC5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKSwgZGVsVD1kZWw/ZGVsLnRleHRDb250ZW50LnJlcGxhY2UoL1xzKy9nLCIgIikudHJpbSgpOiIiOwogICAgdmFyIGN1clQ9ZGVsVD9hbGwucmVwbGFjZShkZWxULCIiKTphbGwsIHN5bT0oYWxsLm1hdGNoKC9bXHUwMGEzXHUyMGFjJF0vKXx8WyIiXSlbMF07CiAgICB2YXIgbnVtPWZ1bmN0aW9uKHQpe3ZhciBtPVN0cmluZyh0KS5yZXBsYWNlKC8sL2csIiIpLm1hdGNoKC9cZCsoPzpcLlxkKyk/Lyk7IHJldHVybiBtPyttWzBdOjA7fTsKICAgIHZhciBub3c9bnVtKGN1clQpLCB3YXM9bnVtKGRlbFQpOwogICAgb3V0LmJlcnRocy5wdXNoKHtsYWJlbDpsYWJlbC5yZXBsYWNlKC9ccypwZXIgcGVyc29uJC9pLCIiKSxhdmFpbDphdmFpbCxwcmljZTp3YXN8fG5vdyxvZmZlcjp3YXMmJm5vdzx3YXM/bm93OjAsY3VyOnsiXHUwMGEzIjoiR0JQIiwiXHUyMGFjIjoiRVVSIiwiJCI6IlVTRCJ9W3N5bV18fCIifSk7CiAgfSk7CiAgLyogcHJpY2UgKi8KICB2YXIgYm9keT0oZG9jLmJvZHkmJmRvYy5ib2R5LnRleHRDb250ZW50KXx8IiIsIHBtPWJvZHkubWF0Y2goLyjCo3zigqx8XCQpXHM/KFxkW1xkLF0qKS8pOwogIGlmKHBtKXtvdXQucHJpY2U9cG1bMV0rcG1bMl07IG91dC5jdXJyZW5jeT17IsKjIjoiR0JQIiwi4oKsIjoiRVVSIiwiJCI6IlVTRCJ9W3BtWzFdXTt9CiAgb3V0LnVybD11cmw7IHJldHVybiBvdXQ7Cn0KZnVuY3Rpb24gZmluZEhlYWRpbmcoZG9jLHJlKXsKICB2YXIgaHM9ZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoImgxLGgyLGgzLGg0LGg1LGg2LHN0cm9uZyxiIik7CiAgZm9yKHZhciBpPTA7aTxocy5sZW5ndGg7aSsrKXtpZihyZS50ZXN0KGhzW2ldLnRleHRDb250ZW50LnJlcGxhY2UoL1xzKy9nLCIgIikudHJpbSgpKSlyZXR1cm4gaHNbaV07fSByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBsaXN0QWZ0ZXIoZG9jLHJlKXsKICB2YXIgaGQ9ZmluZEhlYWRpbmcoZG9jLHJlKTsgaWYoIWhkKXJldHVybiBbXTsKICB2YXIgaGVhZHM9W10uc2xpY2UuY2FsbChkb2MucXVlcnlTZWxlY3RvckFsbCgiaDEsaDIsaDMsaDQsaDUsaDYiKSk7CiAgdmFyIGxpc3RzPWRvYy5xdWVyeVNlbGVjdG9yQWxsKCJ1bCxvbCIpOwogIGZvcih2YXIgaT0wO2k8bGlzdHMubGVuZ3RoO2krKyl7CiAgICB2YXIgdWw9bGlzdHNbaV07IGlmKCEoaGQuY29tcGFyZURvY3VtZW50UG9zaXRpb24odWwpJjQpKWNvbnRpbnVlOyAvKiBtdXN0IGNvbWUgYWZ0ZXIgdGhlIGhlYWRpbmcgKi8KICAgIHZhciBibG9ja2VkPWhlYWRzLnNvbWUoZnVuY3Rpb24oaCl7cmV0dXJuIGghPT1oZCYmIWguY29udGFpbnMoaGQpJiYoaGQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaCkmNCkmJihoLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHVsKSY0KTt9KTsKICAgIGlmKGJsb2NrZWQpcmV0dXJuIFtdOyAvKiBhbm90aGVyIGhlYWRpbmcgY29tZXMgZmlyc3QsIHNvIHRoaXMgbGlzdCBiZWxvbmdzIHRvIGl0ICovCiAgICByZXR1cm4gW10ubWFwLmNhbGwodWwucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlID4gbGkiKSxmdW5jdGlvbihsaSl7cmV0dXJuIGxpLnRleHRDb250ZW50LnJlcGxhY2UoL1xzKy9nLCIgIikudHJpbSgpO30pLmZpbHRlcihCb29sZWFuKTsKICB9CiAgcmV0dXJuIFtdOwp9CmZ1bmN0aW9uIHNwbGl0Q2VsbCh0ZCl7CiAgdmFyIHM9dGQudGV4dENvbnRlbnQucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCk7CiAgdmFyIG09cy5tYXRjaCgvKFxkezEsMn0pWy1cLy5dKFxkezEsMn0pWy1cLy5dKFxkezR9KSg/Oiw/XHMqKFxkezEsMn0pOihcZHsyfSkpP1xzKiguKikkLyk7CiAgaWYoIW0pcmV0dXJuIHtkdDoiIixwb3J0OiIifTsKICB2YXIgZHQ9bVszXSsiLSIrcGFkKCttWzJdKSsiLSIrcGFkKCttWzFdKSsobVs0XT8iVCIrcGFkKCttWzRdKSsiOiIrbVs1XToiVDEyOjAwIik7CiAgcmV0dXJuIHtkdDpkdCxwb3J0OihtWzZdfHwiIikudHJpbSgpfTsKfQpmdW5jdGlvbiBhcHBseUltcG9ydChwLHYscm93KXsKICBpZih2LnRpdGxlKXAubmFtZT12LnRpdGxlOyBwLnZveWFnZVVybD12LnVybDsKICBpZihyb3cudmVzc2VsKXAudmVzc2VsPXJvdy52ZXNzZWw7IGlmKHJvdy52b3lhZ2VObylwLnZveWFnZU5vPXJvdy52b3lhZ2VObzsgaWYocm93Lm5pZ2h0cylwLm5pZ2h0cz1yb3cubmlnaHRzOwogIHAuc3RhcnQ9cm93LnN0YXJ0OyBwLmVuZD1yb3cuZW5kOyBwLmpvaW5Qb3J0PXJvdy5qb2luUG9ydDsgcC5sZWF2ZVBvcnQ9cm93LmxlYXZlUG9ydDsKICBpZih2LnByaWNlKXAucHJpY2U9di5wcmljZTsgaWYodi5jdXJyZW5jeSlwLmN1cnJlbmN5PXYuY3VycmVuY3k7CiAgaWYodi5iZXJ0aHMmJnYuYmVydGhzLmxlbmd0aCl7CiAgICB2YXIgb2xkTj17fTsgKHAuYmVydGhzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihiKXtvbGROW2IubGFiZWxdPWIubnx8MDt9KTsKICAgIHAuYmVydGhzPXYuYmVydGhzLm1hcChmdW5jdGlvbihiKXtiLm49b2xkTltiLmxhYmVsXXx8MDsgaWYoIWIuY3VyKWIuY3VyPXAuY3VycmVuY3k7IHJldHVybiBiO30pOwogICAgcC5wcmljZXNBdD1uZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCk7CiAgfQogIGlmKHYua2l0JiZ2LmtpdC5icmluZy5sZW5ndGgpewogICAgdmFyIG9sZD1wLmtpdCYmcC5raXQuYnJpbmc/cC5raXQuYnJpbmcuam9pbigifCIpOiIiOyBwLmtpdD12LmtpdDsgcC5zaG93R2VuZXJhbEtpdD1mYWxzZTsKICAgIGlmKG9sZCE9PXYua2l0LmJyaW5nLmpvaW4oInwiKSlPYmplY3Qua2V5cyhwLml0ZW1zKS5mb3JFYWNoKGZ1bmN0aW9uKGspe2lmKC9ea1xkKyQvLnRlc3QoaykpZGVsZXRlIHAuaXRlbXNba107fSk7IC8qIG5ldyBsaXN0LCBjbGVhciBvbGQgdGlja3MgKi8KICB9CiAgdmFyIHNkPXJvdy5zdGFydC5zbGljZSgwLDEwKSwgZWQ9cm93LmVuZC5zbGljZSgwLDEwKSwgZDE9bmV3IERhdGUoc2QpLCBkMj1uZXcgRGF0ZShlZCk7CiAgdmFyIHNlYUZyb209bmV3IERhdGUoZDEpOyBzZWFGcm9tLnNldERhdGUoc2VhRnJvbS5nZXREYXRlKCkrMSk7IHZhciBzZWFUbz1uZXcgRGF0ZShkMik7IHNlYVRvLnNldERhdGUoc2VhVG8uZ2V0RGF0ZSgpLTEpOwogIHAuZGF5cz1be2xhYmVsOiJKb2luaW5nIGRheSIsZGF0ZTpzZCx0bzoiIixub3RlOiJKb2luIGluICIrKHJvdy5qb2luUG9ydHx8InBvcnQiKSsocm93LnN0YXJ0Lmxlbmd0aD4xMD8iIGF0ICIrcm93LnN0YXJ0LnNsaWNlKDExKToiIikrIi4ifV07CiAgaWYoc2VhRnJvbTw9c2VhVG8pcC5kYXlzLnB1c2goe2xhYmVsOiJBdCBzZWEiLGRhdGU6aXNvKHNlYUZyb20pLHRvOmlzbyhzZWFUbyksbm90ZTp2LnN0b3BzLmxlbmd0aD8iUG9zc2libGUgc3RvcG92ZXJzOiAiK3Yuc3RvcHMuam9pbigiLCAiKSsiLiBSb3V0ZXMgYW5kIHBvcnRzIGRlcGVuZCBvbiB3ZWF0aGVyIGFuZCB0aGUgc2tpcHBlcuKAmXMgZGVjaXNpb24uIjoiUm91dGVzIGFuZCBwb3J0cyBkZXBlbmQgb24gd2VhdGhlciBhbmQgdGhlIHNraXBwZXLigJlzIGRlY2lzaW9uLiJ9KTsKICBwLmRheXMucHVzaCh7bGFiZWw6IkxlYXZpbmcgZGF5IixkYXRlOmVkLHRvOiIiLG5vdGU6IkxlYXZlIGluICIrKHJvdy5sZWF2ZVBvcnR8fCJwb3J0IikrKHJvdy5lbmQubGVuZ3RoPjEwPyIgYXQgIityb3cuZW5kLnNsaWNlKDExKToiIikrIi4ifSk7Cn0KZnVuY3Rpb24gaXNvKGQpe3JldHVybiBkLmdldEZ1bGxZZWFyKCkrIi0iK3BhZChkLmdldE1vbnRoKCkrMSkrIi0iK3BhZChkLmdldERhdGUoKSk7fQpmdW5jdGlvbiBub3JtTm8ocyl7cmV0dXJuIFN0cmluZyhzfHwiIikucmVwbGFjZSgvW15BLVphLXowLTldL2csIiIpLnRvVXBwZXJDYXNlKCk7fQp2YXIgT05TSVRFPS8oXnxcLiljbGFzc2ljLXNhaWxpbmdcLmNvbSQvaTsKZnVuY3Rpb24gZG9JbXBvcnQocCl7CiAgdmFyIHJhdz0oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNzdnAtaW1wIikudmFsdWV8fCIiKS50cmltKCksIHdhbnQ9IiIsIHU9bnVsbDsKICB2YXIgbG9va3NMaW5rPS9eaHR0cHM/OnxjbGFzc2ljLXNhaWxpbmd8XC92b3lhZ2VzXC8vaS50ZXN0KHJhdyk7CiAgaWYocmF3JiYhbG9va3NMaW5rJiZyYXcubGVuZ3RoPD0yNCYmL1tBLVphLXpdLy50ZXN0KHJhdykmJi9cZC8udGVzdChyYXcpKXt3YW50PW5vcm1ObyhyYXcpOyBwLnZveWFnZU5vPXJhdy50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCIiKTt9CiAgZWxzZSBpZighcmF3KXt2aWV3LmltcG9ydE1zZz0nPGRpdiBjbGFzcz0id2FybiI+UGxlYXNlIGVudGVyIGEgdm95YWdlIG51bWJlciAoZm9yIGV4YW1wbGUgSkwxODA0MjcpIG9yIGEgdm95YWdlIHBhZ2UgbGluayBmaXJzdC48L2Rpdj4nOyByZW5kZXIoKTsgcmV0dXJuO30KICBlbHNle3RyeXt1PW5ldyBVUkwocmF3LGxvY2F0aW9uLmhyZWYpO31jYXRjaChlKXt1PW51bGw7fQogICAgaWYodSYmIS9cL3ZveWFnZXNcLy8udGVzdCh1LnBhdGhuYW1lKSl7dmlldy5pbXBvcnRNc2c9JzxkaXYgY2xhc3M9Indhcm4iPlRoYXQgbGluayBpcyBub3QgYSB2b3lhZ2UgcGFnZS4gVm95YWdlIHBhZ2UgbGlua3MgY29udGFpbiAvdm95YWdlcy8uPC9kaXY+JzsgcmVuZGVyKCk7IHJldHVybjt9CiAgICBpZighdXx8IU9OU0lURS50ZXN0KHUuaG9zdG5hbWUpKXt2aWV3LmltcG9ydE1zZz0nPGRpdiBjbGFzcz0id2FybiI+UGxlYXNlIGVudGVyIGEgdm95YWdlIG51bWJlciAoZm9yIGV4YW1wbGUgSkwxODA0MjcpIG9yIGEgbGluayB0byBhIHZveWFnZSBwYWdlIG9uIGNsYXNzaWMtc2FpbGluZy5jb20uPC9kaXY+JzsgcmVuZGVyKCk7IHJldHVybjt9CiAgICBwLnZveWFnZVVybD11LmhyZWY7IGlmKHAudm95YWdlTm8pd2FudD1ub3JtTm8ocC52b3lhZ2VObyk7fQogIGlmKCFPTlNJVEUudGVzdChsb2NhdGlvbi5ob3N0bmFtZSkpe3ZpZXcuaW1wb3J0TXNnPSc8ZGl2IGNsYXNzPSJ3YXJuIj5UaGlzIHdvcmtzIG9uY2UgdGhlIHBsYW5uZXIgaXMgb24gY2xhc3NpYy1zYWlsaW5nLmNvbS4gSW4gdGhpcyB0ZXN0IGNvcHksIHBsZWFzZSB0eXBlIHRoZSBkZXRhaWxzIGluIGJlbG93LjwvZGl2Pic7IHNhdmUoKTsgcmVuZGVyKCk7IHJldHVybjt9CiAgdmlldy5pbXBvcnRNc2c9JzxkaXYgY2xhc3M9ImhpbnQiPkZpbmRpbmcgdGhlIHZveWFnZeKApjwvZGl2Pic7IHJlbmRlcigpOwogIHZhciBnZXRQYWdlPXU/ZmV0Y2hQYWdlKHUucGF0aG5hbWUrdS5zZWFyY2gpOmZpbmRCeU51bWJlcih3YW50KTsKICBnZXRQYWdlLnRoZW4oZnVuY3Rpb24ocmVzKXsKICAgIGlmKCFyZXMpdGhyb3cgIm5mIjsKICAgIHZhciB2PXBhcnNlVm95YWdlKHJlcy5odG1sLHJlcy51cmwpOwogICAgaWYoIXYucm93cy5sZW5ndGgpe3ZpZXcuaW1wb3J0TXNnPSc8ZGl2IGNsYXNzPSJ3YXJuIj5Db3VsZCBub3QgZmluZCB0aGUgdm95YWdlIGRhdGVzIG9uIHRoYXQgcGFnZS4gUGxlYXNlIHR5cGUgdGhlIGRldGFpbHMgaW4gYmVsb3cuPC9kaXY+JzsgcmVuZGVyKCk7IHJldHVybjt9CiAgICB2YXIgbWF0Y2g9d2FudD92LnJvd3MuZmlsdGVyKGZ1bmN0aW9uKHIpe3JldHVybiBub3JtTm8oci52b3lhZ2VObyk9PT13YW50O30pOltdOwogICAgdmFyIHJvdz1tYXRjaC5sZW5ndGg9PT0xP21hdGNoWzBdOnYucm93cy5sZW5ndGg9PT0xP3Yucm93c1swXTpudWxsOwogICAgaWYocm93KXthcHBseUltcG9ydChwLHYscm93KTsgdmlldy5pbXBvcnRNc2c9JzxkaXYgY2xhc3M9Im9rIj5Wb3lhZ2UgZGV0YWlscyBhZGRlZC4gQ2hlY2sgdGhlbSBiZWxvdywgdGhlbiBsb29rIGF0IHRoZSBWb3lhZ2Ugb3V0bGluZSBhbmQgdGhlIGtpdCBsaXN0LjwvZGl2Pic7IHNhdmUoIlZveWFnZSBkZXRhaWxzIGFkZGVkIik7IHJlbmRlcigpOyByZXR1cm47fQogICAgdmlldy5wZW5kaW5nPXY7CiAgICB2aWV3LmltcG9ydE1zZz0nPGRpdiBjbGFzcz0icGFuZWwiPjxsYWJlbCBjbGFzcz0iZiIgZm9yPSJjc3ZwLWltcC1yb3ciPlRoaXMgdm95YWdlIGhhcyBtb3JlIHRoYW4gb25lIGRhdGUuIFdoaWNoIG9uZT88L2xhYmVsPjxzZWxlY3QgaWQ9ImNzdnAtaW1wLXJvdyI+JysKICAgICAgdi5yb3dzLm1hcChmdW5jdGlvbihyLGkpe3JldHVybiAnPG9wdGlvbiB2YWx1ZT0iJytpKyciPicrZXNjKGZtdERhdGUoci5zdGFydCkpKycgdG8gJytlc2MoZm10RGF0ZShyLmVuZCkpKyhyLnZveWFnZU5vPycgKCcrZXNjKHIudm95YWdlTm8pKycpJzonJykrJzwvb3B0aW9uPic7fSkuam9pbigiIikrCiAgICAgICc8L3NlbGVjdD48ZGl2IGNsYXNzPSJhY3Rpb25zIj48YnV0dG9uIGNsYXNzPSJidG4gc21hbGwiIGRhdGEtYWN0PSJpbXBvcnRyb3ciPlVzZSB0aGlzIGRhdGU8L2J1dHRvbj48L2Rpdj48L2Rpdj4nOyByZW5kZXIoKTsKICB9KS5jYXRjaChmdW5jdGlvbihlcnIpe3ZpZXcuaW1wb3J0TXNnPWVycj09PSJuZiI/JzxkaXYgY2xhc3M9Indhcm4iPkNvdWxkIG5vdCBmaW5kIHZveWFnZSAnK2VzYyh3YW50KSsnLiBQbGVhc2UgY2hlY2sgdGhlIG51bWJlciwgb3IgcGFzdGUgdGhlIHZveWFnZSBwYWdlIGxpbmsgaW5zdGVhZC48L2Rpdj4nOic8ZGl2IGNsYXNzPSJ3YXJuIj5Db3VsZCBub3QgcmVhZCB0aGF0IHBhZ2UuIFBsZWFzZSBjaGVjayB0aGUgbGluaywgb3IgdHlwZSB0aGUgZGV0YWlscyBpbiBiZWxvdy48L2Rpdj4nOyByZW5kZXIoKTt9KTsKfQpmdW5jdGlvbiBmZXRjaFBhZ2UocGF0aCl7cmV0dXJuIGZldGNoKHBhdGgse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKHIpe2lmKCFyLm9rKXRocm93IDA7IHJldHVybiByLnRleHQoKTt9KS50aGVuKGZ1bmN0aW9uKGh0bWwpe3JldHVybiB7aHRtbDpodG1sLHVybDpuZXcgVVJMKHBhdGgsbG9jYXRpb24uaHJlZikuaHJlZn07fSk7fQovKiBMb29rIHVwIGEgdm95YWdlIG51bWJlciB3aXRoIHRoZSBzaXRlIHNlYXJjaCwgdGhlbiBvcGVuIHRoZSBsaWtlbHkgcGFnZXMgdW50aWwgb25lIGxpc3RzIHRoYXQgdm95YWdlIG51bWJlci4KICAgU2VhcmNoIHJlc3VsdHMgY2FuIGluY2x1ZGUgb3RoZXIgdm95YWdlcyAoZm9yIGV4YW1wbGUgcmVjZW50bHkgdmlld2VkKSwgc28gdGhlIHBhZ2UgaXRzZWxmIGlzIGNoZWNrZWQuICovCmZ1bmN0aW9uIGZpbmRCeU51bWJlcihubyl7CiAgcmV0dXJuIGZldGNoKCIvP3M9IitlbmNvZGVVUklDb21wb25lbnQobm8pLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihyKXtpZighci5vayl0aHJvdyAwOyByZXR1cm4gci50ZXh0KCk7fSkudGhlbihmdW5jdGlvbihodG1sKXsKICAgIHZhciBkb2M9bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCJ0ZXh0L2h0bWwiKSwgc2Vlbj17fSwgbGlua3M9W10sIGtleT1uby50b0xvd2VyQ2FzZSgpOwogICAgW10uZm9yRWFjaC5jYWxsKGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWYqPSIvdm95YWdlcy8iXScpLGZ1bmN0aW9uKGEpewogICAgICB2YXIgaD1hLmdldEF0dHJpYnV0ZSgiaHJlZiIpOyB0cnl7dmFyIHg9bmV3IFVSTChoLGxvY2F0aW9uLmhyZWYpOyBpZighT05TSVRFLnRlc3QoeC5ob3N0bmFtZSkpcmV0dXJuOyB2YXIgcGF0aD14LnBhdGhuYW1lLnJlcGxhY2UoL1wvKyQvLCIvIik7CiAgICAgICAgaWYoL1wvdm95YWdlc1wvW15cL10rXC8kLy50ZXN0KHBhdGgpJiYhc2VlbltwYXRoXSl7c2VlbltwYXRoXT0xOyBsaW5rcy5wdXNoKHBhdGgpO319Y2F0Y2goZSl7fQogICAgfSk7CiAgICBsaW5rcy5zb3J0KGZ1bmN0aW9uKGEsYil7dmFyIHNhPWEucmVwbGFjZSgvW15hLXowLTldL2dpLCIiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoa2V5KT4tMT8wOjEsIHNiPWIucmVwbGFjZSgvW15hLXowLTldL2dpLCIiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoa2V5KT4tMT8wOjE7IHJldHVybiBzYS1zYjt9KTsKICAgIGxpbmtzPWxpbmtzLnNsaWNlKDAsNik7CiAgICByZXR1cm4gKGZ1bmN0aW9uIG5leHQoaSl7CiAgICAgIGlmKGk+PWxpbmtzLmxlbmd0aClyZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGZldGNoUGFnZShsaW5rc1tpXSkudGhlbihmdW5jdGlvbihyZXMpewogICAgICAgIHZhciB2PXBhcnNlVm95YWdlKHJlcy5odG1sLHJlcy51cmwpOwogICAgICAgIHJldHVybiB2LnJvd3Muc29tZShmdW5jdGlvbihyKXtyZXR1cm4gbm9ybU5vKHIudm95YWdlTm8pPT09bm87fSk/cmVzOm5leHQoaSsxKTsKICAgICAgfSxmdW5jdGlvbigpe3JldHVybiBuZXh0KGkrMSk7fSk7CiAgICB9KSgwKTsKICB9KTsKfQoKLyogT3V0bGluZTogc2luZ2xlIGRheXMgb3IgZGF0ZSByYW5nZXMgKi8KZnVuY3Rpb24gdGFiT3V0bGluZShwKXsKICB2YXIgaD0nPGRpdiBjbGFzcz0iYmFubmVyIj4nKyhwLnR5cGU9PT0ic2FpbGluZyI/J1JvdXRlcyBhbmQgcG9ydHMgZGVwZW5kIG9uIHdlYXRoZXIgYW5kIHRoZSBza2lwcGVy4oCZcyBkZWNpc2lvbi4gVXNlIGEgZGF0ZSByYW5nZSBmb3IgZGF5cyBhdCBzZWEsIG9yIGFkZCBlYWNoIGRheSBzZXBhcmF0ZWx5Lic6J0FkZCBlYWNoIGRheSBvZiB5b3VyIHRyaXAsIG9yIGEgZGF0ZSByYW5nZSwgd2l0aCBhIG5vdGUuJykrJzwvZGl2Pic7CiAgaWYoIXAuZGF5cy5sZW5ndGggJiYgcC5zdGFydCAmJiBwLmVuZCl7aCs9JzxkaXYgY2xhc3M9Im5vcHJpbnQiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEwcHgiPjxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCBzbWFsbCIgZGF0YS1hY3Q9ImZpbGxkYXlzIj5BZGQgYSByb3cgZm9yIGVhY2ggZGF0ZSBpbiB0aGUgcGxhbjwvYnV0dG9uPjwvZGl2Pic7fQogIHAuZGF5cy5mb3JFYWNoKGZ1bmN0aW9uKGQsaSl7CiAgICBoKz0nPGRpdiBjbGFzcz0iY2FyZCI+PGRpdiBjbGFzcz0iZ3JpZDMiPjxkaXY+PGxhYmVsIGNsYXNzPSJmIj5EYXk8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBkYXRhLWRheT0iJytpKyciIGRhdGEtZGs9ImxhYmVsIiB2YWx1ZT0iJytlc2MoZC5sYWJlbCkrJyIgcGxhY2Vob2xkZXI9IkZvciBleGFtcGxlOiBBdCBzZWEiPjwvZGl2PicrCiAgICAgICAnPGRpdj48bGFiZWwgY2xhc3M9ImYiPkRhdGUgKG9yIGZyb20pPC9sYWJlbD48aW5wdXQgdHlwZT0iZGF0ZSIgZGF0YS1kYXk9IicraSsnIiBkYXRhLWRrPSJkYXRlIiB2YWx1ZT0iJytlc2MoZC5kYXRlfHwiIikrJyI+PC9kaXY+JysKICAgICAgICc8ZGl2PjxsYWJlbCBjbGFzcz0iZiI+VG8gKG9wdGlvbmFsKTwvbGFiZWw+PGlucHV0IHR5cGU9ImRhdGUiIGRhdGEtZGF5PSInK2krJyIgZGF0YS1kaz0idG8iIHZhbHVlPSInK2VzYyhkLnRvfHwiIikrJyI+PC9kaXY+PC9kaXY+JysKICAgICAgICc8bGFiZWwgY2xhc3M9ImYiPk5vdGU8L2xhYmVsPjx0ZXh0YXJlYSBkYXRhLWRheT0iJytpKyciIGRhdGEtZGs9Im5vdGUiPicrZXNjKGQubm90ZSkrJzwvdGV4dGFyZWE+JysKICAgICAgICc8ZGl2IGNsYXNzPSJhY3Rpb25zIj48YnV0dG9uIGNsYXNzPSJsaW5rIiBkYXRhLWFjdD0iZGVsZGF5IiBkYXRhLWk9IicraSsnIj5yZW1vdmU8L2J1dHRvbj48L2Rpdj48L2Rpdj4nOwogIH0pOwogIHZhciB0cGw9cC50eXBlPT09InNhaWxpbmciP1siVHJhdmVsIGRheSIsIkpvaW5pbmcgZGF5IiwiQXQgc2VhIiwiTGVhdmluZyBkYXkiLCJUcmF2ZWwgaG9tZSJdOlsiRGF5Il07CiAgaCs9JzxkaXYgY2xhc3M9ImN2cm93IG5vcHJpbnQiPicrdHBsLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gJzxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCBzbWFsbCIgZGF0YS1hY3Q9ImFkZGRheSIgZGF0YS1sYWJlbD0iJyt0KyciPisgJyt0Kyc8L2J1dHRvbj4nO30pLmpvaW4oIiIpKyc8L2Rpdj4nOwogIGlmKHAuZGF5cy5sZW5ndGgpaCs9JzxkaXYgY2xhc3M9ImFjdGlvbnMgbm9wcmludCI+PGJ1dHRvbiBjbGFzcz0iYnRuIiBkYXRhLWFjdD0ic2F2ZWRheXMiPlNhdmUgb3V0bGluZTwvYnV0dG9uPjwvZGl2Pic7CiAgcmV0dXJuIGg7Cn0KZnVuY3Rpb24gZGF5UmFuZ2UoZCl7cmV0dXJuIGQuZGF0ZT9mbXREYXRlKGQuZGF0ZSkrKGQudG8mJmQudG8hPT1kLmRhdGU/JyB0byAnK2ZtdERhdGUoZC50byk6JycpOicnO30KCi8qIEJ1ZGdldCBhbmQgc3BsaXR0aW5nICovCmZ1bmN0aW9uIHN1bUhvbWUobGlzdCxmaWx0ZXIpe3ZhciB0b3Q9MCxtaXNzPWZhbHNlOyBsaXN0LmZvckVhY2goZnVuY3Rpb24oeCl7aWYoIWZpbHRlcih4KSlyZXR1cm47IHZhciB2PXRvSG9tZSh4LmFtdCx4LmN1cik7IGlmKHY9PW51bGwpbWlzcz10cnVlOyBlbHNlIHRvdCs9djt9KTsgcmV0dXJuIHt0b3Q6dG90LG1pc3M6bWlzc307fQpmdW5jdGlvbiB0YWJCdWRnZXQocCl7CiAgdmFyIGg9JycsIHBheXM9YWxsUGF5bWVudHMocCkuZmlsdGVyKGZ1bmN0aW9uKHgpe3JldHVybiAheC5idWRnZXQ7fSksIGJjcz1iZXJ0aENvc3QocCk7CiAgaWYoYmNzLmFtdCl7CiAgICBoKz0nPGRpdiBjbGFzcz0iY2FyZCI+PGRpdiBjbGFzcz0ibGJsIj5Wb3lhZ2UgY29zdDwvZGl2PjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0cj48dGg+QmVydGg8L3RoPjx0aD5QZW9wbGU8L3RoPjx0aD5QcmljZSBlYWNoPC90aD48dGg+U3VidG90YWw8L3RoPjwvdHI+JysKICAgICAgcC5iZXJ0aHMuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiArYi5uO30pLm1hcChmdW5jdGlvbihiKXt2YXIgcHI9Yi5vZmZlcnx8Yi5wcmljZTsgcmV0dXJuICc8dHI+PHRkPicrZXNjKGIubGFiZWwpKyc8L3RkPjx0ZCBjbGFzcz0ibW9ubyI+JytiLm4rJzwvdGQ+PHRkIGNsYXNzPSJtb25vIj4nK21vbmV5KHByLGIuY3VyKSsoYi5vZmZlcj8nIG9mZmVyJzonJykrJzwvdGQ+PHRkIGNsYXNzPSJtb25vIj4nK21vbmV5KHByKmIubixiLmN1cikrJzwvdGQ+PC90cj4nO30pLmpvaW4oIiIpKwogICAgICAnPC90YWJsZT48L2Rpdj48ZGl2IGNsYXNzPSJ0b3RhbHMiPjxzcGFuPlZveWFnZSBjb3N0IDxiPicrbW9uZXkoYmNzLmFtdCxiY3MuY3VyKSsnPC9iPiAnK2FwcHJveChiY3MuYW10LGJjcy5jdXIpKyc8L3NwYW4+PC9kaXY+JysKICAgICAgJzxkaXYgY2xhc3M9ImhpbnQiPkZyb20gdGhlIGJlcnRocyBjaG9zZW4gaW4gUGxhbiBkZXRhaWxzLiBEZXBvc2l0IGFuZCBiYWxhbmNlIHBheW1lbnRzIHlvdSBlbnRlciBpbiB0aGUgY2hlY2tsaXN0IGNvdW50IHRvd2FyZHMgdGhpcy48L2Rpdj4nK2Jvb2tCbG9jayhwLGZhbHNlKSsnPC9kaXY+JzsKICB9CiAgaCs9JzxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImxibCI+Vm95YWdlIHBheW1lbnRzIGZyb20geW91ciBjaGVja2xpc3Q8L2Rpdj4nOwogIGlmKCFwYXlzLmxlbmd0aCloKz0nPGRpdiBjbGFzcz0iaGludCI+QWRkIGFtb3VudHMsIGN1cnJlbmN5IGFuZCBkdWUgZGF0ZXMgdXNpbmcgRmluYWwgZGV0YWlscyBvbiB0aGUgcGF5bWVudCBpdGVtcyBpbiBCb29raW5nIGFuZCBwYXltZW50cy48L2Rpdj4nOwogIGVsc2UgaCs9JzxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0cj48dGg+UGF5bWVudDwvdGg+PHRoPkFtb3VudDwvdGg+PHRoPkR1ZTwvdGg+PHRoPlN0YXR1czwvdGg+PC90cj4nK3BheXMubWFwKGZ1bmN0aW9uKHgpewogICAgICByZXR1cm4gJzx0cj48dGQ+Jytlc2MoeC5sKSsnPC90ZD48dGQgY2xhc3M9Im1vbm8iPicrKHguYW10P21vbmV5KHguYW10LHguY3VyKSsnPGJyPicrYXBwcm94KHguYW10LHguY3VyKTonJykrJzwvdGQ+PHRkIGNsYXNzPSJtb25vIj4nK2ZtdERhdGUoeC5kdWUpKyc8L3RkPjx0ZD4nKyh4LnBhaWQ/JzxzcGFuIGNsYXNzPSJjaGlwIGRvbmUiPlBhaWQ8L3NwYW4+JzooeC5kdWUmJnguZHVlPG5vd0xvY2FsKCk/JzxzcGFuIGNsYXNzPSJjaGlwIG5vdHlldCI+T3ZlcmR1ZTwvc3Bhbj4nOidUbyBwYXknKSkrJzwvdGQ+PC90cj4nO30pLmpvaW4oIiIpKyc8L3RhYmxlPjwvZGl2Pic7CiAgaCs9JzwvZGl2Pic7CiAgaCs9JzxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImxibCI+T3RoZXIgY29zdHM8L2Rpdj48ZGl2IGNsYXNzPSJoaW50Ij5UcmF2ZWwsIGluc3VyYW5jZSwga2l0LCBhY2NvbW1vZGF0aW9uLCBzcGVuZGluZyBtb25leS4gRWFjaCBjb3N0IGNhbiBiZSBpbiBpdHMgb3duIGN1cnJlbmN5LjwvZGl2PjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0cj48dGg+SXRlbTwvdGg+PHRoPkFtb3VudDwvdGg+PHRoPkN1cnJlbmN5PC90aD48dGg+RHVlIGRhdGUgYW5kIHRpbWU8L3RoPjx0aD5QYWlkIG9uPC90aD4nKyhwLnNwbGl0Pyc8dGg+U2hhcmVkPC90aD48dGg+UGFpZCBieTwvdGg+JzonJykrJzx0aD48L3RoPjwvdHI+JzsKICBwLmJ1ZGdldC5mb3JFYWNoKGZ1bmN0aW9uKGIsaSl7CiAgICBoKz0nPHRyPjx0ZD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1idWQ9IicraSsnIiBkYXRhLWJrPSJsYWJlbCIgdmFsdWU9IicrZXNjKGIubGFiZWwpKyciIHN0eWxlPSJtaW4td2lkdGg6MTIwcHgiPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJudW1iZXIiIHN0ZXA9IjAuMDEiIG1pbj0iMCIgZGF0YS1idWQ9IicraSsnIiBkYXRhLWJrPSJhbW91bnQiIHZhbHVlPSInK2VzYyhiLmFtb3VudCkrJyIgc3R5bGU9IndpZHRoOjEwMHB4Ij4nKyhiLmFtb3VudD8nPGRpdj4nK2FwcHJveChiLmFtb3VudCxiLmN1cnx8cC5jdXJyZW5jeSkrJzwvZGl2Pic6JycpKyc8L3RkPicrCiAgICAgICAnPHRkPicrY3VyU2VsZWN0KCdkYXRhLWJ1ZD0iJytpKyciIGRhdGEtYms9ImN1ciIgc3R5bGU9IndpZHRoOjgwcHgiJyxiLmN1cnx8cC5jdXJyZW5jeSkrJzwvdGQ+JysKICAgICAgICc8dGQ+PGlucHV0IHR5cGU9ImRhdGV0aW1lLWxvY2FsIiBkYXRhLWJ1ZD0iJytpKyciIGRhdGEtYms9ImR1ZSIgdmFsdWU9IicrZXNjKGIuZHVlKSsnIj48L3RkPjx0ZD48aW5wdXQgdHlwZT0iZGF0ZSIgZGF0YS1idWQ9IicraSsnIiBkYXRhLWJrPSJwYWlkIiB2YWx1ZT0iJytlc2MoYi5wYWlkKSsnIj48L3RkPicrCiAgICAgICAocC5zcGxpdD8nPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1idWQ9IicraSsnIiBkYXRhLWJrPSJzaGFyZWQiJysoYi5zaGFyZWQ/JyBjaGVja2VkJzonJykrJyBhcmlhLWxhYmVsPSJTaGFyZWQgY29zdCI+PC90ZD48dGQ+PHNlbGVjdCBkYXRhLWJ1ZD0iJytpKyciIGRhdGEtYms9InBheWVyIj4nK1snPG9wdGlvbiB2YWx1ZT0iIj5DaG9vc2U8L29wdGlvbj4nXS5jb25jYXQocC5wZW9wbGUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiAnPG9wdGlvbicrKGIucGF5ZXI9PT1uPycgc2VsZWN0ZWQnOicnKSsnPicrZXNjKG4pKyc8L29wdGlvbj4nO30pKS5qb2luKCIiKSsnPC9zZWxlY3Q+PC90ZD4nOicnKSsKICAgICAgICc8dGQ+PGJ1dHRvbiBjbGFzcz0ibGluayIgZGF0YS1hY3Q9ImRlbGJ1ZCIgZGF0YS1pPSInK2krJyI+cmVtb3ZlPC9idXR0b24+PC90ZD48L3RyPic7CiAgfSk7CiAgaCs9JzwvdGFibGU+PC9kaXY+PGRpdiBjbGFzcz0iYWN0aW9ucyBub3ByaW50Ij48YnV0dG9uIGNsYXNzPSJidG4gZ2hvc3Qgc21hbGwiIGRhdGEtYWN0PSJhZGRidWQiPkFkZCBjb3N0PC9idXR0b24+JysocC5idWRnZXQubGVuZ3RoPyc8YnV0dG9uIGNsYXNzPSJidG4gc21hbGwiIGRhdGEtYWN0PSJzYXZlYnVkIj5TYXZlIGNvc3RzPC9idXR0b24+JzonJykrJzwvZGl2PjwvZGl2Pic7CiAgaCs9dG90YWxzQ2FyZChwKTsKICAvKiBzcGxpdHRpbmcgKi8KICBoKz0nPGRpdiBjbGFzcz0iY2FyZCI+PGRpdiBjbGFzcz0iY3Zyb3ciPjxkaXYgY2xhc3M9Imdyb3ciPjxkaXYgY2xhc3M9ImxibCI+U2hhcmUgY29zdHMgd2l0aCBvdGhlcnMgKG9wdGlvbmFsKTwvZGl2PjxkaXYgY2xhc3M9ImhpbnQiPkZvciBjb3VwbGVzIG9yIGZyaWVuZHMgdHJhdmVsbGluZyB0b2dldGhlci4gTmFtZXMgb25seSwgbm8gY29udGFjdCBkZXRhaWxzIG5lZWRlZC48L2Rpdj48L2Rpdj4nKwogICAgICc8bGFiZWwgY2xhc3M9ImN2cm93IiBzdHlsZT0iZ2FwOjZweDtmb250LXdlaWdodDo2MDAiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1hY3Q9InRvZ2dsZXNwbGl0IicrKHAuc3BsaXQ/JyBjaGVja2VkJzonJykrJz4gVHVybiBvbjwvbGFiZWw+PC9kaXY+JzsKICBpZihwLnNwbGl0KXsKICAgIGgrPSc8ZGl2IGNsYXNzPSJjdnJvdyIgc3R5bGU9Im1hcmdpbi10b3A6MTBweCI+JytwLnBlb3BsZS5tYXAoZnVuY3Rpb24obixpKXtyZXR1cm4gJzxzcGFuIGNsYXNzPSJ0YWciPicrZXNjKG4pKycgPGJ1dHRvbiBjbGFzcz0ibGluayIgZGF0YS1hY3Q9ImRlbHBlcnNvbiIgZGF0YS1pPSInK2krJyIgYXJpYS1sYWJlbD0iUmVtb3ZlICcrZXNjKG4pKyciPng8L2J1dHRvbj48L3NwYW4+Jzt9KS5qb2luKCIiKSsnPC9kaXY+JysKICAgICAgICc8ZGl2IGNsYXNzPSJjdnJvdyBub3ByaW50IiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iY3N2cC1wZXJzb24iIHBsYWNlaG9sZGVyPSJBZGQgYSBuYW1lIiBzdHlsZT0iZmxleDoxIDEgMTgwcHgiPjxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCBzbWFsbCIgZGF0YS1hY3Q9ImFkZHBlcnNvbiI+QWRkIHBlcnNvbjwvYnV0dG9uPjwvZGl2Pic7CiAgICBoKz1zcGxpdFRhYmxlKHApOwogIH0KICByZXR1cm4gaCsnPC9kaXY+JzsKfQpmdW5jdGlvbiBjb3N0TGlzdChwKXsKICB2YXIgYWxsPWFsbFBheW1lbnRzKHApLCBiYz1iZXJ0aENvc3QocCk7CiAgaWYoIWJjLmFtdClyZXR1cm4gYWxsOwogIHZhciB2b3k9YWxsLmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5pZD09PSJCMyJ8fHguaWQ9PT0iQjUiO30pLCByZXN0PWFsbC5maWx0ZXIoZnVuY3Rpb24oeCl7cmV0dXJuIHguaWQhPT0iQjMiJiZ4LmlkIT09IkI1Ijt9KTsKICB2YXIgcGFpZFY9dm95LmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5wYWlkJiZ4LmFtdDt9KSwgc2FtZUN1cj1wYWlkVi5ldmVyeShmdW5jdGlvbih4KXtyZXR1cm4geC5jdXI9PT1iYy5jdXI7fSksIGxlZnQ7CiAgaWYoc2FtZUN1cil7bGVmdD17bDoiVm95YWdlIGNvc3Qgc3RpbGwgdG8gcGF5IixhbXQ6TWF0aC5tYXgoMCxiYy5hbXQtcGFpZFYucmVkdWNlKGZ1bmN0aW9uKGEseCl7cmV0dXJuIGErKCt4LmFtdCk7fSwwKSksY3VyOmJjLmN1cn07fQogIGVsc2V7dmFyIHBoPXBhaWRWLnJlZHVjZShmdW5jdGlvbihhLHgpe3ZhciB2PXRvSG9tZSh4LmFtdCx4LmN1cik7IHJldHVybiBhKyh2fHwwKTt9LDApLCB2aD10b0hvbWUoYmMuYW10LGJjLmN1cik7IGxlZnQ9e2w6IlZveWFnZSBjb3N0IHN0aWxsIHRvIHBheSIsYW10OnZoPT1udWxsPzA6TWF0aC5tYXgoMCx2aC1waCksY3VyOnN0YXRlLmhvbWV9O30KICByZXR1cm4gcmVzdC5jb25jYXQocGFpZFYpLmNvbmNhdChsZWZ0LmFtdD9bbGVmdF06W10pOwp9CmZ1bmN0aW9uIHRvdGFsc0NhcmQocCl7CiAgdmFyIGFsbD1jb3N0TGlzdChwKTsKICB2YXIgYnlDdXI9e307IGFsbC5mb3JFYWNoKGZ1bmN0aW9uKHgpe2lmKCF4LmFtdClyZXR1cm47IHZhciBjPXguY3VyOyBieUN1cltjXT1ieUN1cltjXXx8e3BhaWQ6MCx0b3BheTowfTsgaWYoeC5wYWlkKWJ5Q3VyW2NdLnBhaWQrPSt4LmFtdDsgZWxzZSBieUN1cltjXS50b3BheSs9K3guYW10O30pOwogIHZhciBwYWlkPXN1bUhvbWUoYWxsLGZ1bmN0aW9uKHgpe3JldHVybiB4LmFtdCYmeC5wYWlkO30pLCB0b3BheT1zdW1Ib21lKGFsbCxmdW5jdGlvbih4KXtyZXR1cm4geC5hbXQmJiF4LnBhaWQ7fSk7CiAgdmFyIGg9JzxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImxibCI+VG90YWxzPC9kaXY+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRyPjx0aD5DdXJyZW5jeTwvdGg+PHRoPlBhaWQ8L3RoPjx0aD5TdGlsbCB0byBwYXk8L3RoPjx0aD5Ub3RhbDwvdGg+PC90cj4nKwogICAgT2JqZWN0LmtleXMoYnlDdXIpLm1hcChmdW5jdGlvbihjKXt2YXIgdj1ieUN1cltjXTsgcmV0dXJuICc8dHI+PHRkPicrYysnPC90ZD48dGQgY2xhc3M9Im1vbm8iPicrbW9uZXkodi5wYWlkLGMpKyc8L3RkPjx0ZCBjbGFzcz0ibW9ubyI+Jyttb25leSh2LnRvcGF5LGMpKyc8L3RkPjx0ZCBjbGFzcz0ibW9ubyI+Jyttb25leSh2LnBhaWQrdi50b3BheSxjKSsnPC90ZD48L3RyPic7fSkuam9pbigiIikrJzwvdGFibGU+PC9kaXY+JzsKICBoKz0nPGRpdiBjbGFzcz0idG90YWxzIj48c3Bhbj5QYWlkIDxiPuKJiCAnK21vbmV5KHBhaWQudG90LHN0YXRlLmhvbWUpKyc8L2I+PC9zcGFuPjxzcGFuPlN0aWxsIHRvIHBheSA8Yj7iiYggJyttb25leSh0b3BheS50b3Qsc3RhdGUuaG9tZSkrJzwvYj48L3NwYW4+PHNwYW4+VG90YWwgPGI+4omIICcrbW9uZXkocGFpZC50b3QrdG9wYXkudG90LHN0YXRlLmhvbWUpKyc8L2I+PC9zcGFuPjwvZGl2PicrCiAgICAnPGRpdiBjbGFzcz0iaGludCI+VG90YWxzIGluICcrc3RhdGUuaG9tZSsnICh5b3VyIGN1cnJlbmN5LCBzZXQgb24gdGhlIEFsbCBteSBwbGFucyBwYWdlKS4gJytyYXRlTm90ZSgpKyhwYWlkLm1pc3N8fHRvcGF5Lm1pc3M/JyBTb21lIGNvc3RzIGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgeWV0Lic6JycpKyc8L2Rpdj48L2Rpdj4nOwogIHJldHVybiBoOwp9CmZ1bmN0aW9uIHNwbGl0VGFibGUocCl7CiAgaWYocC5wZW9wbGUubGVuZ3RoPDIpcmV0dXJuICc8ZGl2IGNsYXNzPSJoaW50IiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPkFkZCBhdCBsZWFzdCB0d28gbmFtZXMuPC9kaXY+JzsKICB2YXIgYmFsPXt9LG1pc3M9ZmFsc2U7IHAucGVvcGxlLmZvckVhY2goZnVuY3Rpb24obil7YmFsW25dPTA7fSk7CiAgcC5idWRnZXQuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgYT10b0hvbWUoYi5hbW91bnQsYi5jdXJ8fHAuY3VycmVuY3kpOyBpZihhPT1udWxsKXttaXNzPXRydWU7cmV0dXJuO30gaWYoIWIucGF5ZXJ8fCEoYi5wYXllciBpbiBiYWwpKXJldHVybjsgYmFsW2IucGF5ZXJdKz1hOyBpZihiLnNoYXJlZCl7cC5wZW9wbGUuZm9yRWFjaChmdW5jdGlvbihuKXtiYWxbbl0tPWEvcC5wZW9wbGUubGVuZ3RoO30pO31lbHNle2JhbFtiLnBheWVyXS09YTt9fSk7CiAgcmV0dXJuICc8ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHgiPjx0YWJsZT48dHI+PHRoPlBlcnNvbjwvdGg+PHRoPkJhbGFuY2UgKOKJiCAnK3N0YXRlLmhvbWUrJyk8L3RoPjwvdHI+JytwLnBlb3BsZS5tYXAoZnVuY3Rpb24obil7dmFyIHY9YmFsW25dOyByZXR1cm4gJzx0cj48dGQ+Jytlc2MobikrJzwvdGQ+PHRkIGNsYXNzPSJtb25vIj4nKyhNYXRoLmFicyh2KTwwLjAwNT8nU3F1YXJlJzoodj4wPydJcyBvd2VkICcrbW9uZXkodixzdGF0ZS5ob21lKTonT3dlcyAnK21vbmV5KC12LHN0YXRlLmhvbWUpKSkrJzwvdGQ+PC90cj4nO30pLmpvaW4oIiIpKyc8L3RhYmxlPjwvZGl2PicrCiAgICAgJzxkaXYgY2xhc3M9ImhpbnQiPkJhc2VkIG9uIGNvc3RzIGluIE90aGVyIGNvc3RzIG1hcmtlZCBTaGFyZWQsIHdpdGggYSBuYW1lIGluIFBhaWQgYnkuJysobWlzcz8nIFNvbWUgY29zdHMgY291bGQgbm90IGJlIGNvbnZlcnRlZCB5ZXQuJzonJykrJzwvZGl2Pic7Cn0KCi8qIEFJIGFzc2lzdGFudCAob3B0aW9uYWwsIGNvbnNlbnQgZWFjaCB1c2UpICovCmZ1bmN0aW9uIHRhYkFzc2lzdGFudChwKXsKICByZXR1cm4gJzxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImxibCI+UGxhbm5pbmcgYXNzaXN0YW50IChvcHRpb25hbCk8L2Rpdj4nKwogICAnPGRpdiBjbGFzcz0iaGludCI+Q2FuIHN1Z2dlc3Qgd2F5cyB0byB0cmF2ZWwgdG8gdGhlIGpvaW5pbmcgcG9ydCBhbmQgaG9tZSwgcGxhY2VzIHRvIHN0YXkgbmVhcmJ5LCBhIHBhY2tpbmcgbGlzdCBmb3IgdGhlIHZlc3NlbCwgcmVnaW9uIGFuZCB0aW1lIG9mIHllYXIsIGFuZCBnYXBzIGluIHlvdXIgcGxhbi48L2Rpdj4nKwogICAnPGRpdiBjbGFzcz0icGFuZWwiPjxkaXYgY2xhc3M9ImxibCIgc3R5bGU9ImZvbnQtc2l6ZTouOWVtIj5DaG9vc2Ugd2hhdCB0byBzZW5kPC9kaXY+JysKICAgJzxsYWJlbCBjbGFzcz0iY3Zyb3ciIHN0eWxlPSJnYXA6NnB4Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtYWk9ImRhdGVzIiBjaGVja2VkPiBEYXRlcyBhbmQgcG9ydHM8L2xhYmVsPicrCiAgICc8bGFiZWwgY2xhc3M9ImN2cm93IiBzdHlsZT0iZ2FwOjZweCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLWFpPSJ2ZXNzZWwiIGNoZWNrZWQ+IFZlc3NlbCBhbmQgcGxhbiB0eXBlPC9sYWJlbD4nKwogICAnPGxhYmVsIGNsYXNzPSJjdnJvdyIgc3R5bGU9ImdhcDo2cHgiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1haT0ib3BlbiI+IFdoaWNoIGNoZWNrbGlzdCBpdGVtcyBhcmUgbm90IHlldCBkb25lPC9sYWJlbD4nKwogICAnPGxhYmVsIGNsYXNzPSJjdnJvdyIgc3R5bGU9ImdhcDo2cHgiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1haT0ibm90ZXMiPiBNeSBub3RlcywgRmluYWwgZGV0YWlscyBhbmQgT3RoZXIgZGV0YWlsczwvbGFiZWw+PC9kaXY+JysKICAgJzxsYWJlbCBjbGFzcz0iZiIgZm9yPSJjc3ZwLWFpLXEiPldoYXQgd291bGQgeW91IGxpa2UgaGVscCB3aXRoPzwvbGFiZWw+PHRleHRhcmVhIGlkPSJjc3ZwLWFpLXEiIHBsYWNlaG9sZGVyPSJGb3IgZXhhbXBsZTogaG93IGRvIEkgZ2V0IGZyb20gTG9uZG9uIHRvIHRoZSBqb2luaW5nIHBvcnQ/Ij48L3RleHRhcmVhPicrCiAgICc8ZGl2IGNsYXNzPSJiYW5uZXIiIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHgiPjxzdHJvbmc+U2VudCBwcml2YXRlbHkgdG8gQ2xhdWRlPC9zdHJvbmc+VGhlIHBhcnRzIG9mIHRoaXMgcGxhbiB5b3Ugc2VsZWN0IGFyZSBzZW50IHRvIENsYXVkZSwgYSBzZWN1cmUgQUkgc2VydmljZSBtYWRlIGJ5IEFudGhyb3BpYywgb25seSB0byBwcm9kdWNlIHlvdXIgc3VnZ2VzdGlvbnMuICcrCiAgICdBbnRocm9waWMgZG9lcyBub3QgdXNlIHdoYXQgeW91IHNlbmQgdG8gdHJhaW4gaXRzIEFJLCBhbmQgQ2xhc3NpYyBTYWlsaW5nIGRvZXMgbm90IHNlZSB3aGF0IGlzIHNlbnQgb3IgcmV0dXJuZWQuIFN1Z2dlc3Rpb25zIG1heSBiZSB3cm9uZywgc28gcGxlYXNlIGNoZWNrIHRoZW0gYmVmb3JlIHlvdSBib29rIGFueXRoaW5nLjwvZGl2PicrCiAgICc8bGFiZWwgY2xhc3M9ImN2cm93IiBzdHlsZT0iZ2FwOjZweDtmb250LXdlaWdodDo2MDAiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImNzdnAtYWktb2siPiBJIHVuZGVyc3RhbmQuIFNlbmQgdGhlIHNlbGVjdGVkIGRldGFpbHMuPC9sYWJlbD4nKwogICAnPGRpdiBjbGFzcz0iYWN0aW9ucyI+PGJ1dHRvbiBjbGFzcz0iYnRuIiBkYXRhLWFjdD0iYWkiIGlkPSJjc3ZwLWFpLWdvIiBkaXNhYmxlZD5HZXQgc3VnZ2VzdGlvbnM8L2J1dHRvbj48L2Rpdj48ZGl2IGlkPSJjc3ZwLWFpLW91dCI+PC9kaXY+PC9kaXY+JzsKfQoKLyogUmV2aWV3LCBwcmludCBvciBzaGFyZSAqLwpmdW5jdGlvbiB0YWJSZXZpZXcocCl7CiAgdmFyIGg9JzxkaXYgY2xhc3M9ImNhcmQgbm9wcmludCI+PGRpdiBjbGFzcz0ibGJsIj5SZXZpZXcsIHByaW50IG9yIHNoYXJlPC9kaXY+JysKICAgJzxkaXYgY2xhc3M9ImhpbnQiIHN0eWxlPSJtYXJnaW4tdG9wOjRweCI+QmVsb3cgaXMgeW91ciB3aG9sZSBwbGFuIGluIG9uZSBsaXN0LiBZb3VyIHBsYW4gaXMgcHJpdmF0ZSB1bnRpbCB5b3UgZGVjaWRlIG90aGVyd2lzZS4gVG8gbGV0IGEgcGFydG5lciwgZnJpZW5kIG9yIGZhbWlseSBtZW1iZXIgc2VlIGl0OjwvZGl2PicrCiAgICc8b2wgc3R5bGU9ImZvbnQtc2l6ZTouOWVtO21hcmdpbjo4cHggMCAwO3BhZGRpbmctbGVmdDoxLjJlbSI+PGxpPjxiPlByaW50IG9yIFNhdmUgYXMgUERGPC9iPiBhbmQgc2VuZCBpdCBhcyB5b3Ugd291bGQgYW55IGRvY3VtZW50LjwvbGk+PGxpPjxiPkNvcHkgYXMgdGV4dDwvYj4gYW5kIHBhc3RlIGl0IGludG8gYW4gZW1haWwgb3IgbWVzc2FnZS48L2xpPjxsaT48aT5Db21pbmcgbGF0ZXI6PC9pPiA8Yj5TaGFyZSBhIHJlYWQgb25seSBsaW5rPC9iPiB5b3UgY2FuIHN3aXRjaCBvZmYgYXQgYW55IHRpbWUuPC9saT48L29sPicrCiAgICc8ZGl2IGNsYXNzPSJoaW50IiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPkJlZm9yZSBzaGFyaW5nLCBjaGVjayB5b3VyIG5vdGVzIGFuZCBGaW5hbCBkZXRhaWxzIGZvciBhbnl0aGluZyB5b3Ugd291bGQgcmF0aGVyIGtlZXAgdG8geW91cnNlbGYuIENsYXNzaWMgU2FpbGluZyBjYW5ub3Qgc2VlIHlvdXIgcGxhbiB1bmxlc3MgeW91IHNlbmQgaXQgdG8gdXMuPC9kaXY+JysKICAgJzxkaXYgY2xhc3M9ImFjdGlvbnMiPjxidXR0b24gY2xhc3M9ImJ0biIgZGF0YS1hY3Q9InByaW50Ij5QcmludCBvciBzYXZlIGFzIFBERjwvYnV0dG9uPjxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCIgZGF0YS1hY3Q9ImNvcHl0ZXh0Ij5Db3B5IGFzIHRleHQ8L2J1dHRvbj48L2Rpdj48L2Rpdj4nOwogIC8qIGRldGFpbHMgKi8KICB2YXIgZGV0PVtbIlR5cGUiLHAudHlwZT09PSJzYWlsaW5nIj8iU2FpbGluZyB2b3lhZ2UiOiJPdGhlciB0cmlwIl0sWyJWZXNzZWwiLHAudmVzc2VsXSxbIlZveWFnZSBudW1iZXIiLHAudm95YWdlTm9dLFtwLnR5cGU9PT0ic2FpbGluZyI/IkpvaW5pbmciOiJTdGFydCIsKHAuc3RhcnQ/Zm10RGF0ZShwLnN0YXJ0KToiIikrKHAuam9pblBvcnQ/IiwgIitwLmpvaW5Qb3J0OiIiKV0sCiAgICBbcC50eXBlPT09InNhaWxpbmciPyJMZWF2aW5nIjoiRW5kIiwocC5lbmQ/Zm10RGF0ZShwLmVuZCk6IiIpKyhwLmxlYXZlUG9ydD8iLCAiK3AubGVhdmVQb3J0OiIiKV0sWyJOaWdodHMiLHAubmlnaHRzXSxbIkFkdmVydGlzZWQgcHJpY2UiLHAucHJpY2VdLFsiVm95YWdlIHBhZ2UiLHAudm95YWdlVXJsXV0uZmlsdGVyKGZ1bmN0aW9uKHgpe3JldHVybiB4WzFdO30pOwogIGgrPSc8ZGl2IGNsYXNzPSJjYXJkIj48aDQgc3R5bGU9Im1hcmdpbi10b3A6MCI+UGxhbiBkZXRhaWxzPC9oND48ZGwgY2xhc3M9ImZhY3RzIj4nK2RldC5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuICc8ZHQ+Jytlc2MoeFswXSkrJzwvZHQ+PGRkPicrZXNjKHhbMV0pKyc8L2RkPic7fSkuam9pbigiIikrJzwvZGw+PC9kaXY+JzsKICBpZihwLmRheXMubGVuZ3RoKWgrPSc8ZGl2IGNsYXNzPSJjYXJkIj48aDQgc3R5bGU9Im1hcmdpbi10b3A6MCI+JysocC50eXBlPT09InNhaWxpbmciPyJWb3lhZ2Ugb3V0bGluZSI6IkRheSBieSBkYXkiKSsnPC9oND4nK3AuZGF5cy5tYXAoZnVuY3Rpb24oZCl7CiAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJydi1pdGVtIj48Yj4nK2VzYyhkLmxhYmVsKSsnPC9iPiA8c3BhbiBjbGFzcz0ibW9ubyIgc3R5bGU9ImNvbG9yOnZhcigtLW11dGVkKSI+Jytlc2MoZGF5UmFuZ2UoZCkpKyc8L3NwYW4+JysoZC5ub3RlPyc8ZGl2IGNsYXNzPSJoaW50Ij4nK2VzYyhkLm5vdGUpKyc8L2Rpdj4nOicnKSsnPC9kaXY+Jzt9KS5qb2luKCIiKSsnPC9kaXY+JzsKICBoKz0nPGRpdiBjbGFzcz0iY2FyZCI+PGg0IHN0eWxlPSJtYXJnaW4tdG9wOjAiPkNoZWNrbGlzdDwvaDQ+JzsKICBzZWN0aW9uc0ZvcihwKS5mb3JFYWNoKGZ1bmN0aW9uKHMpewogICAgdmFyIHZpcz1zLml0ZW1zLmZpbHRlcihmdW5jdGlvbihpdCl7cmV0dXJuIHAuaGlkZGVuLmluZGV4T2YoaXQuaWQpPDA7fSk7IGlmKCF2aXMubGVuZ3RoJiYhKHMuaWQ9PT0iSiImJnAub3RoZXJOb3RlcykpcmV0dXJuOwogICAgaCs9JzxoND4nK3MuaWQrJy4gJytlc2Mocy50aXRsZSkrJzwvaDQ+JzsKICAgIHZpcy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXt2YXIgcj1wLml0ZW1zW2l0LmlkXXx8e30sIGQ9ci5kZXRhaWxzfHx7fTsKICAgICAgdmFyIG1rPXIuc3RhdHVzPT09ImRvbmUiPyc8c3BhbiBjbGFzcz0icnYtbWFyayBkb25lIj5Eb25lPC9zcGFuPic6ci5zdGF0dXM9PT0ibm90eWV0Ij8nPHNwYW4gY2xhc3M9InJ2LW1hcmsgbm90eWV0Ij5Ob3QgeWV0PC9zcGFuPic6JzxzcGFuIGNsYXNzPSJydi1tYXJrIG9wZW4iPlRvIGRvPC9zcGFuPic7CiAgICAgIGgrPSc8ZGl2IGNsYXNzPSJydi1pdGVtIj4nK21rK2VzYyhpdC5sKTsKICAgICAgdmFyIGZhY3RzPWZhY3RzSHRtbChwLGl0LGQpOyBpZihmYWN0cyloKz0nPGRsIGNsYXNzPSJmYWN0cyBydi1zdWIiPicrZmFjdHMrJzwvZGw+JzsKICAgICAgaWYoci5ub3RlKWgrPSc8ZGl2IGNsYXNzPSJydi1zdWIiPk5vdGU6ICcrZXNjKHIubm90ZSkrJzwvZGl2Pic7IGgrPSc8L2Rpdj4nO30pOwogICAgaWYocy5pZD09PSJKIiYmcC5vdGhlck5vdGVzKWgrPSc8ZGl2IGNsYXNzPSJub3RldGV4dCI+Jytlc2MocC5vdGhlck5vdGVzKSsnPC9kaXY+JzsKICB9KTsKICBoKz0nPC9kaXY+JzsKICBpZihhbGxQYXltZW50cyhwKS5zb21lKGZ1bmN0aW9uKHgpe3JldHVybiB4LmFtdDt9KSloKz10b3RhbHNDYXJkKHApOwogIHJldHVybiBoOwp9CgovKiAtLS0tLS0tLS0tIFByaW50IG9yIHNhdmUgYXMgUERGOiBhIGNsZWFuIEE0IGRvY3VtZW50IHdpdGggYSBDbGFzc2ljIFNhaWxpbmcgaGVhZGluZyAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIHNpdGVMb2dvKCl7CiAgdmFyIGltZ3M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaGVhZGVyIGltZywgLnNpdGUtaGVhZGVyIGltZywgLmxvZ28gaW1nLCBpbWdbYWx0Kj0nQ2xhc3NpYycgaV0sIGltZ1tzcmMqPSdsb2dvJyBpXSIpOwogIGZvcih2YXIgaT0wO2k8aW1ncy5sZW5ndGg7aSsrKXt2YXIgcz1pbWdzW2ldLmN1cnJlbnRTcmN8fGltZ3NbaV0uc3JjOyBpZihzJiYhL2RhdGE6Ly50ZXN0KHMpJiZpbWdzW2ldLmNsb3Nlc3QmJiFpbWdzW2ldLmNsb3Nlc3QoIiNjc3ZwIikpcmV0dXJuIHM7fQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBwcmludERvYyhwKXsKICB2YXIgcHI9cHJvZ3Jlc3MocCksIG5wPW5leHRQYXltZW50KHApLCBsb2dvPXNpdGVMb2dvKCksIHByaW50ZWQ9bmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoImVuLUdCIix7ZGF5OiJudW1lcmljIixtb250aDoibG9uZyIseWVhcjoibnVtZXJpYyJ9KTsKICB2YXIgdHlwPXAuc291cmNlPT09ImNzIj8iQ2xhc3NpYyBTYWlsaW5nIHZveWFnZSI6cC50eXBlPT09InNhaWxpbmciPyJTYWlsaW5nIHZveWFnZSI6Ik90aGVyIHRyaXAiOwogIHZhciBzdWI9W3R5cCxwLnR5cGU9PT0ic2FpbGluZyI/cC52ZXNzZWw6IiIscC50eXBlPT09InNhaWxpbmciP3Audm95YWdlTm86IiJdLmZpbHRlcihCb29sZWFuKS5qb2luKCIgwrcgIik7CiAgdmFyIHZsaW5rPXAudm95YWdlVXJsJiYhL3NhaWxpbmctaG9saWRheS1wbGFubmVyLy50ZXN0KHAudm95YWdlVXJsKT9wLnZveWFnZVVybDoiIjsKICB2YXIgc3VtPVtbcC50eXBlPT09InNhaWxpbmciPyJKb2luaW5nIjoiU3RhcnQiLChwLnN0YXJ0P2ZtdERhdGUocC5zdGFydCk6IiIpKyhwLmpvaW5Qb3J0PyI8YnI+Iitlc2MocC5qb2luUG9ydCk6IiIpXSwKICAgICAgICAgICBbcC50eXBlPT09InNhaWxpbmciPyJMZWF2aW5nIjoiRW5kIiwocC5lbmQ/Zm10RGF0ZShwLmVuZCk6IiIpKyhwLmxlYXZlUG9ydD8iPGJyPiIrZXNjKHAubGVhdmVQb3J0KToiIildLAogICAgICAgICAgIFsiTmlnaHRzIixlc2MocC5uaWdodHMpXSxbIlBlb3BsZSIscGFydHlTaXplKHApP1N0cmluZyhwYXJ0eVNpemUocCkpOiIiXSwKICAgICAgICAgICBbIlZveWFnZSBjb3N0IixiZXJ0aENvc3QocCkuYW10P2VzYyhtb25leShiZXJ0aENvc3QocCkuYW10LGJlcnRoQ29zdChwKS5jdXIpKToiIl0sWyJBZHZlcnRpc2VkIHByaWNlIixiZXJ0aENvc3QocCkuYW10PyIiOmVzYyhwLnByaWNlKV0sCiAgICAgICAgICAgWyJDaGVja2xpc3QiLHByLnNlY0RvbmUrIiBvZiAiK3ByLnNlY3Rpb25zKyIgc2VjdGlvbnMgY29tcGxldGUiXSwKICAgICAgICAgICBbIk5leHQgcGF5bWVudCIsbnA/ZXNjKG5wLmwpKyhucC5hbXQ/IiwgIitlc2MobW9uZXkobnAuYW10LG5wLmN1cikpOiIiKSsiPGJyPmR1ZSAiK2VzYyhmbXREYXRlKG5wLmR1ZSkpOiIiXV0uZmlsdGVyKGZ1bmN0aW9uKHgpe3JldHVybiB4WzFdO30pOwogIHZhciBoPSc8IWRvY3R5cGUgaHRtbD48aHRtbCBsYW5nPSJlbi1HQiI+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiPjx0aXRsZT5NeSBWb3lhZ2UgUGxhbm5lciwgJytlc2MocC5uYW1lKSsnPC90aXRsZT4nKwogICAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUZyYXVuY2VzOndnaHRANTAwOzYwMCZmYW1pbHk9SUJNK1BsZXgrU2Fuczp3Z2h0QDQwMDs2MDA7NzAwJmRpc3BsYXk9c3dhcCI+JysKICAgJzxzdHlsZT4nKwogICAnQHBhZ2V7c2l6ZTpBNDttYXJnaW46MTZtbSAxNW1tIDE4bW07QGJvdHRvbS1sZWZ0e2NvbnRlbnQ6IkNsYXNzaWMgU2FpbGluZyDCtyAwMTMyNiA1MzEgMjM0IMK3IGNsYXNzaWMtc2FpbGluZy5jb20iO2ZvbnQ6OHB0ICJJQk0gUGxleCBTYW5zIixBcmlhbCxzYW5zLXNlcmlmO2NvbG9yOiM1YTc0ODB9QGJvdHRvbS1yaWdodHtjb250ZW50OiJQYWdlICIgY291bnRlcihwYWdlKSAiIG9mICIgY291bnRlcihwYWdlcyk7Zm9udDo4cHQgIklCTSBQbGV4IFNhbnMiLEFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzVhNzQ4MH19JysKICAgJyp7Ym94LXNpemluZzpib3JkZXItYm94fWJvZHl7bWFyZ2luOjA7Zm9udDoxMHB0LzEuNDUgIklCTSBQbGV4IFNhbnMiLEFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzAwM2Y1MDstd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDpleGFjdDtwcmludC1jb2xvci1hZGp1c3Q6ZXhhY3R9JysKICAgJy5tYXN0e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Ym9yZGVyLWJvdHRvbTozcHggc29saWQgIzAwM2Y1MDtwYWRkaW5nLWJvdHRvbTo4cHg7bWFyZ2luLWJvdHRvbToycHh9JysKICAgJy5tYXN0IGltZ3toZWlnaHQ6NDRweH0uYnJhbmR7Zm9udDo2MDAgMThwdCBGcmF1bmNlcyxHZW9yZ2lhLHNlcmlmO2xldHRlci1zcGFjaW5nOi4wNmVtfS5tYXN0IC5ye3RleHQtYWxpZ246cmlnaHQ7Zm9udC1zaXplOjlwdDtjb2xvcjojNWE3NDgwfS5tYXN0IC5yIGJ7ZGlzcGxheTpibG9jaztmb250OjYwMCAxMnB0IEZyYXVuY2VzLEdlb3JnaWEsc2VyaWY7Y29sb3I6IzAwM2Y1MH0nKwogICAnLnJ1bGV7aGVpZ2h0OjJweDtiYWNrZ3JvdW5kOiMxZGFkYzI7bWFyZ2luLWJvdHRvbToxNHB4fScrCiAgICdoMXtmb250OjYwMCAyMHB0LzEuMiBGcmF1bmNlcyxHZW9yZ2lhLHNlcmlmO21hcmdpbjowIDAgMnB4fS5zdWJ7Y29sb3I6IzVhNzQ4MDttYXJnaW46MCAwIDEycHh9JysKICAgJ2gye2ZvbnQ6NjAwIDEyLjVwdCBGcmF1bmNlcyxHZW9yZ2lhLHNlcmlmO21hcmdpbjoxNnB4IDAgNnB4O3BhZGRpbmctYm90dG9tOjNweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZDZlMGU0O2JyZWFrLWFmdGVyOmF2b2lkfScrCiAgICdoMiAuY3tmbG9hdDpyaWdodDtmb250OjQwMCA5cHQgIklCTSBQbGV4IFNhbnMiLEFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzVhNzQ4MDtwYWRkaW5nLXRvcDozcHh9JysKICAgJy5zdW17ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMywxZnIpO2dhcDo4cHggMTRweDtiYWNrZ3JvdW5kOiNmNWY2Zjg7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICMxZGFkYzI7cGFkZGluZzoxNHB4IDIwcHggMTRweCAyMnB4O2JvcmRlci1yYWRpdXM6NHB4fScrCiAgICcuc3VtIGRpdiBzcGFue2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjhwdDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjA1ZW07Y29sb3I6IzVhNzQ4MH0uc3VtIGRpdntmb250LXdlaWdodDo2MDB9JysKICAgJy5saW5re2ZvbnQtc2l6ZTo4LjVwdDtjb2xvcjojNWE3NDgwO21hcmdpbjo4cHggMCAwIDIycHg7d29yZC1icmVhazpicmVhay1hbGx9JysKICAgJy5pdHtkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7cGFkZGluZzo1cHggNnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWYyZjQ7YnJlYWstaW5zaWRlOmF2b2lkfS5pdCAudHtmbGV4OjF9JysKICAgJy5ieHtmbGV4OjAgMCAxMnB4O2hlaWdodDoxMnB4O21hcmdpbi10b3A6MnB4O2JvcmRlcjoxLjRweCBzb2xpZCAjMDAzZjUwO2JvcmRlci1yYWRpdXM6MnB4O2ZvbnQtc2l6ZTo5cHQ7bGluZS1oZWlnaHQ6OXB4O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OjcwMH0nKwogICAnLmJ4Lm9ue2JhY2tncm91bmQ6IzFmN2E0ZDtib3JkZXItY29sb3I6IzFmN2E0ZDtjb2xvcjojZmZmfS5pdC5vbiAudHtjb2xvcjojNWE3NDgwfScrCiAgICcuZHtmb250LXNpemU6OHB0O2NvbG9yOiM1YTc0ODA7d2hpdGUtc3BhY2U6bm93cmFwfScrCiAgICcuZXh7Zm9udC1zaXplOjlwdDtjb2xvcjojMDAzZjUwO21hcmdpbjo0cHggMCAycHg7cGFkZGluZzo2cHggMTJweDtiYWNrZ3JvdW5kOiNmNWY2Zjg7Ym9yZGVyLXJhZGl1czozcHh9LmV4IGJ7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM1YTc0ODB9JysKICAgJy5raXR7Y29sdW1uczoyO2NvbHVtbi1nYXA6MjZweH0ua2l0IC5pdHticmVhay1pbnNpZGU6YXZvaWQ7LXdlYmtpdC1jb2x1bW4tYnJlYWstaW5zaWRlOmF2b2lkfS5raXQgLml0ID4gLmR7ZGlzcGxheTpub25lfScrCiAgICcucHJvdntmb250LXNpemU6OXB0O2NvbG9yOiM1YTc0ODA7bWFyZ2luOjAgMCA2cHg7cGFkZGluZzowIDZweH0nKwogICAndGFibGV7d2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjlwdH10aHt0ZXh0LWFsaWduOmxlZnQ7Zm9udC1zaXplOjhwdDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjA0ZW07Y29sb3I6IzVhNzQ4MDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZDZlMGU0O3BhZGRpbmc6NXB4IDEwcHh9dGR7cGFkZGluZzo1cHggMTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVmMmY0O3ZlcnRpY2FsLWFsaWduOnRvcH0nKwogICAnLm5vdGV7d2hpdGUtc3BhY2U6cHJlLXdyYXA7YmFja2dyb3VuZDojZjVmNmY4O3BhZGRpbmc6MTJweCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTo5LjVwdH0nKwogICAnLnByaXZ7bWFyZ2luLXRvcDoyMHB4O2ZvbnQtc2l6ZTo4LjVwdDtjb2xvcjojNWE3NDgwO2JvcmRlci10b3A6MXB4IHNvbGlkICNkNmUwZTQ7cGFkZGluZzo4cHggNnB4IDB9JysKICAgJzwvc3R5bGU+PC9oZWFkPjxib2R5Pic7CiAgaCs9JzxkaXYgY2xhc3M9Im1hc3QiPicrKGxvZ28/JzxpbWcgc3JjPSInK2VzYyhsb2dvKSsnIiBhbHQ9IkNsYXNzaWMgU2FpbGluZyIgb25lcnJvcj0idGhpcy5zdHlsZS5kaXNwbGF5PVwnbm9uZVwnO3RoaXMubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciPjxkaXYgY2xhc3M9ImJyYW5kIiBzdHlsZT0iZGlzcGxheTpub25lIj5DTEFTU0lDIFNBSUxJTkc8L2Rpdj4nOic8ZGl2IGNsYXNzPSJicmFuZCI+Q0xBU1NJQyBTQUlMSU5HPC9kaXY+JykrCiAgICAgJzxkaXYgY2xhc3M9InIiPjxiPk15IFZveWFnZSBQbGFubmVyPC9iPlByaW50ZWQgJytlc2MocHJpbnRlZCkrJzwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InJ1bGUiPjwvZGl2Pic7CiAgaCs9JzxoMT4nK2VzYyhwLm5hbWUpKyc8L2gxPjxwIGNsYXNzPSJzdWIiPicrZXNjKHN1YikrJzwvcD4nOwogIGlmKHN1bS5sZW5ndGgpaCs9JzxkaXYgY2xhc3M9InN1bSI+JytzdW0ubWFwKGZ1bmN0aW9uKHgpe3JldHVybiAnPGRpdj48c3Bhbj4nK3hbMF0rJzwvc3Bhbj4nK3hbMV0rJzwvZGl2Pic7fSkuam9pbigiIikrJzwvZGl2Pic7CiAgaWYodmxpbmspaCs9JzxkaXYgY2xhc3M9ImxpbmsiPlZveWFnZSBwYWdlOiAnK2VzYyh2bGluaykrJzwvZGl2Pic7CiAgaWYocC5kYXlzLmxlbmd0aCl7CiAgICBoKz0nPGgyPicrKHAudHlwZT09PSJzYWlsaW5nIj8iVm95YWdlIG91dGxpbmUiOiJEYXkgYnkgZGF5IikrJzwvaDI+PHRhYmxlPjx0cj48dGggc3R5bGU9IndpZHRoOjIyJSI+RGF5PC90aD48dGggc3R5bGU9IndpZHRoOjMwJSI+RGF0ZTwvdGg+PHRoPk5vdGU8L3RoPjwvdHI+JysKICAgICAgcC5kYXlzLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gJzx0cj48dGQ+PGI+Jytlc2MoZC5sYWJlbCkrJzwvYj48L3RkPjx0ZD4nK2VzYyhkYXlSYW5nZShkKSkrJzwvdGQ+PHRkPicrZXNjKGQubm90ZSkrJzwvdGQ+PC90cj4nO30pLmpvaW4oIiIpKyc8L3RhYmxlPic7CiAgfQogIHNlY3Rpb25zRm9yKHApLmZvckVhY2goZnVuY3Rpb24ocyl7CiAgICB2YXIgdmlzPXMuaXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGl0KXtyZXR1cm4gcC5oaWRkZW4uaW5kZXhPZihpdC5pZCk8MDt9KTsgaWYoIXZpcy5sZW5ndGgmJiEocy5pZD09PSJKIiYmcC5vdGhlck5vdGVzKSlyZXR1cm47CiAgICB2YXIgZG49dmlzLmZpbHRlcihmdW5jdGlvbihpdCl7cmV0dXJuIHAuaXRlbXNbaXQuaWRdJiZwLml0ZW1zW2l0LmlkXS5zdGF0dXM9PT0iZG9uZSI7fSkubGVuZ3RoOwogICAgaCs9JzxoMj4nK3MuaWQrJy4gJytlc2Mocy50aXRsZSkrKHZpcy5sZW5ndGg/JzxzcGFuIGNsYXNzPSJjIj4nK2RuKycgb2YgJyt2aXMubGVuZ3RoKycgZG9uZTwvc3Bhbj4nOicnKSsnPC9oMj4nOwogICAgaWYocy5zaW1wbGUmJnMudmVzc2VsS2l0JiZwLmtpdC5pbmNsdWRlZC5sZW5ndGgpaCs9JzxwIGNsYXNzPSJwcm92Ij5Qcm92aWRlZCBvbiBib2FyZDogJytwLmtpdC5pbmNsdWRlZC5tYXAoZXNjKS5qb2luKCIsICIpKyc8L3A+JzsKICAgIHZhciBncm91cHM9cy52ZXNzZWxLaXQ/W3Zpcy5maWx0ZXIoZnVuY3Rpb24oaXQpe3JldHVybiAhaXQueDt9KSx2aXMuZmlsdGVyKGZ1bmN0aW9uKGl0KXtyZXR1cm4gaXQueDt9KV06W3Zpc107CiAgICBncm91cHMuZm9yRWFjaChmdW5jdGlvbihncnAsZ2kpeyBpZighZ3JwLmxlbmd0aClyZXR1cm47CiAgICBpZihnaT09PTEpaCs9JzxwIGNsYXNzPSJwcm92IiBzdHlsZT0ibWFyZ2luOjhweCAwIDRweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzAwM2Y1MCI+QWxzbyBzdWdnZXN0ZWQgYnkgQ2xhc3NpYyBTYWlsaW5nPC9wPic7CiAgICBoKz0nPGRpdiBjbGFzcz0ia2l0Ij4nK2dycC5tYXAoZnVuY3Rpb24oaXQpewogICAgICB2YXIgcj1wLml0ZW1zW2l0LmlkXXx8e30sIG9uPXIuc3RhdHVzPT09ImRvbmUiLCBkPXIuZGV0YWlsc3x8e30sIGZhY3RzPVtdOwogICAgICAoaXQuZnx8W10pLmZvckVhY2goZnVuY3Rpb24oZil7aWYoZFtmLmtdJiZmLnQhPT0iY3VycmVuY3kiKXt2YXIgdj1mLnQ9PT0iZGF0ZSJ8fGYudD09PSJkYXRldGltZS1sb2NhbCI/Zm10RGF0ZShkW2Yua10pOmYuaz09PSJhbW91bnQiP21vbmV5KGRbZi5rXSxkLmN1cnx8cC5jdXJyZW5jeSk6ZFtmLmtdOyBmYWN0cy5wdXNoKCc8Yj4nK2VzYyhmLmwpKyc6PC9iPiAnK2VzYyh2KSk7fX0pOwogICAgICByZXR1cm4gJzxkaXYgY2xhc3M9Iml0Jysob24/JyBvbic6JycpKyciPjxkaXYgY2xhc3M9ImJ4Jysob24/JyBvbic6JycpKyciPicrKG9uPyfinJMnOicnKSsnPC9kaXY+PGRpdiBjbGFzcz0idCI+Jytlc2MoaXQubCkrKGl0LmgmJnMuc2ltcGxlPycgPHNwYW4gY2xhc3M9ImQiIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3JtYWwiPignK2VzYyhpdC5oKSsnKTwvc3Bhbj4nOicnKSsKICAgICAgICAoZmFjdHMubGVuZ3RoPyc8ZGl2IGNsYXNzPSJleCI+JytmYWN0cy5qb2luKCIgwrcgIikrJzwvZGl2Pic6JycpKyhyLm5vdGU/JzxkaXYgY2xhc3M9ImV4Ij5Ob3RlOiAnK2VzYyhyLm5vdGUpKyc8L2Rpdj4nOicnKSsnPC9kaXY+JysKICAgICAgICAob24mJnIuYXQmJiFzLnNpbXBsZT8nPGRpdiBjbGFzcz0iZCI+Jytlc2MoZm10RGF0ZShyLmF0KS5yZXBsYWNlKC8sPyBcZHsyfTpcZHsyfSQvLCIiKSkrJzwvZGl2Pic6JycpKyc8L2Rpdj4nO30pLmpvaW4oIiIpKyc8L2Rpdj4nOwogICAgfSk7CiAgICBpZihzLmlkPT09IkoiJiZwLm90aGVyTm90ZXMpaCs9JzxkaXYgY2xhc3M9Im5vdGUiPicrZXNjKHAub3RoZXJOb3RlcykrJzwvZGl2Pic7CiAgfSk7CiAgdmFyIGNob3Nlbj0ocC5iZXJ0aHN8fFtdKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuICtiLm47fSk7CiAgaWYoY2hvc2VuLmxlbmd0aCl7CiAgICBoKz0nPGgyPkJlcnRoczwvaDI+PHRhYmxlPjx0cj48dGg+QmVydGg8L3RoPjx0aD5BdmFpbGFiaWxpdHk8L3RoPjx0aD5QZW9wbGU8L3RoPjx0aD5QcmljZSBlYWNoPC90aD48dGg+U3VidG90YWw8L3RoPjwvdHI+JytjaG9zZW4ubWFwKGZ1bmN0aW9uKGIpe3ZhciBwcj1iLm9mZmVyfHxiLnByaWNlOwogICAgICByZXR1cm4gJzx0cj48dGQ+Jytlc2MoYi5sYWJlbCkrJzwvdGQ+PHRkPicrZXNjKGIuYXZhaWwpKyc8L3RkPjx0ZD4nK2IubisnPC90ZD48dGQ+Jytlc2MobW9uZXkocHIsYi5jdXIpKSsoYi5vZmZlcj8nIChvZmZlciwgd2FzICcrZXNjKG1vbmV5KGIucHJpY2UsYi5jdXIpKSsnKSc6JycpKyc8L3RkPjx0ZD4nK2VzYyhtb25leShwcipiLm4sYi5jdXIpKSsnPC90ZD48L3RyPic7fSkuam9pbigiIikrJzwvdGFibGU+JysKICAgICAgJzxwIGNsYXNzPSJwcm92IiBzdHlsZT0ibWFyZ2luLXRvcDo2cHgiPlByaWNlcyBhcyBzaG93biBvbiB0aGUgdm95YWdlIHBhZ2Ugb24gJytlc2MoZm10RGF0ZShwLnByaWNlc0F0KSkrJy4nKyhjaG9zZW4uc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5vZmZlcjt9KT8nIE9mZmVyIHByaWNlcyBtYXkgY2hhbmdlOyBjaGVjayBiZWZvcmUgeW91IGJvb2suJzonJykrJzwvcD4nOwogIH0KICB2YXIgYWxsPWNvc3RMaXN0KHApLmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5hbXQ7fSk7CiAgaWYoYWxsLmxlbmd0aCl7CiAgICBoKz0nPGgyPkNvc3RzPC9oMj48dGFibGU+PHRyPjx0aD5JdGVtPC90aD48dGg+QW1vdW50PC90aD48dGg+RHVlPC90aD48dGg+U3RhdHVzPC90aD48L3RyPicrYWxsLm1hcChmdW5jdGlvbih4KXsKICAgICAgcmV0dXJuICc8dHI+PHRkPicrZXNjKHgubCkrJzwvdGQ+PHRkPicrZXNjKG1vbmV5KHguYW10LHguY3VyKSkrKHguY3VyIT09c3RhdGUuaG9tZSYmdG9Ib21lKHguYW10LHguY3VyKSE9bnVsbD8nIDxzcGFuIGNsYXNzPSJkIj4o4omIICcrZXNjKG1vbmV5KHRvSG9tZSh4LmFtdCx4LmN1ciksc3RhdGUuaG9tZSkpKycpPC9zcGFuPic6JycpKyc8L3RkPjx0ZD4nK2VzYyhmbXREYXRlKHguZHVlKSkrJzwvdGQ+PHRkPicrKHgucGFpZD8nUGFpZCc6J1RvIHBheScpKyc8L3RkPjwvdHI+Jzt9KS5qb2luKCIiKSsnPC90YWJsZT4nOwogICAgdmFyIHBhaWQ9c3VtSG9tZShhbGwsZnVuY3Rpb24oeCl7cmV0dXJuIHgucGFpZDt9KSwgdG9wYXk9c3VtSG9tZShhbGwsZnVuY3Rpb24oeCl7cmV0dXJuICF4LnBhaWQ7fSk7CiAgICBoKz0nPHAgY2xhc3M9InByb3YiIHN0eWxlPSJtYXJnaW4tdG9wOjZweCI+UGFpZCDiiYggJytlc2MobW9uZXkocGFpZC50b3Qsc3RhdGUuaG9tZSkpKycgwrcgU3RpbGwgdG8gcGF5IOKJiCAnK2VzYyhtb25leSh0b3BheS50b3Qsc3RhdGUuaG9tZSkpKycgwrcgVG90YWwg4omIICcrZXNjKG1vbmV5KHBhaWQudG90K3RvcGF5LnRvdCxzdGF0ZS5ob21lKSkrJzwvcD4nOwogIH0KICBoKz0nPGRpdiBjbGFzcz0icHJpdiI+VGhpcyBwbGFuIGlzIHByaXZhdGUgdG8geW91LiBDbGFzc2ljIFNhaWxpbmcgY2Fubm90IHNlZSBpdCB1bmxlc3MgeW91IHNlbmQgaXQgdG8gdXMuIFJvdXRlcyBhbmQgcG9ydHMgZGVwZW5kIG9uIHdlYXRoZXIgYW5kIHRoZSBza2lwcGVy4oCZcyBkZWNpc2lvbi48L2Rpdj4nOwogIHJldHVybiBoKyc8L2JvZHk+PC9odG1sPic7Cn0KZnVuY3Rpb24gcHJpbnRQbGFuKHApewogIHZhciBvbGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNzdnAtcHJpbnQiKTsgaWYob2xkKW9sZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9sZCk7CiAgdmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7IGYuaWQ9ImNzdnAtcHJpbnQiOyBmLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik7CiAgZi5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpmaXhlZDtyaWdodDowO2JvdHRvbTowO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOjA7dmlzaWJpbGl0eTpoaWRkZW4iOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7CiAgdmFyIHc9Zi5jb250ZW50V2luZG93LCBkPXcuZG9jdW1lbnQ7IGQub3BlbigpOyBkLndyaXRlKHByaW50RG9jKHApKTsgZC5jbG9zZSgpOwogIHZhciBnbz1mdW5jdGlvbigpe3RyeXt3LmZvY3VzKCk7IHcucHJpbnQoKTt9Y2F0Y2goZSl7d2luZG93LnByaW50KCk7fX07CiAgdmFyIGltZ3M9W10uc2xpY2UuY2FsbChkLmltYWdlcyksIHdhaXQ9aW1ncy5tYXAoZnVuY3Rpb24oaW0pe3JldHVybiBpbS5jb21wbGV0ZT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpe2ltLm9ubG9hZD1pbS5vbmVycm9yPXJlczt9KTt9KTsKICB2YXIgZm9udHM9ZC5mb250cyYmZC5mb250cy5yZWFkeT9kLmZvbnRzLnJlYWR5OlByb21pc2UucmVzb2x2ZSgpOwogIFByb21pc2UucmFjZShbUHJvbWlzZS5hbGwod2FpdC5jb25jYXQoW2ZvbnRzXSkpLG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcyl7c2V0VGltZW91dChyZXMsMjUwMCk7fSldKS50aGVuKGZ1bmN0aW9uKCl7c2V0VGltZW91dChnbywxNTApO30pOwp9CgpmdW5jdGlvbiBwbGFuVGV4dChwKXsKICB2YXIgTD1bcC5uYW1lLnRvVXBwZXJDYXNlKCksKHAudHlwZT09PSJzYWlsaW5nIj8iU2FpbGluZyB2b3lhZ2UiOiJPdGhlciB0cmlwIikrKHAudmVzc2VsPyIsICIrcC52ZXNzZWw6IiIpKyhwLnZveWFnZU5vPyIgKCIrcC52b3lhZ2VObysiKSI6IiIpXTsKICBpZihwLnN0YXJ0KUwucHVzaCgocC50eXBlPT09InNhaWxpbmciPyJKb2luaW5nOiAiOiJTdGFydDogIikrZm10RGF0ZShwLnN0YXJ0KSsocC5qb2luUG9ydD8iLCAiK3Auam9pblBvcnQ6IiIpKTsKICBpZihwLmVuZClMLnB1c2goKHAudHlwZT09PSJzYWlsaW5nIj8iTGVhdmluZzogIjoiRW5kOiAiKStmbXREYXRlKHAuZW5kKSsocC5sZWF2ZVBvcnQ/IiwgIitwLmxlYXZlUG9ydDoiIikpOwogIHZhciBjaD0ocC5iZXJ0aHN8fFtdKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuICtiLm47fSk7CiAgaWYoY2gubGVuZ3RoKXtMLnB1c2goIiIpOyBMLnB1c2goIkJFUlRIUyIpOyBjaC5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBwcj1iLm9mZmVyfHxiLnByaWNlOyBMLnB1c2goIiAgIitiLm4rIiB4ICIrYi5sYWJlbCsiIGF0ICIrbW9uZXkocHIsYi5jdXIpKyhiLm9mZmVyPyIgKG9mZmVyKSI6IiIpKyIgPSAiK21vbmV5KHByKmIubixiLmN1cikpO30pOyBMLnB1c2goIiAgVm95YWdlIGNvc3Q6ICIrbW9uZXkoYmVydGhDb3N0KHApLmFtdCxiZXJ0aENvc3QocCkuY3VyKSsiIChwcmljZXMgYXMgb24gIitmbXREYXRlKHAucHJpY2VzQXQpKyIpIik7fQogIGVsc2UgaWYoK3AucGFydHkpTC5wdXNoKCJQZW9wbGU6ICIrcC5wYXJ0eSk7CiAgTC5wdXNoKCIiKTsKICBpZihwLmRheXMubGVuZ3RoKXtMLnB1c2goIk9VVExJTkUiKTsgcC5kYXlzLmZvckVhY2goZnVuY3Rpb24oZCl7TC5wdXNoKCIgICIrZC5sYWJlbCsoZC5kYXRlPyIgKCIrZGF5UmFuZ2UoZCkrIikiOiIiKSsoZC5ub3RlPyI6ICIrZC5ub3RlOiIiKSk7fSk7IEwucHVzaCgiIik7fQogIHNlY3Rpb25zRm9yKHApLmZvckVhY2goZnVuY3Rpb24ocyl7CiAgICB2YXIgdmlzPXMuaXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGl0KXtyZXR1cm4gcC5oaWRkZW4uaW5kZXhPZihpdC5pZCk8MDt9KTsgaWYoIXZpcy5sZW5ndGgmJiEocy5pZD09PSJKIiYmcC5vdGhlck5vdGVzKSlyZXR1cm47CiAgICBMLnB1c2gocy5pZCsiLiAiK3MudGl0bGUudG9VcHBlckNhc2UoKSk7CiAgICB2aXMuZm9yRWFjaChmdW5jdGlvbihpdCl7dmFyIHI9cC5pdGVtc1tpdC5pZF18fHt9OyB2YXIgbWFyaz1yLnN0YXR1cz09PSJkb25lIj8iW0RvbmVdICAgIjpyLnN0YXR1cz09PSJub3R5ZXQiPyJbTm90IHlldF0iOiJbVG8gZG9dICAiOyBMLnB1c2goIiAgIittYXJrKyIgIitpdC5sKTsKICAgICAgdmFyIGQ9ci5kZXRhaWxzfHx7fSwgY3VyPWQuY3VyfHxwLmN1cnJlbmN5OyAoaXQuZnx8Ri5nZW5lcmFsKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2lmKGRbZi5rXSYmZi50IT09ImN1cnJlbmN5IilMLnB1c2goIiAgICAgICIrZi5sKyI6ICIrKGYudD09PSJkYXRlInx8Zi50PT09ImRhdGV0aW1lLWxvY2FsIj9mbXREYXRlKGRbZi5rXSk6Zi5rPT09ImFtb3VudCI/bW9uZXkoZFtmLmtdLGN1cik6ZFtmLmtdKSk7fSk7IGlmKHIubm90ZSlMLnB1c2goIiAgICAgIE5vdGU6ICIrci5ub3RlKTt9KTsKICAgIGlmKHMuaWQ9PT0iSiImJnAub3RoZXJOb3RlcylMLnB1c2goIiAgIitwLm90aGVyTm90ZXMpOyBMLnB1c2goIiIpOwogIH0pOwogIHZhciBjb3N0cz1wLmJ1ZGdldC5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIubGFiZWx8fGIuYW1vdW50O30pOwogIGlmKGNvc3RzLmxlbmd0aCl7TC5wdXNoKCJPVEhFUiBDT1NUUyIpOyBjb3N0cy5mb3JFYWNoKGZ1bmN0aW9uKGIpe0wucHVzaCgiICAiKyhiLmxhYmVsfHwiQ29zdCIpKyI6ICIrbW9uZXkoYi5hbW91bnQsYi5jdXJ8fHAuY3VycmVuY3kpKyhiLmR1ZT8iLCBkdWUgIitmbXREYXRlKGIuZHVlKToiIikrKGIucGFpZD8iLCBwYWlkICIrZm10RGF0ZShiLnBhaWQpOiIiKSk7fSk7fQogIHJldHVybiBMLmpvaW4oIlxuIik7Cn0KCi8qIC0tLS0tLS0tLS0gRXZlbnRzIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gY2xvc2VzdEF0dHIoZWwsYXR0cil7d2hpbGUoZWwmJmVsIT09YXBwKXtpZihlbC5oYXNBdHRyaWJ1dGUmJmVsLmhhc0F0dHJpYnV0ZShhdHRyKSlyZXR1cm4gZWw7IGVsPWVsLnBhcmVudE5vZGU7fSByZXR1cm4gbnVsbDt9CmFwcC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7CiAgdmFyIGI9Y2xvc2VzdEF0dHIoZS50YXJnZXQsImRhdGEtYWN0Iik7IGlmKCFiKXJldHVybjsgdmFyIGE9Yi5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0IiksIHA9cGxhbigpLCBpZD1iLmdldEF0dHJpYnV0ZSgiZGF0YS1pZCIpOwogIGlmKGIudGFnTmFtZT09PSJJTlBVVCJ8fGIudGFnTmFtZT09PSJTRUxFQ1QiKXJldHVybjsKICBzd2l0Y2goYSl7CiAgICBjYXNlICJuZXciOiB2YXIgbnA9bmV3UGxhbihiLmdldEF0dHJpYnV0ZSgiZGF0YS10eXBlIikpOyBucC5zb3VyY2U9Yi5nZXRBdHRyaWJ1dGUoImRhdGEtc291cmNlIik7IGlmKG5wLnNvdXJjZT09PSJvdGhlcnNhaWwiKW5wLm5hbWU9Ik15IHNhaWxpbmcgdm95YWdlIjsgaWYobnAuc291cmNlPT09ImNzIilucC5uYW1lPSJNeSBDbGFzc2ljIFNhaWxpbmcgdm95YWdlIjsKICAgICAgc3RhdGUucGxhbnMucHVzaChucCk7IHZpZXcuY2hhbmdlVHlwZT1mYWxzZTsgdmlldy5wbGFuPW5wLmlkOyB2aWV3LnRhYj0iZGV0YWlscyI7IHZpZXcuaW1wb3J0TXNnPSIiOyBzYXZlKCJQbGFuIGNyZWF0ZWQiKTsgcmVuZGVyKCk7IHZhciBmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjc3ZwLWltcCIpOyBpZihmKWYuZm9jdXMoKTsgYnJlYWs7CiAgICBjYXNlICJvcGVuIjogdmlldy5vcGVuU2VjPW51bGw7IHZpZXcuY2hhbmdlVHlwZT1mYWxzZTsgdmlldy5wbGFuPWlkOyB2aWV3LnRhYj0iZGV0YWlscyI7IHZpZXcuaW1wb3J0TXNnPSIiOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJob21lIjogdmlldy5wbGFuPW51bGw7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgInRhYiI6IHNuYXBzaG90T3BlbigpOyBpZih2aWV3LnRhYj09PSJidWRnZXQiKXJlYWRCdWQocCk7IGlmKHZpZXcudGFiPT09Im91dGxpbmUiKXJlYWREYXlzKHApOyB2aWV3LnRhYj1iLmdldEF0dHJpYnV0ZSgiZGF0YS10YWIiKTsgc2F2ZSgpOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJzdGF0dXMiOiB2YXIgcj1yZWMocCxpZCk7IHIuc3RhdHVzPWIuZ2V0QXR0cmlidXRlKCJkYXRhLXN0Iik7IHIuYXQ9bm93KCk7IHNuYXBzaG90T3BlbigpOyBzYXZlKHIuc3RhdHVzPT09ImRvbmUiPyJNYXJrZWQgZG9uZSI6Ik1hcmtlZCBub3QgeWV0Iik7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgImNsZWFyIjogdmFyIHIyPXJlYyhwLGlkKTsgcjIuc3RhdHVzPSIiOyByMi5hdD0iIjsgc25hcHNob3RPcGVuKCk7IHNhdmUoIlN0YXR1cyBjbGVhcmVkIik7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgIm5vdGVib3giOiB0b2dnbGVQYW5lbCgiZGF0YS1ub3RlcGFuZWwiLGlkKTsgYnJlYWs7CiAgICBjYXNlICJkZXRib3giOiB0b2dnbGVQYW5lbCgiZGF0YS1kZXRwYW5lbCIsaWQpOyBicmVhazsKICAgIGNhc2UgImNsb3NlcGFuZWwiOiB2YXIgcG49Y2xvc2VzdEF0dHIoYiwiZGF0YS1ub3RlcGFuZWwiKXx8Y2xvc2VzdEF0dHIoYiwiZGF0YS1kZXRwYW5lbCIpOyBpZihwbilwbi5jbGFzc0xpc3QuYWRkKCJoaWRlIik7IGJyZWFrOwogICAgY2FzZSAic2F2ZW5vdGUiOiB2YXIgdGE9YXBwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5vdGVpbnB1dD0iJytpZCsnIl0nKTsgcmVjKHAsaWQpLm5vdGU9dGEudmFsdWUudHJpbSgpOyBzbmFwc2hvdE9wZW4oKTsgc2F2ZSgiTm90ZSBzYXZlZCIpOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJzYXZlZGV0IjogdmFyIHBubD1hcHAucXVlcnlTZWxlY3RvcignW2RhdGEtZGV0cGFuZWw9IicraWQrJyJdJyksIGQ9e307IHBubC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1kZXRmaWVsZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2RbaS5nZXRBdHRyaWJ1dGUoImRhdGEtZGV0ZmllbGQiKV09aS52YWx1ZS50cmltKCk7fSk7IHJlYyhwLGlkKS5kZXRhaWxzPWQ7IHNuYXBzaG90T3BlbigpOyBzYXZlKCJGaW5hbCBkZXRhaWxzIHNhdmVkIik7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgImdlbmVyYWxraXQiOiBwLnNob3dHZW5lcmFsS2l0PXRydWU7IHNuYXBzaG90T3BlbigpOyBzYXZlKCJTaG93aW5nIHRoZSBnZW5lcmFsIGtpdCBsaXN0Iik7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgInZlc3NlbGtpdCI6IHAuc2hvd0dlbmVyYWxLaXQ9ZmFsc2U7IHNuYXBzaG90T3BlbigpOyBzYXZlKCJTaG93aW5nIHRoZSB2b3lhZ2Uga2l0IGxpc3QiKTsgcmVuZGVyKCk7IGJyZWFrOwogICAgY2FzZSAiaGlkZSI6IHAuaGlkZGVuLnB1c2goaWQpOyBzbmFwc2hvdE9wZW4oKTsgc2F2ZSgiSXRlbSBoaWRkZW4iKTsgcmVuZGVyKCk7IGJyZWFrOwogICAgY2FzZSAidW5oaWRlIjogdmFyIHNpZD1iLmdldEF0dHJpYnV0ZSgiZGF0YS1zZWMiKTsgdmFyIGlkcz1bXTsgc2VjdGlvbnNGb3IocCkuZm9yRWFjaChmdW5jdGlvbihzKXtpZihzLmlkPT09c2lkKXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdCl7aWRzLnB1c2goaXQuaWQpO30pO30pOyBwLmhpZGRlbj1wLmhpZGRlbi5maWx0ZXIoZnVuY3Rpb24oaCl7cmV0dXJuIGlkcy5pbmRleE9mKGgpPDA7fSk7IHNuYXBzaG90T3BlbigpOyBzYXZlKCk7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgImFkZGl0ZW0iOiB2YXIgc2VjPWIuZ2V0QXR0cmlidXRlKCJkYXRhLXNlYyIpLCBpbnA9YXBwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFkZGlucHV0PSInK3NlYysnIl0nKSwgdj1pbnAudmFsdWUudHJpbSgpOyBpZighdil7aW5wLmZvY3VzKCk7cmV0dXJuO30gcC5jdXN0b20ucHVzaCh7aWQ6ImMiK3VpZCgpLHNlY3Rpb246c2VjLGw6dn0pOyB2aWV3Lm9wZW5TZWM9c2VjOyBzYXZlKCJJdGVtIGFkZGVkIik7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgImRlbGN1c3RvbSI6IGlmKCFjb25maXJtKCJSZW1vdmUgdGhpcyBpdGVtPyIpKXJldHVybjsgcC5jdXN0b209cC5jdXN0b20uZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBjLmlkIT09aWQ7fSk7IGRlbGV0ZSBwLml0ZW1zW2lkXTsgc25hcHNob3RPcGVuKCk7IHNhdmUoIkl0ZW0gcmVtb3ZlZCIpOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJzYXZlZGV0YWlscyI6IHJlYWRQbGFuRmllbGRzKHApOyBpZighcC5uYW1lKXAubmFtZT0iTXkgcGxhbiI7IHNhdmUoIlBsYW4gZGV0YWlscyBzYXZlZCIpOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJkZWxwbGFuIjogdmFyIGRwPXN0YXRlLnBsYW5zLmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5pZD09PWlkO30pWzBdOyBpZighZHApcmV0dXJuOwogICAgICBpZighY29uZmlybSgiRGVsZXRlIFx1MjAxYyIrZHAubmFtZSsiXHUyMDFkPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuIikpcmV0dXJuOwogICAgICBzdGF0ZS5wbGFucz1zdGF0ZS5wbGFucy5maWx0ZXIoZnVuY3Rpb24oeCl7cmV0dXJuIHguaWQhPT1pZDt9KTsgc2F2ZSgiUGxhbiBkZWxldGVkIik7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgImRlbGV0ZXBsYW4iOiBpZighY29uZmlybSgiRGVsZXRlIFx1MjAxYyIrcC5uYW1lKyJcdTIwMWQ/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4iKSlyZXR1cm47IHN0YXRlLnBsYW5zPXN0YXRlLnBsYW5zLmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5pZCE9PXAuaWQ7fSk7IHZpZXcucGxhbj1udWxsOyBzYXZlKCJQbGFuIGRlbGV0ZWQiKTsgcmVuZGVyKCk7IGJyZWFrOwogICAgY2FzZSAiaW1wb3J0IjogcmVhZFBsYW5GaWVsZHMocCk7IGRvSW1wb3J0KHApOyBicmVhazsKICAgIGNhc2UgImNoYW5nZXR5cGUiOiB2aWV3LmNoYW5nZVR5cGU9IXZpZXcuY2hhbmdlVHlwZTsgcmVuZGVyKCk7IGJyZWFrOwogICAgY2FzZSAiaW1wb3J0cm93IjogdmFyIHYyPXZpZXcucGVuZGluZywgcmk9K2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjc3ZwLWltcC1yb3ciKS52YWx1ZTsgaWYodjImJnYyLnJvd3NbcmldKXthcHBseUltcG9ydChwLHYyLHYyLnJvd3NbcmldKTsgdmlldy5wZW5kaW5nPW51bGw7IHZpZXcuaW1wb3J0TXNnPSc8ZGl2IGNsYXNzPSJvayI+SW1wb3J0ZWQuIENoZWNrIHRoZSBkZXRhaWxzIGJlbG93LCB0aGVuIGxvb2sgYXQgdGhlIFZveWFnZSBvdXRsaW5lLjwvZGl2Pic7IHNhdmUoIlZveWFnZSBpbXBvcnRlZCIpOyByZW5kZXIoKTt9IGJyZWFrOwogICAgY2FzZSAiYWRkZGF5IjogcmVhZERheXMocCk7IHZhciBsYWI9Yi5nZXRBdHRyaWJ1dGUoImRhdGEtbGFiZWwiKTsgcC5kYXlzLnB1c2goe2xhYmVsOmxhYixkYXRlOiIiLHRvOiIiLG5vdGU6IiJ9KTsgc2F2ZSgpOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJmaWxsZGF5cyI6IHZhciBzMD1uZXcgRGF0ZShwLnN0YXJ0LnNsaWNlKDAsMTApKSxlMD1uZXcgRGF0ZShwLmVuZC5zbGljZSgwLDEwKSk7IGlmKGUwPHMwKXJldHVybjsgZm9yKHZhciBkZD1uZXcgRGF0ZShzMCksbj0xO2RkPD1lMCYmbjwxMjA7ZGQuc2V0RGF0ZShkZC5nZXREYXRlKCkrMSksbisrKXtwLmRheXMucHVzaCh7bGFiZWw6IkRheSAiK24sZGF0ZTppc28oZGQpLHRvOiIiLG5vdGU6IiJ9KTt9IHNhdmUoIkRheXMgYWRkZWQiKTsgcmVuZGVyKCk7IGJyZWFrOwogICAgY2FzZSAiZGVsZGF5IjogcmVhZERheXMocCk7IHAuZGF5cy5zcGxpY2UoK2IuZ2V0QXR0cmlidXRlKCJkYXRhLWkiKSwxKTsgc2F2ZSgpOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJzYXZlZGF5cyI6IHJlYWREYXlzKHApOyBzYXZlKCJPdXRsaW5lIHNhdmVkIik7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgImFkZGJ1ZCI6IHJlYWRCdWQocCk7IHAuYnVkZ2V0LnB1c2goe2xhYmVsOiIiLGFtb3VudDoiIixjdXI6cC5jdXJyZW5jeSxkdWU6IiIscGFpZDoiIixzaGFyZWQ6ZmFsc2UscGF5ZXI6IiJ9KTsgc2F2ZSgpOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJkZWxidWQiOiByZWFkQnVkKHApOyBwLmJ1ZGdldC5zcGxpY2UoK2IuZ2V0QXR0cmlidXRlKCJkYXRhLWkiKSwxKTsgc2F2ZSgpOyByZW5kZXIoKTsgYnJlYWs7CiAgICBjYXNlICJzYXZlYnVkIjogcmVhZEJ1ZChwKTsgc2F2ZSgiQ29zdHMgc2F2ZWQiKTsgcmVuZGVyKCk7IGJyZWFrOwogICAgY2FzZSAiYWRkcGVyc29uIjogcmVhZEJ1ZChwKTsgdmFyIHBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjc3ZwLXBlcnNvbiIpLCBwdj1waS52YWx1ZS50cmltKCk7IGlmKHB2JiZwLnBlb3BsZS5pbmRleE9mKHB2KTwwKXAucGVvcGxlLnB1c2gocHYpOyBzYXZlKCk7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgImRlbHBlcnNvbiI6IHJlYWRCdWQocCk7IHAucGVvcGxlLnNwbGljZSgrYi5nZXRBdHRyaWJ1dGUoImRhdGEtaSIpLDEpOyBzYXZlKCk7IHJlbmRlcigpOyBicmVhazsKICAgIGNhc2UgImFpIjogdmFyIG9rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjc3ZwLWFpLW9rIikuY2hlY2tlZCwgb3V0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjc3ZwLWFpLW91dCIpOyBpZighb2spcmV0dXJuOwogICAgICBvdXQuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJiYW5uZXIgdGVzdCIgc3R5bGU9Im1hcmdpbi10b3A6MTBweCI+PHN0cm9uZz5Ob3QgY29ubmVjdGVkIGluIHRoaXMgdGVzdCB2ZXJzaW9uPC9zdHJvbmc+SW4gdGhlIGxpdmUgdmVyc2lvbiwgc3VnZ2VzdGlvbnMgd2lsbCBhcHBlYXIgaGVyZSBhcyBhIGxpc3QuIE5vdGhpbmcgaXMgYWRkZWQgdG8geW91ciBwbGFuIHVudGlsIHlvdSBjaG9vc2UgdG8gYWRkIGl0LjwvZGl2Pic7IGJyZWFrOwogICAgY2FzZSAicHJpbnQiOiBwcmludFBsYW4ocCk7IGJyZWFrOwogICAgY2FzZSAiY29weXRleHQiOiBjb3B5KHBsYW5UZXh0KHApKTsgYnJlYWs7CiAgICBjYXNlICJkb3dubG9hZCI6IHZhciBibG9iPW5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShzdGF0ZSxudWxsLDIpXSx7dHlwZToiYXBwbGljYXRpb24vanNvbiJ9KSwgdT1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpLCBhYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7IGFhLmhyZWY9dTsgYWEuZG93bmxvYWQ9Im15LXZveWFnZS1wbGFucy5qc29uIjsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhYSk7IGFhLmNsaWNrKCk7IGFhLnJlbW92ZSgpOyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VVJMLnJldm9rZU9iamVjdFVSTCh1KTt9LDEwMDApOyBicmVhazsKICAgIGNhc2UgImRlbGV0ZWFsbCI6IGlmKCFjb25maXJtKCJEZWxldGUgeW91ciB3aG9sZSBwbGFubmVyIGFuZCBldmVyeSBwbGFuIGluIGl0PyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuIikpcmV0dXJuOyBzdGF0ZT17cGxhbnM6W10saG9tZTpzdGF0ZS5ob21lLHJhdGVzOnN0YXRlLnJhdGVzfTsgc2F2ZSgiUGxhbm5lciBkZWxldGVkIik7IHJlbmRlcigpOyBicmVhazsKICB9Cn0pOwphcHAuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixmdW5jdGlvbihlKXsKICB2YXIgdD1lLnRhcmdldCwgcD1wbGFuKCk7CiAgaWYodC5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0Iik9PT0iaG9tZWN1ciIpe3N0YXRlLmhvbWU9dC52YWx1ZTsgc3RhdGUucmF0ZXM9bnVsbDsgc2F2ZSgiWW91ciBjdXJyZW5jeSBpcyBub3cgIit0LnZhbHVlKTsgcmVuZGVyKCk7IGZldGNoUmF0ZXModHJ1ZSk7IHJldHVybjt9CiAgaWYodC5pZD09PSJjc3ZwLWFpLW9rIil7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNzdnAtYWktZ28iKTsgaWYoZylnLmRpc2FibGVkPSF0LmNoZWNrZWQ7IHJldHVybjt9CiAgaWYoIXApcmV0dXJuOwogIGlmKHQuaGFzQXR0cmlidXRlKCJkYXRhLXRpY2siKSl7dmFyIHI9cmVjKHAsdC5nZXRBdHRyaWJ1dGUoImRhdGEtdGljayIpKTsgci5zdGF0dXM9dC5jaGVja2VkPyJkb25lIjoiIjsgci5hdD10LmNoZWNrZWQ/bm93KCk6IiI7IHNuYXBzaG90T3BlbigpOyBzYXZlKHQuY2hlY2tlZD8iRG9uZSI6IlVudGlja2VkIik7CiAgICB2YXIgc2VjPXQuY2xvc2VzdCgnZGV0YWlscy5zZWMnKSwgYz1zZWMmJnNlYy5xdWVyeVNlbGVjdG9yKCcuY291bnQnKTsgaWYoYyl7dmFyIGFsbD1zZWMucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdGlja10nKSxuPTA7IGFsbC5mb3JFYWNoKGZ1bmN0aW9uKHgpe2lmKHguY2hlY2tlZCluKys7fSk7IGMudGV4dENvbnRlbnQ9bisiLyIrYWxsLmxlbmd0aDt9IGlmKHNlYyYmc2VjLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWMnKSE9PSdHJyl7cmVuZGVyKCk7fSByZXR1cm47fQogIGlmKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjdCIpPT09InRvZ2dsZXNwbGl0Iil7cmVhZEJ1ZChwKTsgcC5zcGxpdD10LmNoZWNrZWQ7IHNhdmUoKTsgcmVuZGVyKCk7fQogIGlmKHQuaGFzQXR0cmlidXRlKCJkYXRhLWJlcnRoIikpe3ZhciBiaT0rdC5nZXRBdHRyaWJ1dGUoImRhdGEtYmVydGgiKTsgaWYocC5iZXJ0aHMmJnAuYmVydGhzW2JpXSl7cC5iZXJ0aHNbYmldLm49TWF0aC5tYXgoMCxwYXJzZUludCh0LnZhbHVlLDEwKXx8MCk7IHJlYWRQbGFuRmllbGRzKHApOyBzYXZlKCJQZW9wbGUgdXBkYXRlZCIpOyByZW5kZXIoKTt9IHJldHVybjt9CiAgaWYodC5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0Iik9PT0ic3JjIil7cmVhZFBsYW5GaWVsZHMocCk7IHZpZXcuY2hhbmdlVHlwZT1mYWxzZTsgcC5zb3VyY2U9dC52YWx1ZTsgcC50eXBlPXQudmFsdWU9PT0ib3RoZXIiPyJvdGhlciI6InNhaWxpbmciOyB2aWV3LmltcG9ydE1zZz0iIjsgc2F2ZSgiUGxhbiB0eXBlIGNoYW5nZWQiKTsgcmVuZGVyKCk7IHJldHVybjt9CiAgaWYodC5pZD09PSJjc3ZwLWQtdHlwZSIpe3JlYWRQbGFuRmllbGRzKHApOyBzYXZlKCJQbGFuIHR5cGUgY2hhbmdlZCIpOyByZW5kZXIoKTt9Cn0pOwphcHAuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKGUpewogIHZhciB0PWUudGFyZ2V0LCBwPXBsYW4oKTsgaWYoIXApcmV0dXJuOwogIGlmKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjdCIpPT09Im90aGVybm90ZXMiKXtwLm90aGVyTm90ZXM9dC52YWx1ZTsgY2xlYXJUaW1lb3V0KHQuX3MpOyB0Ll9zPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtzYXZlKCJPdGhlciBkZXRhaWxzIHNhdmVkIik7fSw3MDApO30KfSk7CmFwcC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXsKICBpZihlLmtleT09PSJFbnRlciIpe3ZhciBjPWNsb3Nlc3RBdHRyKGUudGFyZ2V0LCJkYXRhLWFjdCIpOyBpZihjJiZjLmNsYXNzTGlzdC5jb250YWlucygicGxhbmNhcmQiKSl7ZS5wcmV2ZW50RGVmYXVsdCgpOyBjLmNsaWNrKCk7fQogICAgaWYoZS50YXJnZXQuaGFzQXR0cmlidXRlKCJkYXRhLWFkZGlucHV0Iikpe2UucHJldmVudERlZmF1bHQoKTsgdmFyIGJ0bj1hcHAucXVlcnlTZWxlY3RvcignW2RhdGEtYWN0PSJhZGRpdGVtIl1bZGF0YS1zZWM9IicrZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFkZGlucHV0IikrJyJdJyk7IGlmKGJ0bilidG4uY2xpY2soKTt9fQp9KTsKZnVuY3Rpb24gcmVhZFBsYW5GaWVsZHMocCl7YXBwLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXBsYW5dIikuZm9yRWFjaChmdW5jdGlvbihpKXtwW2kuZ2V0QXR0cmlidXRlKCJkYXRhLXBsYW4iKV09aS52YWx1ZS50cmltKCk7fSk7fQpmdW5jdGlvbiBzbmFwc2hvdE9wZW4oKXt2YXIgbz1hcHAucXVlcnlTZWxlY3RvcigiZGV0YWlscy5zZWNbb3Blbl0iKTsgdmlldy5vcGVuU2VjPW8/by5nZXRBdHRyaWJ1dGUoImRhdGEtc2VjIik6bnVsbDt9CmFwcC5hZGRFdmVudExpc3RlbmVyKCJ0b2dnbGUiLGZ1bmN0aW9uKGUpe3ZhciBkPWUudGFyZ2V0OyBpZighZC5jbGFzc0xpc3R8fCFkLmNsYXNzTGlzdC5jb250YWlucygic2VjIikpcmV0dXJuOwogIGlmKGQub3Blbil7dmlldy5vcGVuU2VjPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNlYyIpOyBhcHAucXVlcnlTZWxlY3RvckFsbCgiZGV0YWlscy5zZWNbb3Blbl0iKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe2lmKHghPT1kKXgub3Blbj1mYWxzZTt9KTt9CiAgZWxzZSBpZih2aWV3Lm9wZW5TZWM9PT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zZWMiKSl7dmlldy5vcGVuU2VjPW51bGw7fX0sdHJ1ZSk7CmZ1bmN0aW9uIHRvZ2dsZVBhbmVsKGF0dHIsaWQpe3ZhciBwbmw9YXBwLnF1ZXJ5U2VsZWN0b3IoIlsiK2F0dHIrJz0iJytpZCsnIl0nKTsgaWYoIXBubClyZXR1cm47IHZhciB3YXM9cG5sLmNsYXNzTGlzdC5jb250YWlucygiaGlkZSIpOwogIGFwcC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1ub3RlcGFuZWxdLFtkYXRhLWRldHBhbmVsXSIpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5jbGFzc0xpc3QuYWRkKCJoaWRlIik7fSk7IGlmKHdhcyl7cG5sLmNsYXNzTGlzdC5yZW1vdmUoImhpZGUiKTsgdmFyIGY9cG5sLnF1ZXJ5U2VsZWN0b3IoInRleHRhcmVhLGlucHV0Iik7IGlmKGYpZi5mb2N1cygpO319CmZ1bmN0aW9uIHJlYWREYXlzKHApe2lmKCFwKXJldHVybjsgYXBwLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWRheV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciBkPXAuZGF5c1sraS5nZXRBdHRyaWJ1dGUoImRhdGEtZGF5IildOyBpZihkKWRbaS5nZXRBdHRyaWJ1dGUoImRhdGEtZGsiKV09aS52YWx1ZTt9KTt9CmZ1bmN0aW9uIHJlYWRCdWQocCl7aWYoIXApcmV0dXJuOyBhcHAucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYnVkXSIpLmZvckVhY2goZnVuY3Rpb24oaSl7dmFyIGI9cC5idWRnZXRbK2kuZ2V0QXR0cmlidXRlKCJkYXRhLWJ1ZCIpXTsgaWYoIWIpcmV0dXJuOyB2YXIgaz1pLmdldEF0dHJpYnV0ZSgiZGF0YS1iayIpOyBiW2tdPWkudHlwZT09PSJjaGVja2JveCI/aS5jaGVja2VkOmkudmFsdWU7fSk7fQpmdW5jdGlvbiBjb3B5KHR4dCl7CiAgZnVuY3Rpb24gZmFsbGJhY2soKXt2YXIgdGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsgdGEudmFsdWU9dHh0OyB0YS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiOyB0YS5zdHlsZS5vcGFjaXR5PSIwIjsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7IHRhLnNlbGVjdCgpOyB0cnl7ZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTsgdG9hc3QoIlBsYW4gY29waWVkIGFzIHRleHQiKTt9Y2F0Y2goZSl7dG9hc3QoIkNvdWxkIG5vdCBjb3B5LiBQbGVhc2UgdXNlIFByaW50IGluc3RlYWQuIik7fSB0YS5yZW1vdmUoKTt9CiAgaWYobmF2aWdhdG9yLmNsaXBib2FyZCYmd2luZG93LmlzU2VjdXJlQ29udGV4dCl7bmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodHh0KS50aGVuKGZ1bmN0aW9uKCl7dG9hc3QoIlBsYW4gY29waWVkIGFzIHRleHQiKTt9LGZhbGxiYWNrKTt9ZWxzZSBmYWxsYmFjaygpOwp9CgovKiB0ZXN0IGhvb2sgKHVzZWQgb25seSBieSB0aGUgdGVzdCBzY3JpcHQpICovCndpbmRvdy5fX2NzdnBUZXN0PXtwYXJzZVZveWFnZTpwYXJzZVZveWFnZX07Cgpsb2FkKCk7IHJlbmRlcigpOyBmZXRjaFJhdGVzKGZhbHNlKTsKfSkoKTsKPC9zY3JpcHQ+Cg==