# Name: rah_comment_spam v0.6 # Type: Admin/Client side plugin # Anti-spam tools to prevent comment spam # Author: Jukka Svahn # URL: http://rahforum.biz # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo2OiJhdXRob3IiO3M6MTE6Ikp1a2thIFN2YWhuIjtzOjEwOiJhdXRob3JfdXJp IjtzOjE5OiJodHRwOi8vcmFoZm9ydW0uYml6IjtzOjExOiJkZXNjcmlwdGlvbiI7czozOToi QW50aS1zcGFtIHRvb2xzIHRvIHByZXZlbnQgY29tbWVudCBzcGFtIjtzOjQ6ImhlbHAiO3M6 MTMyMjU6Igk8aDE+cmFoX2NvbW1lbnRfc3BhbTwvaDE+CgoJPHA+UmFoX2NvbW1lbnRfc3Bh bSBwcm92aWRlcyBjdXN0b21pemFibGUgYW50aS1zcGFtIHRvb2xzIGZvciA8YSBocmVmPSJo dHRwOi8vd3d3LnRleHRwYXR0ZXJuLmNvbSI+VGV4dHBhdHRlcm4mIzgyMTc7czwvYT4gY29t bWVudCBzeXN0ZW0uIFNldCBtaW5pbXVtIGFuZCBtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoLCBm aWx0ZXIgc3BhbSB3b3JkcywgdmFsaWRhdGUgZW1haWwgYWRkcmVzc2VzLCBsaW1pdCBwb3N0 aW5nIGFjdGl2aXR5IGFuZCBzZXQgaGlkZGVuIHNwYW0gdHJhcHMuIEFsbCBmcm9tIHNpbXBs ZSBhZG1pbi1zaWRlIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSwgbm8gaGVhZCBmaXJzdCBk aXZlIHRvIGNvZGUuPC9wPgoKCTx1bD4KCQk8bGk+VmVyc2lvbjogMC42PC9saT4KCQk8bGk+ VXBkYXRlZDogMjAxMS8wOS8wOSAyOjQwIFBNIDxzcGFuIGNsYXNzPSJjYXBzIj5VVEM8L3Nw YW4+PC9saT4KCTwvdWw+CgoJPGgzPlRhYmxlIG9mIENvbnRlbnRzPC9oMz4KCgk8dWw+CgkJ PGxpPjxhIGhyZWY9IiNsaXN0LW9mLWZlYXR1cmVzIj5MaXN0IG9mIGZlYXR1cmVzPC9hPjwv bGk+CgkJPGxpPjxhIGhyZWY9IiNyZXF1aXJlbWVudHMiPlJlcXVpcmVtZW50czwvYT48L2xp PgoJCTxsaT48YSBocmVmPSIjaW5zdGFsbGF0aW9uIj5JbnN0YWxsYXRpb248L2E+PC9saT4K CQk8bGk+PGEgaHJlZj0iI2NvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2E+PC9saT4K CQk8bGk+PGEgaHJlZj0iI3ByZWZlcmVuY2VzIj5QcmVmZXJlbmNlczwvYT48L2xpPgoJCTxs aT48YSBocmVmPSIjY2hhbmdlbG9nIj5DaGFuZ2Vsb2c8L2E+PC9saT4KCTwvdWw+CgoJPGgz IGlkPSJsaXN0LW9mLWZlYXR1cmVzIj5MaXN0IG9mIGZlYXR1cmVzPC9oMz4KCgk8dWw+CgkJ PGxpPlNldCBjb21tZW50IG1lc3NhZ2UgbGVuZ3RoIGxpbWl0YXRpb25zOiBtaW5pbXVtIGFu ZCBtYXhpbXVtLCB3b3JkcyBhbmQgY2hhcmFjdGVycy48L2xpPgoJCTxsaT5MaW1pdCBsaW5r IHBvc3RpbmcuPC9saT4KCQk8bGk+RGVmaW5lIHNwYW0gd29yZHMsIGFuZCBzZXQgdGhlIGxp bWl0IGhvdyBtYW55IHNwYW0gd29yZHMgYXJlIG5lZWRlZCB1bnRpbCBjb21tZW50IGJlY29t ZXMgc3BhbS48L2xpPgoJCTxsaT5TaG93IGN1c3RvbWl6YWJsZSBlcnJvciBtZXNzYWdlcyB3 aGVuIGNvbW1lbnQgaXMgYmxvY2tlZC48L2xpPgoJCTxsaT5TZXQgYSBjdXN0b20gaGlkZGVu IHNwYW0gdHJhcCBmaWVsZC48L2xpPgoJCTxsaT5DaGFuZ2UgdGhlIHNwYW0gcHJvdGVjdGlv biBtZXRob2QuPC9saT4KCQk8bGk+U2V0IHF1b3RhcywgbGltaXQgdXNlcnMmIzgyMTc7IGNv bW1lbnQgcG9zdGluZyBhY3Rpdml0eS48L2xpPgoJCTxsaT5JbnRlZ3JhdGVzIHdpdGggVGV4 dHBhdHRlcm4mIzgyMTc7cyBuYXRpdmUgcHJlZmVyZW5jZXMgcGFuZWw7IG5vIGRpdmluZyBp bnRvIGNvZGUgbmVlZGVkIGF0IGFsbC48L2xpPgoJPC91bD4KCgk8aDMgaWQ9InJlcXVpcmVt ZW50cyI+UmVxdWlyZW1lbnRzPC9oMz4KCgk8cD5SYWhfY29tbWVudF9zcGFtJiM4MjE3O3Mg bWluaW11bSByZXF1aXJlbWVudHM6PC9wPgoKCTx1bD4KCQk8bGk+PHNwYW4gY2xhc3M9ImNh cHMiPlBIUDwvc3Bhbj4gNSBvciBuZXdlcjwvbGk+CgkJPGxpPlRleHRwYXR0ZXJuIDQuMi4w IG9yIG5ld2VyLjwvbGk+Cgk8L3VsPgoKCTxwPlJlY29tbWVuZGVkOjwvcD4KCgk8dWw+CgkJ PGxpPlRleHRwYXR0ZXJuIDQuNC4xIG9yIG5ld2VyLjwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0i aW5zdGFsbGF0aW9uIj5JbnN0YWxsYXRpb248L2gzPgoKCTxvbD4KCQk8bGk+TmF2aWdhdGUg dG8geW91ciBUZXh0cGF0dGVybiBpbnN0YWxsYXRpb24mIzgyMTc7cyBQbHVnaW5zIHBhbmVs ICg8ZW0+VGV4dHBhdHRlcm4gLyBBZG1pbiAvIFBsdWdpbnM8L2VtPikuPC9saT4KCQk8bGk+ Q29weSBhbmQgcGFzdGUgcmFoX2NvbW1lbnRfc3BhbSYjODIxNztzIHBsdWdpbiBwYWNrYWdl IGNvZGUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsZXIgdGV4dGFyZWEgYW5kIHJ1biB0aGUgYXV0 b21hdGVkIHNldHVwLjwvbGk+CgkJPGxpPkFmdGVyIHRoZSBzZXR1cCBpcyBjb21wbGV0ZWQs IGFjdGl2YXRlIHRoZSBwbHVnaW4gYW5kIHlvdSYjODIxNztyZSBzZXQuPC9saT4KCQk8bGk+ WW91IGNhbiBjdXN0b21pemUgdGhlIHBsdWdpbiYjODIxNztzIHNldHRpbmdzIGluIFByZWZl cmVuY2VzIHBhbmVsJiM4MjE3O3MgY29tbWVudCBzZWN0aW9uICg8ZW0+VGV4dHBhdHRlcm4g LyBBZG1pbiAvIFByZWZlcmVuY2VzPC9lbT4pLjwvbGk+Cgk8L29sPgoKCTxoMyBpZD0iY29u ZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbjwvaDM+CgoJPHA+T25jZSB0aGUgcGx1Z2luIGlz IGluc3RhbGxlZCwgeW91IGNhbiBmaW5kIHNldCBvZiBuZXcgcHJlZmVyZW5jZXMgaW4geW91 ciBUZXh0cGF0dGVybiBpbnN0YWxsYXRpb24mIzgyMTc7cyBQcmVmZXJlbmNlcyBwYW5lbC4g VG8gY29uZmlndXJlIHJhaF9jb21tZW50X3NwYW0mIzgyMTc7cyBwcmVmZXJlbmNlcyBuYXZp Z2F0ZSB0byA8ZW0+QWRtaW4vUHJlZmVyZW5jZXM8L2VtPiBhbmQgdGFrZSBhIGxvb2sgYXQg dGhlIDxlbT5Db21tZW50czwvZW0+IHNlY3Rpb24uIElmIHlvdSBoYXZlIGNvbW1lbnRpbmcg ZGlzYWJsZWQgb24geW91ciBzaXRlLCB5b3Ugd2lsbCBoYXZlIHRvIHRvZ2dsZSB0aGUgPGVt PkVuYWJsZSBjb21tZW50czwvZW0+IG9wdGlvbiB0byBzZWUgdGhlIHNlY3Rpb24uPC9wPgoK CTxoMyBpZD0icHJlZmVyZW5jZXMiPlByZWZlcmVuY2VzPC9oMz4KCgk8cD5Mb29raW5nIGF0 IHRoZSBQcmVmZXJlbmNlJiM4MjE3O3MgcGFuZWwmIzgyMTc7cyA8ZW0+Q29tbWVudHM8L2Vt PiBzZWN0aW9uLCB5b3Ugc2hvdWxkIHNlZSBzZXQgb2Ygb3B0aW9ucyB0aGF0IHdlcmVuJiM4 MjE3O3QgdGhlcmUgYmVmb3JlLiBUaG9zZSBhcmUgdGhlIG9wdGlvbnMgdGhhdCB0aGUgcGx1 Z2luIG9mZmVycy4gSW4gdG90YWwsIHRoZXJlIHNob3VsZCBiZSBhcm91bmQgMTggbmV3IHRv Z2dsZS1hYmxlIGl0ZW1zLiBUaGUgb2ZmZXJlZCBwbHVnaW4mIzgyMTc7cyBvcHRpb25zIGFy ZSBhcyBmb2xsb3dzLjwvcD4KCgk8cD48c3Ryb25nPldoYXQgdG8gZG8gY29tbWVudHMgZGV0 ZWN0ZWQgYXMgc3BhbT88L3N0cm9uZz4gb3B0aW9uIHNldHMgdGhlIGFjdGlvbiB0aGF0IGlz IHRha2VuIHRvd2FyZHMgdG8gY29tbWVudHMgZmxhZ2dlZCBhcyBhIHNwYW0uIFRoZXJlIGFy ZSB0aHJlZSBvcHRpb25zIHlvdSBjYW4gY2hvb3NlIGZyb20uIFRoZSBkZWZhdWx0IG9wdGlv biBpcyA8ZW0+U2F2ZSB0byBtb2RlcmF0aW9uIHF1ZXVlPC9lbT4gd2hpY2ggc2F2ZXMgdGhl IGNvbW1lbnRzIHRvIG1vZGVyYXRpb24gcXVldWUuIFRoZSBkZXRlY3RlZCBjb21tZW50cyB3 b24mIzgyMTc7dCBiZSB2aXNpYmxlIHRvIHB1YmxpYywgYnV0IGFyZSBzYXZlZCB0byBtb2Rl cmF0aW9uIHF1ZXVlLCBhbmQgY2FuIGJlIG1hbnVhbGx5IGNvbmZpcm1lZC4gVGhlIHNlY29u ZCBvcHRpb24gPGVtPklnbm9yZSwgZG8gbm90IHNhdmU8L2VtPiBibG9ja3MgdGhlIGNvbW1l bnRzLiBUaGUgY29tbWVudHMgd29uJiM4MjE3O3QgYmUgc2F2ZWQgYW5kIHRoZSB1c2VyIGlz IGdyZWV0ZWQgd2l0aCB0aGUgbWVzc2FnZSBzZXQgaW4gPGVtPk1lc3NhZ2UgZGlzcGxheWVk IHRvIHRoZSB1c2VyIHdoZW4gdGhlIGNvbW1lbnQgd2FzIGJsb2NrZWQ8L2VtPiBvcHRpb24u IFRoZSB0aGlyZCBhbmQgbGFzdCBvcHRpb24gPGVtPlNhdmUgYW5kIGZsYWcgYXMgc3BhbTwv ZW0+IHNhdmVzIHRoZSBkZXRlY3RlZCBjb21tZW50IHRvIHRoZSBkYXRhYmFzZSBhcyBzcGFt LjwvcD4KCgk8cD48c3Ryb25nPk1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHdoZW4g dGhlIGNvbW1lbnQgd2FzIGJsb2NrZWQ8L3N0cm9uZz4gc2V0cyB0aGUgbWVzc2FnZSB0aGF0 IGlzIHNob3duIHRvIHVzZXJzIHdoZW4gdGhlaXIgY29tbWVudCBpcyBibG9ja2VkIGJ5IHRo ZSBmaWx0ZXJzLiBUaGUgbWVzc2FnZSBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgcHJvdGVjdGlv biBtZXRob2QgYWJvdmUgaXMgc2V0IHRvIDxlbT5JZ25vcmUsIGRvIG5vdCBzYXZlPC9lbT4u IFdpdGggb3RoZXJzLCBUZXh0cGF0dGVybiYjODIxNztzIGJ1aWxkIGluIGxhbmd1YWdlIHN0 cmluZ3MgYXJlIHVzZWQuPC9wPgoKCTxwPjxzdHJvbmc+TGlzdCBvZiBzcGFtIHdvcmRzPC9z dHJvbmc+IHNldHMgd29yZHMvdGVybXMgdGhhdCBhcmUgY29uc2lkZXJlZCBhcyBzb21ldGhp bmcgdGhhdCBzcGFtIHdvdWxkIGNvbnRhaW4uIFNlcGFyYXRlIG11bHRpcGxlIHdvcmRzIHdp dGggY29tbWFzICg8Y29kZT4sPC9jb2RlPikuIFVzZWQgd29yZHMgYXJlIGluY2FzZS1zZW5z aXRpdmUuIEV4YW1wbGUgdmFsdWU6IDxjb2RlPnZpYWdyYSwgd2FyZXMsIHdvd2dvbGQ8L2Nv ZGU+LjwvcD4KCgk8cD48c3Ryb25nPlNlYXJjaCBzcGFtIHdvcmRzIGZyb20gZm9sbG93aW5n IGZpZWxkczwvc3Ryb25nPiBzZXRzIHdoaWNoIGZpZWxkcyBhcmUgZmlsdGVyZWQgZm9yIHNw YW0gd29yZHMuIFVzZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWVsZCBuYW1lcy4gQXZh aWxhYmxlIHZhbHVlcyBhcmUgPGNvZGU+bmFtZTwvY29kZT4sIDxjb2RlPmVtYWlsPC9jb2Rl PiwgPGNvZGU+d2ViPC9jb2RlPiBhbmQgPGNvZGU+bWVzc2FnZTwvY29kZT4uIERlZmF1bHQg b3B0aW9uIGlzIDxjb2RlPm5hbWUsIGVtYWlsLCB3ZWIsIG1lc3NhZ2U8L2NvZGU+LjwvcD4K Cgk8cD48c3Ryb25nPk1heGltdW0gbnVtYmVyIG9mIHNwYW0gd29yZHMgdW50aWwgdGhlIGNv bW1lbnQgaXMgY29uc2lkZXJlZCBhcyBzcGFtPC9zdHJvbmc+IHNldHMgdGhlIG1heGltdW0g bnVtYmVyIG9mIHNwYW0gd29yZHMgYSBjb21tZW50IGNhbiBoYXZlIHVudGlsIGl0JiM4MjE3 O3MgY29uc2lkZXJlZCBhcyBzcGFtLiBUaGUgbG93ZXIgdGhlIG51bWJlciwgdGhlIHN0cmlj dGVyIHRoZSBmaWx0ZXIgaXMuIFJlY29tbWVuZGVkIHZhbHVlIGlzIGJldHdlZW4gMiB0byAx MC48L3A+CgoJPHA+PHN0cm9uZz5OdW1iZXIgb2YgYWxsb3dlZCA8c3BhbiBjbGFzcz0iY2Fw cyI+VVJMPC9zcGFuPnM8L3N0cm9uZz4gb3B0aW9uIHNldHMgY29tbWVudCBtZXNzYWdlJiM4 MjE3O3MgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4gbGltaXQuIElmIGEgY29tbWVu dCBjb250YWlucyBtb3JlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+cyB0aGFuIHRo ZSBvcHRpb25zIGFsbG93cywgdGhlIGNvbW1lbnQgaXMgY29uc2lkZXJlZCBhcyBzcGFtLjwv cD4KCgk8cD48c3Ryb25nPk1pbmltdW0gbnVtYmVyIG9mIHdvcmRzPC9zdHJvbmc+IHJlcXVp cmVkIG1pbmltdW0gbGVuZ3RoIG9mIGNvbW1lbnQgbWVzc2FnZSBpbiB3b3Jkcy4gU2hvcnRl ciBtZXNzYWdlcyBhcmUgY29uc2lkZXJlZCBhcyBzcGFtLiBSZWNvbW1lbmRlZCB2YWx1ZSBp cyA8Y29kZT4xPC9jb2RlPiB0byA8Y29kZT4zPC9jb2RlPi48L3A+CgoJPHA+PHN0cm9uZz5N YXhpbXVtIG51bWJlciBvZiB3b3Jkczwvc3Ryb25nPiBtYXhpbXVtIGxlbmd0aCBvZiBjb21t ZW50IG1lc3NhZ2UgaW4gd29yZHMuIExvbmdlciBtZXNzYWdlcyBhcmUgY29uc2lkZXJlZCBh cyBzcGFtLiBOb3RlIHRoYXQgbWVzc2FnZSYjODIxNztzIHRvdGFsIHNpemUgaXMgbGltaXRl ZCB0byA2NTUzNSBieXRlcyAoZXF1YWxzIHRvIGFyb3VuZCA2NTUzNSA8c3BhbiBjbGFzcz0i Y2FwcyI+QVNDSUk8L3NwYW4+IGNoYXJhY3RlcnMpLjwvcD4KCgk8cD48c3Ryb25nPk1pbmlt dW0gbnVtYmVyIG9mIGNoYXJhY3RlcnM8L3N0cm9uZz4gcmVxdWlyZWQgbWluaW11bSBsZW5n dGggb2YgY29tbWVudCBpbiBjaGFyYWN0ZXJzLiBTaG9ydGVyIG1lc3NhZ2VzIGFyZSBjb25z aWRlcnMgYXMgc3BhbS4gUmVjb21tZW5kZWQgc2V0dGluZyBpcyA8Y29kZT4xPC9jb2RlPiB0 byA8Y29kZT4xMDwvY29kZT4uPC9wPgoKCTxwPjxzdHJvbmc+TWF4aW11bSBudW1iZXIgb2Yg Y2hhcmFjdGVyczwvc3Ryb25nPiBtYXhpbXVtIGxlbmd0aCBvZiBjb21tZW50IGluIGNoYXJh Y3RlcnMuIExvbmdlciBtZXNzYWdlcyBhcmUgY29uc2lkZXJzIGFzIHNwYW0uIE5vdGUgdGhh dCBtZXNzYWdlJiM4MjE3O3MgdG90YWwgc2l6ZSBpcyBsaW1pdGVkIHRvIDY1NTM1IGJ5dGVz LiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDY1NTM1IChlcXVhbHMgdG8gYXJvdW5k IDY1NTM1IDxzcGFuIGNsYXNzPSJjYXBzIj5BU0NJSTwvc3Bhbj4gY2hhcmFjdGVycykuPC9w PgoKCTxwPjxzdHJvbmc+TmFtZSBvZiBoaWRkZW4gc3BhbSB0cmFwIGZpZWxkPC9zdHJvbmc+ IGlmIHNldCwgYWRkcyBzcGFtIGhpZGRlbiBzcGFtIHRyYXAgdG8gdGhlIGNvbW1lbnQgZm9y bS4gVGhlIGZpZWxkIHdpbGwgYmUgaGlkZGVuIHdpdGggPHNwYW4gY2xhc3M9ImNhcHMiPkNT Uzwvc3Bhbj4sIGFuZCBpZiBpdCBpcyBmaWxsZWQsIHRoZSBjb21tZW50IGlzIGNvbnNpZGVy ZWQgYXMgc3BhbS4gRGVmYXVsdCBpcyA8ZW0+cGhvbmU8L2VtPi4gRW1wdHkgdGhlIGZpZWxk IHRvIGRpc2FibGUgdGhlIHNwYW0gdHJhcC48L3A+CgoJPHA+PHN0cm9uZz5Vc2UgcXVvdGFz LCBsaW1pdCB1c2VycyYjODIxNzsgY29tbWVudCBwb3N0aW5nIGFjdGl2aXR5Pzwvc3Ryb25n PiBpZiBzZXQgdG8gPGVtPlllczwvZW0+LCB1c2VycyBjb21tZW50IHBvc3RpbmcgYWN0aXZp dHkgaXMgbGltaXRlZC4gQ29tbWVudHMgZ29pbmcgb3ZlciB0aGUgcXVvdGEgYXJlIGNvbnNp ZGVyZWQgYXMgc3BhbS4gVXNlcnMgYXJlIGlkZW50aWZpZWQgYnkgSVAgYWRkcmVzc2VzLjwv cD4KCgk8cD48c3Ryb25nPlVzZXJzJiM4MjE3OyBjb21tZW50IHF1b3RhIGxpbWl0PC9zdHJv bmc+IHNldHMgdGhlIHVzZXImIzgyMTc7cyBxdW90YSBsaW1pdC4gRGVmYXVsdCBpcyB0ZW4g KDxjb2RlPjEwPC9jb2RlPikgY29tbWVudHMgcGVyIHVzZXIuPC9wPgoKCTxwPjxzdHJvbmc+ Q291bnQgdXNlcnMmIzgyMTc7IGNvbW1lbnRzIHRvd2FyZHMgcXVvdGEgaW48L3N0cm9uZz4g c2V0cyB3aGljaCBjb21tZW50cyBpbiB3aGljaCBhcnRpY2xlcyBhcmUgY291bnRlZCB0b3dh cmRzIHRoZSBxdW90YSBsaW1pdC4gQnkgZGVmYXVsdCB1c2VyJiM4MjE3O3MgY29tbWVudHMg aW4gYW55IGFydGljbGUgYXJlIHRha2VuIGludG8gY291bnQuIEF2YWlsYWJsZSBzZXR0aW5n cyBhcmUgPGVtPkluIGFsbCBhcnRpY2xlczwvZW0+LCBjb3VudHMgY29tbWVudHMgc2l0ZS13 aWRlLCBhbmQgPGVtPkluIGN1cnJlbnQgYXJ0aWNsZTwvZW0+IHdoaWNoIGNvdW50cyBvbmx5 IGNvbW1lbnRzIGluIHRoZSBjdXJyZW50IGFydGljbGUgdGhlIG5ldyBjb21tZW50IGlzIGJl aW5nIHBvc3RlZCB0by48L3A+CgoJPHA+PHN0cm9uZz5RdW90YSByZXNldHMgZXZlcnkgbnVt YmVyIG9mIHNlY29uZHM8L3N0cm9uZz4gc2V0cyB0aGUgdGltZXNwYW4gdXNlZCBpbiB0aGUg YWN0aXZpdHkgbGltaXRpbmcuIENvbW1lbnRzIG9sZGVyIHRoYW4gdGhpcyBhcmUgbm90IGNv dW50ZWQgdG93YXJkcyB0aGUgcXVvdGEgbGltaXQuIFRoZSB0aW1lIGlzIHNldCBpbiBzZWNv bmRzLiBGb3IgZXhhbXBsZSBzZXR0aW5nIHRoZSBvcHRpb24gdG8gPGNvZGU+NjAwPC9jb2Rl Piwgd291bGQgY291bnQgYW4gdXNlciYjODIxNztzIGNvbW1lbnRzIGZyb20gdGhlIGxhc3Qg dGVuIG1pbnV0ZXMsIGFuZCBpZiB0aGUgbnVtYmVyIGdvZXMgb3ZlciB0aGUgcXVvdGEsIHRo ZW4gdGhlIGNvbW1lbnQgaXMgY29uc2lkZXJlZCBhcyBzcGFtLjwvcD4KCgk8cD48c3Ryb25n PkNoZWNrIGVtYWlsJiM4MjE3O3MgPHNwYW4gY2xhc3M9ImNhcHMiPkROUzwvc3Bhbj4gcmVj b3Jkcz88L3N0cm9uZz4gaWYgc2V0IDxlbT5ZZXM8L2VtPiwgZW1haWwgYWRkcmVzcyYjODIx NzsgPHNwYW4gY2xhc3M9ImNhcHMiPkROUzwvc3Bhbj4gcmVjb3JkcyBhcmUgY2hlY2tlZC4g SWYgdGhlIGRvbWFpbiBpcyBmb3VuZCB0byBiZSBub24tZXhpc3RlbnQsIHRoZSBjb21tZW50 IGlzIGNvbnNpZGVyZWQgYXMgc3BhbS4gVGhlIGZlYXR1cmUgcmVxdWlyZXMgPGEgaHJlZj0i aHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmNoZWNrZG5zcnIucGhwIj5jaGVj a2Ruc3JyKCk8L2E+IGZ1bmN0aW9uIGFuZCB0aGUgc2VydmVyIG11c3QgYmUgYWxsb3dlZCB0 byBtYWtlIG91dGdvaW5nIGNvbm5lY3Rpb25zLjwvcD4KCgk8cD48c3Ryb25nPkNoZWNrIHRo ZSB0aW1lIHVzZXIgc3BlbnQgd3JpdGluZyB0aGUgY29tbWVudD88L3N0cm9uZz4gbWFrZXMg c3VyZSB0aGF0IHRoZSB1c2VyIHNwZW50IHNldCBhbW91bnQgb2YgdGltZSB3cml0aW5nIHRo ZSBjb21tZW50LiBJbnN0YW50IHBvc3RlcnMgd2lsbCBiZSB0cmVhdGVkIGFzIHNwYW1tZXJz LiBVc3VhbGx5IGl0JiM4MjE3O3MgcmVjb21tZW5kZWQgdG8ga2VlcCB0aGlzIGZlYXR1cmUg ZGlzYWJsZWQuIEl0IGNhbiBhY2NpZGVudGFsbHkgYmxvY2sgZmFzdCB3cml0ZXJzIGlmIHRo ZSByZXF1aXJlZCB0aW1lIGlzIHNldCB0byB0b28gaGlnaCwgYnV0IGl0IGNhbiBhbHNvIHN1 Y2Nlc3NmdWxseSBibG9jayBzcGFtIGJvdHMgd2hpY2ggbWlnaHQgdHJ5IHRvIHBvc3QgY29t bWVudHMgaW5zdGFudGx5LCB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIGNvbW1lbnQg Zm9ybS4gVGhlIHRpbWUgaXMgY291bnRlZCBmcm9tIHRoZSBpbml0aWFsIGFydGljbGUgcGFn ZSBsb2FkIHRvIHRoZSBjb21tZW50JiM4MjE3O3Mgc3VibWl0dGluZy48L3A+CgoJPHA+PHN0 cm9uZz5NaW5pbXVtIHRpbWUgcmVxdWlyZWQgdG8gYmUgc3BlbnQgd3JpdGluZyBhIGNvbW1l bnQ/PC9zdHJvbmc+IHNldHMgdGhlIHJlcXVpcmVkIGludGVyYWN0aW9uIHRpbWUgaW4gc2Vj b25kcy4gRGVmYXVsdCBpcyA8Y29kZT41PC9jb2RlPi4gSGlnaGVyIHZhbHVlcyBhcmUgbm90 IHJlY29tbWVuZGVkIHVzYWJpbGl0eS13aXNlLiBJZiB5b3Ugc2V0IHRoZSB2YWx1ZSBoaWdo ZXIgdGhhbiA1IHNlY29uZHMsIGNvbnNpZGVyIGFkZGluZyBKYXZhU2NyaXB0IGJhc2VkIGNv dW50ZXIgdG8gdGhlIGNvbW1lbnQgZm9ybSB0aGF0IGluZm9ybXMgdGhlIHVzZXJzIGhvdyBt dWNoIHRoZXkgaGF2ZSB0byB3YWl0LiBGb3IgY291bnRlcnMgSSByZWNvbW1lbmQgY2hlY2tp bmcgb3V0IDxhIGhyZWY9Imh0dHA6Ly9wbHVnaW5zLmpxdWVyeS5jb20vcGx1Z2luLXRhZ3Mv Y291bnRkb3duIj5qUXVlcnkmIzgyMTc7cyBwbHVnaW4gcmVwb3NpdG9yeTwvYT4uPC9wPgoK CTxoMyBpZD0iY2hhbmdlbG9nIj5DaGFuZ2Vsb2c8L2gzPgoKCTxwPjxzdHJvbmc+VmVyc2lv biAwLjY8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5GaXhlZDogQ29tbWVudCBxdW90YSBs aW1pdCYjODIxNztzIDxlbT5JbiBjdXJyZW50IGFydGljbGU8L2VtPiBvcHRpb24uIFByZXZp b3VzbHkgY291bnRpbmcgZGlkbiYjODIxNzt0IHdvcmsgd2hlbiB0aGUgPGVtPmluIGN1cnJl bnQgYXJ0aWNsZTwvZW0+IG9wdGlvbiB3YXMgc2VsZWN0ZWQuPC9saT4KCQk8bGk+QWRkZWQ6 IGxhbmd1YWdlIHN0cmluZyBzdXBwb3J0LiBUaGUgaW50ZXJmYWNlIG5vdyBpcyB0cmFuc2xh dGFibGUgdXNpbmcgVGV4dHBhY2tzLjwvbGk+CgkJPGxpPkFkZGVkOiBvcHRpb24gdG8gZnJl ZWx5IGFkZCBhbnkgZmllbGQgdG8gdGhlIGxpc3Qgb2YgdGhhdCBhcmUgY2hlY2tlZCBmb3Ig c3BhbSB3b3Jkcy4gVXNlZCBmaWVsZHMgbmVlZCB0byBiZSBkZWZpbmVkIGluIGdldENvbW1l bnQoKS48L2xpPgoJCTxsaT5JbXByb3ZlZDogPHNwYW4gY2xhc3M9ImNhcHMiPlVURjwvc3Bh bj4tOCBjb21wYXRpYmlsaXR5LiBUaGUgcGx1Z2luIG5vdyB1c2VzIG11bHRpYnl0ZSBzYWZl IG1ldGhvZHMgd2hlbiBwb3NzaWJsZS48L2xpPgoJCTxsaT5DaGFuZ2VkOiBNaWdyYXRlZCB0 aGUgcHJlZmVyZW5jZXMgZnJvbSBvd24gYWRtaW4taW50ZXJmYWNlIGFuZCBkYXRhYmFzZSB0 YWJsZSwgdG8gVGV4dHBhdHRlcm4mIzgyMTc7cyBuYXRpdmUgcHJlZmVyZW5jZXMgcGFuZWwu IFByZWZlcmVuY2VzIGFyZSBub3cgbG9jYXRlZCBhdCA8ZW0+QWRtaW4vUHJlZmVyZW5jZXM8 L2VtPiwgaW4gdGhlIDxlbT5Db21tZW50czwvZW0+IGdyb3VwLjwvbGk+CgkJPGxpPkNoYW5n ZWQ6IEZvciBuZXcgaW5zdGFsbGF0aW9ucyBwcm90ZWN0aW9uIG1ldGhvZCBub3cgZGVmYXVs dHMgdG8gPGVtPm1vZGVyYXRlPC9lbT4gaW5zdGVhZCBvZiA8ZW0+YmxvY2tpbmc8L2VtPi48 L2xpPgoJCTxsaT5DaGFuZ2VkOiBGb3IgbmV3IGluc3RhbGxhdGlvbnMsIGRlZmF1bHQgbWVz c2FnZSBsZW5ndGggbGltaXRzIGhhdmUgYmVlbiBpbmNyZWFzZWQsIGFuZCB0aGUgZXhhbXBs ZSBzcGFtIHdvcmRzIGhhdmUgYmVlbiByZW1vdmVkLjwvbGk+CgkJPGxpPk5vdyByZXF1aXJl cyBQSFA1IG9yIG5ld2VyLiA8c3BhbiBjbGFzcz0iY2FwcyI+UEhQPC9zcGFuPiB2ZXJzaW9u IDUuMyBvciBuZXdlciBpcyByZWNvbW1lbmRlZC4gPHNwYW4gY2xhc3M9ImNhcHMiPlBIUDwv c3Bhbj4gNCBzdXBwb3J0IGhhcyBiZWVuIGRyb3BwZWQuPC9saT4KCQk8bGk+Rm9yIGZ1bGwg ZmVhdHVyZSBjb21wYXRpYmlsaXR5IFRleHRwYXR0ZXJuIHZlcnNpb24gNC4yLjAgb3IgbmV3 ZXIgaXMgcmVxdWlyZWQuIFRleHRwYXR0ZXJuIHY0LjQuMSBvciBuZXdlciBpcyByZWNvbW1l bmRlZC48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC41PC9zdHJvbmc+PC9w PgoKCTx1bD4KCQk8bGk+QWRkZWQgb3B0aW9uIHRvIGNoZWNrIHRoZSB0aW1lIHRoZSB1c2Vy IHVzZWQgdG8gd3JpdGUgdGhlIGNvbW1lbnQgYW5kIGJsb2NrIGluc3RhbnQgcG9zdGVycy4g PGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lk PTM0NTM1Ij5BcyBkaXNjdXNzZWQgaGVyZTwvYT4uPC9saT4KCQk8bGk+UmVtb3ZlZCB1bnVz ZWQgPHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IGZpZWxkIGlkcyBhbmQgc2l6ZXMg ZnJvbSB0aGUgYmFja2VuZCBwYW5lLjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lv biAwLjQ8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5BZGRlZDogbm93IGFsc28gZmlsdGVy cyA8Y29kZT5odHRwczovLzwvY29kZT4sIDxjb2RlPmZ0cDovLzwvY29kZT4gYW5kIDxjb2Rl PmZ0cHM6Ly88L2NvZGU+IHByb3RvY29scywgbm90IGp1c3QgbGlua3Mgc3RhcnRpbmcgd2l0 aCA8Y29kZT5odHRwOi8vPC9jb2RlPi48L2xpPgoJCTxsaT5DaGFuZ2VkIHBvc3RpbmcgbGlt aXQgZmVhdHVyZSYjODIxNztzIG1heGltdW0gcG9zdCBzZXR0aW5nIGZyb20gPGVtPiYjODIy MDttb3JlIHRoYW4mIzgyMjE7PC9lbT4gdG8gPGVtPiYjODIyMDtlcXVhbHMgb3IgbW9yZSB0 aGFuJiM4MjIxOzwvZW0+LiBTZXR0aW5nIHRoZSB2YWx1ZSB0byB6ZXJvL29yIGxlYXZpbmcg aXQgZW1wdHkgd2lsbCBkaXNhYmxlIHRoZSBmZWF0dXJlLjwvbGk+CgkJPGxpPkNoYW5nZWQg ZmlsdGVyaW5nIG1ldGhvZCBmcm9tIDxlbT5hbmQ8L2VtPiB0byA8ZW0+b3I8L2VtPi4gVGhp cyBtZWFucywgd2hlbiB0aGUgY29tbWVudCBnZXRzIGZsYWdnZWQgYnkgYSBmaWx0ZXIgZm9y IHRoZSBmaXJzdCB0aW1lLCB0aGUgc3BhbSBmaWx0ZXJpbmcgcHJvY2VzcyBlbmRzIGluc3Rl YWQgZ29pbmcgdGhydSBhbGwgdGhlIGNoZWNrcyB3aGljaCBhcmUgbm8gbG9uZ2VyIG5lZWRl ZC4gR2l2ZXMgc2xpZ2h0IHBlcmZvcm1hbmNlIGJvb3N0LjwvbGk+CgkJPGxpPkZyb20gdmVy c2lvbiAwLjQgb253YXJkcyByZXF1aXJlcyA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFu PiA0LjAuNyBvciBuZXdlci48L2xpPgoJCTxsaT5Ob3cgcG9zdGluZyBsaW1pdHMgYXJlIGNv dW50ZWQgYmFyZWx5IGJ5IE15U1FMLiBObyBpbnZvbG1lbnQgb2YgPHNwYW4gY2xhc3M9ImNh cHMiPlBIUDwvc3Bhbj4uPC9saT4KCQk8bGk+TWVyZ2VkIDxjb2RlPnJhaF9jb21tZW50X3Nw YW1fdXJsY291bnQoKTwvY29kZT4gYW5kIDxjb2RlPnJhaF9jb21tZW50X3NwYW1fc3BhbXdv cmRzKCk8L2NvZGU+LjwvbGk+CgkJPGxpPk5vdyBhZG1pbiBwYW5lbCB1c2VzIHNhbWUgdHlw ZSBvZiBzbGlkaW5nIHBhbmVscyBhcyBzZWVuIGluIDxhIGhyZWY9Imh0dHA6Ly9yYWhmb3J1 bS5iaXovcGx1Z2lucy9yYWhfc2l0ZW1hcCI+cmFoX3NpdGVtYXA8L2E+LjwvbGk+Cgk8L3Vs PgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjM8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5B ZGRlZCBlbWFpbCA8c3BhbiBjbGFzcz0iY2FwcyI+RE5TPC9zcGFuPiB2YWxpZGF0aW9uLjwv bGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjIuMTwvc3Ryb25nPjwvcD4KCgk8 dWw+CgkJPGxpPk1hZGUgd3JpdGluZyBzcGFtIGRlZmluaXRpb24gbGlzdCBsZXNzIHN0cmlj dC4gTm93IGFsbG93cyBkb3VibGUgY29tbWFzLCBzcGFjZXMgYW5kIHNvIG9uLiA8YSBocmVm PSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTIxMjk0 MyNwMjEyOTQzIj5UaGFua3MgUm9iZXJ0LjwvYT48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25n PlZlcnNpb24gMC4yPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+QWRkZWQgdXNlciBiYXNl ZCB0aW1lIHJlbGF0aXZlIHBvc3RpbmcgbGltaXQuPC9saT4KCQk8bGk+Rml4ZWQgaGlkZGVu IHNwYW0gdHJhcCBpbnB1dCYjODIxNztzIGVzY2FwaW5nLjwvbGk+CgkJPGxpPkltcHJvdmVk IGNvbW1lbnQgcG9zdGluZyBldmFsdWF0aW5nIHNwZWVkLjwvbGk+CgkJPGxpPk1lcmdlZCBp bnN0YWxsLCBzYXZlLCB1cGRhdGUgYW5kIGZldGNoIGFycmF5cy48L2xpPgoJCTxsaT5JbXBy b3ZlZCBpbnN0YWxsYXRpb24gc2NyaXB0LjwvbGk+CgkJPGxpPk1lcmdlZCA8c3BhbiBjbGFz cz0iY2FwcyI+U1FMPC9zcGFuPiBxdWVyaWVzLjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+ VmVyc2lvbiAwLjEuMzwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPkZpeGVkIGZvcmdvdHRl biA8Y29kZT5zdHJ0b2xvd2VyKCk8L2NvZGU+LjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+ VmVyc2lvbiAwLjEuMjwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPlJlbW92ZWQgdHlwbyBm cm9tIGFkbWluIHBhbmVsOiAmIzgyMjA7RG9jdW1lbnRpb24mIzgyMjE7IHRvICYjODIyMDtE b2N1bWVudGF0aW9uJiM4MjIxOy48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24g MC4xPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+Rmlyc3QgcmVsZWFzZS48L2xpPgoJPC91 bD4iO3M6NDoiY29kZSI7czoxMjczOToiCSMjIyMjIyMjIyMjIyMjIyMjIwoJIwoJIwlyYWhf Y29tbWVudF9zcGFtLXBsdWdpbiBmb3IgVGV4dHBhdHRlcm4KCSMJdmVyc2lvbiAwLjYKCSMJ YnkgSnVra2EgU3ZhaG4KCSMJaHR0cDovL3JhaGZvcnVtLmJpegoJIwoJIwlDb3B5cmlnaHQg KEMpIDIwMTEgSnVra2EgU3ZhaG4gPGh0dHA6Ly9yYWhmb3J1bS5iaXo+CgkjCUxpY2Vuc2Vk IHVuZGVyIEdOVSBHZW5yYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCgkjCWh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKCSMKCSMjIyMjIyMjIyMjIyMjIyMj IyMKCglpZihAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsKCQlyYWhfY29tbWVudF9zcGFt X2luc3RhbGwoKTsKCQlhZGRfcHJpdnMoJ3BsdWdpbl9wcmVmcy5yYWhfY29tbWVudF9zcGFt JywnMSwyJyk7CgkJcmVnaXN0ZXJfY2FsbGJhY2soJ3JhaF9jb21tZW50X3NwYW1fcHJlZnMn LCdwbHVnaW5fcHJlZnMucmFoX2NvbW1lbnRfc3BhbScpOwoJCXJlZ2lzdGVyX2NhbGxiYWNr KCdyYWhfY29tbWVudF9zcGFtX2luc3RhbGwnLCdwbHVnaW5fbGlmZWN5Y2xlLnJhaF9jb21t ZW50X3NwYW0nKTsKCX0gZWxzZSB7CgkJcmVnaXN0ZXJfY2FsbGJhY2soJ3JhaF9jb21tZW50 X3NwYW1fcmVnaXN0ZXInLCdjb21tZW50LnNhdmUnKTsKCQlyZWdpc3Rlcl9jYWxsYmFjaygn cmFoX2NvbW1lbnRfc3BhbV9yZWdpc3RlcicsJ2NvbW1lbnQuZm9ybScpOwoJfQoKLyoqCglJ bnN0YWxsZXIKCUBwYXJhbSAkZXZlbnQgc3RyaW5nIEFkbWluLXNpZGUgZXZlbnQuCglAcGFy YW0gJHN0ZXAgc3RyaW5nIEFkbWluLXNpZGUsIHBsdWdpbi1saWZlY3ljbGUgc3RlcC4KKi8K CglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX2luc3RhbGwoJGV2ZW50PScnLCRzdGVwPScn KSB7CgoJCWlmKCRzdGVwID09ICdkZWxldGVkJykgewoJCQlzYWZlX2RlbGV0ZSgKCQkJCSd0 eHBfcHJlZnMnLAoJCQkJIm5hbWUgbGlrZSAncmFoX2NvbW1lbnRfc3BhbV8lJyIKCQkJKTsK CQkJcmV0dXJuOwoJCX0KCgkJZ2xvYmFsICRwcmVmcywgJHRleHRhcnJheTsKCgkJLyoKCQkJ TWFrZSBzdXJlIGxhbmd1YWdlIHN0cmluZ3MgYXJlIHNldAoJCSovCgoJCWZvcmVhY2goCgkJ CWFycmF5KAoJCQkJJ21ldGhvZCcgPT4gJ1doYXQgdG8gZG8gY29tbWVudHMgZGV0ZWN0ZWQg YXMgc3BhbT8nLAoJCQkJJ21ldGhvZF9ibG9jaycgPT4gJ0lnbm9yZSwgZG8gbm90IHNhdmUn LAoJCQkJJ21ldGhvZF9tb2RlcmF0ZScgPT4gJ1NhdmUgdG8gbW9kZXJhdGlvbiBxdWV1ZScs CgkJCQknbWV0aG9kX3NwYW0nID0+ICdTYXZlIGFuZCBmbGFnIGFzIHNwYW0nLAoJCQkJJ21l c3NhZ2UnID0+ICdNZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlciB3aGVuIHRoZSBjb21t ZW50IHdhcyBibG9ja2VkJywKCQkJCSdzcGFtd29yZHMnID0+ICdMaXN0IG9mIHNwYW0gd29y ZHMgKGNvbW1hLXNlcGFyYXRlZCknLAoJCQkJJ2NoZWNrJyA9PiAnU2VhcmNoIHNwYW0gd29y ZHMgZnJvbSBmb2xsb3dpbmcgZmllbGRzIChjb21tYS1zZXBhcmF0ZWQpJywKCQkJCSdtYXhz cGFtd29yZHMnID0+ICdNYXhpbXVtIG51bWJlciBvZiBzcGFtIHdvcmRzIHVudGlsIHRoZSBj b21tZW50IGlzIGNvbnNpZGVyZWQgYXMgc3BhbScsCgkJCQkndXJsY291bnQnID0+ICdOdW1i ZXIgb2YgYWxsb3dlZCBVUkxzJywKCQkJCSdtaW53b3JkcycgPT4gJ01pbmltdW0gbnVtYmVy IG9mIHdvcmRzJywKCQkJCSdtYXh3b3JkcycgPT4gJ01heGltdW0gbnVtYmVyIG9mIHdvcmRz JywKCQkJCSdtaW5jaGFycycgPT4gJ01pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMnLAoJ CQkJJ21heGNoYXJzJyA9PiAnTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycycsCgkJCQkn ZmllbGQnID0+ICdOYW1lIG9mIGhpZGRlbiBzcGFtIHRyYXAgZmllbGQgKGVtcHR5IHRvIGRp c2FibGUgdGhlIHRyYXApJywKCQkJCSdjb21tZW50dXNlJyA9PiAnVXNlIHF1b3RhcywgbGlt aXQgdXNlcnNcJyBjb21tZW50IHBvc3RpbmcgYWN0aXZpdHk/JywKCQkJCSdjb21tZW50bGlt aXQnID0+ICdVc2Vyc1wnIGNvbW1lbnQgcXVvdGEgbGltaXQnLAoJCQkJJ2NvbW1lbnRpbicg PT4gJ0NvdW50IHVzZXJzXCcgY29tbWVudHMgdG93YXJkcyBxdW90YSBpbicsCgkJCQknY29t bWVudGluX2FsbCcgPT4gJ0luIGFsbCBhcnRpY2xlcycsCgkJCQknY29tbWVudGluX3RoaXMn ID0+ICdJbiBjdXJyZW50IGFydGljbGUnLAoJCQkJJ2NvbW1lbnR0aW1lJyA9PiAnUXVvdGEg cmVzZXRzIGV2ZXJ5IG51bWJlciBvZiBzZWNvbmRzJywKCQkJCSdlbWFpbGRucycgPT4gJ0No ZWNrIGVtYWlsXCdzIEROUyByZWNvcmRzPycsCgkJCQkndXNlX3R5cGVfZGV0ZWN0JyA9PiAn Q2hlY2sgdGhlIHRpbWUgdXNlciBzcGVudCB3cml0aW5nIHRoZSBjb21tZW50PycsCgkJCQkn dHlwZV9pbnRlcnZhbCcgPT4gJ01pbmltdW0gdGltZSByZXF1aXJlZCB0byBiZSBzcGVudCB3 cml0aW5nIGEgY29tbWVudCAoaW4gc2Vjb25kcyk/JwoJCQkpIGFzICRzdHJpbmcgPT4gJHRy YW5zbGF0aW9uCgkJKSB7CgkJCSRuYW1lID0gc3RycG9zKCRzdHJpbmcsICdyYWhfJykgPT09 IDAgPyAkc3RyaW5nIDogJ3JhaF9jb21tZW50X3NwYW1fJy4kc3RyaW5nOwoKCQkJaWYoIWlz c2V0KCR0ZXh0YXJyYXlbJG5hbWVdKSkKCQkJCSR0ZXh0YXJyYXlbJG5hbWVdID0gJHRyYW5z bGF0aW9uOwoJCX0KCgkJJHZlcnNpb24gPSAnMC42JzsKCgkJJGN1cnJlbnQgPSBpc3NldCgk cHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fdmVyc2lvbiddKSA/IAoJCQkkcHJlZnNbJ3JhaF9j b21tZW50X3NwYW1fdmVyc2lvbiddIDogJ2Jhc2UnOwoKCQlpZigkdmVyc2lvbiA9PSAkY3Vy cmVudCkKCQkJcmV0dXJuOwoKCQkkaW5pID0gCgkJCWFycmF5KAoJCQkJJ21ldGhvZCcgPT4g J21vZGVyYXRlJywKCQkJCSdtZXNzYWdlJyA9PiAnWW91ciBjb21tZW50IHdhcyBtYXJrZWQg YXMgc3BhbS4nLAoJCQkJJ3NwYW13b3JkcycgPT4gJycsCgkJCQknbWF4c3BhbXdvcmRzJyA9 PiAzLAoJCQkJJ2NoZWNrJyA9PiAnbmFtZSwgZW1haWwsIHdlYiwgbWVzc2FnZScsCgkJCQkn dXJsY291bnQnID0+IDYsCgkJCQknbWlud29yZHMnID0+IDEsCgkJCQknbWF4d29yZHMnID0+ IDEwMDAwLAoJCQkJJ21pbmNoYXJzJyA9PiAxLAoJCQkJJ21heGNoYXJzJyA9PiA2NTUzNSwK CQkJCSdmaWVsZCcgPT4gJ3Bob25lJywKCQkJCSdjb21tZW50dXNlJyA9PiAxLAoJCQkJJ2Nv bW1lbnRsaW1pdCcgPT4gMTAsCgkJCQknY29tbWVudGluJyA9PiAndGhpcycsCgkJCQknY29t bWVudHRpbWUnID0+IDMwMCwKCQkJCSdlbWFpbGRucycgPT4gMCwKCQkJCSd1c2VfdHlwZV9k ZXRlY3QnID0+IDAsCgkJCQkndHlwZV9pbnRlcnZhbCcgPT4gNSwKCQkJCSdub25jZScgPT4g bWQ1KHVuaXFpZChyYW5kKCksdHJ1ZSkpCgkJCSk7CgoJCS8qCgkJCU1pZ3JhdGUgcHJlZmVy ZW5jZXMgZm9ybWF0IGZyb20gPD0gMC41IHRvID49IDAuNgoJCSovCgoJCWlmKCRjdXJyZW50 ID09ICdiYXNlJykgewoJCQlAJHJzID0gCgkJCQlzYWZlX3Jvd3MoCgkJCQkJJ25hbWUsIHZh bHVlJywKCQkJCQkncmFoX2NvbW1lbnRfc3BhbScsCgkJCQkJJzE9MScKCQkJCSk7CgoJCQlp ZighZW1wdHkoJHJzKSAmJiBpc19hcnJheSgkcnMpKSB7CgkJCQlmb3JlYWNoKCRycyBhcyAk YSkgewoJCQkJCWlmKCFpc3NldCgkaW5pWyRhWyduYW1lJ11dKSkKCQkJCQkJY29udGludWU7 CgkJCQkJCgkJCQkJaWYoaW5fYXJyYXkoJGFbJ25hbWUnXSwgYXJyYXkoCgkJCQkJCSd1c2Vf dHlwZV9kZXRlY3QnLAoJCQkJCQknZW1haWxkbnMnLAoJCQkJCQknY29tbWVudHVzZScsCgkJ CQkJKSkpCgkJCQkJCSRhWyd2YWx1ZSddID0gJGFbJ3ZhbHVlJ10gPT0gJ25vJyA/IDAgOiAx OwoJCQkJCQoJCQkJCSRpbmlbJGFbJ25hbWUnXV0gPSAkYVsndmFsdWUnXTsKCQkJCX0KCgkJ CQlAc2FmZV9xdWVyeSgKCQkJCQknRFJPUCBUQUJMRSBJRiBFWElTVFMgJy5zYWZlX3BmeCgn cmFoX2NvbW1lbnRfc3BhbScpCgkJCQkpOwoJCQl9CgkJfQoKCQkkcG9zaXRpb24gPSAyNTA7 CgoJCS8qCgkJCUFkZCBwcmVmZXJlbmNlIHN0cmluZ3MKCQkqLwoJCQoJCWZvcmVhY2goJGlu aSBhcyAkbmFtZSA9PiAkdmFsKSB7CgoJCQkkbiA9ICdyYWhfY29tbWVudF9zcGFtXycgLiAk bmFtZTsKCQkJCgkJCWlmKCFpc3NldCgkcHJlZnNbJG5dKSkgewoJCQkJCgkJCQlpZigkbmFt ZSA9PSAnbm9uY2UnKSB7CgkJCQkJc2V0X3ByZWYoJ3JhaF9jb21tZW50X3NwYW1fbm9uY2Un LCR2YWwsJ3JhaF9jc3BhbScsMiwnJywwKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCQoJ CQkJc3dpdGNoKCRuYW1lKSB7CgkJCQkJY2FzZSAnY29tbWVudHVzZSc6CgkJCQkJY2FzZSAn ZW1haWxkbnMnOgoJCQkJCWNhc2UgJ3VzZV90eXBlX2RldGVjdCc6CgkJCQkJCSRodG1sID0g J3llc25vcmFkaW8nOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdjb21tZW50aW4nOgoJCQkJ CQkkaHRtbCA9ICdyYWhfY29tbWVudF9zcGFtX3NlbGVjdF9jb21tZW50aW4nOwoJCQkJCQli cmVhazsKCQkJCQljYXNlICdtZXRob2QnOgoJCQkJCQkkaHRtbCA9ICdyYWhfY29tbWVudF9z cGFtX3NlbGVjdF9tZXRob2QnOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdzcGFtd29yZHMn OgoJCQkJCQkkaHRtbCA9ICdyYWhfY29tbWVudF9zcGFtX3RleHRhcmVhJzsKCQkJCQkJYnJl YWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJJGh0bWwgPSAndGV4dF9pbnB1dCc7CgkJCQl9CgoJ CQkJc2FmZV9pbnNlcnQoCgkJCQkJJ3R4cF9wcmVmcycsCgkJCQkJInByZWZzX2lkPTEsCgkJ CQkJbmFtZT0nIi5kb1NsYXNoKCRuKS4iJywKCQkJCQl2YWw9JyIuZG9TbGFzaCgkdmFsKS4i JywKCQkJCQl0eXBlPTAsCgkJCQkJZXZlbnQ9J2NvbW1lbnRzJywKCQkJCQlodG1sPSckaHRt bCcsCgkJCQkJcG9zaXRpb249Ii4kcG9zaXRpb24KCQkJCSk7CgkJCQkKCQkJCSRwcmVmc1sk bl0gPSAkdmFsOwoJCQl9CgkJCQoJCQkkcG9zaXRpb24rKzsKCQl9CgkJCgkJLyoKCQkJU2V0 IHZlcnNpb24KCQkqLwoJCQoJCXNldF9wcmVmKCdyYWhfY29tbWVudF9zcGFtX3ZlcnNpb24n LCR2ZXJzaW9uLCdyYWhfY3NwYW0nLDIsJycsMCk7Cgl9CgovKioKCUNoZWNrIGZvciBzcGFt CglAcGFyYW0gJGV2ZW50IHN0cmluZyBDYWxsYmFjayBldmVudC4KKi8KCglmdW5jdGlvbiBy YWhfY29tbWVudF9zcGFtX3JlZ2lzdGVyKCRldmVudD0nJykgewoJCWdsb2JhbCAkcHJlZnM7 CgoJCXJhaF9jb21tZW50X3NwYW1faW5zdGFsbCgpOwoKCQkvKgoJCQlBZGQgc3BhbSB0cmFw IGZpZWxkIHRvIHRoZSBjb21tZW50IGZvcm0KCQkqLwoKCQlpZigkZXZlbnQgPT0gJ2NvbW1l bnQuZm9ybScpIHsKCgkJCSRvdXQgPSBhcnJheSgpOwoKCQkJaWYoJHByZWZzWydyYWhfY29t bWVudF9zcGFtX3VzZV90eXBlX2RldGVjdCddKSB7CgkJCQkKCQkJCSRub25jZSA9IHBzKCdy YWhfY29tbWVudF9zcGFtX25vbmNlJyk7CgkJCQkkdGltZSA9IHBzKCdyYWhfY29tbWVudF9z cGFtX3RpbWUnKTsKCQkJCQoJCQkJaWYoISRub25jZSAmJiAhJHRpbWUpIHsKCQkJCQlAJHRp bWUgPSBzdHJ0b3RpbWUoJ25vdycpOwoJCQkJCSRub25jZSA9IG1kNSgkcHJlZnNbJ3JhaF9j b21tZW50X3NwYW1fbm9uY2UnXS4kdGltZSk7CgkJCQl9CgkJCQkKCQkJCSRvdXRbXSA9CgkJ CQkJaElucHV0KCdyYWhfY29tbWVudF9zcGFtX25vbmNlJywgJG5vbmNlKS4KCQkJCQloSW5w dXQoJ3JhaF9jb21tZW50X3NwYW1fdGltZScsICR0aW1lKTsKCQkJfQoKCQkJaWYoJHByZWZz WydyYWhfY29tbWVudF9zcGFtX2ZpZWxkJ10pCgkJCQkkb3V0W10gPSAKCQkJCQknPGRpdiBz dHlsZT0iZGlzcGxheTpub25lOyI+Jy4KCQkJCQkJZklucHV0KAoJCQkJCQkJJ3RleHQnLAoJ CQkJCQkJaHRtbHNwZWNpYWxjaGFycygkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fZmllbGQn XSksCgkJCQkJCQlwcygkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fZmllbGQnXSkKCQkJCQkJ KS4KCQkJCQknPC9kaXY+JzsKCgkJCXJldHVybiBuLmltcGxvZGUoJycsJG91dCkubjsKCQl9 CgoJCS8qCgkJCUNoZWNrIHNlbnQgY29tbWVudHMgYmVmb3JlIHNhdmluZwoJCSovCgoJCSRj b21tZW50ID0gbmV3IHJhaF9jb21tZW50X3NwYW0oKTsKCgkJaWYoJGNvbW1lbnQtPmlzX3Nw YW0oKSkgewoJCQkkZXZhbHVhdG9yID0mIGdldF9jb21tZW50X2V2YWx1YXRvcigpOwoJCQlz d2l0Y2goJHByZWZzWydyYWhfY29tbWVudF9zcGFtX21ldGhvZCddKSB7CgkJCQljYXNlICdi bG9jaycgOgoJCQkJCSRldmFsdWF0b3ItPmFkZF9lc3RpbWF0ZShSRUxPQUQsMSwgZ1R4dCgk cHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fbWVzc2FnZSddKSk7CgkJCQlicmVhazsKCQkJCWNh c2UgJ21vZGVyYXRlJyA6CgkJCQkJJGV2YWx1YXRvci0+YWRkX2VzdGltYXRlKE1PREVSQVRF LDAuNzUpOwoJCQkJYnJlYWs7CgkJCQlkZWZhdWx0IDoKCQkJCQkkZXZhbHVhdG9yLT5hZGRf ZXN0aW1hdGUoU1BBTSwwLjc1KTsKCQkJfQoJCX0KCX0KCi8qKgoJQ29udGFpbnMgYW50aS1z cGFtIHRvb2xzCiovCgpjbGFzcyByYWhfY29tbWVudF9zcGFtIHsKCglwcml2YXRlICRmb3Jt ID0gYXJyYXkoKTsKCi8qKgoJRmlsdGVyIGNvbW1lbnQKCUByZXR1cm4gYm9vbCBUUlVFIGlm IGNvbW1lbnQgaXMgZGV0ZWN0ZWQgYXMgc3BhbS4KKi8KCglwdWJsaWMgZnVuY3Rpb24gaXNf c3BhbSgpIHsKCQlnbG9iYWwgJHByZWZzOwoKCQkkdGhpcy0+Zm9ybSA9IGdldENvbW1lbnQo KTsKCgkJZm9yZWFjaChkb19saXN0KCRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9jaGVjaydd KSBhcyAkZikgCgkJCWlmKGlzc2V0KCR0aGlzLT5mb3JtWyRmXSkgJiYgIWlzc2V0KCRzdGFj a1skZl0pKQoJCQkJJHN0YWNrWyRmXSA9ICR0aGlzLT5mb3JtWyRmXTsKCgkJJHN0YWNrID0g aXNzZXQoJHN0YWNrKSA/IGltcGxvZGUoJyAnLCAkc3RhY2spIDogJyc7CgoJCXJldHVybiAK CQkJKAoJCQkJKAoJCQkJCSRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9maWVsZCddICYmIAoJ CQkJCXRyaW0ocHMoJHByZWZzWydyYWhfY29tbWVudF9zcGFtX2ZpZWxkJ10pKQoJCQkJKSB8 fAoJCQkJJHRoaXMtPndvcmRjb3VudCgkdGhpcy0+Zm9ybVsnbWVzc2FnZSddKSB8fAoJCQkJ JHRoaXMtPmNoYXJjb3VudCgkdGhpcy0+Zm9ybVsnbWVzc2FnZSddKSB8fAoJCQkJJHRoaXMt PnNlYXJjaCgKCQkJCQkkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fc3BhbXdvcmRzJ10sCgkJ CQkJJHN0YWNrLAoJCQkJCSRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9tYXhzcGFtd29yZHMn XQoJCQkJKSB8fAoJCQkJJHRoaXMtPnNlYXJjaCgKCQkJCQlhcnJheSgKCQkJCQkJJ2h0dHBz Oi8vJywKCQkJCQkJJ2h0dHA6Ly8nLAoJCQkJCQknZnRwOi8vJywKCQkJCQkJJ2Z0cHM6Ly8n CgkJCQkJKSwKCQkJCQkkdGhpcy0+Zm9ybVsnbWVzc2FnZSddLAoJCQkJCSRwcmVmc1sncmFo X2NvbW1lbnRfc3BhbV91cmxjb3VudCddCgkJCQkpIHx8CgkJCQkkdGhpcy0+Y29tbWVudHF1 b3RhKCkgfHwgCgkJCQkkdGhpcy0+dHlwZXNwZWVkKCkgfHwgCgkJCQkkdGhpcy0+ZW1haWxk bnMoKQoJCQkpOwoJfQoKLyoqCglGaW5kcyBuZWVkbGVzIGZyb20gaGF5c3RhY2suIElmICRt YXggaXMgZXhjZWVkZWQgcmV0dXJucyBUUlVFLgoJQHBhcmFtICRuZWVkbGUgbWl4ZWQgTmVl ZGxlIHRvIHNlYXJjaCBmb3IuIEVpdGhlciBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIG9yIGFy cmF5LgoJQHBhcmFtICRzdHJpbmcgc3RyaW5nIFN0cmluZyB0byBzZWFyY2guCglAcGFyYW0g JG1heCBpbnQgTWF4aW11bSBvY2N1cnJlbmNlcy4KCUBwYXJhbSAkY291bnQgaW50IFN0YXJ0 aW5nIHZhbHVlLgoJQHJldHVybiBib29sCiovCgoJcHJpdmF0ZSBmdW5jdGlvbiBzZWFyY2go JG5lZWRsZSwkc3RyaW5nLCRtYXg9MCwkY291bnQ9MCkgewoKCQlpZighJG5lZWRsZSB8fCAh JHN0cmluZykKCQkJcmV0dXJuIGZhbHNlOwoJCgkJLyoKCQkJR2V0IHRoZSBzdGF0dXMgb2Yg bXVsdGlieXRlIGZ1bmN0aW9ucwoJCSovCgoJCSRtYiA9IGZ1bmN0aW9uX2V4aXN0cygnbWJf c3RydG9sb3dlcicpICYmIGZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyX2NvdW50Jyk7CgoJ CS8qCgkJCUNvbnZlcnQgY2FzZXMsIHR1cm4gbmVlZGxlIHRvCgkJCWFycmF5IGlmIHN0cmlu ZyB3YXMgcHJvdmlkZWQKCQkqLwoKCQkkc3RyaW5nID0gJG1iID8gbWJfc3RydG9sb3dlcign ICcuJHN0cmluZy4nICcsJ1VURi04JykgOiBzdHJ0b2xvd2VyKCcgJy4kc3RyaW5nLicgJyk7 CgoJCWlmKCFpc19hcnJheSgkbmVlZGxlKSkgewoJCQkkbmVlZGxlID0gJG1iID8gbWJfc3Ry dG9sb3dlcigkbmVlZGxlLCdVVEYtOCcpIDogc3RydG9sb3dlcigkbmVlZGxlKTsKCQkJJG5l ZWRsZSA9IGRvX2xpc3QoJG5lZWRsZSk7CgkJfQoKCQlmb3JlYWNoKCRuZWVkbGUgYXMgJGZp bmQpCgkJCWlmKCFlbXB0eSgkZmluZCkpCgkJCQkkY291bnQgKz0gJG1iID8gbWJfc3Vic3Ry X2NvdW50KCRzdHJpbmcsJGZpbmQsJ1VURi04JykgOiBzdWJzdHJfY291bnQoJHN0cmluZywk ZmluZCk7CgoJCWlmKCRjb3VudCA+ICRtYXgpCgkJCXJldHVybiB0cnVlOwoJfQoKLyoqCglD b3VudCBjaGFyYWN0ZXJzLCByZXR1cm4gVFJVRSBpZiBleGNlZWRzIHRoZSBsaW1pdC4KCUBw YXJhbSAkc3RyaW5nIHN0cmluZyBTdHJpbmcgdG8gY291bnQKCUByZXR1cm4gYm9vbAoqLwoK CXByaXZhdGUgZnVuY3Rpb24gY2hhcmNvdW50KCRzdHJpbmcpIHsKCQlnbG9iYWwgJHByZWZz OwoKCQlpZighJHN0cmluZyB8fCAoISRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9taW5jaGFy cyddICYmICEkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fbWF4Y2hhcnMnXSkpCgkJCXJldHVy biBmYWxzZTsKCgkJJGNoYXJzID0gZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSA/IG1i X3N0cmxlbigkc3RyaW5nLCAnVVRGLTgnKSA6IHN0cmxlbigkc3RyaW5nKTsKCQkKCQlpZigK CQkJKCRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9tYXhjaGFycyddICYmICRwcmVmc1sncmFo X2NvbW1lbnRfc3BhbV9tYXhjaGFycyddIDwgJGNoYXJzKSB8fCAKCQkJKCRwcmVmc1sncmFo X2NvbW1lbnRfc3BhbV9taW5jaGFycyddICYmICRjaGFycyA8PSAkcHJlZnNbJ3JhaF9jb21t ZW50X3NwYW1fbWluY2hhcnMnXSkKCQkpCgkJCXJldHVybiB0cnVlOwoJfQoKLyoqCglDb3Vu dCB3b3JkcyBpbiBzdHJpbmcsIHJldHVybiBUUlVFIGlmIGV4ZWVkcyB0aGUgbGltaXQuCglA cGFyYW0gJHN0cmluZyBzdHJpbmcgU3RyaW5nIHRvIGNvdW50CglAcmV0dXJuIGJvb2wKKi8K Cglwcml2YXRlIGZ1bmN0aW9uIHdvcmRjb3VudCgkc3RyaW5nKSB7CgkJZ2xvYmFsICRwcmVm czsKCQkKCQlpZighJHN0cmluZyB8fCAoISRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9tYXh3 b3JkcyddICYmICEkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fbWlud29yZHMnXSkpCgkJCXJl dHVybiBmYWxzZTsKCQkKCQkkd29yZHMgPSBjb3VudChleHBsb2RlKGNocigzMiksJHN0cmlu ZykpOwoJCQoJCWlmKAoJCQkoJHByZWZzWydyYWhfY29tbWVudF9zcGFtX21heHdvcmRzJ10g JiYgJHByZWZzWydyYWhfY29tbWVudF9zcGFtX21heHdvcmRzJ10gPCAkd29yZHMpIHx8IAoJ CQkoJHByZWZzWydyYWhfY29tbWVudF9zcGFtX21pbndvcmRzJ10gJiYgJHdvcmRzIDw9ICRw cmVmc1sncmFoX2NvbW1lbnRfc3BhbV9taW53b3JkcyddKQoJCSkKCQkJcmV0dXJuIHRydWU7 Cgl9CgovKioKCUxpbWl0IHVzZXIncyBjb21tZW50IHBvc3RpbmcuCglAcmV0dXJuIGJvb2wg VFJVRSB3aGVuIGFjdGl2aXR5IGV4Y2VlZHMgcXVvdGEuCiovCgoJcHJpdmF0ZSBmdW5jdGlv biBjb21tZW50cXVvdGEoKSB7CgkJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHByZWZzOwoJCQoJ CWlmKAoJCQkhJHByZWZzWydyYWhfY29tbWVudF9zcGFtX2NvbW1lbnR1c2UnXSB8fCAKCQkJ ISRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9jb21tZW50bGltaXQnXSB8fAoJCQkoJHByZWZz WydyYWhfY29tbWVudF9zcGFtX2NvbW1lbnRpbiddID09ICd0aGlzJyAmJiAhaXNzZXQoJHRo aXNhcnRpY2xlWyd0aGlzaWQnXSkpIHx8CgkJCSgoJGlwID0gZG9TbGFzaChyZW1vdGVfYWRk cigpKSkgJiYgISRpcCkKCQkpCgkJCXJldHVybiBmYWxzZTsKCQkKCQkkcHJlcmlvZCA9IChp bnQpICRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9jb21tZW50dGltZSddOwoJCQoJCWlmKAoJ CQlzYWZlX2NvdW50KAoJCQkJJ3R4cF9kaXNjdXNzJywKCQkJCSJpcD0nJGlwJyBhbmQgVU5J WF9USU1FU1RBTVAocG9zdGVkKSA+IChVTklYX1RJTUVTVEFNUChub3coKSktJHByZXJpb2Qp Ii4KCQkJCSgkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fY29tbWVudGluJ10gPT0gJ3RoaXMn ID8gIiBhbmQgcGFyZW50aWQ9JyIuZG9TbGFzaCgkdGhpc2FydGljbGVbJ3RoaXNpZCddKS4i JyIgOiAnJykKCQkJKSA+PSAkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fY29tbWVudGxpbWl0 J10KCQkpCgkJCXJldHVybiB0cnVlOwoJfQoKLyoqCglDaGVjayB0eXBpbmcgc3BlZWQsIG1h a2Ugc3VyZSB0aGUgdXNlciBmaWRsZWQgd2l0aCB0aGUgY29tbWVudCBmb3JtLgoJQHJldHVy biBib29sIFRSVUUgd2hlbiBjb21tZW50IGlzIGNvbnNpZGVyZWQgYXMgc3BhbS4KKi8KCglw cml2YXRlIGZ1bmN0aW9uIHR5cGVzcGVlZCgpIHsKCQlnbG9iYWwgJHByZWZzOwoKCQlpZigh JHByZWZzWydyYWhfY29tbWVudF9zcGFtX3VzZV90eXBlX2RldGVjdCddKQoJCQlyZXR1cm4g ZmFsc2U7CgkJCgkJJHR5cGVfaW50ZXJ2YWwgPSAoaW50KSAkcHJlZnNbJ3JhaF9jb21tZW50 X3NwYW1fdHlwZV9pbnRlcnZhbCddOwoJCSR0aW1lID0gKGludCkgcHMoJ3JhaF9jb21tZW50 X3NwYW1fdGltZScpOwoKCQlAJGJhcnJpZXIgPSBzdHJ0b3RpbWUoJ25vdycpLSR0eXBlX2lu dGVydmFsOwoJCSRtZDUgPSBtZDUoJHByZWZzWydyYWhfY29tbWVudF9zcGFtX25vbmNlJ10u JHRpbWUpOwoKCQlpZigkbWQ1ICE9IHBzKCdyYWhfY29tbWVudF9zcGFtX25vbmNlJykgfHwg JHRpbWUgPj0gJGJhcnJpZXIpCgkJCXJldHVybiB0cnVlOwoJfQoKLyoqCglDaGVjayBETlMg cmVjb3JkcyBvZiB0aGUgZW1haWwgYWRkcmVzcy4KCUByZXR1cm4gYm9vbCBUUlVFIHdoZW4g Y29tbWVudCBpcyBjb25zaWRlcmVkIGFzIHNwYW0uCiovCgoJcHJpdmF0ZSBmdW5jdGlvbiBl bWFpbGRucygpIHsKCQlnbG9iYWwgJHByZWZzOwoJCQoJCWlmKCEkcHJlZnNbJ3JhaF9jb21t ZW50X3NwYW1fZW1haWxkbnMnXSB8fCAhdHJpbSgkdGhpcy0+Zm9ybVsnZW1haWwnXSkpCgkJ CXJldHVybiBmYWxzZTsKCQkKCQkkZG9tYWluID0gdHJpbShlbmQoZXhwbG9kZSgnQCcsJHRo aXMtPmZvcm1bJ2VtYWlsJ10pKSk7CgoJCWlmKCEkZG9tYWluKQoJCQlyZXR1cm4gdHJ1ZTsK CQkKCQlpZighZnVuY3Rpb25fZXhpc3RzKCdjaGVja2Ruc3JyJykpCgkJCXJldHVybiBmYWxz ZTsKCQkKCQlpZighKGNoZWNrZG5zcnIoJGRvbWFpbiwnTVgnKSB8fCBjaGVja2Ruc3JyKCRk b21haW4sJ0EnKSkpCgkJCXJldHVybiB0cnVlOwoJfQp9CgovKioKCVNwYW0gcHJvdGVjdGlv biBtZXRob2Qgb3B0aW9uCglAcGFyYW0gJG5hbWUgc3RyaW5nIEZpZWxkIG5hbWUuCglAcGFy YW0gJHZhbCBpbnQgQ3VycmVudCB2YWx1ZS4KCUByZXR1cm4gc3RyaW5nIEhUTUwgc2VsZWN0 IGZpZWxkLgoqLwoKCWZ1bmN0aW9uIHJhaF9jb21tZW50X3NwYW1fc2VsZWN0X21ldGhvZCgk bmFtZSwgJHZhbCkgewoKCQlmb3JlYWNoKGFycmF5KCdibG9jaycsICdtb2RlcmF0ZScsICdz cGFtJykgYXMgJG9wdCkKCQkJJG91dFskb3B0XSA9IGdUeHQoJ3JhaF9jb21tZW50X3NwYW1f bWV0aG9kXycuJG9wdCk7CgoJCXJldHVybiBzZWxlY3RJbnB1dCgkbmFtZSwgJG91dCwgJHZh bCwgJycsICcnLCAkbmFtZSk7Cgl9CgovKioKCUNvbW1lbnQgY291bnQgcmFuZ2Ugb3B0aW9u CglAcGFyYW0gJG5hbWUgc3RyaW5nIEZpZWxkIG5hbWUuCglAcGFyYW0gJHZhbCBpbnQgQ3Vy cmVudCB2YWx1ZS4KCUByZXR1cm4gc3RyaW5nIEhUTUwgc2VsZWN0IGZpZWxkLgoqLwoKCWZ1 bmN0aW9uIHJhaF9jb21tZW50X3NwYW1fc2VsZWN0X2NvbW1lbnRpbigkbmFtZSwgJHZhbCkg ewoKCQlmb3JlYWNoKGFycmF5KCdhbGwnLCAndGhpcycpIGFzICRvcHQpCgkJCSRvdXRbJG9w dF0gPSBnVHh0KCdyYWhfY29tbWVudF9zcGFtX2NvbW1lbnRpbl8nLiRvcHQpOwoJCQoJCXJl dHVybiBzZWxlY3RJbnB1dCgkbmFtZSwgJG91dCwgJHZhbCwgJycsICcnLCAkbmFtZSk7Cgl9 CgovKioKCVRleHRhcmVhIGZvciBwcmVmZXJlbmNlcyBwYW5lbAoJQHBhcmFtICRuYW1lIHN0 cmluZyBGaWVsZCBuYW1lLgoJQHBhcmFtICR2YWwgaW50IEN1cnJlbnQgdmFsdWUuCglAcmV0 dXJuIHN0cmluZyBIVE1MIHRleHRhcmVhLgoqLwoKCWZ1bmN0aW9uIHJhaF9jb21tZW50X3Nw YW1fdGV4dGFyZWEoJG5hbWUsICR2YWwpIHsKCQlyZXR1cm4gdGV4dF9hcmVhKCRuYW1lLCAx MDAsIDMwMCwgJHZhbCwgJG5hbWUpOwoJfQoKLyoqCglSZWRpcmVjdCB0byBwcmVmZXJlbmNl cyBwYW5lbAoqLwoKCWZ1bmN0aW9uIHJhaF9jb21tZW50X3NwYW1fcHJlZnMoKSB7CgkJaGVh ZGVyKCdMb2NhdGlvbjogP2V2ZW50PXByZWZzI3ByZWZzLXJhaF9jb21tZW50X3NwYW1fbWV0 aG9kJyk7CgkJZWNobyAKCQkJJzxwPicubi4KCQkJJwk8YSBocmVmPSI/ZXZlbnQ9cHJlZnMj cHJlZnMtcmFoX2NvbW1lbnRfc3BhbV9tZXRob2QiPicuZ1R4dCgnY29udGludWUnKS4nPC9h Picubi4KCQkJJzwvcD4nOwoJfSI7czo0OiJ0eXBlIjtzOjE6IjEiO3M6NToib3JkZXIiO3M6 MToiNSI7czo1OiJmbGFncyI7czoxOiIzIjtzOjM6Im1kNSI7czozMjoiOWIxNmY2ODJiYmUy M2U3MTY5OGRmMzhiM2YzNTJkMjYiO3M6NDoibmFtZSI7czoxNjoicmFoX2NvbW1lbnRfc3Bh bSI7czo3OiJ2ZXJzaW9uIjtzOjM6IjAuNiI7fQ==