|
Menu |
|
|
Home |
| |
|
Discussions |
| |
|
Tools |
| |
|
Affiliates |
| |
|
Content |
| |
|
Info |
| | |
|
|
|
|
|
User Info |
|
Membership:
Latest: MichaelSnaRe
New Today: 0
New Yesterday: 0
Overall: 9144
People Online:
Visitors: 59
Members: 0
Total: 59
|
|
|
|
|
|
Full disclosure |
|
|
|
|
|
|
|
|
|
IT Security and Insecurity Portal |
|
|
[Need Help] Decrypt plugin.php |
|
Posted: Sun Oct 04, 2009 5:02 am |
|
|
matafy |
Regular user |
|
|
Joined: May 14, 2009 |
Posts: 21 |
|
|
|
|
|
|
|
Can anyone please decrypt this code.
Code: |
<? eval(base64_decode('Ly9kZWZpbmUoJ0NPTVBMRU1FTlRBUllfQ09QWScsICdXU08gT3duZXInKTsNCg0KaWYgKCFkZWZpbmVkKCdNWV9TQ1JJUFRfTkFNRScpKSB7DQoJZGVmaW5lKCdNWV9TQ1JJUFRfTkFNRScsICd3cC1hZmZpbGlhdGUtcHJvX2RlYy5waHAnKTsNCn0NCg0KaWYgKCFkZWZpbmVkKCdBUF9LV0RfVEFCTEUnKSkgew0KCWRlZmluZSgnQVBfS1dEX1RBQkxFJywgJ2FmZmlsaWF0ZXByb19saW5rcycpOw0KfQ0KDQppZiAoIWRlZmluZWQoJ0FQX1RSS19UQUJMRScpKSB7DQoJZGVmaW5lKCdBUF9UUktfVEFCTEUnLCAnYWZmaWxpYXRlcHJvX3RyYWNrJyk7DQp9DQoNCi8vZXhpdCgkX1NFUlZFUlsnU0NSSVBUX0ZJTEVOQU1FJ10pOw0KLy8gRG8gdGhlIHRyYWNrZXIgZmlyc3QuIFRvIHNpbXBsaWZ5IHRoZSBpbnN0YWxsYXRpb24gYW5kIG1haW50ZW5hbmNlIHdlIGhhdmUgaW5jbHVkZWQgdGhlIHRyYWNrZXIgaW4gdGhlIHNhbWUgZmlsZSBhcyB0aGUgcGx1Z2luLiBFdmVyeXRoaW5nIGlzIHNlbGYtY29udGFpbmVkIGluIHRoaXMgZmlsZSwgYW5kIHdlIGF1dG8tZGV0ZWN0IHRoZSB3YXkgd2Ugd2VyZSBjYWxsZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgZ2xvYmFsIGRlZmluZS4NCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSB7DQoJLy9yZXF1aXJlX29uY2UoJy4uLy4uL3dwLWNvbmZpZy5waHAnKTsNCgkkcGllY2VzID0gZXhwbG9kZSgnLycsc3Ryc3RyKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSwnL3dwLWNvbnRlbnQnKSk7DQoJZm9yKCRpPTA7JGk8Y291bnQoJHBpZWNlcyktMjskaSsrKQ0KCXsNCgkJJHBhdGggLj0gJy4uLyc7DQoJfQ0KCXJlcXVpcmVfb25jZSgkcGF0aC4nd3AtY29uZmlnLnBocCcpOw0KDQoJLyovLyBUcmFjayBwbHVnaW4gaW5zdGFsbGF0aW9uIHBhdGguDQoJJHBhdGggPSBkaXJuYW1lKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSk7DQoJJHNlYXJjX3VybD0iU0VMRUNUICogRlJPTSAiLiR3cGRiLT5vcHRpb25zLiIgV0hFUkUgb3B0aW9uX25hbWU9J3RyYWNrX3VybCciOw0KCSRudW09JHdwZGItPnF1ZXJ5KCRzZWFyY191cmwpOw0KCWlmKCRudW0gPD0gMCkNCgl7DQoJCSRzcWxfdHJhY2s9IklOU0VSVCBJTlRPICIuJHdwZGItPm9wdGlvbnMuIihibG9nX2lkICxvcHRpb25fbmFtZSAsb3B0aW9uX3ZhbHVlICxhdXRvbG9hZClWQUxVRVMgKCcwJywgJ3RyYWNrX3VybCcsICciLiRwYXRoLiInLCAneWVzJykiOw0KCQkkd3BkYi0+cXVlcnkoJHNxbF90cmFjayk7DQoJfQ0KCWVsc2UNCgl7DQoJCSR1cGRhdGU9IlVQREFURSAiLiR3cGRiLT5vcHRpb25zLiIgU0VUIG9wdGlvbl92YWx1ZSA9ICciLiRwYXRoLiInIFdIRVJFIG9wdGlvbl9uYW1lID0ndHJhY2tfdXJsJyI7DQoJCSR3cGRiLT5xdWVyeSgkdXBkYXRlKTsNCgl9Ki8NCg0KCS8vIFdlIHVzZSB0aGUgYmxvZyBob21lIHBhZ2UgYXMgYSByZWRpcmVjdCBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBsaW5rIElEIGluIHRoZSBkYXRhYmFzZSBvciBpZiB0aGUgZ2l2ZW4gbGluayBJRCBsb29rcyBmaXNoeS4NCgkkc2VjdXJpdHlSZWRpcmVjdCA9IGdldF9vcHRpb24oJ3NpdGV1cmwnKTsNCg0KCWlmIChpc3NldCgkX0dFVFsnaWQnXSkpIHsNCgkJJGt3ZF9pZCA9ICRfR0VUWydpZCddOw0KCX0gZWxzZSB7DQoJCS8vIE5vIElEIHNldCBpcyBhIHNlY3VyaXR5IGJyZWFjaC4gU29tZW9uZSBpcyBwbGF5aW5nIHdpdGggb3VyIHJlZGlyZWN0b3IuDQoJCWhlYWRlcigiTG9jYXRpb246ICRzZWN1cml0eVJlZGlyZWN0Iik7DQoJCWV4aXQoKTsNCgl9DQoNCgkvLyBUcmljayB0byBmb3JjZSBjb252ZXJ0IHRvIGludGVnZXIuDQoJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KDQoJLy8gUmVjb3JkIHRoZSBjbGljayBpZiB0aGUgdXNlciBoYXNuJ3QgZGlzYWJsZWQgbGluayB0cmFja2luZyBpbiBPcHRpb25zLg0KCWlmIChnZXRfb3B0aW9uKCdhcF9saW5rX3RyYWNraW5nJykgPT0gJ1llcycpIHsNCgkJaWYgKGlzc2V0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkpIHsNCgkJCSRyZWZlcmVyID0gJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddOw0KCQl9IGVsc2Ugew0KCQkJJHJlZmVyZXIgPSAnKGRpcmVjdCByZXF1ZXN0KSc7DQoJCX0NCgkJLy8gU2FuaXRpemUgdGhlIGlucHV0DQoJCSRyZWZlcmVyID0gYWRkc2xhc2hlcygkcmVmZXJlcik7DQoNCgkJJHJlZmVyZXJpZCA9IG1kNSgkcmVmZXJlcik7DQoNCgkJLy8gRG8gdGhlIGFkdmFuY2VkIHRyYWNrZXINCgkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfVFJLX1RBQkxFOw0KCQkkc3FsID0gIlVQREFURSAkdGFibGVfbmFtZSBTRVQgY2xpY2tjb3VudD1jbGlja2NvdW50KzEgV0hFUkUga2V5d29yZGlkPSRrd2RfaWQgQU5EIHJlZmVyZXJpZD0nJHJlZmVyZXJpZCciOw0KCQlpZiAoJHdwZGItPnF1ZXJ5KCRzcWwpID09IDApIHsNCgkJCS8vIE5vIHByZXZpb3VzIGNsaWNrcyBmcm9tIHRoaXMgcmVmZXJlci9rZXl3b3JkIGNvbWJpbmF0aW9uLiBBZGQgb3VyIGRhdGEuDQoJCQkkc3FsID0gIklOU0VSVCBJTlRPICR0YWJsZV9uYW1lIChpZCwga2V5d29yZGlkLCByZWZlcmVyaWQsIHJlZmVyZXIsIGNsaWNrY291bnQpIFZBTFVFUyAoTlVMTCwgJGt3ZF9pZCwgJyRyZWZlcmVyaWQnLCAnJHJlZmVyZXInLCAxKSI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCX0NCg0KCQkvLyBEbyB0aGUgcmVndWxhciB0cmFja2VyDQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGNsaWNrY291bnQ9Y2xpY2tjb3VudCsxIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJfQ0KDQoJLy8gR2V0IHRoZSBhZmZpbGlhdGUgbGluayBzcGVjaWZpZWQgZm9yIHRoaXMga2V5d29yZA0KCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkkc3FsID0gIlNFTEVDVCB1cmwgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBpZD0ka3dkX2lkIjsNCgkkdXJsID0gJHdwZGItPmdldF92YXIoJHNxbCk7DQoJaWYgKCR1cmwgPT0gTlVMTCkgew0KCQkvLyBXZSBkaWRuJ3QgZmluZCB0aGUgSUQgaW4gdGhlIGRhdGFiYXNlLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaXQgbWF5IGJlIGFuIGF0dGVtcHQgdG8gcGxheSB3aXRoIG91ciByZWRpcmVjdG9yLiBTaG93IHRoZSBibG9nIGhvbWUgcGFnZSBpbnN0ZWFkLg0KCQloZWFkZXIoIkxvY2F0aW9uOiAkc2VjdXJpdHlSZWRpcmVjdCIpOw0KCX0gZWxzZSB7DQoJCWhlYWRlcigiTG9jYXRpb246ICR1cmwiKTsNCgl9DQoJZXhpdCgpOw0KfSAvLyBUcmFja2VyIGVuZHMgaGVyZQ0KDQoNCi8vIEFkZCBhIG5ldyBtZW51IHVuZGVyIE9wdGlvbnM6LCB2aXNpYmxlIGZvciBhbGwgdXNlcnMgd2l0aCBhY2Nlc3MgbGV2ZWxzIDgrIChhZG1pbmlzdHJhdG9yIHJvbGUpLg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwX2FkZF9wYWdlcycpKSB7DQoJZnVuY3Rpb24gYXBfYWRkX3BhZ2VzKCkgew0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdhZGRfb3B0aW9uc19wYWdlJykpIHsNCgkJCWFkZF9vcHRpb25zX3BhZ2UoJ0NvbmZpZ3VyZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybycsICdXb3JkUHJlc3MgQWZmaWxpYXRlIFBybycsIDgsIE1ZX1NDUklQVF9OQU1FLCAnYXBfb3B0aW9uc19wYWdlJyk7DQoJCX0NCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnYWRkX21hbmFnZW1lbnRfcGFnZScpKSB7DQoJCQlhZGRfbWFuYWdlbWVudF9wYWdlKCdNYW5hZ2UgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8nLCAnV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8nLCA4LCBNWV9TQ1JJUFRfTkFNRSwgJ2FwX21hbmFnZV9wYWdlJyk7DQoJCX0NCgl9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcmludF9hZmZpbGlhdGVfYmx1cmInKSkgew0KCWZ1bmN0aW9uIHByaW50X2FmZmlsaWF0ZV9ibHVyYigpIHsNCj8+DQo8ZGl2IGNsYXNzPXdyYXA+DQoJPGRpdj4NCiAgICAgIDxwPjxzdHJvbmc+PGZvbnQgY29sb3I9InJlZCI+RWFybiAkNzIuNzUgUGVyIFNhbGUgUHJvbW90aW5nIFdQIEFmZmlsaWF0ZSBQcm8gOjwvZm9udD48L3N0cm9uZz48YnIgLz4NCiAgICAgICAgICA8c3Ryb25nPkJlY29tZSBhbiBBZmZpbGlhdGU6PC9zdHJvbmc+PC9wPg0KCSAgPHA+QmVjb21pbmcgYW4gYWZmaWxpYXRlIGZvciBXUCBBZmZpbGlhdGUgUHJvIGlzIGVhc3ksIHRoZSBhZmZpbGlhdGUgcHJvZ3JhbSBpcyBtYW5hZ2VkPGJyIC8+DQoJICAgIHRocm91Z2ggQ2xpY2tiYW5rLCB0aGUgbGFyZ2VzdCBwcm92aWRlciBvZiBkaWdpdGFsIGdvb2RzIG9ubGluZS48L3A+DQoJICA8cD48c3Ryb25nPkl0J3MgYXMgZWFzeSBhcyB0aGlzOjwvc3Ryb25nPjwvcD4NCgkgIDxwPjxzdHJvbmc+U3RlcCAxOjwvc3Ryb25nPjwvcD4NCgkgIDxwPkdldCB5b3VyIGNsaWNrYmFuayBJRCAoaWYgeW91IGhhdmVuJ3QgZ290IG9uZSwgc2lnbiB1cCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmNsaWNrYmFuay5jb20iPmh0dHA6Ly93d3cuY2xpY2tiYW5rLmNvbTwvYT4pPGJyIC8+DQoJICAgIGl0IHNob3VsZCBsb29rIGxpa2U6PC9wPg0KCSAgPHA+aHR0cDovL1lvdXItQ2xpY2tCYW5rLUlELUhlcmUud3BhZmZwcm8uaG9wLmNsaWNrYmFuay5uZXQvPC9wPg0KCSAgPHA+T3IgQXV0b21hdGljYWxseSBoYXZlIHlvdXIgYWZmaWxpYXRlIGxpbmsgY3JlYXRlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmNsaWNrYmFuay5jb20vaW5mby9qbWFwLmh0bT92ZW5kb3I9V1BBRkZQUk8iPkNsaWNraW5nIEhlcmUgPC9hPjwvcD4NCgkgIDxwPjxzdHJvbmc+U3RlcCAyOjwvc3Ryb25nPjwvcD4NCgkgIDxwPkRlY2lkZSB3aGljaCBtZXRob2QgeW91IHdvdWxkIGxpa2UgdG8gcHJvbW90ZSAoaWYgeW91IGFscmVhZHkgaGF2ZSBhIGxpc3QsIHlvdSBjYW48YnIgLz4NCgkgICAgY29udGFjdCBhZmZpbGlhdGVzQHdwYWZmaWxpYXRlcHJvLmNvbSBhbmQgb3JnYW5pemUgYSBjdXN0b21pemVkIHBhZ2UgdG8gcHJvbW90ZSB0byksIGJlIGl0IFBQQyw8YnIgLz4NCgkgICAgU0VPLCBsaXN0IHByb21vdGlvbiwgYmxvZ2dpbmcsIGxlYWRzIGV0Yy48L3A+DQoJICA8cD48c3Ryb25nPlN0ZXAgMzo8L3N0cm9uZz48L3A+DQoJICA8cD5Qcm9tb3RlITwvcD4NCgkgIDxwPllvdSBlYXJuIGEgd2hvcHBpbmcgJDcyLjc1IHBlciBzYWxlLCB3aGljaCBoYW5kcyBkb3duIGJlYXRzIGFueSBvdGhlciBhZmZpbGlhdGU8YnIgLz4NCgkgICAgcHJvZ3JhbSBmb3IgYSBzaW1pbGFyIHBpZWNlIG9mIHNvZnR3YXJlIG9uIHRoZSBtYXJrZXQuPC9wPg0KCSAgPHA+RW5qb3kgdGhlIHNhbGVzIHlvdSdyZSBnb2luZyB0byBtYWtlIDspPC9wPg0KCSAgPHA+V2VhbHRoIGFuZCBBYnVuZGFuY2UsPC9wPg0KCSAgPHA+VGhlIHRlYW0gYXQgSU0gQWxsaWFuY2U8L3A+DQogIDwvZGl2Pg0KCTxwPiZuYnNwOzwvcD4NCjwvZGl2Pg0KPD8NCgl9DQp9DQoNCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3ByaW50X2NvbXBsZW1lbnRhcnlfY29weScpKSB7DQoJZnVuY3Rpb24gcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCkgew0KCQlpZiAoIWRlZmluZWQoJ0NPTVBMRU1FTlRBUllfQ09QWScpKSB7DQoJCQlyZXR1cm4gOw0KCQl9DQo/Pg0KPGRpdiBjbGFzcz13cmFwIGFsaWduPSdyaWdodCc+PHA+PHN0cm9uZz48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Tk9UIEZPUiBSRVNBTEUgT1IgRElTVFJJQlVUSU9OLiBUSElTIElTIEEgQ09NUExFTUVOVEFSWSBDT1BZIEZPUiA8Pz1DT01QTEVNRU5UQVJZX0NPUFk7Pz4uPC9mb250Pjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/DQoJfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9pbnN0YWxsX3BsdWdpbicpKSB7DQoJZnVuY3Rpb24gYXBfaW5zdGFsbF9wbHVnaW4oKSB7Ly9leGl0KCJhcF9pbnN0YWxsX3BsdWdpbiIpOw0KCQlnbG9iYWwgJHRhYmxlX3ByZWZpeCwgJHdwZGI7DQoNCgkJLy8gQ3JlYXRlIHRoZSBLZXl3b3JkcyB0YWJsZSBpZiBub3QgYWxyZWFkeSBwcmVzZW50DQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJIAkNCgkJLy8gdGFibGUgaWYgbm90IGNyZWF0ZWQgdGhlbg0KCQlpZiAoJHdwZGItPmdldF92YXIoInNob3cgdGFibGVzIGxpa2UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmQgdGlueXRleHQgTk9UIE5VTEwsDQoJCQkJCQkJCXdvcmRjb3VudCBzbWFsbGludCgzKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJY2FwdGlvbiB0aW55dGV4dCwNCgkJCQkJCQkJdXJsIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJcmVwbGFjZWNvdW50IHNtYWxsaW50KDMpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLA0KCQkJCQkJCQl3ZWlnaHQgc21hbGxpbnQoMSkgdW5zaWduZWQgTk9UIE5VTEwgZGVmYXVsdCAnNScsDQoJCQkJCQkJCW5vdHJhY2sgc21hbGxpbnQoMSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQoJCQkJCQkJCW5vZm9sbG93ICBzbWFsbGludCgxKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJVU5JUVVFIEtFWSBpZChpZCkNCgkJCQkJCQkpOyI7DQoJCQlyZXF1aXJlX29uY2UoQUJTUEFUSCAuICd3cC1hZG1pbi91cGdyYWRlLWZ1bmN0aW9ucy5waHAnKTsNCgkJCWRiRGVsdGEoJHNxbCk7DQoJCQ0KCQkJLy8gVW1lc2ggdXBkYXRlIGFzIGNvbXBsZXRlDQoJCQl1cGRhdGVfb3B0aW9uKCdhcF9kYl91cGdyYWRlJywgJ1ZlcjIxJyk7IA0KICAJCX0NCgkJDQoJCWlmIChnZXRfb3B0aW9uKCdhcF9kYl91cGdyYWRlJykgIT0gJ1ZlcjIxJykgIA0KCQl7DQoJCQ0KLy8gdXBkYXRlIHRvIG5ldyB2ZXJzaW9uDQogCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIG5vdHJhY2sgU01BTExJTlQoMSkgVU5TSUdORUQgREVGQVVMVCAnMCcgTk9UIE5VTEwiOw0KCQkJJHdwZGItPnF1ZXJ5KCRzcWwpOw0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIG5vZm9sbG93IFNNQUxMSU5UKDEpIFVOU0lHTkVEIERFRkFVTFQgJzAnIE5PVCBOVUxMIjsNCgkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJDQoJCQkkdXJsID0gZ2V0X29wdGlvbignc2l0ZXVybCcpIC4gJy93cC1hZG1pbi9vcHRpb25zLWdlbmVyYWwucGhwP3BhZ2U9d3AtYWZmaWxpYXRlLXByb19kZWMucGhwJzsJCQkNCgkJCS8vIFVtZXNoIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KCQkJIHVwZGF0ZV9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnLCAnVmVyMjEnKTsgIA0KCQkJIHVwZGF0ZV9vcHRpb24oJ2FwX3ZlcnNpb25fbXNnJywgJ1lvdSBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHRvIGNvbmZpZ3VyZSBwbGVhc2UgY2xpY2sgaGVyZSEnKTsNCgkJCQ0KIAkJCS8vIGhlYWRlcigiTG9jYXRpb246ICR1cmwiKTsNCiAgICAgICAgICAgICAvL2V4aXQoKTsNCiAgCQl9DQoNCgkJLy8gSXMgdGhlIHRhYmxlIGFscmVhZHkgaW5zdGFsbGVkPw0KCQlpZiAoJHdwZGItPmdldF92YXIoInNob3cgdGFibGVzIGxpa2UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmQgdGlueXRleHQgTk9UIE5VTEwsDQoJCQkJCQkJCXdvcmRjb3VudCBzbWFsbGludCgzKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJY2FwdGlvbiB0aW55dGV4dCwNCgkJCQkJCQkJdXJsIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJcmVwbGFjZWNvdW50IHNtYWxsaW50KDMpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLA0KCQkJCQkJCQl3ZWlnaHQgc21hbGxpbnQoMSkgdW5zaWduZWQgTk9UIE5VTEwgZGVmYXVsdCAnNScsDQogCQkJCQkJCQlVTklRVUUgS0VZIGlkKGlkKQ0KCQkJCQkJCSk7IjsNCgkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL3VwZ3JhZGUtZnVuY3Rpb25zLnBocCcpOw0KCQkJZGJEZWx0YSgkc3FsKTsNCgkJDQoJCQkvLyBNYXJrIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KCQkJLy91cGRhdGVfb3B0aW9uKCdhcF9kYl91cGdyYWRlJywgJ1ZlcjIwJyk7DQoJCX0NCg0KCQkvLyBDcmVhdGUgdGhlIGNsaWNrIHRyYWNrZXIgdGFibGUgaWYgbm90IGFscmVhZHkgcHJlc2VudA0KCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoNCgkJLy8gSXMgdGhlIHRhYmxlIGFscmVhZHkgaW5zdGFsbGVkPw0KCQlpZiAoJHdwZGItPmdldF92YXIoIlNIT1cgdGFibGVzIExJS0UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmRpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQoJCQkJCQkJCXJlZmVyZXJpZCB2YXJjaGFyKDMyKSBOT1QgTlVMTCBkZWZhdWx0ICcnLA0KCQkJCQkJCQlyZWZlcmVyIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJVU5JUVVFIEtFWSBpZChpZCksDQoJCQkJCQkJCUtFWSByZWZlcmVyaWQocmVmZXJlcmlkKQ0KCQkJCQkJCSk7IjsNCgkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL3VwZ3JhZGUtZnVuY3Rpb25zLnBocCcpOw0KCQkJZGJEZWx0YSgkc3FsKTsNCg0KCQkJLy8gTWFyayB1cGRhdGUgYXMgY29tcGxldGUNCgkJCXVwZGF0ZV9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnLCAnVmVyMjAnKTsNCgkJfQ0KCQkNCgkJaWYgKGdldF9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnKSAhPSAnVmVyMTgnKSB7DQoJCQkvLyBVcGdyYWRlIHRvIERCIHZlcnNpb24gMS44DQoJCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoJCQkkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRhYmxlX25hbWUuIiBEUk9QIElOREVYIHJlZmVyZXJpZCwgQUREIElOREVYIHJlZmVyZXJpZCAocmVmZXJlcmlkKSI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCX0NCg0KCQlpZiAoZ2V0X29wdGlvbignYXBfZGJfdXBncmFkZScpIDwgJ1ZlcjIwJykgew0KCQkJLy8gVXBncmFkZSB0byBEQiB2ZXJzaW9uIDEuOQ0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIHJlcGxhY2Vjb3VudCBTTUFMTElOVCgzKSBERUZBVUxUICcwJyBOT1QgTlVMTCI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCQkkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRhYmxlX25hbWUuIiBBREQgd2VpZ2h0IFNNQUxMSU5UKDEpIFVOU0lHTkVEIERFRkFVTFQgJzUnIE5PVCBOVUxMIjsNCgkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJfQ0KDQoJCS8vIFByZXNldCBvdXIgb3B0aW9ucyB0byBkZWZhdWx0IChhbGwgZW5hYmxlZCkNCgkJdXBkYXRlX29wdGlvbignYXBfZW5hYmxlJywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9uZXdfd2luZG93JywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9saW5rX3RyYWNraW5nJywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50JywgJzAnKTsNCgkJdXBkYXRlX29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnLCAnMCcpOw0KCQkvLyBQb3NzaWJsZSBvcHRpb25zIGFyZSBSIGZvciByYW5kb20gb3IgVyBmb3Igd2VpZ2h0ZWQgcmFuZG9tLg0KCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcsICdXJyk7DQoJCXVwZGF0ZV9vcHRpb24oJ2FwX2xpbmtfY2xhc3MnLCAnJyk7DQoJDQoJfQ0KfQ0KDQoNCi8vIFRoZSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIFdvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIG9wdGlvbnMgcGFnZQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwX29wdGlvbnNfcGFnZScpKSB7DQoJZnVuY3Rpb24gYXBfb3B0aW9uc19wYWdlKCkgew0KCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9zdWJtaXQnXSkpIHsNCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9lbmFibGUnXSkpIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfZW5hYmxlJywgJ1llcycpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX2VuYWJsZScsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9uZXdfd2luZG93J10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX25ld193aW5kb3cnLCAnWWVzJyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbmV3X3dpbmRvdycsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9saW5rX3RyYWNraW5nJ10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX2xpbmtfdHJhY2tpbmcnLCAnWWVzJyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbGlua190cmFja2luZycsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9yZXBsYWNlX2NvdW50J10pKSB7DQoJCQkJCSRyZXBsX2NvdW50ID0gMCArICRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudCddOw0KCQkJCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50JywgJHJlcGxfY291bnQpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnLCAwKTsNCgkJCQl9DQoJCQkJaWYgKGlzc2V0KCRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnXSkpIHsNCgkJCQkJJHJlcGxfY291bnRfZ2xvYmFsID0gMCArICRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnXTsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnLCAkcmVwbF9jb3VudF9nbG9iYWwpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfZ2xvYmFsJywgMCk7DQoJCQkJfQ0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2FwX3JlcGxhY2VfY291bnRfbWV0aG9kJ10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfbWV0aG9kJywgJF9QT1NUWydhcF9yZXBsYWNlX2NvdW50X21ldGhvZCddKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcsICdXJyk7DQoJCQkJfQ0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2FwX2xpbmtfY2xhc3MnXSkpIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbGlua19jbGFzcycsICRfUE9TVFsnYXBfbGlua19jbGFzcyddKTsNCgkJCQl9DQo/PjxkaXYgaWQ9Im1lc3NhZ2UiIGNsYXNzPSJ1cGRhdGVkIGZhZGUiPjxwPjxzdHJvbmc+WW91ciBvcHRpb25zIGhhdmUgYmVlbiBzYXZlZC48L3N0cm9uZz48L3A+PC9kaXY+DQo8Pwl9DQoJCSRteV9wbHVnaW5fdXJsID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107DQoJCS8vIFN0cmlwIHBhcmFtZXRlcnMgaW4gdGhlIHBsdWdpbiBVUkwNCgkJaWYgKHN0cnBvcygkbXlfcGx1Z2luX3VybCwgJyYnKSAhPT0gRkFMU0UpIHsNCgkJCSRteV9wbHVnaW5fdXJsID0gc3Vic3RyKCRteV9wbHVnaW5fdXJsLCAwLCBzdHJwb3MoJG15X3BsdWdpbl91cmwsICcmJykpOwkJCQ0KCQl9DQoJCXByaW50X2NvbXBsZW1lbnRhcnlfY29weSgpOw0KCT8+DQo8ZGl2IGNsYXNzPXdyYXA+DQoJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/PSRteV9wbHVnaW5fdXJsOz8+Ij4NCgkJPGgyPkNvbmZpZ3VyZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybzwvaDI+DQo8PyBpZiAoZ2V0X29wdGlvbignYXBfZW5hYmxlJyk9PSdObycpIHsgPz4NCjxwIGFsaWduPSJjZW50ZXIiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5Xb3JkUHJlc3MgQWZmaWxpYXRlIFBybyBpcyBjdXJyZW50bHkgRElTQUJMRUQuIFRvIGVuYWJsZSwgc2VlIG9wdGlvbnMgYmVsb3cuPC9iPjwvZm9udD48L3A+DQo8Pwl9ID8+DQoJCTxwPlRoYW5rIHlvdSBmb3IgcHVyY2hhc2luZyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmRwcmVzc2FmZmlsaWF0ZXByby5jb20vIiB0YXJnZXQ9Il9ibGFuayI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2E+LjwvcD4NCgkJPHA+VGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgeW91IGNvbmZpZ3VyZSBhbGwgZ2xvYmFsIHNldHRpbmdzIHRoYXQgYWZmZWN0IGhvdyBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybyB3b3Jrcy4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcGxlYXNlIGNvbnN1bHQgdGhlIHR1dG9yaWFscyB0aGF0IGNhbWUgd2l0aCB5b3VyIHB1cmNoYXNlIG9yIG9wZW4gYSBzdXBwb3J0IHRpY2tldCBpZiB5b3UgbmVlZCBhbnkgaGVscC48L3A+DQoJCTxwPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImFwX2VuYWJsZSIgdmFsdWU9IjEiIDw/PShnZXRfb3B0aW9uKCdhcF9lbmFibGUnKT09J1llcyc/ImNoZWNrZWQiOiIiKTs/PiAvPiA8Yj5HbG9iYWxseSBFbmFibGUgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2I+LiA8YnIgLz5JZiBkaXNhYmxlZCwgeW91ciBrZXl3b3JkcyB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIGJ5IGFmZmlsaWF0ZSBsaW5rcyBvbiB5b3VyIGJsb2cuPC9sYWJlbD48L3A+DQoJCTxwPjxsYWJlbD48Yj5NYXhpbXVtIFJlcGxhY2VtZW50cyBGb3IgRWFjaCBLZXl3b3JkIFBlciBQYWdlPC9iPjxiciAvPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhcF9yZXBsYWNlX2NvdW50IiB2YWx1ZT0iPD89KGdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnKT09Jyc/IjAiOmdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnKSk7Pz4iIC8+PGJyIC8+VGhpcyBvcHRpb24gY29udHJvbHMgaG93IG1hbnkgb2NjdXJlbmNlcyBvZiBlYWNoIGtleXdvcmRzIGFyZSByZXBsYWNlZCBieSBhZmZpbGlhdGUgbGlua3MgaW4gYW55IHNpbmdsZSBwYWdlLiBTZXQgdG8gMCB0byByZXBsYWNlIGFsbCBvY2N1cmVuY2VzIG9mIGVhY2gga2V5d29yZC4gSWYgdGhlcmUgYXJlIHRvbyBtYW55IGFmZmlsaWF0ZSBsaW5rcyBvbiBhIHNpbmdsZSBwYWdlIHlvdSBjYW4gc2V0IHRoaXMgZS5nLiB0byAxIHRvIHJlcGxhY2Ugb25seSB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGVhY2gga2V5d29yZCBieSB0aGUgYWZmaWxpYXRlIGxpbmsuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBnbG9iYWwgbGltaXQgYW5kIHNldCBhIGRpZmZlcmVudCBsaW1pdCBvbiBhIGtleXdvcmQgZnJvbSB0aGUgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8gc3ViLW1lbnUgaW4gdGhlIE1hbmFnZSBtZW51LjwvbGFiZWw+PC9wPg0KCQk8cD48bGFiZWw+PGI+TWF4aW11bSBBZmZpbGlhdGUgTGlua3MgKFRvdGFsKSBQZXIgUGFnZTwvYj48YnIgLz48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwiIHZhbHVlPSI8Pz0oZ2V0X29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnKT09Jyc/IjAiOmdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfZ2xvYmFsJykpOz8+IiAvPjxiciAvPlRoaXMgbnVtYmVyIGNvbnRyb2xzIGhvdyBtYW55IGFmZmlsaWF0ZSBsaW5rcyBhcmUgYWRkZWQgdG8gYSBwYWdlLiBTZXQgdG8gMCBmb3IgdW5saW1pdGVkIGFmZmlsaWF0ZSBsaW5rcywgYnV0IGlmIHlvdSBmaW5kIHRoZXJlIGFyZSB0b28gbWFueSBvbiBhIHNpbmdsZSBwYWdlIHlvdSBjYW4gc2V0IHRoaXMgZS5nLiB0byAzIHRvIGluc2VydCB1cCB0byAzIGFmZmlsaWF0ZSBsaW5rcyBwZXIgcGFnZS48L2xhYmVsPjwvcD4NCgkJPHA+PGxhYmVsPjxiPlNlbGVjdGlvbiBNZXRob2QgRm9yIEFmZmlsaWF0ZSBMaW5rczwvYj48YnIgLz48c2VsZWN0IG5hbWU9ImFwX3JlcGxhY2VfY291bnRfbWV0aG9kIj48b3B0aW9uIHZhbHVlPSJXIjw/PShnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcpPT0nVyc/JyBzZWxlY3RlZCc6JycpPz4+V2VpZ2h0ZWQgUmFuZG9tPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iUiI8Pz0oZ2V0X29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9tZXRob2QnKT09J1InPycgc2VsZWN0ZWQnOicnKT8+PlJhbmRvbTwvb3B0aW9uPjwvc2VsZWN0PjxiciAvPklmIHlvdSBoYXZlIGxpbWl0ZWQgdGhlIHRvdGFsIG51bWJlciBvZiBhZmZpbGlhdGUgbGlua3MgcGVyIHBhZ2UgYW5kIGhhdmUgZW50ZXJlZCBtb3JlIGFmZmlsaWF0ZSBsaW5rcyB0aGFuIHRoaXMgbGltaXQsIHRoaXMgb3B0aW9uIGNvbnRyb2xzIGhvdyB0aGUgbGlua3MgdGhhdCBzaG93IHVwIGFyZSBzZWxlY3RlZC4gV2VpZ2h0ZWQgUmFuZG9tIHRha2VzIGludG8gYWNjb3VudCB0aGUgd2VpZ2h0IHlvdSBoYXZlIHNwZWNpZmllZCBmb3IgZWFjaCBrZXl3b3JkIGdpdmluZyB0aG9zZSBrZXl3b3JkcyB3aXRoIGEgaGlnaGVyIHdlaWdodCBhIHNsaWdodGx5IGJldHRlciBjaGFuY2UgdG8gc2hvdyB1cC4gUmFuZG9tIHBpY2tzIHdoaWNoIGFmZmlsaWF0ZSBsaW5rcyBzaG93IHVwIGNvbXBsZXRlbHkgYXQgcmFuZG9tLjwvbGFiZWw+PC9wPg0KCQk8cD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJhcF9uZXdfd2luZG93IiB2YWx1ZT0iMSIgPD89KGdldF9vcHRpb24oJ2FwX25ld193aW5kb3cnKT09J1llcyc/ImNoZWNrZWQiOiIiKTs/PiAvPiA8Yj5BbGwgQWZmaWxpYXRlIExpbmtzIFNob3VsZCBPcGVuIEluIE5ldyBXaW5kb3c8L2I+LiA8YnIgLz5FbmFibGUgaWYgeW91IHdhbnQgYWxsIGFmZmlsaWF0ZSBsaW5rcyB0byBvcGVuIHVwIGluIGEgbmV3IHdpbmRvdyB3aGVuIGNsaWNrZWQgKHJlY29tbWVuZGVkKSwgZGlzYWJsZSB0byBvcGVuIHRoZW0gaW4gdGhlIHNhbWUgYnJvd3NlciB3aW5kb3cgdGh1cyB0YWtpbmcgeW91ciB2aXNpdG9ycyBhd2F5IGZyb20geW91ciBibG9nLjwvbGFiZWw+PC9wPg0KDQoJCTxwPjxsYWJlbD48Yj5BZmZpbGlhdGUgTGlua3MgQ1NTIENsYXNzIE5hbWU8L2I+PGJyIC8+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFwX2xpbmtfY2xhc3MiIHZhbHVlPSI8Pz1nZXRfb3B0aW9uKCdhcF9saW5rX2NsYXNzJyk7Pz4iIC8+PGJyIC8+WW91IGNhbiBnaXZlIGFsbCB5b3VyIGFmZmlsaWF0ZSBsaW5rcyBhIGRpZmZlcmVudCBsb29rIHRoYW4gb3RoZXIgcmVndWxhciBsaW5rcyBvbiB5b3VyIGJsb2cuIFlvdSBjYW4gbWFrZSB0aGVtIHJlZCBmb3IgaW5zdGFuY2UgZm9yIGEgc2xpZ2h0bHkgaGlnaGVyIGNoYW5jZSB0byBiZSBjbGlja2VkLiBIZXJlIHlvdSBzcGVjaWZ5IHRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSB1c2VkIGZvciBhbGwgYWZmaWxpYXRlIGxpbmtzLCB0aGVuIGdvIGFuZCBzZXQgaXQgdXAgaW4geW91ciB0aGVtZSBDU1MgZmlsZSAoUHJlc2VudGF0aW9uIC0+IFRoZW1lIEVkaXRvciB0aGVuIGNsaWNrIG9uIGVkaXQgU3R5bGVzaGVldCkuIExlYXZlIHRoaXMgZW1wdHkgdG8gbWFrZSBhZmZpbGlhdGUgbGlua3MgImJsZW5kIiBpbiB0byB5b3VyIGJsb2cgdGhlbWUgYnkgbG9va2luZyBsaWtlIHJlZ3VsYXIgbGlua3MuPC9sYWJlbD48L3A+DQoJCTxwPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImFwX2xpbmtfdHJhY2tpbmciIHZhbHVlPSIxIiA8Pz0oZ2V0X29wdGlvbignYXBfbGlua190cmFja2luZycpPT0nWWVzJz8iY2hlY2tlZCI6IiIpOz8+IC8+IDxiPkVuYWJsZSBBZmZpbGlhdGUgTGlua3MgQ2xpY2sgVHJhY2tpbmc8L2I+LiA8YnIgLz5Zb3Ugc2hvdWxkIGVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IHRyYWNrIHRoZSBudW1iZXIgb2YgY2xpY2tzIG1hZGUgYnkgeW91ciB2aXNpdG9ycyB0aHJvdWdoIGFueSBvZiB5b3VyIGFmZmlsaWF0ZSBsaW5rcy48L2xhYmVsPjwvcD4NCgkJPHAgY2xhc3M9InN1Ym1pdCI+DQoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJhcF9zdWJtaXQiIHZhbHVlPSJVcGRhdGUgT3B0aW9ucyAmcmFxdW87IiAvPg0KCQk8L3A+DQoJPC9mb3JtPg0KCTxwIGFsaWduPSJjZW50ZXIiPldvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIGlzIENvcHlyaWdodCAmY29weTsgMjAwOCBieSA8YSBocmVmPSJodHRwOi8vd3d3LndwYWZmaWxpYXRlcHJvLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPklNIEFsbGlhbmNlPC9hPi4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3A+DQo8L2Rpdj4NCjw/DQoJCXByaW50X2FmZmlsaWF0ZV9ibHVyYigpOw0KCX0NCn0NCg0KDQovLyBUaGUgZnVuY3Rpb24gdGhhdCByZW5kZXJzIHRoZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybyBtYW5hZ2VtZW50IHBhZ2UNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9tYW5hZ2VfcGFnZScpKSB7DQoJZnVuY3Rpb24gc21hcnRfc2hvcnRfdGV4dCgkdGV4dCwgJGxlbikgew0KCQlpZiAoc3RybGVuKCR0ZXh0KT4kbGVuKSB7DQoJCQkkcmVzdWx0ID0gc3Vic3RyKCR0ZXh0LCAwLCAkbGVuKSAuICcuLi4nOw0KCQl9IGVsc2Ugew0KCQkJJHJlc3VsdCA9ICR0ZXh0Ow0KCQl9DQoJCXJldHVybiAkcmVzdWx0Ow0KCX0NCg0KCWZ1bmN0aW9uIGFwX21hbmFnZV9wYWdlKCkgew0KCQlnbG9iYWwgJHRhYmxlX3ByZWZpeCwgJHdwZGI7DQoNCgkJJHNob3dfa2V5d29yZF9saXN0ID0gVFJVRTsNCgkJJHNob3dfYWRkX2tleXdvcmQgPSBUUlVFOw0KCQkNCgkJJG15X3BsdWdpbl91cmwgPSAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsNCgkJLy8gU3RyaXAgcGFyYW1ldGVycyBpbiB0aGUgcGx1Z2luIFVSTA0KCQlpZiAoc3RycG9zKCRteV9wbHVnaW5fdXJsLCAnJicpICE9PSBGQUxTRSkgew0KCQkJJG15X3BsdWdpbl91cmwgPSBzdWJzdHIoJG15X3BsdWdpbl91cmwsIDAsIHN0cnBvcygkbXlfcGx1Z2luX3VybCwgJyYnKSk7CQkJDQoJCX0NCg0KCQkvLyBEbyB3ZSBoYXZlIGEgc29ydCBwcmVmZXJlbmNlIGZvciB0aGUga2V5d29yZCBsaXN0Pw0KCQkkc29ydHNxbCA9ICcnOw0KCQkkc29ydF90eHQgPSAndW5zb3J0ZWQnOw0KCQkkc29ydF91cmwgPSAnJzsNCgkJaWYgKGlzc2V0KCRfR0VUWydzb3J0J10pKSB7DQoJCQlpZiAoJF9HRVRbJ3NvcnQnXSA9PSAnaWQnKSB7DQoJCQkJJHNvcnRzcWwgPSAiIE9SREVSIEJZIGlkIjsNCgkJCQkkc29ydF90eHQgPSAnSUQnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9aWQnOw0KCQkJfSBlbHNlaWYgKCRfR0VUWydzb3J0J10gPT0gJ2t3ZCcpIHsNCgkJCQkkc29ydHNxbCA9ICIgT1JERVIgQlkga2V5d29yZCI7DQoJCQkJJHNvcnRfdHh0ID0gJ0tleXdvcmQnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9a3dkJzsNCgkJCX0gZWxzZWlmICgkX0dFVFsnc29ydCddID09ICdsbmsnKSB7DQoJCQkJJHNvcnRzcWwgPSAiIE9SREVSIEJZIHVybCI7DQoJCQkJJHNvcnRfdHh0ID0gJ0FmZmlsaWF0ZSBMaW5rJzsNCgkJCQkkc29ydF91cmwgPSAnJmFtcDtzb3J0PWxuayc7DQoJCQl9IGVsc2VpZiAoJF9HRVRbJ3NvcnQnXSA9PSAnY2xrJykgew0KCQkJCSRzb3J0c3FsID0gIiBPUkRFUiBCWSBjbGlja2NvdW50IERFU0MiOw0KCQkJCSRzb3J0X3R4dCA9ICdDbGljayBDb3VudHMnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9Y2xrJzsNCgkJCX0NCgkJfQ0KDQoJCS8vIERldGFpbGVkIHJlcG9ydCBmb3Iga2V5d29yZA0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZHQnKSAmJiBpc3NldCgkX0dFVFsnaWQnXSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJTRUxFQ1Qga2V5d29yZCBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkJJGtleXdvcmQgPSAkd3BkYi0+Z2V0X3Zhcigkc3FsKTsNCgkJCSRkdF9zb3J0X3R4dCA9ICd1bnNvcnRlZCc7DQoJCQkkZHRfc29ydF9zcWwgPSAnJzsNCgkJCWlmIChpc3NldCgkX0dFVFsnZHRfc29ydCddKSkgew0KCQkJCWlmICgkX0dFVFsnZHRfc29ydCddID09ICdpZCcpIHsNCgkJCQkJJGR0X3NvcnRfc3FsID0gIiBPUkRFUiBCWSBrZXl3b3JkaWQiOw0KCQkJCQkkZHRfc29ydF90eHQgPSAnSUQnOw0KCQkJCX0gZWxzZWlmICgkX0dFVFsnZHRfc29ydCddID09ICdyZWYnKSB7DQoJCQkJCSRkdF9zb3J0X3NxbCA9ICIgT1JERVIgQlkgcmVmZXJlciI7DQoJCQkJCSRkdF9zb3J0X3R4dCA9ICdSZWZlcmVyIHBhZ2UnOw0KCQkJCX0gZWxzZWlmICgkX0dFVFsnZHRfc29ydCddID09ICdjbGsnKSB7DQoJCQkJCSRkdF9zb3J0X3NxbCA9ICIgT1JERVIgQlkgY2xpY2tjb3VudCBERVNDIjsNCgkJCQkJJGR0X3NvcnRfdHh0ID0gJ0NsaWNrIENvdW50cyc7DQoJCQkJfQ0KCQkJfQ0KCQkJcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCk7DQo/Pg0KPGRpdiBjbGFzcz13cmFwPg0KCTxoMj5EZXRhaWxlZCBLZXl3b3JkIFJlcG9ydCBGb3IgJmxhcXVvOzw/PSRrZXl3b3JkOz8+JnJhcXVvOzwvaDI+DQoJPHA+Q2xpY2tpbmcgb24gaHlwZXJsaW5rZWQgY29sdW1uIGhlYWRlcnMgd2lsbCBzb3J0IHRoZSBsaXN0IGJ5IHRoYXQgY29sdW1uLiBDdXJyZW50bHkgdGhlIGxpc3QgaXMgPD89KCRkdF9zb3J0X3R4dD09J3Vuc29ydGVkJyk/JzxzdHJvbmc+dW5zb3J0ZWQ8L3N0cm9uZz4nOiJzb3J0ZWQgYnkgPHN0cm9uZz4kZHRfc29ydF90eHQ8L3N0cm9uZz4iPz4uPC9wPg0KCTx0YWJsZSBpZD0idGhlLWxpc3QteCIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMyI+DQoJCTx0cj48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO2R0X3NvcnQ9aWQmYW1wO2lkPTw/PSRrd2RfaWQ/PiZhbXA7b3A9ZHQ8Pz0kc29ydF91cmw/PiIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgSUQiPklEPC9hPjwvdGg+PHRoIHNjb3BlPSJjb2wiPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsOz8+JmFtcDtkdF9zb3J0PXJlZiZhbXA7aWQ9PD89JGt3ZF9pZD8+JmFtcDtvcD1kdDw/PSRzb3J0X3VybD8+IiB0aXRsZT0iQ2xpY2sgdG8gc29ydCBieSBSZWZlcmVyIj5SZWZlcmVyIHBhZ2U8L2E+PC90aD48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO2R0X3NvcnQ9Y2xrJmFtcDtpZD08Pz0ka3dkX2lkPz4mYW1wO29wPWR0PD89JHNvcnRfdXJsPz4iIHRpdGxlPSJDbGljayB0byBzb3J0IGJ5IENsaWNrIENvdW50Ij5DbGlja3M8L2E+PC90aD48L3RyPg0KPD8NCgkJCS8vIFJldHJpZXZlIGFuZCBkaXNwbGF5IHRoZSBrZXl3b3JkIGRhdGEgZnJvbSBvdXIgZGF0YWJhc2UNCgkJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX1RSS19UQUJMRTsNCgkJCSRzcWwgPSAiU0VMRUNUICogRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBrZXl3b3JkaWQ9JGt3ZF9pZCRkdF9zb3J0X3NxbCI7DQoJCQkka2V5d29yZHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJHNxbCwgQVJSQVlfQSk7DQoJCQlpZiAoaXNzZXQoJGtleXdvcmRzKSAmJiAoY291bnQoJGtleXdvcmRzKSA+IDApKSB7DQoJCQkJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXk9PiRrZXl3b3JkKSB7DQoJCQkJCWVjaG8gIjx0ciBjbGFzcz0nYWx0ZXJuYXRlJz48dGggc2NvcGU9J3Jvdyc+Ii4ka2V5d29yZFsnaWQnXS4iPC90aD48dGQ+Ii4ka2V5d29yZFsncmVmZXJlciddLiI8L3RkPjx0ZD4iLiRrZXl3b3JkWydjbGlja2NvdW50J10uIjwvdGQ+PC90cj4iOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZWNobyAiPHRyIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAnPjx0ZCBjb2xzcGFuPSczJz5ObyB0cmFja2luZyBkYXRhIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBrZXl3b3JkLjwvdGQ+PC90cj4iOw0KCQkJfQ0KPz4NCgk8L3RhYmxlPg0KCTxwPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsLiRzb3J0X3VybDs/PiI+JmxhcXVvOyBSZXR1cm4gdG8ga2V5d29yZCBsaXN0PC9hPjwvcD4NCjwvZGl2Pg0KPD8JDQoJCQkkc2hvd19rZXl3b3JkX2xpc3QgPSBGQUxTRTsNCgkJCSRzaG93X2FkZF9rZXl3b3JkID0gRkFMU0U7DQoJCX0gLy8gZGV0YWlsZWQgcmVwb3J0IGZvciBrZXl3b3JkIGVuZHMgaGVyZQ0KDQoJCS8vIFJlc2V0IGNsaWNrIGNvdW50cw0KCQlpZiAoaXNzZXQoJF9QT1NUWydyZXNldCddKSkgew0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGNsaWNrY291bnQ9MCI7DQoJCQlpZiAoJHdwZGItPnF1ZXJ5KCRzcWwpID09PSBGQUxTRSkgeyA/Pg0KCTxkaXYgY2xhc3M9ImVycm9yIj48cD48c3Ryb25nPlRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXNldGluZyBjbGljayBjb3VudHMuPC9zdHJvbmc+PC9wPjwvZGl2Pg0KPD8JCX0gZWxzZSB7ID8+DQoJPGRpdiBpZD0ibWVzc2FnZSIgY2xhc3M9InVwZGF0ZWQgZmFkZSI+PHA+PHN0cm9uZz5Zb3UgaGF2ZSBzdWNjZXNzZnVsbHkgcmVzZXQgYWxsIGNsaWNrIGNvdW50cyB0byAwLjwvc3Ryb25nPjwvcD48L2Rpdj4JDQo8PwkJDQoJCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfVFJLX1RBQkxFOw0KCQkJCSRzcWwgPSAiVVBEQVRFICR0YWJsZV9uYW1lIFNFVCBjbGlja2NvdW50PTAiOw0KCQkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJCX0NCgkJfSAvLyBjbGljayBjb3VudCByZXNldCBlbmRzIGhlcmUNCg0KCQkvLyBBZGQgbmV3L0VkaXQgZXhpc3Rpbmcga2V5d29yZCBpbnRvIHRoZSBkYXRhYmFzZQ0KCQlpZiAoaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkpIHsNCgkJCWlmICgkX1BPU1RbJ2FjdGlvbiddID09ICdhZGRrZXl3b3JkJykgew0KCQkJCSRlZGl0X2t3ZCA9IEZBTFNFOw0KCQkJfSBlbHNlIHsNCgkJCQkkZWRpdF9rd2QgPSBUUlVFOw0KCQkJfQ0KCQkJJGVycl9tc2cgPSAnJzsNCgkJCSRrd2QgPSAnJzsNCgkJCSR1cmwgPSAnJzsNCgkJCSRjYXB0aW9uID0gJyc7DQoJCQkkcmVwbF9jb3VudCA9IDA7DQoNCgkJCWlmIChpc3NldCgkX1BPU1RbJ3VybCddKSAmJiAodHJpbSgkX1BPU1RbJ3VybCddKSAhPSAnJykpIHsNCgkJCQkkdXJsID0gdHJpbSgkX1BPU1RbJ3VybCddKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGVycl9tc2cgPSAiVGhlIGFmZmlsaWF0ZSBsaW5rIHdhcyBlbXB0eS4gWW91IG11c3QgdHlwZSBpbiB0aGUgYWZmaWxpYXRlIGxpbmsuIjsNCgkJCX0NCgkJCWlmIChpc3NldCgkX1BPU1RbJ2tleXdvcmQnXSkgJiYgKHRyaW0oJF9QT1NUWydrZXl3b3JkJ10pICE9ICcnKSkgew0KCQkJCSRrd2QgPSB0cmltKCRfUE9TVFsna2V5d29yZCddKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGVycl9tc2cgPSAnVGhlIGtleXdvcmQgd2FzIGVtcHR5LiBZb3UgbmVlZCB0byB0eXBlIGluIHRoZSBrZXl3b3JkIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgYWZmaWxpYXRlIGxpbmsuJzsNCgkJCX0NCgkJCWlmIChpc3NldCgkX1BPU1RbJ2NhcHRpb24nXSkpIHsNCgkJCQkkY2FwdGlvbiA9IHRyaW0oJF9QT1NUWydjYXB0aW9uJ10pOw0KCQkJfQ0KCQkJaWYgKGlzc2V0KCRfUE9TVFsncmVwbF9jb3VudCddKSkgew0KCQkJCSRyZXBsX2NvdW50ID0gMCArICRfUE9TVFsncmVwbF9jb3VudCddOw0KCQkJfQ0KCQkJaWYgKCBpc3NldCgkX1BPU1RbJ25vdHJhY2snXSkgKSB7DQoJCQkJJG5vdHJhY2s9IHRyaW0oJF9QT1NUWydub3RyYWNrJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5vdHJhY2s9PSAnb24nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub3RyYWNrPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm90cmFjaz0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5vdHJhY2s9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCgkJCWlmIChpc3NldCgkX1BPU1RbJ25vZm9sbG93J10pKSB7DQoJCQkJJG5vZm9sbG93PSB0cmltKCRfUE9TVFsnbm9mb2xsb3cnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbm9mb2xsb3cgPT0gJ29uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm9mb2xsb3c9IDE7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub2ZvbGxvdz0gMDsgfQ0KCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub2ZvbGxvdz0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KCQkJaWYgKGlzc2V0KCRfUE9TVFsnd2VpZ2h0J10pKSB7DQoJCQkJJHdlaWdodCA9IDAgKyAkX1BPU1RbJ3dlaWdodCddOw0KCQkJCWlmICgkd2VpZ2h0ID4gOSkgew0KCQkJCQkkd2VpZ2h0ID0gOTsNCgkJCQl9IGVsc2VpZiAoJHdlaWdodCA8IDApIHsNCgkJCQkJJHdlaWdodCA9IDA7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkd2VpZ2h0ID0gNTsNCgkJCX0NCg0KCQkJaWYgKCRlZGl0X2t3ZCkgew0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2lkJ10pKSB7DQoJCQkJCSRrd2RfaWQgPSAkX1BPU1RbJ2lkJ107DQoJCQkJCSRrd2RfaWQgPSAwICsgJGt3ZF9pZDsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZXJyX21zZyA9ICdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUga2V5d29yZCBpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmRlciByZWd1bGFyIHVzYWdlLiBBcmUgeW91IG1lc3Npbmcgd2l0aCB0aGUgZGF0YT8nOw0KCQkJCX0NCgkJCX0NCg0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJaWYgKCRlZGl0X2t3ZCA9PSBGQUxTRSkgew0KCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSBvdXIga2V5d29yZCBpcyB1bmlxdWUgaW4gdGhlIGRhdGFiYXNlDQoJCQkJJHNxbCA9ICJTRUxFQ1QgQ09VTlQoKikgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBVUFBFUihrZXl3b3JkKT1VUFBFUignJGt3ZCcpIjsNCgkJCQlpZiAoJHdwZGItPmdldF92YXIoJHNxbCkgIT0gMCkgew0KCQkJCQkkZXJyX21zZyA9ICdUaGlzIGtleXdvcmQgaXMgYWxyZWFkeSBkZWZpbmVkIGFuZCBwb2ludHMgdG8gYSBkaWZmZXJlbnQgYWZmaWxpYXRlIGxpbmsuJzsNCgkJCQl9DQoJCQl9DQoNCgkJCWlmICgkZXJyX21zZyAhPSAnJykgez8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+PD89JGVycl9tc2c7Pz48L3N0cm9uZz48L3A+PC9kaXY+DQo8PwkJfSBlbHNlIHsNCgkJCQkvLyBBbGwgc2VlbXMgb2suIENvbXB1dGUgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsIHdvcmRzIGluIHRoZSBrZXl3b3JkIGFuZCBkbyBzb21lIHNhbml0eSBjaGVja3MuDQoJCQkJJHdvcmRfY250ID0gc3Vic3RyX2NvdW50KCRrd2QsICcgJykgKyAxOw0KCQkJCWlmICgkZWRpdF9rd2QpIHsNCgkJCQkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGtleXdvcmQ9JyRrd2QnLCB3b3JkY291bnQ9JHdvcmRfY250LCBjYXB0aW9uPSckY2FwdGlvbicsIHVybD0nJHVybCcsIHJlcGxhY2Vjb3VudD0kcmVwbF9jb3VudCwgd2VpZ2h0PSR3ZWlnaHQsIG5vdHJhY2s9JG5vdHJhY2ssIG5vZm9sbG93PSRub2ZvbGxvdyAgV0hFUkUgaWQ9JGt3ZF9pZCI7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJHNxbCA9ICJJTlNFUlQgSU5UTyAkdGFibGVfbmFtZSAoaWQsIGtleXdvcmQsIHdvcmRjb3VudCwgY2FwdGlvbiwgdXJsLCBjbGlja2NvdW50LCByZXBsYWNlY291bnQsIHdlaWdodCwgbm90cmFjayxub2ZvbGxvdykgVkFMVUVTIChOVUxMLCAnJGt3ZCcsICR3b3JkX2NudCwgJyRjYXB0aW9uJywgJyR1cmwnLCAwLCAkcmVwbF9jb3VudCwgJHdlaWdodCwgJG5vdHJhY2ssICRub2ZvbGxvdykiOw0KCQkJCX0NCg0KCQkJCWlmICgkd3BkYi0+cXVlcnkoJHNxbCkgPT09IEZBTFNFKSB7ID8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+VGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHNhdmluZyB0byB0aGUgZGF0YWJhc2UuIFlvdXIga2V5d29yZCB3YXMgTk9UIHNhdmVkLjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/CQkJfSBlbHNlIHsgPz4NCgk8ZGl2IGlkPSJtZXNzYWdlIiBjbGFzcz0idXBkYXRlZCBmYWRlIj48cD48c3Ryb25nPlRoZSBrZXl3b3JkIHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQgYW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQgYXV0b21hdGljYWxseSBieSB0aGUgYWZmaWxpYXRlIGxpbmsgeW91IGhhdmUgZGVmaW5lZC48L3N0cm9uZz48L3A+PC9kaXY+CQ0KPD8JCQl9DQoJCQl9DQoJCX0gLy8gS2V5d29yZCBhZGRpdGlvbiBlbmRzIGhlcmUNCg0KCQkvLyBFZGl0IGV4aXN0aW5nIGtleXdvcmQNCgkJaWYgKGlzc2V0KCRfR0VUWydvcCddKSAmJiAoJF9HRVRbJ29wJ10gPT0gJ2VkJykgJiYgKGlzc2V0KCRfR0VUWydpZCddKSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkJJGtleXdvcmQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJHNxbCwgQVJSQVlfQSk7DQoJCQlpZiAoaXNfYXJyYXkoJGtleXdvcmQpKSB7DQoJCQkJJGt3ZCA9ICRrZXl3b3JkWzBdWydrZXl3b3JkJ107DQoJCQkJJGNhcHRpb24gPSAka2V5d29yZFswXVsnY2FwdGlvbiddOw0KCQkJCSR1cmwgPSAka2V5d29yZFswXVsndXJsJ107DQoJCQkJJHJlcGxfY291bnQgPSAka2V5d29yZFswXVsncmVwbGFjZWNvdW50J107DQoJCQkJJHdlaWdodCA9ICRrZXl3b3JkWzBdWyd3ZWlnaHQnXTsNCgkJCQkkbm9mb2xsb3cgPSAka2V5d29yZFswXVsnbm9mb2xsb3cnXTsNCgkJCQkkbm90cmFjayA9ICRrZXl3b3JkWzBdWydub3RyYWNrJ107DQoJCQkJcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCk7DQo/Pg0KPGRpdiBjbGFzcz13cmFwPg0KCTxoMj5FZGl0IEtleXdvcmQ8L2gyPg0KCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwPjxzdHJvbmc+S2V5d29yZDwvc3Ryb25nPiB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFmZmlsaWF0ZSBsaW5rOjxiciAvPg0KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJrZXl3b3JkIiB2YWx1ZT0iPD89JGt3ZD8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+QWZmaWxpYXRlIExpbms8L3N0cm9uZz4gKGVudGVyIHRoZSBjb21wbGV0ZSBhZmZpbGlhdGUgbGluayBoZXJlLCBpbmNsdWRpbmcgdGhlIGh0dHA6Ly8gcGFydCk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9Ijw/PSR1cmw/PiIgc3R5bGU9IndpZHRoOiA4MCU7IiAvPjwvcD4NCgk8cD48c3Ryb25nPlN0YXR1c2JhciBUZXh0PC9zdHJvbmc+IChsZWF2ZSBlbXB0eSB0byBzaG93IHRoZSBjbGljayB0cmFja2VyIFVSTCwgeW91ciBhZmZpbGlhdGUgbGluayBpcyBhbHdheXMgaGlkZGVuKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY2FwdGlvbiIgdmFsdWU9Ijw/PSRjYXB0aW9uPz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz48L3A+DQoJPHA+PHN0cm9uZz5NYXhpbXVtIFJlcGxhY2VtZW50IENvdW50PC9zdHJvbmc+IChob3cgbWFueSBvY2N1cmVuY2VzIG9mIHRoaXMga2V5d29yZCB3aWxsIGJlIHJlcGxhY2VkIG9uIGEgcGFnZSwgMCBtZWFucyByZXBsYWNlIGFsbC4gSWYgbm90IDAsIHRoaXMgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBzZXR0aW5nKTo8YnIgLz4NCgkgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyZXBsX2NvdW50MiIgdmFsdWU9Ijw/PSRyZXBsX2NvdW50Pz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz4NCgk8L3A+DQoJPHA+PHN0cm9uZz5LZXl3b3JkIFdlaWdodDwvc3Ryb25nPiBmb3IgdGhlIHdlaWdodGVkIHJhbmRvbSBsaW5rIHNlbGVjdGlvbi4gVGhpcyBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCA5IChsZWF2ZSB1bmNoYW5nZWQgaWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGlzIG1lYW5zKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0id2VpZ2h0IiB2YWx1ZT0iPD89JHdlaWdodD8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPkNoZWNrIHRoaXMgYm94IGlzIHRvIGFkZA0KICAgICAgPHN0cm9uZz5yZWw9bm9mb2xsb3c8L3N0cm9uZz4gaW50byAgdGhlIGh5cGVybGluayBpdCBjcmVhdGVzIG9uIGEgcGFnZS48YnIgLz4NCg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJub2ZvbGxvdyIgIDw/IGlmICgkbm9mb2xsb3cgPT0gMSl7DQogICAgICBlY2hvICdjaGVja2VkJzsNCiB9Pz4gIC8+DQo8L3A+DQo8cD5DaGVjayB0aGlzIGJveCBpcyB0byBkaXNhYmxlIGludGVybmFsIHRyYWNraW5nIHN5c3RlbSBmb3IgdGhpcyBrZXl3b3JkLjxiciAvPg0KCSAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJub3RyYWNrIiAgPD8gaWYgKCRub3RyYWNrPT0gMSl7DQogICAgICBlY2hvICdjaGVja2VkJzt9Pz4gICAvPg0KCTwvcD4NCgk8cCBjbGFzcz0ic3VibWl0Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJlZGl0a2V5d29yZCIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9Ijw/PSRrd2RfaWQ/PiIgLz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTYXZlIENoYW5nZXMgJnJhcXVvOyIgLz48L3A+DQo8L2Zvcm0+DQo8cD48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPiZsYXF1bzsgUmV0dXJuIHRvIGtleXdvcmQgbGlzdDwvYT48L3A+DQo8L2Rpdj4NCjw/DQoJCQkJJHNob3dfa2V5d29yZF9saXN0ID0gRkFMU0U7DQoJCQkJJHNob3dfYWRkX2tleXdvcmQgPSBGQUxTRTsNCgkJCX0NCgkJfSAvLyBLZXl3b3JkIGVkaXRpbmcgZW5kcyBoZXJlDQoNCgkJLy8gRGVsZXRpbmcgZXhpc3Rpbmcga2V5d29yZA0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZGVsJykgJiYgKGlzc2V0KCRfR0VUWydpZCddKSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJERUxFVEUgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBpZD0ka3dkX2lkIjsNCgkJCWlmICgkd3BkYi0+cXVlcnkoJHNxbCkgPT09IEZBTFNFKSB7ID8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+VGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGRlbGV0aW5nIGZyb20gdGhlIGRhdGFiYXNlLiBZb3VyIGtleXdvcmQgd2FzIE5PVCBkZWxldGVkLjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/CQl9IGVsc2UgeyA/Pg0KCTxkaXYgaWQ9Im1lc3NhZ2UiIGNsYXNzPSJ1cGRhdGVkIGZhZGUiPjxwPjxzdHJvbmc+VGhlIGtleXdvcmQgd2FzIHN1Y2Nlc3NmdWxseSBkZWxldGVkIGZyb20gdGhlIGRhdGFiYXNlLjwvc3Ryb25nPjwvcD48L2Rpdj4JDQo8PwkJDQoJCQkJLy8gRGVsZXRlIGFueSBhc3NvY2lhdGVkIGNsaWNrLXRocm91Z2ggZGF0YQ0KCQkJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX1RSS19UQUJMRTsNCgkJCQkkc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGtleXdvcmRpZD0ka3dkX2lkIjsNCgkJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCQl9DQoJCX0gLy8gS2V5d29yZCBkZWxldGlvbiBlbmRzIGhlcmUNCg0KCQkvLyBTaG93IGtleXdvcmQgY2xpY2sgY291bnQgZGV0YWlscw0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZHQnKSAmJiAoaXNzZXQoJF9HRVRbJ2lkJ10pKSkgew0KCQkJJGt3ZF9pZCA9ICRfR0VUWydpZCddOw0KCQkJLy8gZm9yY2UgY29udmVydCB0byBpbnRlZ2VyIHRyaWNrDQoJCQkka3dkX2lkID0gMCArICRrd2RfaWQ7DQoJCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoJCX0gLy8gY2xpY2sgY291bnQgZGV0YWlscyBlbmRzIGhlcmUNCg0KCQlpZiAoJHNob3dfa2V5d29yZF9saXN0KSB7DQoJCQlwcmludF9jb21wbGVtZW50YXJ5X2NvcHkoKTsNCgkJPz4NCjxkaXYgY2xhc3M9d3JhcD4NCgk8aDI+TWFuYWdlIFdvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIExpbmtzICg8YSBocmVmPSIjYWRka3dkIj5hZGQgbmV3PC9hPik8L2gyPg0KPD8gaWYgKGdldF9vcHRpb24oJ2FwX2VuYWJsZScpPT0nTm8nKSB7ID8+DQo8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm8gaXMgY3VycmVudGx5IERJU0FCTEVELiBUbyBlbmFibGUgZ28gdG8gT3B0aW9ucywgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8uPC9iPjwvZm9udD48L3A+DQo8Pwl9ID8+DQo8PyBpZiAoZ2V0X29wdGlvbignYXBfbGlua190cmFja2luZycpPT0nTm8nKSB7ID8+DQo8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+TGluayBjbGljayB0cmFja2luZyBpcyBjdXJyZW50bHkgRElTQUJMRUQuIFRvIGVuYWJsZSBnbyB0byBPcHRpb25zLCBXb3JkUHJlc3MgQWZmaWxpYXRlIFByby48L2I+PC9mb250PjwvcD4NCjw/CX0gPz4NCgk8cD5UaGFuayB5b3UgZm9yIHB1cmNoYXNpbmcgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JkcHJlc3NhZmZpbGlhdGVwcm8uY29tIiB0YXJnZXQ9Il9ibGFuayI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2E+LjwvcD4NCgk8cD5UaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSB5b3UgY29uZmlndXJlIHlvdXIga2V5d29yZHMgYW5kIGFmZmlsaWF0ZSBsaW5rcy4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcGxlYXNlIGNvbnN1bHQgdGhlIHR1dG9yaWFscyB0aGF0IGNhbWUgd2l0aCB5b3VyIHB1cmNoYXNlIG9yIG9wZW4gYSBzdXBwb3J0IHRpY2tldCBpZiB5b3UgbmVlZCBhbnkgaGVscC48L3A+DQoJPHA+Q2xpY2tpbmcgb24gaHlwZXJsaW5rZWQgY29sdW1uIGhlYWRlcnMgd2lsbCBzb3J0IHRoZSBsaXN0IGJ5IHRoYXQgY29sdW1uLiBDdXJyZW50bHkgdGhlIGxpc3QgaXMgPD89KCRzb3J0X3R4dD09J3Vuc29ydGVkJyk/JzxzdHJvbmc+dW5zb3J0ZWQ8L3N0cm9uZz4nOiJzb3J0ZWQgYnkgPHN0cm9uZz4kc29ydF90eHQ8L3N0cm9uZz4iPz4uPC9wPg0KCQ0KPD8JDQoJLy8gVW1lc2ggdXBkYXRlIGFzIHN0YXJ0DQoNCgkkYW1zZyA9IGdldF9vcHRpb24oJ2FwX3ZlcnNpb25fbXNnJyk7DQoJaWYgKCRhbXNnICE9ICIiKSB7IA0KIAkJJHVybCA9IGdldF9vcHRpb24oJ3NpdGV1cmwnKSAuICcvd3AtYWRtaW4vb3B0aW9ucy1nZW5lcmFsLnBocD9wYWdlPXdwLWFmZmlsaWF0ZS1wcm9fZGVjLnBocCc7CQ0KCT8+DQoJPGRpdiBpZD0ibWVzc2FnZSIgY2xhc3M9InVwZGF0ZWQgZmFkZSI+PHA+PHN0cm9uZz48YSBocmVmPSI8Pz0kdXJsOz8+Ij48Pz0kYW1zZzs/PjwvYT48L3N0cm9uZz48L3A+PC9kaXY+DQoJDQo8PyAJCQ0KIAkJCSB1cGRhdGVfb3B0aW9uKCdhcF92ZXJzaW9uX21zZycsICcnKTsNCgkJCS8vIFVtZXNoIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KICB9ID8+DQoJPHRhYmxlIGlkPSJ0aGUtbGlzdC14IiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIzIj4NCgkJPHRyPjx0aCBzY29wZT0iY29sIj48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybDs/PiZhbXA7c29ydD1pZCIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgSUQiPklEPC9hPjwvdGg+PHRoIHNjb3BlPSJjb2wiPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsOz8+JmFtcDtzb3J0PWt3ZCIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgS2V5d29yZCI+S2V5d29yZDwvYT48L3RoPjx0aCBzY29wZT0iY29sIj5XZWlnaHQ8L3RoPjx0aCBzY29wZT0iY29sIj5SZXBsYWNlIENvdW50PC90aD48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO3NvcnQ9bG5rIiB0aXRsZT0iQ2xpY2sgdG8gc29ydCBieSBBZmZpbGlhdGUgTGluayI+QWZmaWxpYXRlIExpbms8L2E+PC90aD48dGggc2NvcGU9ImNvbCI+U3RhdHVzYmFyIFRleHQ8L3RoPjx0aCBzY29wZT0iY29sIj48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybDs/PiZhbXA7c29ydD1jbGsiIHRpdGxlPSJDbGljayB0byBzb3J0IGJ5IENsaWNrIENvdW50Ij5DbGlja3M8L2E+PC90aD48dGggY29sc3Bhbj0iMiI+QWN0aW9uPC90aD48L3RyPg0KPD8NCgkvLyBSZXRyaWV2ZSBhbmQgZGlzcGxheSB0aGUga2V5d29yZHMgZnJvbSBvdXIgZGF0YWJhc2UNCgkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9LV0RfVEFCTEU7DQoJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lJHNvcnRzcWwiOw0KCSRrZXl3b3JkcyA9ICR3cGRiLT5nZXRfcmVzdWx0cygkc3FsLCBBUlJBWV9BKTsNCglpZiAoaXNzZXQoJGtleXdvcmRzKSAmJiAoY291bnQoJGtleXdvcmRzKSA+IDApKSB7DQoJCWZvcmVhY2ggKCRrZXl3b3JkcyBhcyAka2V5PT4ka2V5d29yZCkgew0KCQkJZWNobyAiPHRyIGNsYXNzPSdhbHRlcm5hdGUnPjx0aCBzY29wZT0ncm93Jz4iLiRrZXl3b3JkWydpZCddLiI8L3RoPjx0ZD4iLiRrZXl3b3JkWydrZXl3b3JkJ10uIjwvdGQ+PHRkIGFsaWduPSdjZW50ZXInPiIuJGtleXdvcmRbJ3dlaWdodCddLiI8L3RkPjx0ZCBhbGlnbj0nY2VudGVyJz4iLigka2V5d29yZFsncmVwbGFjZWNvdW50J109PTA/J0FMTCc6JGtleXdvcmRbJ3JlcGxhY2Vjb3VudCddKS4iPC90ZD48dGQ+Ii5zbWFydF9zaG9ydF90ZXh0KCRrZXl3b3JkWyd1cmwnXSwgNDApLiI8L3RkPjx0ZD4iLiRrZXl3b3JkWydjYXB0aW9uJ10uIjwvdGQ+PHRkIGFsaWduPSdjZW50ZXInPiIuJGtleXdvcmRbJ2NsaWNrY291bnQnXS4iICg8YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1kdCRzb3J0X3VybCcgdGl0bGU9J0NsaWNrIHRvIHNob3cgYSBkZXRhaWxlZCBjbGljayB0aHJvdWdoIHJlcG9ydCBmb3IgdGhpcyBrZXl3b3JkJz5kZXRhaWxzPC9hPik8L3RkPjx0ZD48YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1lZCRzb3J0X3VybCc+RWRpdDwvYT48L3RkPjx0ZD48YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1kZWwkc29ydF91cmwnPkRlbGV0ZTwvYT48L3RkPjwvdHI+IjsNCgkJfQ0KDQoNCgl9IGVsc2Ugew0KCQllY2hvICI8dHIgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICc+PHRkIGNvbHNwYW49JzcnPk5vIGFmZmlsaWF0ZSBsaW5rcyBhcmUgZGVmaW5lZC4gVG8gYWRkIG9uZSBvciBtb3JlIGFmZmlsaWF0ZSBsaW5rcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBrZXl3b3JkcyBwbGVhc2UgdXNlIHRoZSBmb3JtIGJlbG93LjwvdGQ+PC90cj4iOw0KCX0NCj8+DQoJPC90YWJsZT4NCg0KCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwIGNsYXNzPSJzdWJtaXQiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc2V0IiB2YWx1ZT0icmVzZXRjb3VudHMiIC8+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iUmVzZXQgQ2xpY2sgQ291bnRzICZyYXF1bzsiIC8+PC9wPg0KCTwvZm9ybT4NCg0KCTxwIGFsaWduPSJjZW50ZXIiPldvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIGlzIENvcHlyaWdodCAmY29weTsgMjAwOCBieSA8YSBocmVmPSJodHRwOi8vd3d3LndwYWZmaWxpYXRlcHJvLmNvbS8iIHRhcmdldD0iX2JsYW5rIj5JTSBBbGxpYW5jZTwvYT4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPg0KPC9kaXY+DQo8PwkJCQ0KCQl9CS8vIGlmIHNob3cga2V5d29yZCBsaXN0DQoJCWlmICgkc2hvd19hZGRfa2V5d29yZCkgew0KPz4NCjxkaXYgY2xhc3M9d3JhcD4NCgk8aDI+QWRkIE5ldyBLZXl3b3JkPC9oMj4NCgk8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJhZGRrd2QiIG5hbWU9ImFkZGt3ZCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwPjxzdHJvbmc+S2V5d29yZDwvc3Ryb25nPiB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFmZmlsaWF0ZSBsaW5rOjxiciAvPg0KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJrZXl3b3JkIiB2YWx1ZT0iPD89KGlzc2V0KCRrd2QpJiYoJGVycl9tc2chPScnKSk/JGt3ZDonJz8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+QWZmaWxpYXRlIExpbms8L3N0cm9uZz4gKGVudGVyIHRoZSBjb21wbGV0ZSBhZmZpbGlhdGUgbGluayBoZXJlLCBpbmNsdWRpbmcgdGhlIGh0dHA6Ly8gcGFydCk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9Ijw/PShpc3NldCgkdXJsKSYmKCRlcnJfbXNnIT0nJykpPyR1cmw6Jyc/PiIgc3R5bGU9IndpZHRoOiA4MCU7IiAvPjwvcD4NCgk8cD48c3Ryb25nPlN0YXR1c2JhciBUZXh0PC9zdHJvbmc+IChsZWF2ZSBlbXB0eSB0byBzaG93IHRoZSBjbGljayB0cmFja2VyIFVSTCwgeW91ciBhZmZpbGlhdGUgbGluayBpcyBhbHdheXMgaGlkZGVuKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY2FwdGlvbiIgdmFsdWU9Ijw/PShpc3NldCgkY2FwdGlvbikmJigkZXJyX21zZyE9JycpKT8kY2FwdGlvbjonJz8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+TWF4aW11bSBSZXBsYWNlbWVudCBDb3VudDwvc3Ryb25nPiAoaG93IG1hbnkgb2NjdXJlbmNlcyBvZiB0aGlzIGtleXdvcmQgd2lsbCBiZSByZXBsYWNlZCBvbiBhIHBhZ2UsIDAgbWVhbnMgcmVwbGFjZSBhbGwuIElmIG5vdCAwLCB0aGlzIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgc2V0dGluZyk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJlcGxfY291bnQiIHZhbHVlPSI8Pz0oaXNzZXQoJHJlcGxfY291bnQpJiYoJGVycl9tc2chPScnKSk/JHJlcGxfY291bnQ6JzAnPz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz48L3A+DQoJPHA+PHN0cm9uZz5LZXl3b3JkIFdlaWdodDwvc3Ryb25nPiBmb3IgdGhlIHdlaWdodGVkIHJhbmRvbSBsaW5rIHNlbGVjdGlvbi4gVGhpcyBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCA5IChsZWF2ZSB1bmNoYW5nZWQgaWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGlzIG1lYW5zKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0id2VpZ2h0IiB2YWx1ZT0iPD89KGlzc2V0KCR3ZWlnaHQpJiYoJGVycl9tc2chPScnKSk/JHdlaWdodDonNSc/PiIgc3R5bGU9IndpZHRoOiA0MCU7IiAvPjwvcD4NCgk8cD5DaGVjayB0aGlzIGJveCBpcyB0byBhZGQNCjxzdHJvbmc+cmVsPW5vZm9sbG93PC9zdHJvbmc+IGludG8gIHRoZSBoeXBlcmxpbmsgaXQgY3JlYXRlcyBvbiBhIHBhZ2UuPGJyIC8+DQoJICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im5vZm9sbG93IiA8PyBpZiAoaXNzZXQoJG5vZm9sbG93KSYmKCRlcnJfbXNnIT0nJykpDQp7DQogaWYgKCRub2ZvbGxvdyA9PSAxKQ0KIHsNCiAgICAgIGVjaG8gJ2NoZWNrZWQnOw0KIH0NCn0/PiAgIC8+DQoJPC9wPg0KPHA+Q2hlY2sgdGhpcyBib3ggaXMgdG8gZGlzYWJsZSBpbnRlcm5hbCB0cmFja2luZyBzeXN0ZW0gZm9yIHRoaXMga2V5d29yZC48YnIgLz4NCgkgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibm90cmFjayIgPD8gaWYgKGlzc2V0KCRub3RyYWNrKSYmKCRlcnJfbXNnIT0nJykpDQp7DQogaWYgKCRub3RyYWNrPT0gMSkNCiB7DQogICAgICBlY2hvICdjaGVja2VkJzsNCiB9DQp9Pz4gICAvPg0KCTwvcD4NCgk8cCBjbGFzcz0ic3VibWl0Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJhZGRrZXl3b3JkIiAvPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkFkZCBLZXl3b3JkICZyYXF1bzsiIC8+PC9wPg0KPC9mb3JtPg0KPC9kaXY+DQo8PwkJDQoJCX0JLy8gaWYgc2hvdyBhZGQga2V5d29yZCBib3gNCgkJcHJpbnRfYWZmaWxpYXRlX2JsdXJiKCk7DQoJfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdpbkhUTUxUYWcnKSkgew0KCWZ1bmN0aW9uIGluSFRNTFRhZygkaGF5c3RhY2ssICRvZmZzZXQpIHsNCgkJJGhheWxlbiA9IHN0cmxlbigkaGF5c3RhY2spOw0KDQoJCS8vIFJ1biBzb21lIHNhbml0eSBjaGVja3MgZmlyc3QuIElmIHRoZSBvZmZzZXQgaXMgbmVnYXRpdmUsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGlzIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgbGVuZ3RoLCByZXR1cm4gRkFMU0UNCgkJaWYgKCgkb2Zmc2V0IDwgMCkgfHwgKCRvZmZzZXQgPiAkaGF5bGVuKSB8fCAoJGhheWxlbiA9PSAwKSkgew0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoNCg0KCQkvLyBTZWFyY2ggdXAgdG8gMjUwIGNoYXJhY3RlcnMgdG8gdGhlIGxlZnQgZm9yIHRoZSBvcGVuIEhUTUwgdGFnDQoJCSRtYXhfbGVuID0gJG9mZnNldCAtIDI1MDsNCgkJaWYgKCRtYXhfbGVuIDwgMCkgew0KCQkJJG1heF9sZW4gPSAwOw0KCQl9DQoNCgkJJGxlZnQgPSAtMTsNCgkJZm9yICgkaT0kb2Zmc2V0OyAkaT49JG1heF9sZW47ICRpLS0pIHsNCgkJCXN3aXRjaCAoJGhheXN0YWNreyRpfSkgew0KCQkJCWNhc2UgJzwnOg0KCQkJCQkkbGVmdCA9ICRpOw0KCQkJCQkkaSA9ICRtYXhfbGVuOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICc+JzoNCgkJCQkJJGkgPSAkbWF4X2xlbjsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCg0KCQkvLyBTZWFyY2ggdXAgdG8gMjUwIGNoYXJhY3RlcnMgdG8gdGhlIHJpZ2h0IGZvciB0aGUgY2xvc2UgSFRNTCB0YWcNCgkJJHJpZ2h0ID0gLTE7DQoJCWlmICgkbGVmdCAhPSAtMSkgew0KCQkJJG1heF9sZW4gPSAkb2Zmc2V0ICsgMjUwOw0KCQkJaWYgKCRtYXhfbGVuID4gJGhheWxlbikgew0KCQkJCSRtYXhfbGVuID0gJGhheWxlbjsNCgkJCX0NCg0KCQkJZm9yICgkaT0kb2Zmc2V0OyAkaSA8ICRtYXhfbGVuOyAkaSsrKSB7DQoJCQkJc3dpdGNoICgkaGF5c3RhY2t7JGl9KSB7DQoJCQkJCWNhc2UgJz4nOg0KCQkJCQkJJHJpZ2h0ID0gJGk7DQoJCQkJCQkkaSA9ICRtYXhfbGVuOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgJzwnOg0KCQkJCQkJJGkgPSAkbWF4X2xlbjsNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCSRyZXN1bHQgPSAoKCRsZWZ0ICE9IC0xKSAmJiAoJHJpZ2h0ICE9IC0xKSAmJiAoJGxlZnQgPCAkb2Zmc2V0KSAmJiAoJHJpZ2h0ID4gJG9mZnNldCkpOw0KCQlyZXR1cm4gJHJlc3VsdDsNCgl9DQoNCn0NCg0KDQovLyBQSFAgNSBjb21wYXRpYmlsaXR5IGZ1bmN0aW9uOiBzdHJpcG9zDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3RyaXBvcycpKSB7DQogICAgZnVuY3Rpb24gc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSBudWxsKQ0KICAgIHsNCiAgICAgICAgLy8gTWFuaXB1bGF0ZSB0aGUgc3RyaW5nIGlmIHRoZXJlIGlzIGFuIG9mZnNldA0KICAgICAgICAkZml4ID0gMDsNCiAgICAgICAgaWYgKCFpc19udWxsKCRvZmZzZXQpKSB7DQogICAgICAgICAgICBpZiAoJG9mZnNldCA+IDApIHsNCiAgICAgICAgICAgICAgICAkaGF5c3RhY2sgPSBzdWJzdHIoJGhheXN0YWNrLCAkb2Zmc2V0LCBzdHJsZW4oJGhheXN0YWNrKSAtICRvZmZzZXQpOw0KICAgICAgICAgICAgICAgICRmaXggPSAkb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJHNlZ21lbnRzID0gZXhwbG9kZShzdHJ0b2xvd2VyKCRuZWVkbGUpLCBzdHJ0b2xvd2VyKCRoYXlzdGFjayksIDIpOw0KDQogICAgICAgIC8vIENoZWNrIHRoZXJlIHdhcyBhIG1hdGNoDQogICAgICAgIGlmIChjb3VudCgkc2VnbWVudHMpID09PSAxKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICAkcG9zaXRpb24gPSBzdHJsZW4oJHNlZ21lbnRzWzBdKSArICRmaXg7DQogICAgICAgIHJldHVybiAkcG9zaXRpb247DQogICAgfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJykpIHsNCglmdW5jdGlvbiBhcF9hZGRfYWZmaWxpYXRlX2xpbmtzKCRjb250ZW50ID0gJycpIHsNCgkJZ2xvYmFsICR0YWJsZV9wcmVmaXgsICR3cGRiOw0KDQoJCS8vIElmIHRoZSBwcm9jZXNzaW5nIGlzIGRpc2FibGVkIHZpYSB0aGUgT3B0aW9ucyBtZW51IHRoZW4gcmV0dXJuIHRoZSB0ZXh0IHVuY2hhbmdlZA0KCQlpZiAoZ2V0X29wdGlvbignYXBfZW5hYmxlJyk9PSdObycpIHsNCgkJCXJldHVybiAkY29udGVudDsNCgkJfQ0KDQoJCWlmIChnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcpID09ICdXJykgew0KCQkJJHdlaWdodGVkX3JhbmRvbSA9IFRSVUU7DQoJCX0gZWxzZSB7DQoJCQkkd2VpZ2h0ZWRfcmFuZG9tID0gRkFMU0U7DQoJCX0NCg0KCQkvLyBQdWxsIHRoZSBsaXN0IG9mIGtleXdvcmRzIGZyb20gdGhlIERCLiBJZiB0aGUgbGluayBpbnNlcnRpb24gbWV0aG9kIGlzIFdlaWdodGVkIFJhbmRvbSB0aGVuIHRha2UgdGhhdCBpbnRvIGFjY291bnQuDQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJaWYgKCR3ZWlnaHRlZF9yYW5kb20pIHsNCgkJCSR3ZWlnaHRfdHh0ID0gJ09SREVSIEJZIHdlaWdodCBERVNDJzsNCgkJfSBlbHNlIHsNCgkJCSR3ZWlnaHRfdHh0ID0gJyc7DQoJCX0NCgkJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lICR3ZWlnaHRfdHh0IjsNCgkJJGtleXdvcmRzID0gJHdwZGItPmdldF9yZXN1bHRzKCRzcWwsIEFSUkFZX0EpOw0KDQoJCWlmIChpc19hcnJheSgka2V5d29yZHMpKSB7DQoJCQkvLyBSZXRyaWV2ZSB0aGUgZ2xvYmFsIG9wdGlvbnMNCgkJCSRuZXdfd2luZG93ID0gKGdldF9vcHRpb24oJ2FwX25ld193aW5kb3cnKSA9PSAnWWVzJyk/JyB0YXJnZXQ9Il9ibGFuayInOicnOw0KCQkJJGxpbmtfY2xhc3MgPSB0cmltKGdldF9vcHRpb24oJ2FwX2xpbmtfY2xhc3MnKSk7DQoJCQlpZiAoJGxpbmtfY2xhc3MgIT0gJycpIHsNCgkJCQkkbGlua19jbGFzcyA9ICIgY2xhc3M9JyRsaW5rX2NsYXNzJyI7DQoJCQl9DQoJCQkkcmVwbGFjZV9saW1pdF9nbG9iYWwgPSBnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X2dsb2JhbCcpOw0KCQkJaWYgKCRyZXBsYWNlX2xpbWl0X2dsb2JhbCA9PSAwKSB7DQoJCQkJLy8gU2V0ICJ1bmxpbWl0ZWQiIHRvIHNvbWUgYXJiaXRyYXJ5IGhpZ2ggdmFsdWUgdW5saWtlbHkgdG8gYmUgcmVhY2hlZC4NCgkJCQkkcmVwbGFjZV9saW1pdF9nbG9iYWwgPSA5OTk5Ow0KCQkJfQ0KCQkJJHJlcGxhY2VfbGltaXRfa2V5d29yZF9nbG9iYWwgPSBnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50Jyk7DQoJCQlpZiAoJHJlcGxhY2VfbGltaXRfa2V5d29yZF9nbG9iYWwgPT0gMCkgew0KCQkJCSRyZXBsYWNlX2xpbWl0X2tleXdvcmRfZ2xvYmFsID0gOTk5OTsNCgkJCX0NCg0KCQkJJGJhc2VfdXJsID0gZ2V0X29wdGlvbignc2l0ZXVybCcpIC4gJy93cC1jb250ZW50L3BsdWdpbnMvJzsNCg0KCQkJLyokdHJhY2tlcl91cmwgPSAkYmFzZV91cmwgLiBNWV9TQ1JJUFRfTkFNRTsqLw0KCQkJLy8gUmV0cmlldmUgcGx1Z2luIHBhdGggZnJvbSBkYg0KCQkJJHNlYXJjX3VybCA9ICJTRUxFQ1QgKiBGUk9NICIuJHdwZGItPm9wdGlvbnMuIiBXSEVSRSBvcHRpb25fbmFtZT0nYWN0aXZlX3BsdWdpbnMnIjsNCg0KCQkJJHNkYXRhID0gJHdwZGItPmdldF9yb3coJHNlYXJjX3VybCwgQVJSQVlfQSk7DQoNCgkJCSRzZGFyciA9IHVuc2VyaWFsaXplKCRzZGF0YVsnb3B0aW9uX3ZhbHVlJ10pOw0KDQoJCQlmb3JlYWNoKCRzZGFyciBhcyAkayA9PiAkdikNCgkJCXsNCgkJCQkkcG9zID0gc3RycG9zKCR2LCAiYWZmaWxpYXRlIik7DQoJCQkJaWYoJHBvcyAhPT0gZmFsc2UpCWJyZWFrOw0KCQkJfQ0KDQoJCQkkdHJhY2tlcl91cmwgPSAkYmFzZV91cmwgLiAkc2RhcnJbJGtdOyAvL3ByaW50X3IoJHRyYWNrZXJfdXJsKTtleGl0Ow0KDQoNCgkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU1RFUCAxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJCQkvLyAqKioqICAgIEJ1aWxkIGEgKHdlaWdodGVkKSByYW5kb20gbGlzdCBvZiBhdmFpbGFibGUga2V5d29yZHMuICAgICAgKioqKg0KCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkJCSRrZXl3b3JkX2NvdW50ID0gY291bnQoJGtleXdvcmRzKTsNCg0KCQkJLy8gSW5pdGlhbGl6ZSB0aGUgTWVyc2VubmUgVHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoZG9uZSBhdXRvbWF0aWNhbGx5IG9ubHkgb24gUEhQID4gNC4yIHNvIHdlIHRha2UgY2FyZSBvZiBpdCBoZXJlLikNCgkJCWxpc3QoJHVzZWMsICRzZWMpID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkJCW10X3NyYW5kKChmbG9hdCkgJHNlYyArICgoZmxvYXQpICR1c2VjICogMTAwMDAwKSk7DQoNCgkJCS8vIEFkZCB0aGUgcmFuZG9tICh3ZWlnaHRlZCkgcHJpb3JpdHkgdG8gZWFjaCBrZXl3b3JkLiBBbHNvIGNyZWF0ZSB0aGUgY29sdW1uIGFycmF5cywgdG8gcHJlcGFyZSBmb3IgYXJyYXlfbXVsdGlzb3J0IGFuZCBjcmVhdGUgdGhlIHRlbXBvcmFyeSBrZXl3b3JkIHJlcGxhY2VtZW50cy4NCgkJCSRpZHggPSAxOw0KCQkJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXk9PiR2YWwpIHsNCgkJCQkkcmFuZF9wcmlvID0gbXRfcmFuZCgxLCAka2V5d29yZF9jb3VudCk7DQoJCQkJaWYgKCR3ZWlnaHRlZF9yYW5kb20pIHsNCgkJCQkJLy8gS2V5d29yZCB3ZWlnaHQgaXMgMCBiYXNlZCwgYW5kIHdlIG5lZWQgaXQgMSBiYXNlZC4NCgkJCQkJJHJhbmRfcHJpbyA9ICRyYW5kX3ByaW8gKiAoJGtleXdvcmRzWyRrZXldWyd3ZWlnaHQnXSArIDEpOw0KCQkJCX0NCg0KCQkJCSRrd2RfaWRbXSA9ICR2YWxbJ2lkJ107DQoJCQkJJGt3ZF9rZXl3b3JkW10gPSAkdmFsWydrZXl3b3JkJ107DQoJCQkJJGt3ZF9jYXB0aW9uW10gPSAkdmFsWydjYXB0aW9uJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrd2Rfbm9mb2xsb3dbXSA9ICR2YWxbJ25vZm9sbG93J107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrd2Rfbm90cmFja1tdID0gJHZhbFsnbm90cmFjayddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAka3dkX3VybFtdPSAkdmFsWyd1cmwnXTsNCg0KCQkJCWlmICgkdmFsWydyZXBsYWNlY291bnQnXSA9PSAwKSB7DQoJCQkJCS8vIFRha2UgaW50byBhY2NvdW50IHRoZSBnbG9iYWwgb3B0aW9uIGlmIG5vIHBlci1rZXl3b3JkIHNldHRpbmcgaXMgYXZhaWxhYmxlLg0KCQkJCQkkcmMgPSAkcmVwbGFjZV9saW1pdF9rZXl3b3JkX2dsb2JhbDsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkcmMgPSAkdmFsWydyZXBsYWNlY291bnQnXTsNCgkJCQl9DQoNCgkJCQkka3dkX3JlcGxhY2Vjb3VudFtdID0gJHJjOw0KCQkJCSRrd2RfcHJpb3JpdHlbXSA9ICRyYW5kX3ByaW87DQoJCQkJJGt3ZF9zZWFyY2hwb3NbXSA9IDA7DQoJCQkJJGt3ZF90bXByZXBsW10gPSAiISFUTVBBUCRpZHghISI7DQoJCQkJJGlkeCsrOw0KCQkJfQ0KDQoJCQkvLyBTb3J0IHRoZSBhcnJheSBiYXNlZCBvbiB0aGUga2V5d29yZCBwcmlvcml0eS4NCgkJCWFyc29ydCgka3dkX3ByaW9yaXR5KTsNCg0KCQkJLy8gUGVyZm9ybSB0aGUgZmlyc3Qgc3RhZ2Ugb2YgcmVwbGFjZW1lbnRzLg0KCQkJJGtlZXBfZ29pbmcgPSBUUlVFOw0KCQkJd2hpbGUgKCRrZWVwX2dvaW5nKSB7DQoJCQkJLy8gV2UgdXNlIGRvbmVfd29yayB0byBrZWVwIHRyYWNrIGlmIGF0IGxlYXN0IG9uZSByZXBsYWNlbWVudCBvY2N1cmVkIHBlciBsb29wLiBJZiBubyByZXBsYWNlbWVudHMgd2VyZSBkb25lIG9uIHRoZSBsYXN0IGxvb3AsIGJhaWwgb3V0LiBUaGlzIGlzIHRvIHByZXZlbnQgZW5kbGVzcyBsb29wcyB3aGVyZSB1c2VyIGFsbG93cyB1bmxpbWl0ZWQgbnVtYmVyIG9mIGFmZmlsaWF0ZSBsaW5rcyBwZXIgcGFnZSBhbmQgYWxsIGtleXdvcmRzIGhhdmUgdW5saW1pdGVkIHJlcGxhY2VtZW50cyB0b28uDQoJCQkJJGRvbmVfd29yayA9IEZBTFNFOw0KCQkJCWZvcmVhY2ggKCRrd2RfcHJpb3JpdHkgYXMgJGtleT0+JHZhbCkgew0KCQkJCQlpZiAoJGt3ZF9yZXBsYWNlY291bnRbJGtleV0gPiAwKSB7DQoJCQ0KCQkJJGt3ZHBvcyA9IHN0cmlwb3MoJGNvbnRlbnQsICRrd2Rfa2V5d29yZFska2V5XSwgJGt3ZF9zZWFyY2hwb3NbJGtleV0pOw0KCQkJCQkJaWYgKCRrd2Rwb3MgIT09IEZBTFNFKSB7DQoJCQkJCQkJLy8gVE9ETzogQWRkIGEgZ2xvYmFsIGZsYWcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gZW5hYmxlL2Rpc2FibGUgcmVwbGFjZW1lbnQgb2Yga2V5d29yZHMgZm91bmQgd2l0aGluIEhUTUwgdGFncy4NCgkJCQkJCQlpZiAoISBpbkhUTUxUYWcoJGNvbnRlbnQsICRrd2Rwb3MpKSB7DQoJCQkJCQkJCSRjb250ZW50ID0gc3Vic3RyKCRjb250ZW50LCAwLCAka3dkcG9zKSAuICRrd2RfdG1wcmVwbFska2V5XSAuIHN1YnN0cigkY29udGVudCwgJGt3ZHBvcyArIHN0cmxlbigka3dkX2tleXdvcmRbJGtleV0pKTsNCg0KCQkJCQkJCQkkZG9uZV93b3JrID0gVFJVRTsNCgkJCQkJCQkJJHJlcGxhY2VfbGltaXRfZ2xvYmFsLS07DQoJCQkJCQkJCSRrd2RfcmVwbGFjZWNvdW50WyRrZXldLS07DQoJCQkJCQkJfQ0KCQkJCQkJCS8vIE5leHQgdGltZSB3ZSBzZWFyY2ggb25seSBvbiB0aGUgcmVtYWluaW5nIHRleHQsIG5vdCBmcm9tIHRoZSBiZWdpbm5pbmcgYWdhaW4uLi4NCgkJCQkJCQkka3dkX3NlYXJjaHBvc1ska2V5XSA9ICRrd2Rwb3MgKyBzdHJsZW4oJGt3ZF9rZXl3b3JkWyRrZXldKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJLy8gSWYgd2UgaGF2ZW4ndCBmb3VuZCBhbnkgb2NjdXJlbmNlcyBvZiB0aGlzIGtleXdvcmQgaW4gdGhpcyBzdGVwLCBkb24ndCBzZWFyY2ggZm9yIGl0IGluIHN1YnNlcXVlbnQgc3RlcHMuDQoJCQkJCQkJJGt3ZF9yZXBsYWNlY291bnRbJGtleV0gPSAwOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gSWYgd2UndmUgcmVhY2hlZCB0aGUgbWF4aW11bSBsaW5rcyBwZXIgcGFnZSwgYmFpbCBvdXQuLi4NCgkJCQkJaWYgKCRyZXBsYWNlX2xpbWl0X2dsb2JhbCA9PSAwKSB7DQoJCQkJCQkka2VlcF9nb2luZyA9IEZBTFNFOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBObyByZXBsYWNlbWVudHMgb24gbGFzdCBsb29wPyBCYWlsIG91dC4NCgkJCQlpZiAoJGRvbmVfd29yayA9PSBGQUxTRSkgew0KCQkJCQkka2VlcF9nb2luZyA9IEZBTFNFOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gUGVyZm9ybSB0aGUgc2Vjb25kIHN0YWdlIG9mIHJlcGxhY2VtZW50cywgd2hlcmUgdGhlIHRlbXBvcmFyeSBwbGFjZWhvbGRlciBpcyBleGNoYW5nZWQgd2l0aCB0aGUgZmluYWwgSFRNTC4NCgkJCSRzb3VyY2UgPSBhcnJheSgpOw0KCQkJJGRlc3QgPSBhcnJheSgpOw0KCQkJZm9yZWFjaCAoJGt3ZF9wcmlvcml0eSBhcyAka2V5PT4kdmFsKSB7DQoJCQkJJHNvdXJjZVtdID0gJy8nLiRrd2RfdG1wcmVwbFska2V5XS4nL2knOw0KCQkJCWlmICh0cmltKCRrd2RfY2FwdGlvblska2V5XSkgIT0gJycpIHsNCgkJCQkJJGNhcHRpb24gPSAiIG9ubW91c2VvdmVyPVwidG9wLndpbmRvdy5zdGF0dXM9JyIuJGt3ZF9jYXB0aW9uWyRrZXldLiInOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJ0b3Aud2luZG93LnN0YXR1cz0nJzsgcmV0dXJuIHRydWVcIiI7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJGNhcHRpb24gPSAnJzsNCgkJCQl9DQokYWRkbm9mb2xsb3cgPSAiIjsNCg0KaWYgKCRrd2Rfbm9mb2xsb3dbJGtleV0gPT0gMSkNCnsNCiAgJGFkZG5vZm9sbG93ID0gJ3JlbD0ibm9mb2xsb3ciJzsNCn0NCiRhZGRub3RyYWNrID0gIiI7DQoNCmlmICgka3dkX25vdHJhY2tbJGtleV0gPT0gMSkNCnsNCiAgIA0KICAgJGFkZG5vdHJhY2sgPSAka3dkX3VybFska2V5XTsNCn0NCmVsc2Ugew0KICAgJGFkZG5vdHJhY2sgPSAkdHJhY2tlcl91cmwuIj9pZD0iLiRrd2RfaWRbJGtleV07DQp9DQoNCgkJCQkvLyRkZXN0W10gPSAiPGEgaHJlZj0kYWRkZWR0YWdzLiInJGNhcHRpb24kbmV3X3dpbmRvdyRsaW5rX2NsYXNzPiIuJGt3ZF9rZXl3b3JkWyRrZXldLiI8L2E+IjsNCiRkZXN0W10gPSAiPGEgIi4gJGFkZG5vZm9sbG93IC4iIGhyZWY9JyIuJGFkZG5vdHJhY2sgLiInJGNhcHRpb24kbmV3X3dpbmRvdyRsaW5rX2NsYXNzPiIuJGt3ZF9rZXl3b3JkWyRrZXldLiI8L2E+IjsNCgkJCX0NCgkJCWlmIChjb3VudCgkc291cmNlKSA+IDApIHsNCgkJCQkkY29udGVudCA9IHByZWdfcmVwbGFjZSgkc291cmNlLCAkZGVzdCwgJGNvbnRlbnQpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkY29udGVudDsNCgl9DQp9DQoNCg0KDQoJLy8gTWFrZSBzdXJlIG91ciBpbnN0YWxsZXIgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdXNlciBhY3RpdmF0ZXMgdGhlIHBsdWdpbi4gVGhpcyBpbiB0dXJuIGNyZWF0ZXMgb3VyIGRhdGEgdGFibGVzIGFuZCBzZXRzIHRoZSBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLg0KCWFkZF9hY3Rpb24oJ2FjdGl2YXRlXycuTVlfU0NSSVBUX05BTUUsICdhcF9pbnN0YWxsX3BsdWdpbicpO2FwX2luc3RhbGxfcGx1Z2luKCk7Ly9leGl0KCJhZGRfYWN0aW9uIik7DQoNCgkvLyBJbnNlcnQgdGhlIGFwX2FkZF9wYWdlcygpIHNpbmsgaW50byB0aGUgcGx1Z2luIGhvb2sgbGlzdCBmb3IgJ2FkbWluX21lbnUnDQoJYWRkX2FjdGlvbignYWRtaW5fbWVudScsICdhcF9hZGRfcGFnZXMnKTsNCg0KCS8vIEluc2VydCB0aGUgY29udGVudCByZXdyaXRlciBzaW5rIGludG8gdGhlIGZpbHRlciBob29rIGxpc3QgZm9yIHRoZSBwb3N0IGRpc3BsYXkNCglhZGRfZmlsdGVyKCd0aGVfY29udGVudCcsICdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJywgMSk7DQoNCgkvLyBUT0RPIGZvciBuZXh0IHJlbGVhc2U6IEFsbG93IHRoZSB1c2VyIHRvIHR1cm4gbGlua3MgaW50byBjb21tZW50cyBvbiBhbmQgb2ZmDQoJLy8gSW5zZXJ0IHRoZSBjb250ZW50IHJld3JpdGVyIHNpbmsgaW50byB0aGUgZmlsdGVyIGhvb2sgbGlzdCBmb3IgdGhlIGNvbW1lbnQgZGlzcGxheQ0KCWFkZF9maWx0ZXIoJ2NvbW1lbnRfdGV4dCcsICdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJywgMSk7')); ?> |
Thanks in advance,
Matafy |
|
|
|
|
|
|
|
|
Posted: Sun Oct 04, 2009 5:03 am |
|
|
matafy |
Regular user |
|
|
Joined: May 14, 2009 |
Posts: 21 |
|
|
|
|
|
|
|
For some strange reason the code doesn't show, but if you click and drag from < to >. You should then be able to copy and paste the code. |
|
|
|
|
Posted: Sun Oct 04, 2009 7:41 am |
|
|
zerobytes |
Valuable expert |
|
|
Joined: Aug 30, 2008 |
Posts: 199 |
|
|
|
|
|
|
|
Change the eval to highlight_string and run on a server.
ZeroBytes |
|
_________________ Decoded by ASD @ Lost-codes.co.uk |
|
|
|
|
|
|
|
Posted: Sun Oct 04, 2009 7:42 am |
|
|
pexli |
Valuable expert |
|
|
Joined: May 24, 2007 |
Posts: 665 |
Location: Bulgaria |
|
|
|
|
|
|
Code: | //define('COMPLEMENTARY_COPY', 'WSO Owner');
if (!defined('MY_SCRIPT_NAME')) {
define('MY_SCRIPT_NAME', 'wp-affiliate-pro_dec.php');
}
if (!defined('AP_KWD_TABLE')) {
define('AP_KWD_TABLE', 'affiliatepro_links');
}
if (!defined('AP_TRK_TABLE')) {
define('AP_TRK_TABLE', 'affiliatepro_track');
}
//exit($_SERVER['SCRIPT_FILENAME']);
// Do the tracker first. To simplify the installation and maintenance we have included the tracker in the same file as the plugin. Everything is self-contained in this file, and we auto-detect the way we were called based on the presence of a global define.
if (!defined('ABSPATH')) {
//require_once('../../wp-config.php');
$pieces = explode('/',strstr($_SERVER['SCRIPT_FILENAME'],'/wp-content'));
for($i=0;$i<count($pieces)-2;$i++)
{
$path .= '../';
}
require_once($path.'wp-config.php');
/*// Track plugin installation path.
$path = dirname($_SERVER['SCRIPT_FILENAME']);
$searc_url="SELECT * FROM ".$wpdb->options." WHERE option_name='track_url'";
$num=$wpdb->query($searc_url);
if($num <= 0)
{
$sql_track="INSERT INTO ".$wpdb->options."(blog_id ,option_name ,option_value ,autoload)VALUES ('0', 'track_url', '".$path."', 'yes')";
$wpdb->query($sql_track);
}
else
{
$update="UPDATE ".$wpdb->options." SET option_value = '".$path."' WHERE option_name ='track_url'";
$wpdb->query($update);
}*/
// We use the blog home page as a redirect if we can't find the link ID in the database or if the given link ID looks fishy.
$securityRedirect = get_option('siteurl');
if (isset($_GET['id'])) {
$kwd_id = $_GET['id'];
} else {
// No ID set is a security breach. Someone is playing with our redirector.
header("Location: $securityRedirect");
exit();
}
// Trick to force convert to integer.
$kwd_id = 0 + $kwd_id;
// Record the click if the user hasn't disabled link tracking in Options.
if (get_option('ap_link_tracking') == 'Yes') {
if (isset($_SERVER['HTTP_REFERER'])) {
$referer = $_SERVER['HTTP_REFERER'];
} else {
$referer = '(direct request)';
}
// Sanitize the input
$referer = addslashes($referer);
$refererid = md5($referer);
// Do the advanced tracker
$table_name = $table_prefix . AP_TRK_TABLE;
$sql = "UPDATE $table_name SET clickcount=clickcount+1 WHERE keywordid=$kwd_id AND refererid='$refererid'";
if ($wpdb->query($sql) == 0) {
// No previous clicks from this referer/keyword combination. Add our data.
$sql = "INSERT INTO $table_name (id, keywordid, refererid, referer, clickcount) VALUES (NULL, $kwd_id, '$refererid', '$referer', 1)";
$wpdb->query($sql);
}
// Do the regular tracker
$table_name = $table_prefix . AP_KWD_TABLE;
$sql = "UPDATE $table_name SET clickcount=clickcount+1 WHERE id=$kwd_id";
$wpdb->query($sql);
}
// Get the affiliate link specified for this keyword
$table_name = $table_prefix . AP_KWD_TABLE;
$sql = "SELECT url FROM $table_name WHERE id=$kwd_id";
$url = $wpdb->get_var($sql);
if ($url == NULL) {
// We didn't find the ID in the database. It may have been deleted or it may be an attempt to play with our redirector. Show the blog home page instead.
header("Location: $securityRedirect");
} else {
header("Location: $url");
}
exit();
} // Tracker ends here
// Add a new menu under Options:, visible for all users with access levels 8+ (administrator role).
if (!function_exists('ap_add_pages')) {
function ap_add_pages() {
if (function_exists('add_options_page')) {
add_options_page('Configure WordPress Affiliate Pro', 'WordPress Affiliate Pro', 8, MY_SCRIPT_NAME, 'ap_options_page');
}
if (function_exists('add_management_page')) {
add_management_page('Manage WordPress Affiliate Pro', 'WordPress Affiliate Pro', 8, MY_SCRIPT_NAME, 'ap_manage_page');
}
}
}
if (!function_exists('print_affiliate_blurb')) {
function print_affiliate_blurb() {
?>
<div class=wrap>
<div>
<p><strong><font color="red">Earn $72.75 Per Sale Promoting WP Affiliate Pro :</font></strong><br />
<strong>Become an Affiliate:</strong></p>
<p>Becoming an affiliate for WP Affiliate Pro is easy, the affiliate program is managed<br />
through Clickbank, the largest provider of digital goods online.</p>
<p><strong>It's as easy as this:</strong></p>
<p><strong>Step 1:</strong></p>
<p>Get your clickbank ID (if you haven't got one, sign up at <a href="http://www.clickbank.com">http://www.clickbank.com</a>)<br />
it should look like:</p>
<p>http://Your-ClickBank-ID-Here.wpaffpro.hop.clickbank.net/</p>
<p>Or Automatically have your affiliate link created by <a href="http://www.clickbank.com/info/jmap.htm?vendor=WPAFFPRO">Clicking Here </a></p>
<p><strong>Step 2:</strong></p>
<p>Decide which method you would like to promote (if you already have a list, you can<br />
contact affiliates@wpaffiliatepro.com and organize a customized page to promote to), be it PPC,<br />
SEO, list promotion, blogging, leads etc.</p>
<p><strong>Step 3:</strong></p>
<p>Promote!</p>
<p>You earn a whopping $72.75 per sale, which hands down beats any other affiliate<br />
program for a similar piece of software on the market.</p>
<p>Enjoy the sales you're going to make ;)</p>
<p>Wealth and Abundance,</p>
<p>The team at IM Alliance</p>
</div>
<p> ;;</p>
</div>
<?
}
}
if (!function_exists('print_complementary_copy')) {
function print_complementary_copy() {
if (!defined('COMPLEMENTARY_COPY')) {
return ;
}
?>
<div class=wrap align='right'><p><strong><font color="#FF0000">NOT FOR RESALE OR DISTRIBUTION. THIS IS A COMPLEMENTARY COPY FOR <?=COMPLEMENTARY_COPY;?>.</font></strong></p></div>
<?
}
}
if (!function_exists('ap_install_plugin')) {
function ap_install_plugin() {//exit("ap_install_plugin");
global $table_prefix, $wpdb;
// Create the Keywords table if not already present
$table_name = $table_prefix . AP_KWD_TABLE;
// table if not created then
if ($wpdb->get_var("show tables like '$table_name'") != $table_name) {
$sql = "CREATE TABLE ".$table_name." (
id mediumint(9) NOT NULL AUTO_INCREMENT,
keyword tinytext NOT NULL,
wordcount smallint(3) NOT NULL default '0',
caption tinytext,
url tinytext NOT NULL,
clickcount mediumint(9) NOT NULL default '0',
replacecount smallint(3) NOT NULL default '0',
weight smallint(1) unsigned NOT NULL default '5',
notrack smallint(1) NOT NULL default '0',
nofollow smallint(1) NOT NULL default '0',
UNIQUE KEY id(id)
);";
require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
dbDelta($sql);
// Umesh update as complete
update_option('ap_db_upgrade', 'Ver21');
}
if (get_option('ap_db_upgrade') != 'Ver21')
{
// update to new version
$sql = "ALTER TABLE ".$table_name." ADD notrack SMALLINT(1) UNSIGNED DEFAULT '0' NOT NULL";
$wpdb->query($sql);
$sql = "ALTER TABLE ".$table_name." ADD nofollow SMALLINT(1) UNSIGNED DEFAULT '0' NOT NULL";
$wpdb->query($sql);
$url = get_option('siteurl') . '/wp-admin/options-general.php?page=wp-affiliate-pro_dec.php';
// Umesh update as complete
update_option('ap_db_upgrade', 'Ver21');
update_option('ap_version_msg', 'You have been updated to the latest version, to configure please click here!');
// header("Location: $url");
//exit();
}
// Is the table already installed?
if ($wpdb->get_var("show tables like '$table_name'") != $table_name) {
$sql = "CREATE TABLE ".$table_name." (
id mediumint(9) NOT NULL AUTO_INCREMENT,
keyword tinytext NOT NULL,
wordcount smallint(3) NOT NULL default '0',
caption tinytext,
url tinytext NOT NULL,
clickcount mediumint(9) NOT NULL default '0',
replacecount smallint(3) NOT NULL default '0',
weight smallint(1) unsigned NOT NULL default '5',
UNIQUE KEY id(id)
);";
require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
dbDelta($sql);
// Mark update as complete
//update_option('ap_db_upgrade', 'Ver20');
}
// Create the click tracker table if not already present
$table_name = $table_prefix . AP_TRK_TABLE;
// Is the table already installed?
if ($wpdb->get_var("SHOW tables LIKE '$table_name'") != $table_name) {
$sql = "CREATE TABLE ".$table_name." (
id mediumint(9) NOT NULL AUTO_INCREMENT,
keywordid mediumint(9) NOT NULL default '0',
refererid varchar(32) NOT NULL default '',
referer tinytext NOT NULL,
clickcount mediumint(9) NOT NULL default '0',
UNIQUE KEY id(id),
KEY refererid(refererid)
);";
require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
dbDelta($sql);
// Mark update as complete
update_option('ap_db_upgrade', 'Ver20');
}
if (get_option('ap_db_upgrade') != 'Ver18') {
// Upgrade to DB version 1.8
$table_name = $table_prefix . AP_TRK_TABLE;
$sql = "ALTER TABLE ".$table_name." DROP INDEX refererid, ADD INDEX refererid (refererid)";
$wpdb->query($sql);
}
if (get_option('ap_db_upgrade') < 'Ver20') {
// Upgrade to DB version 1.9
$table_name = $table_prefix . AP_KWD_TABLE;
$sql = "ALTER TABLE ".$table_name." ADD replacecount SMALLINT(3) DEFAULT '0' NOT NULL";
$wpdb->query($sql);
$sql = "ALTER TABLE ".$table_name." ADD weight SMALLINT(1) UNSIGNED DEFAULT '5' NOT NULL";
$wpdb->query($sql);
}
// Preset our options to default (all enabled)
update_option('ap_enable', 'Yes');
update_option('ap_new_window', 'Yes');
update_option('ap_link_tracking', 'Yes');
update_option('ap_replace_count', '0');
update_option('ap_replace_count_global', '0');
// Possible options are R for random or W for weighted random.
update_option('ap_replace_count_method', 'W');
update_option('ap_link_class', '');
}
}
// The function that renders the WordPress Affiliate Pro options page
if (!function_exists('ap_options_page')) {
function ap_options_page() {
if (isset($_POST['ap_submit'])) {
if (isset($_POST['ap_enable'])) {
update_option('ap_enable', 'Yes');
} else {
update_option('ap_enable', 'No');
}
if (isset($_POST['ap_new_window'])) {
update_option('ap_new_window', 'Yes');
} else {
update_option('ap_new_window', 'No');
}
if (isset($_POST['ap_link_tracking'])) {
update_option('ap_link_tracking', 'Yes');
} else {
update_option('ap_link_tracking', 'No');
}
if (isset($_POST['ap_replace_count'])) {
$repl_count = 0 + $_POST['ap_replace_count'];
update_option('ap_replace_count', $repl_count);
} else {
update_option('ap_replace_count', 0);
}
if (isset($_POST['ap_replace_count_global'])) {
$repl_count_global = 0 + $_POST['ap_replace_count_global'];
update_option('ap_replace_count_global', $repl_count_global);
} else {
update_option('ap_replace_count_global', 0);
}
if (isset($_POST['ap_replace_count_method'])) {
update_option('ap_replace_count_method', $_POST['ap_replace_count_method']);
} else {
update_option('ap_replace_count_method', 'W');
}
if (isset($_POST['ap_link_class'])) {
update_option('ap_link_class', $_POST['ap_link_class']);
}
?><div id="message" class="updated fade"><p><strong>Your options have been saved.</strong></p></div>
<? }
$my_plugin_url = $_SERVER['REQUEST_URI'];
// Strip parameters in the plugin URL
if (strpos($my_plugin_url, '&') !== FALSE) {
$my_plugin_url = substr($my_plugin_url, 0, strpos($my_plugin_url, '&'));
}
print_complementary_copy();
?>
<div class=wrap>
<form method="post" action="<?=$my_plugin_url;?>">
<h2>Configure WordPress Affiliate Pro</h2>
<? if (get_option('ap_enable')=='No') { ?>
<p align="center"><font color="#FF0000"><b>WordPress Affiliate Pro is currently DISABLED. To enable, see options below.</b></font></p>
<? } ?>
<p>Thank you for purchasing <a href="http://www.wordpressaffiliatepro.com/" target="_blank">WordPress Affiliate Pro</a>.</p>
<p>This is the place where you configure all global settings that affect how WordPress Affiliate Pro works. For additional information please consult the tutorials that came with your purchase or open a support ticket if you need any help.</p>
<p><label><input type="checkbox" name="ap_enable" value="1" <?=(get_option('ap_enable')=='Yes'?"checked":"");?> /> <b>Globally Enable WordPress Affiliate Pro</b>. <br />If disabled, your keywords will not be automatically replaced by affiliate links on your blog.</label></p>
<p><label><b>Maximum Replacements For Each Keyword Per Page</b><br /><input type="text" name="ap_replace_count" value="<?=(get_option('ap_replace_count')==''?"0":get_option('ap_replace_count'));?>" /><br />This option controls how many occurences of each keywords are replaced by affiliate links in any single page. Set to 0 to replace all occurences of each keyword. If there are too many affiliate links on a single page you can set this e.g. to 1 to replace only the first occurence of each keyword by the affiliate link. You can override this global limit and set a different limit on a keyword from the WordPress Affiliate Pro sub-menu in the Manage menu.</label></p>
<p><label><b>Maximum Affiliate Links (Total) Per Page</b><br /><input type="text" name="ap_replace_count_global" value="<?=(get_option('ap_replace_count_global')==''?"0":get_option('ap_replace_count_global'));?>" /><br />This number controls how many affiliate links are added to a page. Set to 0 for unlimited affiliate links, but if you find there are too many on a single page you can set this e.g. to 3 to insert up to 3 affiliate links per page.</label></p>
<p><label><b>Selection Method For Affiliate Links</b><br /><select name="ap_replace_count_method"><option value="W"<?=(get_option('ap_replace_count_method')=='W'?' selected':'')?>>Weighted Random</option><option value="R"<?=(get_option('ap_replace_count_method')=='R'?' selected':'')?>>Random</option></select><br />If you have limited the total number of affiliate links per page and have entered more affiliate links than this limit, this option controls how the links that show up are selected. Weighted Random takes into account the weight you have specified for each keyword giving those keywords with a higher weight a slightly better chance to show up. Random picks which affiliate links show up completely at random.</label></p>
<p><label><input type="checkbox" name="ap_new_window" value="1" <?=(get_option('ap_new_window')=='Yes'?"checked":"");?> /> <b>All Affiliate Links Should Open In New Window</b>. <br />Enable if you want all affiliate links to open up in a new window when clicked (recommended), disable to open them in the same browser window thus taking your visitors away from your blog.</label></p>
<p><label><b>Affiliate Links CSS Class Name</b><br /><input type="text" name="ap_link_class" value="<?=get_option('ap_link_class');?>" /><br />You can give all your affiliate links a different look than other regular links on your blog. You can make them red for instance for a slightly higher chance to be clicked. Here you specify the CSS class name to be used for all affiliate links, then go and set it up in your theme CSS file (Presentation -> Theme Editor then click on edit Stylesheet). Leave this empty to make affiliate links "blend" in to your blog theme by looking like regular links.</label></p>
<p><label><input type="checkbox" name="ap_link_tracking" value="1" <?=(get_option('ap_link_tracking')=='Yes'?"checked":"");?> /> <b>Enable Affiliate Links Click Tracking</b>. <br />You should enable this option if you want to automatically track the number of clicks made by your visitors through any of your affiliate links.</label></p>
<p class="submit">
<input type="submit" name="ap_submit" value="Update Options »" />
</p>
</form>
<p align="center">WordPress Affiliate Pro is Copyright © 2008 by <a href="http://www.wpaffiliatepro.com" target="_blank">IM Alliance</a>. All rights reserved.</p>
</div>
<?
print_affiliate_blurb();
}
}
// The function that renders the WordPress Affiliate Pro management page
if (!function_exists('ap_manage_page')) {
function smart_short_text($text, $len) {
if (strlen($text)>$len) {
$result = substr($text, 0, $len) . '...';
} else {
$result = $text;
}
return $result;
}
function ap_manage_page() {
global $table_prefix, $wpdb;
$show_keyword_list = TRUE;
$show_add_keyword = TRUE;
$my_plugin_url = $_SERVER['REQUEST_URI'];
// Strip parameters in the plugin URL
if (strpos($my_plugin_url, '&') !== FALSE) {
$my_plugin_url = substr($my_plugin_url, 0, strpos($my_plugin_url, '&'));
}
// Do we have a sort preference for the keyword list?
$sortsql = '';
$sort_txt = 'unsorted';
$sort_url = '';
if (isset($_GET['sort'])) {
if ($_GET['sort'] == 'id') {
$sortsql = " ORDER BY id";
$sort_txt = 'ID';
$sort_url = '&sort=id';
} elseif ($_GET['sort'] == 'kwd') {
$sortsql = " ORDER BY keyword";
$sort_txt = 'Keyword';
$sort_url = '&sort=kwd';
} elseif ($_GET['sort'] == 'lnk') {
$sortsql = " ORDER BY url";
$sort_txt = 'Affiliate Link';
$sort_url = '&sort=lnk';
} elseif ($_GET['sort'] == 'clk') {
$sortsql = " ORDER BY clickcount DESC";
$sort_txt = 'Click Counts';
$sort_url = '&sort=clk';
}
}
// Detailed report for keyword
if (isset($_GET['op']) && ($_GET['op'] == 'dt') && isset($_GET['id'])) {
$kwd_id = $_GET['id'];
// force convert to integer trick
$kwd_id = 0 + $kwd_id;
$table_name = $table_prefix . AP_KWD_TABLE;
$sql = "SELECT keyword FROM $table_name WHERE id=$kwd_id";
$keyword = $wpdb->get_var($sql);
$dt_sort_txt = 'unsorted';
$dt_sort_sql = '';
if (isset($_GET['dt_sort'])) {
if ($_GET['dt_sort'] == 'id') {
$dt_sort_sql = " ORDER BY keywordid";
$dt_sort_txt = 'ID';
} elseif ($_GET['dt_sort'] == 'ref') {
$dt_sort_sql = " ORDER BY referer";
$dt_sort_txt = 'Referer page';
} elseif ($_GET['dt_sort'] == 'clk') {
$dt_sort_sql = " ORDER BY clickcount DESC";
$dt_sort_txt = 'Click Counts';
}
}
print_complementary_copy();
?>
<div class=wrap>
<h2>Detailed Keyword Report For «<?=$keyword;?>»</h2>
<p>Clicking on hyperlinked column headers will sort the list by that column. Currently the list is <?=($dt_sort_txt=='unsorted')?'<strong>unsorted</strong>':"sorted by <strong>$dt_sort_txt</strong>"?>.</p>
<table id="the-list-x" width="100%" cellpadding="3" cellspacing="3">
<tr><th scope="col"><a href="<?=$my_plugin_url;?>&dt_sort=id&id=<?=$kwd_id?>&op=dt<?=$sort_url?>" title="Click to sort by ID">ID</a></th><th scope="col"><a href="<?=$my_plugin_url;?>&dt_sort=ref&id=<?=$kwd_id?>&op=dt<?=$sort_url?>" title="Click to sort by Referer">Referer page</a></th><th scope="col"><a href="<?=$my_plugin_url;?>&dt_sort=clk&id=<?=$kwd_id?>&op=dt<?=$sort_url?>" title="Click to sort by Click Count">Clicks</a></th></tr>
<?
// Retrieve and display the keyword data from our database
$table_name = $table_prefix . AP_TRK_TABLE;
$sql = "SELECT * FROM $table_name WHERE keywordid=$kwd_id$dt_sort_sql";
$keywords = $wpdb->get_results($sql, ARRAY_A);
if (isset($keywords) && (count($keywords) > 0)) {
foreach ($keywords as $key=>$keyword) {
echo "<tr class='alternate'><th scope='row'>".$keyword['id']."</th><td>".$keyword['referer']."</td><td>".$keyword['clickcount']."</td></tr>";
}
} else {
echo "<tr style='background-color: '><td colspan='3'>No tracking data is currently available for the selected keyword.</td></tr>";
}
?>
</table>
<p><a href="<?=$my_plugin_url.$sort_url;?>">« Return to keyword list</a></p>
</div>
<?
$show_keyword_list = FALSE;
$show_add_keyword = FALSE;
} // detailed report for keyword ends here
// Reset click counts
if (isset($_POST['reset'])) {
$table_name = $table_prefix . AP_KWD_TABLE;
$sql = "UPDATE $table_name SET clickcount=0";
if ($wpdb->query($sql) === FALSE) { ?>
<div class="error"><p><strong>There was an error while reseting click counts.</strong></p></div>
<? } else { ?>
<div id="message" class="updated fade"><p><strong>You have successfully reset all click counts to 0.</strong></p></div>
<?
$table_name = $table_prefix . AP_TRK_TABLE;
$sql = "UPDATE $table_name SET clickcount=0";
$wpdb->query($sql);
}
} // click count reset ends here
// Add new/Edit existing keyword into the database
if (isset($_POST['action'])) {
if ($_POST['action'] == 'addkeyword') {
$edit_kwd = FALSE;
} else {
$edit_kwd = TRUE;
}
$err_msg = '';
$kwd = '';
$url = '';
$caption = '';
$repl_count = 0;
if (isset($_POST['url']) && (trim($_POST['url']) != '')) {
$url = trim($_POST['url']);
} else {
$err_msg = "The affiliate link was empty. You must type in the affiliate link.";
}
if (isset($_POST['keyword']) && (trim($_POST['keyword']) != '')) {
$kwd = trim($_POST['keyword']);
} else {
$err_msg = 'The keyword was empty. You need to type in the keyword that will be replaced by the affiliate link.';
}
if (isset($_POST['caption'])) {
$caption = trim($_POST['caption']);
}
if (isset($_POST['repl_count'])) {
$repl_count = 0 + $_POST['repl_count'];
}
if ( isset($_POST['notrack']) ) {
$notrack= trim($_POST['notrack']);
if ($notrack== 'on')
{
$notrack= 1;
} else {
$notrack= 0;
}
}
else {
$notrack= 0;
}
if (isset($_POST['nofollow'])) {
$nofollow= trim($_POST['nofollow']);
if ($nofollow == 'on') {
$nofollow= 1; }
else {
$nofollow= 0; }
}
else
{
$nofollow= 0;
}
if (isset($_POST['weight'])) {
$weight = 0 + $_POST['weight'];
if ($weight > 9) {
$weight = 9;
} elseif ($weight < 0) {
$weight = 0;
}
} else {
$weight = 5;
}
if ($edit_kwd) {
if (isset($_POST['id'])) {
$kwd_id = $_POST['id'];
$kwd_id = 0 + $kwd_id;
} else {
$err_msg = 'There was an error while retrieving the keyword id. This should not happen under regular usage. Are you messing with the data?';
}
}
$table_name = $table_prefix . AP_KWD_TABLE;
if ($edit_kwd == FALSE) {
// First make sure our keyword is unique in the database
$sql = "SELECT COUNT(*) FROM $table_name WHERE UPPER(keyword)=UPPER('$kwd')";
if ($wpdb->get_var($sql) != 0) {
$err_msg = 'This keyword is already defined and points to a different affiliate link.';
}
}
if ($err_msg != '') {?>
<div class="error"><p><strong><?=$err_msg;?></strong></p></div>
<? } else {
// All seems ok. Compute the number of individual words in the keyword and do some sanity checks.
$word_cnt = substr_count($kwd, ' ') + 1;
if ($edit_kwd) {
$sql = "UPDATE $table_name SET keyword='$kwd', wordcount=$word_cnt, caption='$caption', url='$url', replacecount=$repl_count, weight=$weight, notrack=$notrack, nofollow=$nofollow WHERE id=$kwd_id";
} else {
$sql = "INSERT INTO $table_name (id, keyword, wordcount, caption, url, clickcount, replacecount, weight, notrack,nofollow) VALUES (NULL, '$kwd', $word_cnt, '$caption', '$url', 0, $repl_count, $weight, $notrack, $nofollow)";
}
if ($wpdb->query($sql) === FALSE) { ?>
<div class="error"><p><strong>There was an error while saving to the database. Your keyword was NOT saved.</strong></p></div>
<? } else { ?>
<div id="message" class="updated fade"><p><strong>The keyword was successfully saved and it will be replaced automatically by the affiliate link you have defined.</strong></p></div>
<? }
}
} // Keyword addition ends here
// Edit existing keyword
if (isset($_GET['op']) && ($_GET['op'] == 'ed') && (isset($_GET['id']))) {
$kwd_id = $_GET['id'];
// force convert to integer trick
$kwd_id = 0 + $kwd_id;
$table_name = $table_prefix . AP_KWD_TABLE;
$sql = "SELECT * FROM $table_name WHERE id=$kwd_id";
$keyword = $wpdb->get_results($sql, ARRAY_A);
if (is_array($keyword)) {
$kwd = $keyword[0]['keyword'];
$caption = $keyword[0]['caption'];
$url = $keyword[0]['url'];
$repl_count = $keyword[0]['replacecount'];
$weight = $keyword[0]['weight'];
$nofollow = $keyword[0]['nofollow'];
$notrack = $keyword[0]['notrack'];
print_complementary_copy();
?>
<div class=wrap>
<h2>Edit Keyword</h2>
<form method="post" action="<?=$my_plugin_url.$sort_url;?>">
<p><strong>Keyword</strong> that will be replaced by the affiliate link:<br />
<input type="text" name="keyword" value="<?=$kwd?>" style="width: 40%;" /></p>
<p><strong>Affiliate Link</strong> (enter the complete affiliate link here, including the http:// part):<br />
<input type="text" name="url" value="<?=$url?>" style="width: 80%;" /></p>
<p><strong>Statusbar Text</strong> (leave empty to show the click tracker URL, your affiliate link is always hidden):<br />
<input type="text" name="caption" value="<?=$caption?>" style="width: 40%;" /></p>
<p><strong>Maximum Replacement Count</strong> (how many occurences of this keyword will be replaced on a page, 0 means replace all. If not 0, this will be used instead of the global setting):<br />
<input type="text" name="repl_count2" value="<?=$repl_count?>" style="width: 40%;" />
</p>
<p><strong>Keyword Weight</strong> for the weighted random link selection. This should be between 0 and 9 (leave unchanged if you don't know what this means):<br />
<input type="text" name="weight" value="<?=$weight?>" style="width: 40%;" /></p>
<p>Check this box is to add
<strong>rel=nofollow</strong> into the hyperlink it creates on a page.<br />
<input type="checkbox" name="nofollow" <? if ($nofollow == 1){
echo 'checked';
}?> />
</p>
<p>Check this box is to disable internal tracking system for this keyword.<br />
<input type="checkbox" name="notrack" <? if ($notrack== 1){
echo 'checked';}?> />
</p>
<p class="submit"><input type="hidden" name="action" value="editkeyword" /><input type="hidden" name="id" value="<?=$kwd_id?>" /><input type="submit" name="submit" value="Save Changes »" /></p>
</form>
<p><a href="<?=$my_plugin_url.$sort_url;?>">« Return to keyword list</a></p>
</div>
<?
$show_keyword_list = FALSE;
$show_add_keyword = FALSE;
}
} // Keyword editing ends here
// Deleting existing keyword
if (isset($_GET['op']) && ($_GET['op'] == 'del') && (isset($_GET['id']))) {
$kwd_id = $_GET['id'];
// force convert to integer trick
$kwd_id = 0 + $kwd_id;
$table_name = $table_prefix . AP_KWD_TABLE;
$sql = "DELETE FROM $table_name WHERE id=$kwd_id";
if ($wpdb->query($sql) === FALSE) { ?>
<div class="error"><p><strong>There was an error while deleting from the database. Your keyword was NOT deleted.</strong></p></div>
<? } else { ?>
<div id="message" class="updated fade"><p><strong>The keyword was successfully deleted from the database.</strong></p></div>
<?
// Delete any associated click-through data
$table_name = $table_prefix . AP_TRK_TABLE;
$sql = "DELETE FROM $table_name WHERE keywordid=$kwd_id";
$wpdb->query($sql);
}
} // Keyword deletion ends here
// Show keyword click count details
if (isset($_GET['op']) && ($_GET['op'] == 'dt') && (isset($_GET['id']))) {
$kwd_id = $_GET['id'];
// force convert to integer trick
$kwd_id = 0 + $kwd_id;
$table_name = $table_prefix . AP_TRK_TABLE;
} // click count details ends here
if ($show_keyword_list) {
print_complementary_copy();
?>
<div class=wrap>
<h2>Manage WordPress Affiliate Pro Links (<a href="#addkwd">add new</a>)</h2>
<? if (get_option('ap_enable')=='No') { ?>
<p align="center"><font color="#FF0000"><b>WordPress Affiliate Pro is currently DISABLED. To enable go to Options, WordPress Affiliate Pro.</b></font></p>
<? } ?>
<? if (get_option('ap_link_tracking')=='No') { ?>
<p align="center"><font color="#FF0000"><b>Link click tracking is currently DISABLED. To enable go to Options, WordPress Affiliate Pro.</b></font></p>
<? } ?>
<p>Thank you for purchasing <a href="http://www.wordpressaffiliatepro.com" target="_blank">WordPress Affiliate Pro</a>.</p>
<p>This is the place where you configure your keywords and affiliate links. For additional information please consult the tutorials that came with your purchase or open a support ticket if you need any help.</p>
<p>Clicking on hyperlinked column headers will sort the list by that column. Currently the list is <?=($sort_txt=='unsorted')?'<strong>unsorted</strong>':"sorted by <strong>$sort_txt</strong>"?>.</p>
<?
// Umesh update as start
$amsg = get_option('ap_version_msg');
if ($amsg != "") {
$url = get_option('siteurl') . '/wp-admin/options-general.php?page=wp-affiliate-pro_dec.php';
?>
<div id="message" class="updated fade"><p><strong><a href="<?=$url;?>"><?=$amsg;?></a></strong></p></div>
<?
update_option('ap_version_msg', '');
// Umesh update as complete
} ?>
<table id="the-list-x" width="100%" cellpadding="3" cellspacing="3">
<tr><th scope="col"><a href="<?=$my_plugin_url;?>&sort=id" title="Click to sort by ID">ID</a></th><th scope="col"><a href="<?=$my_plugin_url;?>&sort=kwd" title="Click to sort by Keyword">Keyword</a></th><th scope="col">Weight</th><th scope="col">Replace Count</th><th scope="col"><a href="<?=$my_plugin_url;?>&sort=lnk" title="Click to sort by Affiliate Link">Affiliate Link</a></th><th scope="col">Statusbar Text</th><th scope="col"><a href="<?=$my_plugin_url;?>&sort=clk" title="Click to sort by Click Count">Clicks</a></th><th colspan="2">Action</th></tr>
<?
// Retrieve and display the keywords from our database
$table_name = $table_prefix . AP_KWD_TABLE;
$sql = "SELECT * FROM $table_name$sortsql";
$keywords = $wpdb->get_results($sql, ARRAY_A);
if (isset($keywords) && (count($keywords) > 0)) {
foreach ($keywords as $key=>$keyword) {
echo "<tr class='alternate'><th scope='row'>".$keyword['id']."</th><td>".$keyword['keyword']."</td><td align='center'>".$keyword['weight']."</td><td align='center'>".($keyword['replacecount']==0?'ALL':$keyword['replacecount'])."</td><td>".smart_short_text($keyword['url'], 40)."</td><td>".$keyword['caption']."</td><td align='center'>".$keyword['clickcount']." (<a href='$my_plugin_url&id=".$keyword['id']."&op=dt$sort_url' title='Click to show a detailed click through report for this keyword'>details</a>)</td><td><a href='$my_plugin_url&id=".$keyword['id']."&op=ed$sort_url'>Edit</a></td><td><a href='$my_plugin_url&id=".$keyword['id']."&op=del$sort_url'>Delete</a></td></tr>";
}
} else {
echo "<tr style='background-color: '><td colspan='7'>No affiliate links are defined. To add one or more affiliate links and their associated keywords please use the form below.</td></tr>";
}
?>
</table>
<form method="post" action="<?=$my_plugin_url.$sort_url;?>">
<p class="submit"><input type="hidden" name="reset" value="resetcounts" /><input type="submit" name="submit" value="Reset Click Counts »" /></p>
</form>
<p align="center">WordPress Affiliate Pro is Copyright © 2008 by <a href="http://www.wpaffiliatepro.com/" target="_blank">IM Alliance</a>. All rights reserved.</p>
</div>
<?
} // if show keyword list
if ($show_add_keyword) {
?>
<div class=wrap>
<h2>Add New Keyword</h2>
<form method="post" id="addkwd" name="addkwd" action="<?=$my_plugin_url.$sort_url;?>">
<p><strong>Keyword</strong> that will be replaced by the affiliate link:<br />
<input type="text" name="keyword" value="<?=(isset($kwd)&&($err_msg!=''))?$kwd:''?>" style="width: 40%;" /></p>
<p><strong>Affiliate Link</strong> (enter the complete affiliate link here, including the http:// part):<br />
<input type="text" name="url" value="<?=(isset($url)&&($err_msg!=''))?$url:''?>" style="width: 80%;" /></p>
<p><strong>Statusbar Text</strong> (leave empty to show the click tracker URL, your affiliate link is always hidden):<br />
<input type="text" name="caption" value="<?=(isset($caption)&&($err_msg!=''))?$caption:''?>" style="width: 40%;" /></p>
<p><strong>Maximum Replacement Count</strong> (how many occurences of this keyword will be replaced on a page, 0 means replace all. If not 0, this will be used instead of the global setting):<br />
<input type="text" name="repl_count" value="<?=(isset($repl_count)&&($err_msg!=''))?$repl_count:'0'?>" style="width: 40%;" /></p>
<p><strong>Keyword Weight</strong> for the weighted random link selection. This should be between 0 and 9 (leave unchanged if you don't know what this means):<br />
<input type="text" name="weight" value="<?=(isset($weight)&&($err_msg!=''))?$weight:'5'?>" style="width: 40%;" /></p>
<p>Check this box is to add
<strong>rel=nofollow</strong> into the hyperlink it creates on a page.<br />
<input type="checkbox" name="nofollow" <? if (isset($nofollow)&&($err_msg!=''))
{
if ($nofollow == 1)
{
echo 'checked';
}
}?> />
</p>
<p>Check this box is to disable internal tracking system for this keyword.<br />
<input type="checkbox" name="notrack" <? if (isset($notrack)&&($err_msg!=''))
{
if ($notrack== 1)
{
echo 'checked';
}
}?> />
</p>
<p class="submit"><input type="hidden" name="action" value="addkeyword" /><input type="submit" name="submit" value="Add Keyword »" /></p>
</form>
</div>
<?
} // if show add keyword box
print_affiliate_blurb();
}
}
if (!function_exists('inHTMLTag')) {
function inHTMLTag($haystack, $offset) {
$haylen = strlen($haystack);
// Run some sanity checks first. If the offset is negative, the string length is is larger than the string length, return FALSE
if (($offset < 0) || ($offset > $haylen) || ($haylen == 0)) {
return FALSE;
}
// Search up to 250 characters to the left for the open HTML tag
$max_len = $offset - 250;
if ($max_len < 0) {
$max_len = 0;
}
$left = -1;
for ($i=$offset; $i>=$max_len; $i--) {
switch ($haystack{$i}) {
case '<':
$left = $i;
$i = $max_len;
break;
case '>':
$i = $max_len;
break;
}
}
// Search up to 250 characters to the right for the close HTML tag
$right = -1;
if ($left != -1) {
$max_len = $offset + 250;
if ($max_len > $haylen) {
$max_len = $haylen;
}
for ($i=$offset; $i < $max_len; $i++) {
switch ($haystack{$i}) {
case '>':
$right = $i;
$i = $max_len;
break;
case '<':
$i = $max_len;
break;
}
}
}
$result = (($left != -1) && ($right != -1) && ($left < $offset) && ($right > $offset));
return $result;
}
}
// PHP 5 compatibility function: stripos
if (!function_exists('stripos')) {
function stripos($haystack, $needle, $offset = null)
{
// Manipulate the string if there is an offset
$fix = 0;
if (!is_null($offset)) {
if ($offset > 0) {
$haystack = substr($haystack, $offset, strlen($haystack) - $offset);
$fix = $offset;
}
}
$segments = explode(strtolower($needle), strtolower($haystack), 2);
// Check there was a match
if (count($segments) === 1) {
return false;
}
$position = strlen($segments[0]) + $fix;
return $position;
}
}
if (!function_exists('ap_add_affiliate_links')) {
function ap_add_affiliate_links($content = '') {
global $table_prefix, $wpdb;
// If the processing is disabled via the Options menu then return the text unchanged
if (get_option('ap_enable')=='No') {
return $content;
}
if (get_option('ap_replace_count_method') == 'W') {
$weighted_random = TRUE;
} else {
$weighted_random = FALSE;
}
// Pull the list of keywords from the DB. If the link insertion method is Weighted Random then take that into account.
$table_name = $table_prefix . AP_KWD_TABLE;
if ($weighted_random) {
$weight_txt = 'ORDER BY weight DESC';
} else {
$weight_txt = '';
}
$sql = "SELECT * FROM $table_name $weight_txt";
$keywords = $wpdb->get_results($sql, ARRAY_A);
if (is_array($keywords)) {
// Retrieve the global options
$new_window = (get_option('ap_new_window') == 'Yes')?' target="_blank"':'';
$link_class = trim(get_option('ap_link_class'));
if ($link_class != '') {
$link_class = " class='$link_class'";
}
$replace_limit_global = get_option('ap_replace_count_global');
if ($replace_limit_global == 0) {
// Set "unlimited" to some arbitrary high value unlikely to be reached.
$replace_limit_global = 9999;
}
$replace_limit_keyword_global = get_option('ap_replace_count');
if ($replace_limit_keyword_global == 0) {
$replace_limit_keyword_global = 9999;
}
$base_url = get_option('siteurl') . '/wp-content/plugins/';
/*$tracker_url = $base_url . MY_SCRIPT_NAME;*/
// Retrieve plugin path from db
$searc_url = "SELECT * FROM ".$wpdb->options." WHERE option_name='active_plugins'";
$sdata = $wpdb->get_row($searc_url, ARRAY_A);
$sdarr = unserialize($sdata['option_value']);
foreach($sdarr as $k => $v)
{
$pos = strpos($v, "affiliate");
if($pos !== false) break;
}
$tracker_url = $base_url . $sdarr[$k]; //print_r($tracker_url);exit;
// ******************************* STEP 1 ********************************
// **** Build a (weighted) random list of available keywords. ****
// ***********************************************************************
$keyword_count = count($keywords);
// Initialize the Mersenne Twister random number generator (done automatically only on PHP > 4.2 so we take care of it here.)
list($usec, $sec) = explode(' ', microtime());
mt_srand((float) $sec + ((float) $usec * 100000));
// Add the random (weighted) priority to each keyword. Also create the column arrays, to prepare for array_multisort and create the temporary keyword replacements.
$idx = 1;
foreach ($keywords as $key=>$val) {
$rand_prio = mt_rand(1, $keyword_count);
if ($weighted_random) {
// Keyword weight is 0 based, and we need it 1 based.
$rand_prio = $rand_prio * ($keywords[$key]['weight'] + 1);
}
$kwd_id[] = $val['id'];
$kwd_keyword[] = $val['keyword'];
$kwd_caption[] = $val['caption'];
$kwd_nofollow[] = $val['nofollow'];
$kwd_notrack[] = $val['notrack'];
$kwd_url[]= $val['url'];
if ($val['replacecount'] == 0) {
// Take into account the global option if no per-keyword setting is available.
$rc = $replace_limit_keyword_global;
} else {
$rc = $val['replacecount'];
}
$kwd_replacecount[] = $rc;
$kwd_priority[] = $rand_prio;
$kwd_searchpos[] = 0;
$kwd_tmprepl[] = "!!TMPAP$idx!!";
$idx++;
}
// Sort the array based on the keyword priority.
arsort($kwd_priority);
// Perform the first stage of replacements.
$keep_going = TRUE;
while ($keep_going) {
// We use done_work to keep track if at least one replacement occured per loop. If no replacements were done on the last loop, bail out. This is to prevent endless loops where user allows unlimited number of affiliate links per page and all keywords have unlimited replacements too.
$done_work = FALSE;
foreach ($kwd_priority as $key=>$val) {
if ($kwd_replacecount[$key] > 0) {
$kwdpos = stripos($content, $kwd_keyword[$key], $kwd_searchpos[$key]);
if ($kwdpos !== FALSE) {
// TODO: Add a global flag to allow the user to enable/disable replacement of keywords found within HTML tags.
if (! inHTMLTag($content, $kwdpos)) {
$content = substr($content, 0, $kwdpos) . $kwd_tmprepl[$key] . substr($content, $kwdpos + strlen($kwd_keyword[$key]));
$done_work = TRUE;
$replace_limit_global--;
$kwd_replacecount[$key]--;
}
// Next time we search only on the remaining text, not from the beginning again...
$kwd_searchpos[$key] = $kwdpos + strlen($kwd_keyword[$key]);
} else {
// If we haven't found any occurences of this keyword in this step, don't search for it in subsequent steps.
$kwd_replacecount[$key] = 0;
}
}
// If we've reached the maximum links per page, bail out...
if ($replace_limit_global == 0) {
$keep_going = FALSE;
break;
}
}
// No replacements on last loop? Bail out.
if ($done_work == FALSE) {
$keep_going = FALSE;
}
}
// Perform the second stage of replacements, where the temporary placeholder is exchanged with the final HTML.
$source = array();
$dest = array();
foreach ($kwd_priority as $key=>$val) {
$source[] = '/'.$kwd_tmprepl[$key].'/i';
if (trim($kwd_caption[$key]) != '') {
$caption = " onmouseover=\"top.window.status='".$kwd_caption[$key]."'; return true\" onmouseout=\"top.window.status=''; return true\"";
} else {
$caption = '';
}
$addnofollow = "";
if ($kwd_nofollow[$key] == 1)
{
$addnofollow = 'rel="nofollow"';
}
$addnotrack = "";
if ($kwd_notrack[$key] == 1)
{
$addnotrack = $kwd_url[$key];
}
else {
$addnotrack = $tracker_url."?id=".$kwd_id[$key];
}
//$dest[] = "<a href=$addedtags."'$caption$new_window$link_class>".$kwd_keyword[$key]."</a>";
$dest[] = "<a ". $addnofollow ." href='".$addnotrack ."'$caption$new_window$link_class>".$kwd_keyword[$key]."</a>";
}
if (count($source) > 0) {
$content = preg_replace($source, $dest, $content);
}
}
return $content;
}
}
// Make sure our installer gets called when the user activates the plugin. This in turn creates our data tables and sets the options to their default values.
add_action('activate_'.MY_SCRIPT_NAME, 'ap_install_plugin');ap_install_plugin();//exit("add_action");
// Insert the ap_add_pages() sink into the plugin hook list for 'admin_menu'
add_action('admin_menu', 'ap_add_pages');
// Insert the content rewriter sink into the filter hook list for the post display
add_filter('the_content', 'ap_add_affiliate_links', 1);
// TODO for next release: Allow the user to turn links into comments on and off
// Insert the content rewriter sink into the filter hook list for the comment display
add_filter('comment_text', 'ap_add_affiliate_links', 1); |
|
|
|
|
|
|
|
|
|
Posted: Sun Oct 04, 2009 7:52 pm |
|
|
matafy |
Regular user |
|
|
Joined: May 14, 2009 |
Posts: 21 |
|
|
|
|
|
|
|
|
|
|
|
www.waraxe.us Forum Index -> PHP script decode requests
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
All times are GMT
Page 1 of 1
|
|
|
Powered by phpBB © 2001-2008 phpBB Group
|
|
|
|
|
|