Login   Register  
PHP Classes
elePHPant
Icontem

File: lib/wisard.inc.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Roman Shneer  >  PHP Security Scanner  >  lib/wisard.inc.php  >  Download  
File: lib/wisard.inc.php
Role: Class source
Content type: text/plain
Description: Class source
Class: PHP Security Scanner
Stop security attacks blocking malicious values
Author: By
Last change:
Date: 2013-04-04 03:56
Size: 23,100 bytes
 

Contents

Class file image Download
<?
/**
*Class Wisard - P.W.S.M.
*Installer functions
*Author Roman Shneer romanshneer@gmail.com
*1.02.2012
*Any changes at your risk and criminal responsibility
*/
eval(base64_decode('Q2xhc3MgV2lzYXJkew0KdmFyICRzdGVwPTA7DQp2YXIgJHRhYmxlczsNCiAgICBmdW5jdGlvbiBXaXNhcmQoKQ0KICAgIHsNCg0KICAgICR0aGlzLT50YWJsZXNbJ215c3FsJ109QXJyYXkoJ3B3c21fb2JqZWN0cyc9PiJDUkVBVEUgVEFCTEUgYHB3c21fb2JqZWN0c2AgKA0KICBgaWRgIGJpZ2ludCgyMCkgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsDQogIGBvYmplY3Rfc291cmNlYCB2YXJjaGFyKDEwMjQpIGNvbGxhdGUgdXRmOF9iaW4gTk9UIE5VTEwsDQogIGBvYmplY3RfdXJsYCB2YXJjaGFyKDM1NSkgY29sbGF0ZSB1dGY4X2JpbiBOT1QgTlVMTCwNCiAgYG1vbml0b3Jfc3RhdHVzYCB0aW55aW50KDQpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLA0KICBgY3JlYXRlZGAgYmlnaW50KDkpIGRlZmF1bHQgTlVMTCwNCiAgUFJJTUFSWSBLRVkgIChgaWRgKQ0KKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTE0IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF9iaW4gQVVUT19JTkNSRU1FTlQ9MSA7IiwNCidwd3NtX3JlcXVlc3RzJz0+IkNSRUFURSBUQUJMRSBgcHdzbV9yZXF1ZXN0c2AgKA0KICBgaWRgIGJpZ2ludCgyMCkgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsDQogIGB1cmxgIHZhcmNoYXIoMTAyNCkgY29sbGF0ZSB1dGY4X2JpbiBOT1QgTlVMTCwNCiAgYG1ldGhvZGAgdmFyY2hhcig0KSBjb2xsYXRlIHV0ZjhfYmluIE5PVCBOVUxMLA0KICBgcXVlcnlfc3RyaW5nYCB2YXJjaGFyKDUwMCkgY29sbGF0ZSB1dGY4X2JpbiBOT1QgTlVMTCwNCiAgYHJlYXNvbmAgdmFyY2hhcig1MTIpIGNvbGxhdGUgdXRmOF9iaW4gTk9UIE5VTEwsDQogIGBzdGF0dXNgIHRpbnlpbnQoNCkgTk9UIE5VTEwsDQogIGBvYmplY3RfaWRgIGJpZ2ludCgyMCkgTk9UIE5VTEwsDQogIGB0ZW1wbGF0ZV9pZGAgYmlnaW50KDIwKSBOT1QgTlVMTCwNCiAgYHJlbW90ZV9hZGRyYCB2YXJjaGFyKDUwKSBjb2xsYXRlIHV0ZjhfYmluIE5PVCBOVUxMLA0KICBgY3JlYXRlZGAgYmlnaW50KDIwKSBOT1QgTlVMTCwNCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwNCiAgS0VZIGBmb2xkZXJfaWRgIChgb2JqZWN0X2lkYCkNCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD03NjQzIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF9iaW4gQVVUT19JTkNSRU1FTlQ9MSA7IiwNCidwd3NtX3RlbXBsYXRlcyc9PiJDUkVBVEUgVEFCTEUgYHB3c21fdGVtcGxhdGVzYCAoDQogIGBpZGAgbWVkaXVtaW50KDkpIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LA0KICBgbmFtZWAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF9iaW4gTk9UIE5VTEwsDQogIGBkZXNjcmlwdGlvbmAgdGV4dCBjb2xsYXRlIHV0ZjhfYmluIE5PVCBOVUxMLA0KICBgcHJvdG9jb2xgIHZhcmNoYXIoMzIpIGNvbGxhdGUgdXRmOF9iaW4gTk9UIE5VTEwsDQogIGBjb2RlYCB0ZXh0IGNvbGxhdGUgdXRmOF9iaW4gTk9UIE5VTEwsDQogIGBzdGF0dXNgIHRpbnlpbnQoNCkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQogIGByZWdfZGF0ZWAgYmlnaW50KDIwKSBOT1QgTlVMTCwNCiAgYHN0YXJ0X2RhdGVgIGJpZ2ludCgyMCkgTk9UIE5VTEwsDQogIGBhdXRob3JgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfYmluIE5PVCBOVUxMLA0KICBQUklNQVJZIEtFWSAgKGBpZGApDQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MTMgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X2JpbiBBVVRPX0lOQ1JFTUVOVD0xIDsiLA0KJ3B3c21fdGVtcGxhdGVzX29iamVjdHMnPT4iQ1JFQVRFIFRBQkxFIGBwd3NtX3RlbXBsYXRlc19vYmplY3RzYCAoDQogIGBpZGAgYmlnaW50KDIwKSBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwNCiAgYHRlbXBsYXRlX2lkYCBiaWdpbnQoMjApIE5PVCBOVUxMLA0KICBgb2JqZWN0X2lkYCBiaWdpbnQoMjApIE5PVCBOVUxMLA0KICBQUklNQVJZIEtFWSAgKGBpZGApLA0KICBLRVkgYHRlbXBsYXRlX2lkYCAoYHRlbXBsYXRlX2lkYCxgb2JqZWN0X2lkYCkNCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD0yMjAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQVVUT19JTkNSRU1FTlQ9MSA7IiwNCidwd3NtX3VzZXJzJz0+IkNSRUFURSBUQUJMRSBgcHdzbV91c2Vyc2AgKA0KICBgaWRgIG1lZGl1bWludCg5KSBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwNCiAgYG5hbWVgIHZhcmNoYXIoNTApIGNvbGxhdGUgdXRmOF9iaW4gTk9UIE5VTEwsDQogIGBwYXNzYCB2YXJjaGFyKDMyKSBjb2xsYXRlIHV0ZjhfYmluIGRlZmF1bHQgTlVMTCwNCiAgYGVtYWlsYCB2YXJjaGFyKDUxMikgY29sbGF0ZSB1dGY4X2JpbiBOT1QgTlVMTCwNCiAgYGNyZWF0ZWRgIGJpZ2ludCgyMCkgTk9UIE5VTEwsDQogIGBjaGdfcGFzc190aW1lYCBiaWdpbnQoMjApIE5PVCBOVUxMLA0KICANCiAgDQogIFBSSU1BUlkgS0VZICAoYGlkYCkNCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD00IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF9iaW4gQVVUT19JTkNSRU1FTlQ9MTsiDQopOw0KCSR0aGlzLT50YWJsZXNbJ3Bvc3RncmVzcWwnXT1BcnJheSgNCidwd3NtX29iamVjdHMnPT4nQ1JFQVRFIFRBQkxFIHB3c21fb2JqZWN0cw0KKA0KICBpZCBzZXJpYWwgTk9UIE5VTEwsDQogIG9iamVjdF9zb3VyY2UgY2hhcmFjdGVyIHZhcnlpbmcoMTAyNCksDQogIG9iamVjdF91cmwgY2hhcmFjdGVyIHZhcnlpbmcoMzU1KSwNCiAgbW9uaXRvcl9zdGF0dXMgc21hbGxpbnQgTk9UIE5VTEwgREVGQVVMVCAwLA0KICBjcmVhdGVkIGJpZ2ludCwNCiAgQ09OU1RSQUlOVCBwd3NtX29iamVjdHNfaWRfaWR4IFBSSU1BUlkgS0VZIChpZCkNCikNCldJVEggKE9JRFM9RkFMU0UpOycsDQoncHdzbV9yZXF1ZXN0cyc9PidDUkVBVEUgVEFCTEUgcHdzbV9yZXF1ZXN0cw0KKA0KICBpZCBiaWdzZXJpYWwgTk9UIE5VTEwsDQogIHVybCBjaGFyYWN0ZXIgdmFyeWluZygxMDI0KSwNCiAgbWV0aG9kIGNoYXJhY3RlciB2YXJ5aW5nKDQpLA0KICBxdWVyeV9zdHJpbmcgY2hhcmFjdGVyIHZhcnlpbmcoNTAwKSwNCiAgcmVhc29uIGNoYXJhY3RlciB2YXJ5aW5nKDUxMiksDQogIHN0YXR1cyBzbWFsbGludCBOT1QgTlVMTCBERUZBVUxUIDAsDQogIG9iamVjdF9pZCBiaWdpbnQsDQogIHRlbXBsYXRlX2lkIGJpZ2ludCwNCiAgcmVtb3RlX2FkZHIgY2hhcmFjdGVyIHZhcnlpbmcoNTApLA0KICBjcmVhdGVkIGJpZ2ludCwNCiAgQ09OU1RSQUlOVCBwd3NtX3JlcXVlc3RzX2lkX2lkeCBQUklNQVJZIEtFWSAoaWQpDQopDQpXSVRIIChPSURTPUZBTFNFKTsnLA0KICAncHdzbV90ZW1wbGF0ZXMnPT4nQ1JFQVRFIFRBQkxFIHB3c21fdGVtcGxhdGVzDQooDQogIGlkIHNlcmlhbCBOT1QgTlVMTCwNCiAgIm5hbWUiIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSksDQogIHByb3RvY29sIGNoYXJhY3RlciB2YXJ5aW5nKDUpLA0KICBjb2RlIHRleHQsDQogIHN0YXR1cyBzbWFsbGludCBERUZBVUxUIDAsDQogIHJlZ19kYXRlIGJpZ2ludCwNCiAgc3RhcnRfZGF0ZSBiaWdpbnQsDQogIGF1dGhvciBjaGFyYWN0ZXIgdmFyeWluZyg1MCksDQogIGRlc2NyaXB0aW9uIHRleHQsDQogIENPTlNUUkFJTlQgcHdzbV90ZW1wbGF0ZXNfaWRfaWR4IFBSSU1BUlkgS0VZIChpZCkNCikNCldJVEggKE9JRFM9RkFMU0UpOycsDQoncHdzbV90ZW1wbGF0ZXNfb2JqZWN0cyc9PidDUkVBVEUgVEFCTEUgcHdzbV90ZW1wbGF0ZXNfb2JqZWN0cw0KKA0KICBpZCBiaWdzZXJpYWwgTk9UIE5VTEwsDQogIG9iamVjdF9pZCBiaWdpbnQsDQogIHRlbXBsYXRlX2lkIGJpZ2ludCwNCiAgQ09OU1RSQUlOVCBwd3NtX3RlbXBsYXRlc19vYmplY3RzX2lkX2lkeCBQUklNQVJZIEtFWSAoaWQpDQopDQpXSVRIIChPSURTPUZBTFNFKTsNCi0tRFJPUCBJTkRFWCBwd3NtX3JlcXVlc3RzX29iamVjdF9pZF9pZHg7DQoNCkNSRUFURSBJTkRFWCBwd3NtX3JlcXVlc3RzX29iamVjdF9pZF9pZHgNCiAgT04gcHdzbV9yZXF1ZXN0cw0KICBVU0lORyBidHJlZQ0KICAob2JqZWN0X2lkKTsNCiBDUkVBVEUgSU5ERVggcHdzbV9yZXF1ZXN0c190ZW1wbGF0ZV9pZF9pZHgNCiAgT04gcHdzbV9yZXF1ZXN0cw0KICBVU0lORyBidHJlZQ0KICAodGVtcGxhdGVfaWQpOyANCiAgJywNCiAgJ3B3c21fdXNlcnMnPT4nQ1JFQVRFIFRBQkxFIHB3c21fdXNlcnMNCigNCiAgaWQgc2VyaWFsIE5PVCBOVUxMLA0KICAibmFtZSIgY2hhcmFjdGVyIHZhcnlpbmcoNTApLA0KICBwYXNzIGNoYXJhY3RlciB2YXJ5aW5nKDMyKSwNCiAgImVtYWlsIiBjaGFyYWN0ZXIgdmFyeWluZyg1MTIpLA0KICBjcmVhdGVkIGJpZ2ludCwNCiAgY2hnX3Bhc3NfdGltZSBiaWdpbnQsDQogIENPTlNUUkFJTlQgcHdzbV91c2Vyc19pZF9pZHggUFJJTUFSWSBLRVkgKGlkKQ0KKQ0KV0lUSCAoT0lEUz1GQUxTRSk7Jw0KKTsNCiAgICB9DQogICAgZnVuY3Rpb24gbmV4dHN0ZXAoKQ0KICAgIHsNCiAgICAJaWYoIWlzc2V0KCRfU0VTU0lPTlsnaW5zdGFsbCddWydzdGVwJ10pKSRfU0VTU0lPTlsnaW5zdGFsbCddWydzdGVwJ109MDsNCiAgICAJJF9TRVNTSU9OWydpbnN0YWxsJ11bJ3N0ZXAnXSsrOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzdGVwKCkNCiAgICB7DQogICAgCXJldHVybiAoaXNzZXQoJF9TRVNTSU9OWydpbnN0YWxsJ10pJiYkX1NFU1NJT05bJ2luc3RhbGwnXVsnc3RlcCddKT8kX1NFU1NJT05bJ2luc3RhbGwnXVsnc3RlcCddOjA7DQogICAgfQ0KICAgIGZ1bmN0aW9uIHN0ZXBpcygkc3RlcCkNCiAgICB7DQogICAgJF9TRVNTSU9OWydpbnN0YWxsJ11bJ3N0ZXAnXT0kc3RlcDsNCiAgICB9DQogICAgIyMjIHdlbGxjb21lIG1lc3NhZ2UgYW5kIHN0YXJ0IGluc3RhbGxhdGlvbiAjIyMNCiAgICBmdW5jdGlvbiB3aW5kb3dfd2VsbGNvbWUoKQ0KICAgIHsNCiAgICBpZihpc3NldCgkX1BPU1RbJ29wJ10pJiYoJF9QT1NUWydvcCddPT0nc3RhcnQnKSkNCiAgICB7DQogICAgCSR0aGlzLT5uZXh0c3RlcCgpOw0KICAgICAJcmV0dXJuOw0KICAgIH0NCiAgICAgJGh0bWw9JzxkaXYgY2xhc3M9Im1lc3NhZ2UiPjxiPlBXU00gc3RlbGwgbm90IGluc3RhbGxlZCwgYXJlIHlvdSByZWFkeSB0byBzdGFydCBpbnN0YWxsYXRpb24/PC9iPg0KDQogICAgIDxjZW50ZXI+PGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCI+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ib3AiIHZhbHVlPSJzdGFydCIgY2xhc3M9InN0YXJ0X2J0biI+PC9mb3JtPjwvY2VudGVyPjwvZGl2Pic7DQogICAgIHJldHVybiAkaHRtbDsNCiAgICB9DQogICAgIyMjIyBmb3JtIGZvciBnZXQgREIgY29ubmVjdCBpbmZvcm1hdGlvbiBmcm9tIHVzZXIgYW5kIGNhbGwgY3JlYXRlIGNvbmZpZyBmaWxlICMjIw0KCWZ1bmN0aW9uIHdpbmRvd19jcmVhdGVfY29uZmlnX2ZpbGUoKQ0KCXsNCiAgICAkaHRtbD0iIjsNCiAgICAgICAgaWYoaXNzZXQoJF9QT1NUWydkYnR5cGUnXSkmJmNvdW50KCRfUE9TVCkpDQogICAgICAgIHsNCgkJaWYoJHRoaXMtPmNyZWF0ZV9jb25maWdmaWxlKCRfUE9TVCkpeyR0aGlzLT5uZXh0c3RlcCgpOyByZXR1cm4gIjxkaXYgY2xhc3M9J21lc3NhZ2UnPmNvbmYvY29uZmlnLnBocCBmaWxlIGNyZWF0ZWQ8L2Rpdj4iO30NCgkJZWxzZSAkaHRtbC49IjxkaXYgY2xhc3M9J2Vycm9yJz5JbXBvcnN0YWJsZSBjcmVldGUgY29uZi9jb25maWcucGhwIGZpbGUgLSBwbGVhc2UgcmVjaGVjayBwZXJtaXNzaW9uczwvZGl2Pg0KCQkJICAgIDxwPjxiPlJlY29tbWVuZGF0aW9uIHRyeSBzc2ggY29tbWFuZCAnPGNvZGU+Y2hvd24gYXBhY2hlIGNvbmY8L2NvZGU+JyBvciAnPGNvZGU+Y2htb2QgNzc3IGNvbmY8L2NvZGU+JyBpbiB3ZWJwcm9qZWN0IGZvbGRlcixvciB0b2xrIHdpdGggeW91ciB3ZWJob3N0IGFkbWluaXN0cmF0b3IgICA8L2I+PC9wPiI7DQogICAgICAgIH0NCg0KCQkkcGF0aD1zdWJzdHIoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sMCxzdHJsZW4oJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pLTgpOw0KICAgICAgICRodG1sLj0iDQoNCiAgICAgICA8Zm9ybSBhY3Rpb249JycgbWV0aG9kPSdQT1NUJz4NCiAgICAgICA8ZGl2IGNsYXNzPSdtZXNzYWdlJz5Gb3IgaW5zdGFsbGF0aW9uIHByb2Nlc3Mgb2YgUFdTTSAoUEhQIFdlYiBTZWN1cml0eSBNb25pdG9yKSBuZWVkIGNob2lzZSBkYXRhYmFzZSAoTVlTUUwgb3IgUG9zdGdyZVNRTCksIHdhbnRlZCBvciBleGlzdHMgZGF0YWJhc2UgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24gZGV0YWlsczwvZGl2Pg0KICAgICAgIDx0YWJsZSBzdHlsZT0nbWFyZ2luLXRvcDoyMHB4Oyc+DQogICAgICAgPHRyPjx0ZD5UeXBlIG9mIERCOjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0nZGJ0eXBlJz4NCiAgICAgICAJCQkgIDxvcHRpb24gdmFsdWU9J215c3FsJyIuKChpc3NldCgkX1BPU1RbJ2RidHlwZSddKSYmKCRfUE9TVFsnZGJ0eXBlJ109PSdteXNxbCcpKT8iIHNlbGVjdGVkIjoiIikuIj5teXNxbA0KICAgICAgIAkJCSAgPG9wdGlvbiB2YWx1ZT0ncG9zdGdyZXNxbCciLigoaXNzZXQoJF9QT1NUWydkYnR5cGUnXSkmJigkX1BPU1RbJ2RidHlwZSddPT0ncG9zdGdyZXNxbCcpKT8iIHNlbGVjdGVkIjoiIikuIj5wb3N0Z3Jlc3FsDQogICAgICAgCQkJICA8L3NlbGVjdD48L3RkPjwvdHI+DQogICAgICAgPHRyPjx0ZD5EQiBob3N0OjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdob3N0JyB2YWx1ZT0nIi4oaXNzZXQoJF9QT1NUWydob3N0J10pPyRfUE9TVFsnaG9zdCddOidsb2NhbGhvc3QnKS4iJz48L3RkPjwvdHI+DQogICAgICAgPHRyPjx0ZD5EQiBuYW1lOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdkYm5hbWUnIHZhbHVlPSciLihpc3NldCgkX1BPU1RbJ2RibmFtZSddKT8kX1BPU1RbJ2RibmFtZSddOidwd3NtJykuIic+PC90ZD48L3RyPg0KICAgICAgIDx0cj48dGQ+REIgdXNlcjo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndXNlcicgdmFsdWU9JyIuKGlzc2V0KCRfUE9TVFsndXNlciddKT8kX1BPU1RbJ3VzZXInXToncm9vdCcpLiInPjwvdGQ+PC90cj4NCiAgICAgICA8dHI+PHRkPkRCIFBhc3N3b3JkOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSdwYXNzd29yZCcgbmFtZT0ncGFzcyc+PC90ZD48L3RyPg0KICAgICAgIDx0cj48dGQgY29sc3Bhbj0yPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdjcmVhdGUnIGNsYXNzPSdzdGFydF9idG4nPjwvdGQ+PC90cj4NCiAgICAgICA8L3RhYmxlPg0KICAgICAgICI7DQogICAgICAgICN9DQogICAgICAgIHJldHVybiAkaHRtbDsNCgl9DQoJIyMjIHRlc3QgY29ubmVjdGlvbiB0byBzcGVjaWZpZWQgZGIgc2VydmVyICMjIw0KCWZ1bmN0aW9uIGNoa19kYl9jb25uZWN0KCRwb3N0KQ0KCXsNCgkJaWYoJHBvc3RbJ2RidHlwZSddPT0nbXlzcWwnKQ0KCQl7DQoJCQkkY29ubj1AbXlzcWxfY29ubmVjdCgkcG9zdFsnaG9zdCddLCRwb3N0Wyd1c2VyJ10sJHBvc3RbJ3Bhc3MnXSk7DQoJCQlyZXR1cm4gQG15c3FsX3N0YXQoJGNvbm4pOw0KCQl9ZWxzZWlmKCRwb3N0WydkYnR5cGUnXT09J3Bvc3RncmVzcWwnKQ0KCQl7DQoJCQkkY29ubj1wZ19jb25uZWN0KCJob3N0PSIuJHBvc3RbJ2hvc3QnXS4iIHBvcnQ9NTQzMiBkYm5hbWU9dGVtcGxhdGUxIHVzZXI9Ii4kcG9zdFsndXNlciddLiIgcGFzc3dvcmQ9Ii4kcG9zdFsncGFzcyddKTsNCgkJCQ0KCQkJcmV0dXJuICRjb25uOw0KCQl9DQoJfQ0KCSMjIyB0ZXN0IGNvbm5lY3Rpb24gdG8gc3BlY2lmaWVkIGRhdGFiYXNlIHJlc291cmNlIyMjDQoJZnVuY3Rpb24gY2hrX2lmX2RiX2V4aXN0cygkcG9zdCkNCgl7DQogICAgICBpZigkcG9zdFsnZGJ0eXBlJ109PSdteXNxbCcpDQogICAgICB7DQogICAgICAJcmV0dXJuIG15c3FsX3NlbGVjdF9kYigkcG9zdFsnZGJuYW1lJ10pOw0KICAgICAgfWVsc2V7DQogICAgICBwZ19jb25uZWN0aW9uX3N0YXR1cygpOw0KICAgICAgfQ0KCX0NCgkjIyMgY2hlY2tpbmcgaWYgY29uZmlnIGZpbGUgZXhpc3RzICMjIw0KCWZ1bmN0aW9uIGNoa19jb25maWdmaWxlKCkNCgl7DQoJcmV0dXJuIGZpbGVfZXhpc3RzKCIuLi9jb25mL2NvbmZpZy5waHAiKTsNCgl9DQoJIyMjIGNyZWF0aW9uIGNvbmZpZyBmaWxlIHZpYSBkYXRhIGdpdmVkIGJ5IHVzZXIgIyMjDQoJZnVuY3Rpb24gY3JlYXRlX2NvbmZpZ2ZpbGUoJHBvc3QpDQoJew0KCS8vd3JpdGUgY29uZmlnIGZpbGUNCgkkX1NFU1NJT05bJ3Bvc3QnXT0kcG9zdDsNCgkkY29uZmlnX2ZpbGU9Ii4uL2NvbmYvY29uZmlnLnBocCI7DQoJJGNvbmZpZ19maWxlX2Rpcj1zdWJzdHIoJGNvbmZpZ19maWxlLDAsc3RybGVuKCRjb25maWdfZmlsZSktMTApOw0KCWlmKCFpc193cml0YWJsZSgkY29uZmlnX2ZpbGVfZGlyKSkNCgl7DQoJDQoJcmV0dXJuIGZhbHNlOw0KCX0NCiAgICAgICAkZj1mb3BlbigkY29uZmlnX2ZpbGUsInciKTsNCiAgICAgICBmd3JpdGUoJGYsIjw/DQoNCiAgICAgICAkIi4iZGJfaG9zdD0nIi4kcG9zdFsnaG9zdCddLiInOw0KICAgICAgICQiLiJkYl9uYW1lPSciLiRwb3N0WydkYm5hbWUnXS4iJzsNCiAgICAgICAkIi4iZGJfdXNlcj0nIi4kcG9zdFsndXNlciddLiInOw0KICAgICAgICQiLiJkYl9wYXNzPSciLiRwb3N0WydwYXNzJ10uIic7DQogICAgICAgJCIuImRiX3R5cGU9JyIuJHBvc3RbJ2RidHlwZSddLiInOw0KDQoNCg0KDQogICAgICAgPz4iKTsNCiAgICAgICBmY2xvc2UoJGYpOw0KICAgICAgIHJldHVybiBmaWxlX2V4aXN0cygiLi4vY29uZi9jb25maWcucGhwIik7DQoJfQ0KCSMjIyBkZWxldGUgY29uZmlnIGZpbGUgIyMjDQoJZnVuY3Rpb24gZGVsZXRlX2NvbmZpZ19maWxlKCkNCgl7DQoJCUB1bmxpbmsoIi4uL2NvbmYvY29uZmlnLnBocCIpOw0KCX0NCgkjIyMgY2hlY2sgJiBjb25uZWN0IHRvIHNwZWNpZmllZCBkYXRhYmFzZSByZXNvdXJzZSAjIyMNCglmdW5jdGlvbiBkYl9leGlzdHMoJGRibmFtZSkNCgl7DQoJCWlmKCRfU0VTU0lPTlsncG9zdCddWydkYnR5cGUnXT09J215c3FsJykNCgkJew0KCQkNCgkJJGNvbm49bXlzcWxfY29ubmVjdCgkX1NFU1NJT05bJ3Bvc3QnXVsnaG9zdCddLCRfU0VTU0lPTlsncG9zdCddWyd1c2VyJ10sJF9TRVNTSU9OWydwb3N0J11bJ3Bhc3MnXSk7DQoJCXJldHVybiBteXNxbF9zZWxlY3RfZGIoJGRibmFtZSwkY29ubikJOw0KCQkjcmV0dXJuICRjb25uOw0KCQl9ZWxzZXsNCiAgICAgICAgJGNvbm49QHBnX2Nvbm5lY3QoImhvc3Q9Ii4kX1NFU1NJT05bJ3Bvc3QnXVsnaG9zdCddLiIgcG9ydD01NDMyIGRibmFtZT0iLiRkYm5hbWUuIiB1c2VyPSIuJF9TRVNTSU9OWydwb3N0J11bJ3VzZXInXS4iIHBhc3N3b3JkPSIuJF9TRVNTSU9OWydwb3N0J11bJ3Bhc3MnXSk7DQoJCXJldHVybiAkY29ubjsNCgkJfQ0KDQoJfQ0KCSMjIyBjcmVhdGluZyBuZXcgZGF0YWJhc2UgIyMjDQoJZnVuY3Rpb24gY3JlYXRlX25ld19kYigkZGJuYW1lKQ0KCXsNCgkNCgkkdGhpcy0+bmV4dHN0ZXAoKTsNCgkkc3FsPSJDUkVBVEUgREFUQUJBU0UgIi4kdGhpcy0+USgkZGJuYW1lLDEpOw0KICAgICRjb25uPSR0aGlzLT5kYmNvbm5lY3Rfcm9vdCgpOw0KCSRyZXM9JHRoaXMtPlFVRVJZKCRzcWwsJGNvbm4pOw0KCXJldHVybiAiPGRpdiBjbGFzcz0nbWVzc2FnZSc+RGF0YWJhc2UgPGI+Ii4kZGJuYW1lLiI8L2I+IGNyZWF0ZWQ8L2Rpdj4iOw0KCX0NCgkjIyMgZHJvcCBuZXcgZGF0YWJhc2UgIyMjDQoJZnVuY3Rpb24gZHJvcF9kYigkZGJuYW1lKQ0KCXsNCg0KCSRyZXo9JHRoaXMtPlFVRVJZKCJEUk9QIERBVEFCQVNFICIuJHRoaXMtPlEoJGRibmFtZSwxKSwkdGhpcy0+ZGJjb25uZWN0X3Jvb3QoKSk7DQoJcmV0dXJuICRyZXo7DQoJfQ0KCSMjIyBkYiBjb25uZWN0aW9uIHRvIG1haW4gZGIgIyMjDQoJZnVuY3Rpb24gZGJjb25uZWN0X3Jvb3QoKQ0KCXsNCgkJaWYoJF9TRVNTSU9OWydwb3N0J11bJ2RidHlwZSddPT0nbXlzcWwnKQ0KCQl7DQoNCgkgICAgICRjb25uPW15c3FsX2Nvbm5lY3QoJF9TRVNTSU9OWydwb3N0J11bJ2hvc3QnXSwkX1NFU1NJT05bJ3Bvc3QnXVsndXNlciddLCRfU0VTU0lPTlsncG9zdCddWydwYXNzJ10pOw0KCQkgbXlzcWxfc2VsZWN0X2RiKCRfU0VTU0lPTlsncG9zdCddWydkYm5hbWUnXSwkY29ubik7DQoJCX1lbHNlaWYoJF9TRVNTSU9OWydwb3N0J11bJ2RidHlwZSddPT0ncG9zdGdyZXNxbCcpDQoJCXsNCg0KCQkJJGRic3RyaW5nPSJob3N0PSIuJF9TRVNTSU9OWydwb3N0J11bJ2hvc3QnXS4iIHBvcnQ9NTQzMiBkYm5hbWU9dGVtcGxhdGUxIHVzZXI9Ii4kX1NFU1NJT05bJ3Bvc3QnXVsndXNlciddLiIgcGFzc3dvcmQ9Ii4kX1NFU1NJT05bJ3Bvc3QnXVsncGFzcyddOw0KDQoJCQkkY29ubj1wZ19jb25uZWN0KCRkYnN0cmluZyk7DQoJCX0NCgkJcmV0dXJuICRjb25uOw0KCX0NCgkjIyMgZGIgY29ubmVjdGlvbiB0byBzcGVjaWZpZWQgZGIgIyMjDQoJZnVuY3Rpb24gZGJjb25uZWN0KCkNCgl7DQoJCSMkcG9zdD0kX1NFU1NJT05bJ3Bvc3QnXTsNCgkJaWYoJF9TRVNTSU9OWydwb3N0J11bJ2RidHlwZSddPT0nbXlzcWwnKQ0KCQl7DQoJICAgICAgICAgJGNvbm49bXlzcWxfY29ubmVjdCgkX1NFU1NJT05bJ3Bvc3QnXVsnaG9zdCddLCRfU0VTU0lPTlsncG9zdCddWyd1c2VyJ10sJF9TRVNTSU9OWydwb3N0J11bJ3Bhc3MnXSk7DQoJCSBteXNxbF9zZWxlY3RfZGIoJF9TRVNTSU9OWydwb3N0J11bJ2RibmFtZSddLCRjb25uKTsNCgkJICR0aGlzLT5kYnR5cGU9JF9TRVNTSU9OWydwb3N0J11bJ2RidHlwZSddOw0KCQl9ZWxzZWlmKCRfU0VTU0lPTlsncG9zdCddWydkYnR5cGUnXT09J3Bvc3RncmVzcWwnKQ0KCQl7DQoJCSRkYnN0cmluZz0iaG9zdD0iLiRfU0VTU0lPTlsncG9zdCddWydob3N0J10uIiBwb3J0PTU0MzIgZGJuYW1lPSIuJF9TRVNTSU9OWydwb3N0J11bJ2RibmFtZSddLiIgdXNlcj0iLiRfU0VTU0lPTlsncG9zdCddWyd1c2VyJ10uIiBwYXNzd29yZD0iLiRfU0VTU0lPTlsncG9zdCddWydwYXNzJ107DQoJCSRjb25uPXBnX2Nvbm5lY3QoJGRic3RyaW5nKTsNCgkJJHRoaXMtPmRidHlwZT0kX1NFU1NJT05bJ3Bvc3QnXVsnZGJ0eXBlJ107DQoJCX0NCgkJcmV0dXJuICRjb25uOw0KCX0NCgkjIyMgZGIgZnVuYyA0IHF1ZXJ5ICMjIw0KCWZ1bmN0aW9uIFFVRVJZKCRzcWwsJGNvbm4pDQoJew0KCQkjJGNvbm49JHRoaXMtPmRiY29ubmVjdCgpOw0KCQlpZigkX1NFU1NJT05bJ3Bvc3QnXVsnZGJ0eXBlJ109PSdteXNxbCcpDQoJCXsNCgkJcmV0dXJuIG15c3FsX3F1ZXJ5KCRzcWwsJGNvbm4pOw0KCQl9ZWxzZWlmKCRfU0VTU0lPTlsncG9zdCddWydkYnR5cGUnXT09J3Bvc3RncmVzcWwnKQ0KCQl7DQoJCXJldHVybiBwZ19xdWVyeSgkY29ubiwkc3FsKSBvciBwcmludCAoJHNxbC4iPGhyPiIucGdfbGFzdF9lcnJvcigpKS4iPGhyPiI7DQoJCX0NCgl9DQoJIyMjIGRiIGZ1bmMgcmV0dXJuIG9uZSBlbGVtZW50IG9mIHJlc3VsdCAtIGFycmF5ICMjIw0KCWZ1bmN0aW9uIFJPV19RKCRzcWwsJGNvbm4pDQoJew0KCQkkcmVzdWx0PSR0aGlzLT5RVUVSWSgkc3FsLCRjb25uKTsNCgkJaWYoJHRoaXMtPmRidHlwZT09J215c3FsJykNCgkJew0KCQlyZXR1cm4gbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCk7DQoJCX1lbHNlaWYoJHRoaXMtPmRidHlwZT09J3Bvc3RncmVzcWwnKXsNCgkJcmV0dXJuICgkcmVzdWx0P3BnX2ZldGNoX2Fzc29jKCRyZXN1bHQpOiRyZXN1bHQpOw0KCQl9DQoJfQ0KCSMjIyBkYiBmdW5jIGZvciBudW1fcm93cyAjIyMNCglmdW5jdGlvbiBhZmZlY3RlZF9yb3dzKCRyZXMpDQoJew0KCQlpZigkX1NFU1NJT05bJ3Bvc3QnXVsnZGJ0eXBlJ109PSdteXNxbCcpDQoJCXsNCgkJcmV0dXJuIG15c3FsX2FmZmVjdGVkX3Jvd3MoJHJlcyk7DQoJCX1lbHNlaWYoJF9TRVNTSU9OWydwb3N0J11bJ2RidHlwZSddPT0ncG9zdGdyZXNxbCcpDQoJCXsNCgkJcmV0dXJuIHBnX2FmZmVjdGVkX3Jvd3MoJHJlcyk7DQoJCX0NCgl9DQogICAgIyMjIGNoZWNrIGlmIHNwZWNpZmllZCB0YWJsZSBleGlzdHMgIyMjDQoJZnVuY3Rpb24gY2hrX3RhYmxlX2V4aXN0cygkdGFibGUsJGNvbm4pDQoJew0KDQoJaWYoJF9TRVNTSU9OWydwb3N0J11bJ2RidHlwZSddPT0nbXlzcWwnKQ0KCQkkcmV6PSR0aGlzLT5RVUVSWSgiU0VMRUNUIDEgRlJPTSAiLiR0aGlzLT5RKCR0YWJsZSwxKS4iIiwkY29ubik7DQoJZWxzZWlmKCRfU0VTU0lPTlsncG9zdCddWydkYnR5cGUnXT09J3Bvc3RncmVzcWwnKQ0KCQkkcmV6PSR0aGlzLT5RVUVSWSgic2VsZWN0ICogZnJvbSBwZ190YWJsZXMgd2hlcmUgc2NoZW1hbmFtZT0ncHVibGljJyBhbmQgdGFibGVuYW1lPSciLiR0YWJsZS4iJzsiLCRjb25uKTsNCiAgICByZXR1cm4gQCR0aGlzLT5hZmZlY3RlZF9yb3dzKCRyZXopOw0KCX0NCgkjIyMgY2hlY2sgaWYgdGFibGVzIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5vdCAjIyMNCglmdW5jdGlvbiBjaGtfdGFibGVzX2V4aXN0cygpDQoJew0KDQoJJGNvbm49JHRoaXMtPmRiY29ubmVjdCgpOw0KICAgICRodG1sPScnOw0KCQlmb3JlYWNoKCR0aGlzLT50YWJsZXNbdHJpbSgkX1NFU1NJT05bJ3Bvc3QnXVsnZGJ0eXBlJ10pXSBhcyAkdGFibGU9PiR2YWx1ZSkNCgkJew0KICAgICAgICAgICAgJHI9JHRoaXMtPmNoa190YWJsZV9leGlzdHMoJHRhYmxlLCRjb25uKTsNCg0KCQkJaWYoISRyJiYoJHRoaXMtPlFVRVJZKCR2YWx1ZSwkY29ubikpKQ0KCQkJCXsNCgkJCQkJI3ByaW50ICRyLiI8aHI+IjsNCgkJCQkJJGh0bWwuPSc8ZGl2IGNsYXNzPSJtZXNzYWdlIj5UYWJsZSAnLiR0YWJsZS4nIGNyZWF0ZWQnLiI8L2Rpdj4iOw0KCQkJCX1lbHNlew0KCQkJCQkkaHRtbC49JzxkaXYgY2xhc3M9Im1lc3NhZ2UgZXJyb3IiPlRhYmxlICcuJHRhYmxlLicgYWxyZWFkeSBleGlzdHMnLiI8L2Rpdj4iOw0KCQkJCX0NCg0KCQl9DQoJCSNkaWUoJGh0bWwpOw0KCQkkdGhpcy0+bmV4dHN0ZXAoKTsNCgkJcmV0dXJuICRodG1sOw0KCX0NCgkjIyMjIGRiIGZ1bmMgc2VjdXJpdHkgZm9yIGVzY2FwZSBzdHJpbmcgIyMjDQoJZnVuY3Rpb24gUSgkdmFsdWUsJHN0cj1mYWxzZSkNCgl7DQoNCglpZigoJHN0cj09ZmFsc2UpJiYoIWlzX2ludGVnZXIoJHZhbHVlKSkpJHZhbHVlPS0xOw0KDQoJaWYoJF9TRVNTSU9OWydwb3N0J11bJ2RidHlwZSddPT0nbXlzcWwnKQ0KCQl7DQoJCXJldHVybiBteXNxbF9lc2NhcGVfc3RyaW5nKCR2YWx1ZSk7DQoJCX1lbHNlaWYoJF9TRVNTSU9OWydwb3N0J11bJ2RidHlwZSddPT0ncG9zdGdyZXNxbCcpDQoJCXsNCgkJcmV0dXJuIHBnX2VzY2FwZV9zdHJpbmcoJHZhbHVlKTsNCgkJfQ0KCX0NCgkjIyMgZm9ybSA0IGNyZWF0aW5nIG5ldyBkYiAjIyMNCglmdW5jdGlvbiB3aW5kb3dfY3JlYXRlX25ld19kYigkZGJuYW1lKQ0KCXsNCgkNCiAgICBpZihpc3NldCgkX1BPU1RbJ29wJ10pKQ0KICAgIHsNCiAgICAkdGhpcy0+bmV4dHN0ZXAoKTsNCgkJaWYoJF9QT1NUWydvcCddPT0nZGVsZXRlJykNCgkJew0KCSAgICAkdGhpcy0+ZHJvcF9kYigkZGJuYW1lKTsNCgkJJHRoaXMtPmNyZWF0ZV9uZXdfZGIoJGRibmFtZSk7DQoNCgkJcmV0dXJuICRkYm5hbWUuIiBEZWxldGVkIGFuZCBjcmVhdGVkIG5ldyI7DQoJCX1lbHNleyByZXR1cm4gIiB1c2luZyBleGlzdHMgZGIgIi4kZGJuYW1lO30NCiAgICB9DQoJJGh0bWw9IkFyZSB5b3Ugd2FudCBkZWxldGUgb2xkIERhdGFiYXNlICIuJGRibmFtZS4iIG9yIFJlcGFpciBvbGQ/PGJyPg0KCTxmb3JtIGFjdGlvbj0nJyBtZXRob2Q9J3Bvc3QnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J29wJyB2YWx1ZT0nZGVsZXRlJz48aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdvcCcgdmFsdWU9J3VzZSBvbGQnPjwvZm9ybT4iOw0KICAgIHJldHVybiAkaHRtbDsNCgl9DQogICAgIyMjIHdpbmRvdyBmb3IgY2hlY2sgJiByZWdpc3RlcmluZyBuZXcgdXNlcg0KCWZ1bmN0aW9uIHdpbmRvd19jcmVhdGVfdXNlcigpDQoJew0KCSRodG1sPScnOw0KCSRjb25uPSR0aGlzLT5kYmNvbm5lY3QoKTsNCglpZihpc3NldCgkX1BPU1RbJ25hbWUnXSkmJmlzc2V0KCRfUE9TVFsncGFzc3dvcmQnXSkpDQoJew0KCWlmKCRfUE9TVFsnc3RhcnRfYnRuJ109PSdsb2dpbicpDQoJew0KCSRvbGR1c2VyPSR0aGlzLT5ST1dfUSgiU0VMRUNUICogRlJPTSBwd3NtX3VzZXJzIFdIRVJFIChuYW1lPSciLiR0aGlzLT5RKCRfUE9TVFsnbmFtZSddLDEpLiInIE9SIGVtYWlsPSciLiR0aGlzLT5RKCRfUE9TVFsnbmFtZSddLDEpLiInKSBhbmQgcGFzcz0nIi5tZDUoJF9QT1NUWydwYXNzd29yZCddKS4iJyIsJGNvbm4pOw0KCSAgaWYoISRvbGR1c2VyKSRodG1sLj0iPGRpdiBjbGFzcz0nbWVzc2FnZSBlcnJvcic+TG9naW4gaW5jb3JyZWN0LCB5b3UgY2FuIHJlZ2lzdGVyIG5ldyB1c2VyIGFuZCBlZGl0IGxhdGVyIHlvdXIgb2xkIG9uZTwvZGl2PiI7DQoJICBlbHNlew0KCSAgICAgICR0aGlzLT5uZXh0c3RlcCgpOw0KCSAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nbWVzc2FnZSc+VXNlciBMb2dpbmVkPC9kaXY+IjsNCgkgICAgICB9IA0KCX1lbHNlaWYoJF9QT1NUWydzdGFydF9idG4nXT09J3NhdmUnKQ0KCXsNCgkkc29tZXVzZXI9JHRoaXMtPlJPV19RKCJTRUxFQ1QgY291bnQoKikgYXMgbnVtIEZST00gcHdzbV91c2VycyBXSEVSRSBuYW1lPSciLiR0aGlzLT5RKCRfUE9TVFsnbmFtZSddLDEpLiInIE9SIGVtYWlsPSciLiR0aGlzLT5RKCRfUE9TVFsnZW1haWwnXSwxKS4iJyIsJGNvbm4pOw0KCWlmKCRzb21ldXNlclsnbnVtJ10+MCkNCgkgIHsNCgkgICRodG1sLj0iPGRpdiBjbGFzcz0nbWVzc2FnZSBlcnJvcic+VGhlIHVzZXIgd2l0aCBzb21lIG5hbWUgb3IgZW1haWwgYWxyZWFkeSBleGlzdHMsIHBsZWFzZSB0eXBlIGRpZmZlcmVudCBvbmUuPC9kaXY+IjsNCgkgIH1lbHNlaWYoc3RybGVuKHRyaW0oJF9QT1NUWydwYXNzd29yZCddKSkmJigkX1BPU1RbJ3Bhc3N3b3JkJ109PSRfUE9TVFsncGFzc3dvcmQxJ10pKQ0KCQl7DQoJCSAgJHRoaXMtPlFVRVJZKCJJTlNFUlQgSU5UTyBwd3NtX3VzZXJzIChuYW1lLGVtYWlsLCBwYXNzLGNyZWF0ZWQpIFZBTFVFUyAoJyIuJHRoaXMtPlEoJF9QT1NUWyduYW1lJ10sMSkuIicsJyIuJHRoaXMtPlEoJF9QT1NUWydlbWFpbCddLDEpLiInLCciLm1kNSgkdGhpcy0+USgkX1BPU1RbJ3Bhc3N3b3JkJ10sMSkpLiInLCIudGltZSgpLiIpIiwkY29ubik7DQoJCSAgJHRoaXMtPm5leHRzdGVwKCk7DQoJCSAgcmV0dXJuICI8ZGl2IGNsYXNzPSdtZXNzYWdlJz5Vc2VyIHJlZ2lzdGVyZWQ8L2Rpdj4iOw0KDQoJCSAgDQoJCX1lbHNlaWYoJF9QT1NUWydwYXNzd29yZCddIT0kX1BPU1RbJ3Bhc3N3b3JkMSddKQ0KCQl7DQoJCSRodG1sLj0iPGRpdiBjbGFzcz0nbWVzc2FnZSBlcnJvcic+UGxlYXNlIHBhc3N3b3JkIGFuZCByZXR5cGUgYWdhaW4gdGhlIHNvbWUgcGFzc3dvcmQuPC9kaXY+IjsNCgkJfQ0KCX0NCgkJDQoJIH0gDQoJCS8vY2hlY2sgaWYgdXNlciBhbHJlYWR5IGV4aXN0cw0KCQkNCgkNCgkJJGNvdW50dXNlcj0kdGhpcy0+Uk9XX1EoIlNFTEVDVCBjb3VudChpZCkgYXMgbnVtIEZST00gcHdzbV91c2VycyB3aGVyZSBsZW5ndGgobmFtZSk+MCBhbmQgbGVuZ3RoKHBhc3MpPjAiLCRjb25uKTsNCgkJI2RpZSgkY291bnR1c2VyWydudW0nXSk7DQoJCSRodG1sLj0iIjsNCgkJaWYoJGNvdW50dXNlclsnbnVtJ10+MCkNCgkJew0KCQkjcHJpbnRfcigkX1BPU1QpOw0KCQkkaHRtbC49Ijxmb3JtIG1ldGhvZD0ncG9zdCc+PFRBQkxFPg0KCQk8Y2FwdGlvbj48Yj5UcnkgbG9naW4gZm9yIG9sZCBpbnN0YWxsYXRpb24gdXNlcjwvYj48L2NhcHRpb24+DQoJCTx0cj48dGQ+TmFtZSBvciBlbWFpbDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSduYW1lJyB2YWx1ZT0nIi4oKChpc3NldCgkX1BPU1RbJ3N0YXJ0X2J0biddKSkmJigkX1BPU1RbJ3N0YXJ0X2J0biddPT0nbG9naW4nKSYmaXNzZXQoJF9QT1NUWyduYW1lJ10pKT8kX1BPU1RbJ25hbWUnXTonJykuIic+PC90ZD48L3RyPg0KCQk8dHI+PHRkPlBhc3N3b3JkPC90ZD48dGQ+PGlucHV0IHR5cGU9J3Bhc3N3b3JkJyBuYW1lPSdwYXNzd29yZCcgdmFsdWU9Jyc+PC90ZD48L3RyPg0KCQk8dHI+PHRkIGNvbHNwYW49Mj48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nbG9naW4nIG5hbWU9J3N0YXJ0X2J0bicgY2xhc3M9J3N0YXJ0X2J0bic+PC90ZD48L3RyPg0KCQk8L1RBQkxFPjxwPiZuYnNwOzwvcD48L2Zvcm0+IjsNCgkJDQoJCX0NCgkJJGh0bWwuPSI8Zm9ybSBtZXRob2Q9J3Bvc3QnPjx0YWJsZT4NCgkJPGNhcHRpb24+PGI+PGZvbnQgY29sb3I9J3JlZCc+T1I8L2ZvbnQ+IFJlZ2lzdGVyIGZpcnN0IGFkbWluaXN0cmF0b3IgdXNlcjwvYj48L2NhcHRpb24+DQoJCTx0cj48dGQ+TmFtZTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSduYW1lJyB2YWx1ZT0nIi4oKGlzc2V0KCRfUE9TVFsnc3RhcnRfYnRuJ10pJiYoJF9QT1NUWydzdGFydF9idG4nXT09J3NhdmUnKSYmaXNzZXQoJF9QT1NUWyduYW1lJ10pKT8kX1BPU1RbJ25hbWUnXTonJykuIic+PC90ZD48L3RyPg0KCQk8dHI+PHRkPkVtYWlsPC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2VtYWlsJyB2YWx1ZT0nIi4oKGlzc2V0KCRfUE9TVFsnc3RhcnRfYnRuJ10pJiYoJF9QT1NUWydzdGFydF9idG4nXT09J3NhdmUnKSYmaXNzZXQoJF9QT1NUWydlbWFpbCddKSk/JF9QT1NUWydlbWFpbCddOicnKS4iJz48L3RkPjwvdHI+DQoJCTx0cj48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD48aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3N3b3JkJyB2YWx1ZT0nJz48L3RkPjwvdHI+DQoJCTx0cj48dGQ+UmV0eXBlIFBhc3N3b3JkPC90ZD48dGQ+PGlucHV0IHR5cGU9J3Bhc3N3b3JkJyBuYW1lPSdwYXNzd29yZDEnIHZhbHVlPScnPjwvdGQ+PC90cj4NCgkJPHRyPjx0ZCBjb2xzcGFuPTI+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J3NhdmUnIG5hbWU9J3N0YXJ0X2J0bicgY2xhc3M9J3N0YXJ0X2J0bic+PC90ZD48L3RyPg0KCQk8L3RhYmxlPg0KCQk8L2Zvcm0+DQoJCSI7DQoJCXJldHVybiAkaHRtbDsNCgl9DQoJIyMjIHJlZGlyZWN0IGFmdGVyIGZpbmFsaXphdGlvbiAjIyMNCglmdW5jdGlvbiBmaW5hbGxfaW5zdGFsbGF0aW9uKCkNCgl7DQogICAgaGVhZGVyKCJMb2NhdGlvbjogIi5zdWJzdHIoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sMCxzdHJsZW4oJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pLTgpKTsNCgl9DQp9'));
?>