# Name: rah_plugin_installer v0.3 # Type: Admin/Client side plugin # Plugin installer for rah-prefixed plugins. # 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 IjtzOjE5OiJodHRwOi8vcmFoZm9ydW0uYml6IjtzOjExOiJkZXNjcmlwdGlvbiI7czo0Mjoi UGx1Z2luIGluc3RhbGxlciBmb3IgcmFoLXByZWZpeGVkIHBsdWdpbnMuIjtzOjQ6ImhlbHAi O3M6MzQ2ODoiCTxoMT5yYWhfcGx1Z2luX2luc3RhbGxlcjwvaDE+CgoJPHA+SW5zdGFsbCBh bmQgdXBkYXRlIHJhaC1wbHVnaW5zIGRpcmVjdGx5IGZyb20geW91ciA8YSBocmVmPSJodHRw Oi8vd3d3LnRleHRwYXR0ZXJuLmNvbSI+VGV4dHBhdHRlcm48L2E+IGluc3RhbGxhdGlvbi4g Q2xpY2sgYW5kIGluc3RhbGwsIHJlYWR5IHRvIGdvLjwvcD4KCgk8dWw+CgkJPGxpPlZlcnNp b246IDAuMzwvbGk+CgkJPGxpPlVwZGF0ZWQ6IDIwMTEvMDcvMTkgMTI6MDUgUE0gPHNwYW4g Y2xhc3M9ImNhcHMiPlVUQzwvc3Bhbj48L2xpPgoJPC91bD4KCgk8aDM+VGFibGUgb2YgQ29u dGVudHM8L2gzPgoKCTx1bD4KCQk8bGk+PGEgaHJlZj0iI2ludHJvLWFuZC1kZXNjcmlwdGlv biI+SW50cm8gYW5kIGRlc2NyaXB0aW9uPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNsaXN0 LW9mLWZlYXR1cmVzIj5MaXN0IG9mIGZlYXR1cmVzPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9 IiNyZXF1aXJlbWVudHMiPlJlcXVpcmVtZW50czwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIj aW5zdGFsbGF0aW9uLWFuZC11c2FnZSI+SW5zdGFsbGF0aW9uIGFuZCB1c2FnZTwvYT48L2xp PgoJPC91bD4KCgk8aDMgaWQ9Imxpc3Qtb2YtZmVhdHVyZXMiPkxpc3Qgb2YgZmVhdHVyZXM8 L2gzPgoKCTx1bD4KCQk8bGk+U2ltcGxlIGluc3RhbGw6IGp1c3QgcnVuIHRoZSBhdXRvbWF0 aWMgcGx1Z2luIGluc3RhbGwuIE5vIG5lZWQgdG8gdXBsb2FkIGFueSBmaWxlcyBub3Igc2V0 IHBlcm1pc3Npb25zLjwvbGk+CgkJPGxpPkRvd25sb2FkIGFuZCBpbnN0YWxsIHJhaC1mYW1p bHkgcGx1Z2luIGRpcmVjdGx5IGZyb20geW91ciBUZXh0cGF0dGVybiBiYWNrZW5kLjwvbGk+ CgkJPGxpPlNlcnZlciBzaWRlIGNhY2hpbmcgb2YgdGhlIHVwZGF0ZSBsaXN0LjwvbGk+CgkJ PGxpPkFkbWluIHBhbmVsIHVuZGVyIFRleHRwYXR0ZXJuICZndDsgRXh0ZW5zaW9ucyAmZ3Q7 IDxlbT5QbHVnaW4gSW5zdGFsbGVyPC9lbT4uPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJyZXF1 aXJlbWVudHMiPlJlcXVpcmVtZW50czwvaDM+CgoJPHA+UmFoX3BsdWdpbl9pbnN0YWxsZXIm IzgyMTc7cyBtaW5pbXVtIHJlcXVpcmVtZW50OjwvcD4KCgk8dWw+CgkJPGxpPlRleHRwYXR0 ZXJuIDQuNC4xKzwvbGk+CgkJPGxpPjxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+IDQu My4wKwoJPHVsPgoJCTxsaT48YSBocmVmPSJodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vYm9v ay5jdXJsLnBocCI+Y1VSTDwvYT4gbGlicmFyeSBvciA8YSBocmVmPSJodHRwOi8vcGhwLm5l dC9tYW51YWwvZW4vZmlsZXN5c3RlbS5jb25maWd1cmF0aW9uLnBocCI+YWxsb3dfdXJsX2Zv cGVuPC9hPiBzZXQgdHJ1ZTwvbGk+CgkJPGxpPkludGVybmV0IGNvbm5lY3Rpb24gZm9yIGNv bW11bmljYXRpb25zIHdpdGggdGhlIHNlcnZlcjwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPk9w dGlvbmFsOiBabGliIGxpYnJhcnkuPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJpbnN0YWxsYXRp b24tYW5kLXVzYWdlIj5JbnN0YWxsYXRpb24gYW5kIHVzYWdlPC9oMz4KCgk8cD5UaGUgZ2Vu ZXJhbCBiZWhhdmlvciBzdGFuZHM6IHBhc3RlIHBsdWdpbiBjb2RlIHRvIHRoZSBwbHVnaW4g aW5zdGFsbGVyIHRleHRhcmVhIGFuZCBydW4gdGhlIGF1dG9tYXRpYyBzZXR1cC4gVGhlbiBq dXN0IGFjdGl2YXRlIHRoZSBwbHVnaW4gYW5kIHlvdSBhcmUgcmVhZHkgdG8gdXNlIHRoZSBm dW5jdGlvbmFsaXRpZXMuPC9wPgoKCTxwPllvdSBjYW4gZG93bmxvYWQgYW5kIGluc3RhbGwg cmFoLXBsdWdpbnMgZnJvbSBUZXh0cGF0dGVybiAmZ3Q7IEV4dGVuc2lvbnMgJmd0OyBQbHVn aW4gSW5zdGFsbGVyLjwvcD4KCgk8aDMgaWQ9ImNoYW5nZWxvZyI+Q2hhbmdlbG9nPC9oMz4K Cgk8cD48c3Ryb25nPlZlcnNpb24gMC4zPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+Q29t cGF0aWJpbGl0eSB3aXRoIFRleHRwYXR0ZXJuIHY0LjQuMS48L2xpPgoJCTxsaT5BZGRlZDog U3VwcG9ydCBmb3IgY1VSTCBsaWJyYXJ5IGFuZCBwcmVmZXJzIGl0IGlmIGluc3RhbGxlZC4g SWYgbm90IGluc3RhbGxlZCwgdXNlcyByZWd1bGFyIGZpbGUgZnVuY3Rpb25zIGFzIGZhbGxi YWNrLjwvbGk+CgkJPGxpPkFkZGVkOiBMb2NhbGl6YXRpb24gYW5kIGxhbmd1YWdlIHN0cmlu ZyBzdXBwb3J0LiBUZXh0UGFja3MgY2FuIGJlIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBhZG1p biBpbnRlcmZhY2UuPC9saT4KCQk8bGk+QWRkZWQ6IEJ1aWxkIGluIHVuaW5zdGFsbGVyLjwv bGk+CgkJPGxpPkNoYW5nZWQ6IE1vdmVkIHRoZSBwcmVmZXJlbmNlIHN0cmluZ3MgdG8gVGV4 dHBhdHRlcm4mIzgyMTc7cyBjb3JlIHR4cF9wcmVmcyB0YWJsZS48L2xpPgoJCTxsaT5DaGFu Z2VkOiBIVE1MNSByZWFkeSBtYXJrdXAsIGFkZGVkIDxjb2RlPiZsdDt0Ym9keSZndDs8L2Nv ZGU+IGFuZCA8Y29kZT4mbHQ7dGhlYWQmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byB0aGUgPHNw YW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IHRhYmxlIGFuZCByZW1vdmVkIGlubGluZSBz dHlsZXMuPC9saT4KCQk8bGk+SW1wcm92ZWQ6IE5ldyB1cGRhdGUgZmlsZSBmb3JtYXQuIFRo ZSBzeW50YXggaXMgc2ltaWxhciB0byBUZXh0cGF0dGVybiYjODIxNztzIGxhbmd1YWdlIGZp bGVzLjwvbGk+CgkJPGxpPkltcHJvdmVkOiBBZGRpdGlvbmFsIHZhbGlkYXRpb24gd2hlbiBk b3dubG9hZGluZyB1cGRhdGUgZmlsZXMuPC9saT4KCQk8bGk+SW1wcm92ZWQ6IE5vdyB1cGRh dGUgZmlsZXMgYXJlIHBhcnNlZCBhbmQgaW5zZXJ0ZWQgdG8gZGF0YWJhc2UgYXMgaW5kaXZp ZHVhbCByb3dzIGluc3RlYWQgb2YgY2FjaGVkIGFuZCBwYXJzZWQgb24gZXZlcnkgcGFnZSBy ZXF1ZXN0LiBBbGxvd3MgZnV0dXJlIGV4cGFuc2lvbnMuPC9saT4KCQk8bGk+Tm93IHJlcXVp cmVzIFRleHRwYXR0ZXJuIHY0LjQuMSBvciBuZXdlci48L2xpPgoJPC91bD4KCgk8cD48c3Ry b25nPlZlcnNpb24gMC4yPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+QWRkZWQgbW9yZSB2 YWxpZGl0eSBhbmQgZXJyb3IgY2hlY2tzLjwvbGk+CgkJPGxpPkFkZGVkIHRpbWVvdXQgc3Vw cG9ydCBmb3IgdXBkYXRlIGRvd25sb2Fkcy4gMyBzZWNvbmRzIGZvciB1cGRhdGUgY2hlY2tz IGFuZCAxMCBzZWNvbmRzIGZvciBhY3R1YWwgZmlsZXMuPC9saT4KCQk8bGk+QWRkZWQgb3B0 aW9uIHRvIHR1cm4gYXV0b21hdGljLXVwZGF0ZXMgb2ZmLjwvbGk+CgkJPGxpPkNsZWFuZWQg dGhlIGFkbWluIHBhbmVsLjwvbGk+CgkJPGxpPkZpeGVkIG1hbnVhbCB1cGRhdGUgY2hlY2su PC9saT4KCQk8bGk+Rml4ZWQgY29uZmxpY3RzIHdpdGggb3RoZXIgZXh0ZW5zaW9uIHRoYXQg aW5jbHVkZWQgPGNvZGU+dHhwX3BsdWdpbi5waHA8L2NvZGU+LjwvbGk+Cgk8L3VsPgoKCTxw PjxzdHJvbmc+VmVyc2lvbiAwLjE8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5Jbml0aWFs IHJlbGVhc2UuPC9saT4KCTwvdWw+IjtzOjQ6ImNvZGUiO3M6MTM1ODM6IgkjIyMjIyMjIyMj IyMjIyMjIyMKCSMKCSMJcmFoX3BsdWdpbl9pbnN0YWxsZXItcGx1Z2luIGZvciBUZXh0cGF0 dGVybgoJIwl2ZXJzaW9uIDAuMwoJIwlieSBKdWtrYSBTdmFobgoJIwlodHRwOi8vcmFoZm9y dW0uYml6CgkjCgkjCUNvcHlyaWdodCAoQykgMjAxMSBKdWtrYSBTdmFobiA8aHR0cDovL3Jh aGZvcnVtLmJpej4KCSMJTGljZW5zZWQgdW5kZXIgR05VIEdlbnJhbCBQdWJsaWMgTGljZW5z ZSB2ZXJzaW9uIDIKCSMJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRt bAoJIwoJIyMjIyMjIyMjIyMjIyMjIyMjCgoJaWYoQHR4cGludGVyZmFjZSA9PSAnYWRtaW4n KSB7CgkJYWRkX3ByaXZzKCdyYWhfcGx1Z2luX2luc3RhbGxlcicsJzEnKTsKCQlhZGRfcHJp dnMoJ3BsdWdpbl9wcmVmcy5yYWhfcGx1Z2luX2luc3RhbGxlcicsJzEsMicpOwoJCXJlZ2lz dGVyX3RhYignZXh0ZW5zaW9ucycsJ3JhaF9wbHVnaW5faW5zdGFsbGVyJyxnVHh0KCdyYWhf cGx1Z2luX2luc3RhbGxlcicpID09ICdyYWhfcGx1Z2luX2luc3RhbGxlcicgPyAnUGx1Z2lu IEluc3RhbGxlcicgOiBnVHh0KCdyYWhfcGx1Z2luX2luc3RhbGxlcicpKTsKCQlyZWdpc3Rl cl9jYWxsYmFjaygncmFoX3BsdWdpbl9pbnN0YWxsZXJfaGVhZCcsJ2FkbWluX3NpZGUnLCdo ZWFkX2VuZCcpOwoJCXJlZ2lzdGVyX2NhbGxiYWNrKCdyYWhfcGx1Z2luX2luc3RhbGxlcics J3JhaF9wbHVnaW5faW5zdGFsbGVyJyk7CgkJcmVnaXN0ZXJfY2FsbGJhY2soJ3JhaF9wbHVn aW5faW5zdGFsbGVyX29wdGlvbnMnLCdwbHVnaW5fcHJlZnMucmFoX3BsdWdpbl9pbnN0YWxs ZXInKTsKCQlyZWdpc3Rlcl9jYWxsYmFjaygncmFoX3BsdWdpbl9pbnN0YWxsZXJfaW5zdGFs bCcsJ3BsdWdpbl9saWZlY3ljbGUucmFoX3BsdWdpbl9pbnN0YWxsZXInKTsKCX0KCi8qKgoJ SW5zdGFsbGVyIHNjcmlwdAoJQHBhcmFtICRldmVudCBzdHJpbmcgQWRtaW4tc2lkZSBldmVu dC4KCUBwYXJhbSAkc3RlcCBzdHJpbmcgQWRtaW4tc2lkZSwgcGx1Z2luLWxpZmVjeWNsZSBz dGVwLgoqLwoKCWZ1bmN0aW9uIHJhaF9wbHVnaW5faW5zdGFsbGVyX2luc3RhbGwoJGV2ZW50 PScnLCAkc3RlcD0nJykgewoJCQoJCS8qCgkJCVVuaW5zdGFsbCBpZiB1bmluc3RhbGxpbmcg dGhlCgkJCXBsdWdpbgoJCSovCgkJCgkJaWYoJHN0ZXAgPT0gJ2RlbGV0ZWQnKSB7CgkJCQoJ CQlAc2FmZV9xdWVyeSgKCQkJCSdEUk9QIFRBQkxFIElGIEVYSVNUUyAnLnNhZmVfcGZ4KCdy YWhfcGx1Z2luX2luc3RhbGxlcl9kZWYnKQoJCQkpOwoJCQkKCQkJc2FmZV9kZWxldGUoCgkJ CQkndHhwX3ByZWZzJywKCQkJCSJuYW1lIGxpa2UgJ3JhaF9wbHVnaW5faW5zdGFsbGVyXyUn IgoJCQkpOwoJCQkKCQkJcmV0dXJuOwoJCX0KCQkKCQlnbG9iYWwgJHByZWZzLCAkdGV4dGFy cmF5OwoJCQoJCS8qCgkJCU1ha2Ugc3VyZSBsYW5ndWFnZSBzdHJpbmdzIGFyZSBzZXQKCQkq LwoJCQoJCWZvcmVhY2goCgkJCWFycmF5KAoJCQkJJycgPT4gJ1BsdWdpbiBpbnN0YWxsZXIn LAoJCQkJJ2NoZWNrX2Zvcl91cGRhdGVzJyA9PiAnQ2hlY2sgZm9yIHVwZGF0ZXMnLAoJCQkJ J25hbWUnID0+ICdOYW1lJywKCQkJCSd2ZXJzaW9uJyA9PiAnVmVyc2lvbicsCgkJCQknZGVz Y3JpcHRpb24nID0+ICdEZXNjcmlwdGlvbicsCgkJCQknaW5zdGFsbGVkX3ZlcnNpb24nID0+ ICdJbnN0YWxsZWQgdmVyc2lvbicsCgkJCQknbm9fcGx1Z2lucycgPT4gJ05vIHBsdWdpbiB1 cGRhdGUgZGVmaW5pdGlvbnMgZG93bmxvYWRlZCB5ZXQuJywKCQkJCSdhbHJlYWR5X3VwX3Rv X2RhdGUnID0+ICdQbHVnaW4gdXBkYXRlIGRlZmluaXRpb25zIGFyZSB1cC10by1kYXRlLics CgkJCQknYWxyZWFkeV9pbnN0YWxsZWQnID0+ICdQbHVnaW4gaXMgYWxyZWFkeSBpbnN0YWxs ZWQuJywKCQkJCSdpbmNvcnJlY3Rfc2VsZWN0aW9uJyA9PiAnSW5jb3JyZWN0IHNlbGVjdGlv bi4nLAoJCQkJJ29wZW5fcG9ydHNfb3JfaW5zdGFsbF9jdXJsJyA9PiAnQ2FuIG5vdCBjb25u ZWN0IHRvIHNlcnZlciBkdWUgdG8gdW5zdXBwb3J0ZWQgc2VydmVyIGNvbmZpZ3VyYXRpb24u IFBsZWFzZSBlaXRoZXIgaW5zdGFsbCBjVVJMIG9yIHNldCBhbGxvd191cmxfZm9wZW4gZGly ZWN0aXZlIGluIFBIUCBjb25maWd1cmF0aW9uIGZpbGUgdG8gdHJ1ZS4nLAoJCQkJJ2Rvd25s b2FkaW5nX3BsdWdpbl9mYWlsZWQnID0+ICdEb3dubG9hZGluZyBwbHVnaW4gZmFpbGVkJywK CQkJCSdpbl9wbHVnaW5fY2FjaGUnID0+ICdJbml0aWFsaXplZCBmcm9tIHBsdWdpbiBjYWNo ZScsCgkJCQkndXBkYXRlJyA9PiAnVXBkYXRlJywKCQkJCSdkb3dubG9hZCcgPT4gJ0Rvd25s b2FkJywKCQkJCSdpbnN0YWxsJyA9PiAnSW5zdGFsbCcsCgkJCQknZGVmaW5pdGlvbl91cGRh dGVzX2NoZWNrZWQnID0+ICdOZXcgcGx1Z2luIHVwZGF0ZSBkZWZpbml0aW9ucyBkb3dubG9h ZGVkIHN1Y2Nlc3NmdWxseS4nCgkJCSkgYXMgJHN0cmluZyA9PiAkdHJhbnNsYXRpb24KCQkp IHsKCQkJJHN0cmluZyA9ICdyYWhfcGx1Z2luX2luc3RhbGxlcicgLiAoJHN0cmluZyA/ICdf JyAuICRzdHJpbmcgOiAnJyk7CgkJCQoJCQlpZighaXNzZXQoJHRleHRhcnJheVskc3RyaW5n XSkpCgkJCQkkdGV4dGFycmF5WyRzdHJpbmddID0gJHRyYW5zbGF0aW9uOwoJCX0KCQkJCQoJ CSR2ZXJzaW9uID0gJzAuMyc7CgkJCgkJJGN1cnJlbnQgPSAKCQkJaXNzZXQoJHByZWZzWydy YWhfcGx1Z2luX2luc3RhbGxlcl92ZXJzaW9uJ10pID8KCQkJJHByZWZzWydyYWhfcGx1Z2lu X2luc3RhbGxlcl92ZXJzaW9uJ10gOiAnJzsKCQkKCQlpZigkY3VycmVudCA9PSAkdmVyc2lv bikKCQkJcmV0dXJuOwoJCQoJCWlmKCEkY3VycmVudCkKCQkJQHNhZmVfcXVlcnkoJ0RST1Ag VEFCTEUgSUYgRVhJU1RTICcuc2FmZV9wZngoJ3JhaF9wbHVnaW5faW5zdGFsbGVyJykpOwoJ CQoJCS8qCgkJCVN0b3JlcyBwbHVnaW4ncyB2ZXJzaW9uIGFuZCB1cGRhdGUgZGV0YWlscy4K CQkJCgkJCSogbmFtZTogUGx1Z2luJ3MgbmFtZS4gUHJpbWFyeSBrZXkuCgkJCSogYXV0aG9y OiBBdXRob3IncyBuYW1lLgoJCQkqIGF1dGhvcl91cmk6IEF1dGhvcidzIHdlYnNpdGUgYWRk cmVzcy4KCQkJKiB2ZXJzaW9uOiBQbHVnaW4ncyBsYXRlc3QgdmVyc2lvbiBudW1iZXIuCgkJ CSogZGVzY3JpcHRpb246IFBsdWdpbidzIGRlc2NyaXB0aW9uLgoJCQkqIGhlbHA6IENhY2hl ZCBoZWxwIGZpbGUuCgkJCSogdHlwZTogUGx1Z2luJ3MgdHlwZS4KCQkJKiBtZDVfY2hlY2tz dW06IE1ENSBjaGVja3N1bSBmb3IgaW5zdGFsbGVyIGZpbGUuCgkJKi8KCQkKCQlzYWZlX3F1 ZXJ5KAoJCQkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgIi5zYWZlX3BmeCgncmFoX3Bs dWdpbl9pbnN0YWxsZXJfZGVmJykuIiAoCgkJCQlgbmFtZWAgdmFyY2hhcig2NCkgTk9UIE5V TEwgZGVmYXVsdCAnJywKCQkJCWBhdXRob3JgIHZhcmNoYXIoMTI4KSBOT1QgTlVMTCBkZWZh dWx0ICcnLAoJCQkJYGF1dGhvcl91cmlgIHZhcmNoYXIoMTI4KSBOT1QgTlVMTCBkZWZhdWx0 ICcnLAoJCQkJYHZlcnNpb25gIHZhcmNoYXIoMTApIE5PVCBOVUxMIGRlZmF1bHQgJzEuMCcs CgkJCQlgZGVzY3JpcHRpb25gIHRleHQgTk9UIE5VTEwsCgkJCQlgaGVscGAgdGV4dCBOT1Qg TlVMTCwKCQkJCWB0eXBlYCBpbnQoMikgTk9UIE5VTEwgZGVmYXVsdCAwLAoJCQkJYG1kNV9j aGVja3N1bWAgdmFyY2hhcigzMikgTk9UIE5VTEwgZGVmYXVsdCAnJywKCQkJCVBSSU1BUlkg S0VZKGBuYW1lYCkKCQkJKSBQQUNLX0tFWVM9MSBDSEFSU0VUPXV0ZjgiCgkJKTsKCQkKCQkv KgoJCQlBZGQgcHJlZmVyZW5jZXMgc3RyaW5ncwoJCSovCgkJCgkJZm9yZWFjaCgKCQkJYXJy YXkoCgkJCQkndmVyc2lvbicgPT4gJHZlcnNpb24sCgkJCQkndXBkYXRlZCcgPT4gMCwKCQkJ CSdjaGVja3N1bScgPT4gJycKCQkJKSBhcyAkbmFtZSA9PiAkdmFsdWUKCQkpIHsKCQkJaWYo IWlzc2V0KCRwcmVmc1sncmFoX3BsdWdpbl9pbnN0YWxsZXJfJy4kbmFtZV0pIHx8ICRuYW1l ID09ICd2ZXJzaW9uJykgewoJCQkJc2V0X3ByZWYoJ3JhaF9wbHVnaW5faW5zdGFsbGVyXycu JG5hbWUsJHZhbHVlLCdyYWhfcGlucycsMiwnJywwKTsKCQkJCSRwcmVmc1sncmFoX3BsdWdp bl9pbnN0YWxsZXJfJy4kbmFtZV0gPSAkdmFsdWU7CgkJCX0KCQl9Cgl9CgovKioKCURlbGl2 ZXJzIHRoZSBwYW5lcwoqLwoKCWZ1bmN0aW9uIHJhaF9wbHVnaW5faW5zdGFsbGVyKCkgewoJ CXJlcXVpcmVfcHJpdnMoJ3JhaF9wbHVnaW5faW5zdGFsbGVyJyk7CgkJcmVxdWlyZV9wcml2 cygncGx1Z2luJyk7CgkJCgkJcmFoX3BsdWdpbl9pbnN0YWxsZXJfaW5zdGFsbCgpOwoJCQoJ CWdsb2JhbCAkc3RlcDsKCQkKCQkkc3RlcHMgPSAKCQkJYXJyYXkoCgkJCQknZG93bmxvYWQn ID0+IHRydWUsCgkJCQkndXBkYXRlJyA9PiB0cnVlLAoJCQkpOwoJCQoJCWlmKCEkc3RlcCB8 fCAhYm91bmNlcigkc3RlcCwgJHN0ZXBzKSkKCQkJJHN0ZXAgPSAnbGlzdCc7CgkJCgkJJGZ1 bmMgPSAncmFoX3BsdWdpbl9pbnN0YWxsZXJfJyAuICRzdGVwOwoJCSRmdW5jKCk7Cgl9Cgov KioKCVRoZSBtYWluIHBhbmU7IHRoZSBwbHVnaW4gbGlzdGluZwoJQHBhcmFtICRtZXNzYWdl IHN0cmluZyBBY3Rpdml0eSBtZXNzYWdlLgoJQHBhcmFtICRjaGVjayBib29sIENoZWNrIGZv ciB1cGRhdGVzLgoqLwoKCWZ1bmN0aW9uIHJhaF9wbHVnaW5faW5zdGFsbGVyX2xpc3QoJG1l c3NhZ2U9JycsJGNoZWNrPWZhbHNlKSB7CgkJCgkJZ2xvYmFsICRldmVudDsKCQkKCQlwYWdl dG9wKCdQbHVnaW4gSW5zdGFsbGVyJywkbWVzc2FnZSk7CgkJCgkJaWYoKCR1cGRhdGVzID0g cmFoX3BsdWdpbl9pbnN0YWxsZXJfY2hlY2soJGNoZWNrKSkgJiYgJHVwZGF0ZXMpCgkJCSR1 cGRhdGVzID0gZ1R4dCgncmFoX3BsdWdpbl9pbnN0YWxsZXJfJyAuICR1cGRhdGVzKTsKCQkK CQkkaW5zdGFsbGVkID0gcmFoX3BsdWdpbl9pbnN0YWxsZXJfaW5zdGFsbGVkKCk7CgkJCgkJ JHJzID0gCgkJCXNhZmVfcm93cygKCQkJCSduYW1lLCB2ZXJzaW9uLCBkZXNjcmlwdGlvbics CgkJCQkncmFoX3BsdWdpbl9pbnN0YWxsZXJfZGVmJywKCQkJCScxPTEnCgkJCSk7CgkJCgkJ JG91dFtdID0KCQkKCQkJJwk8ZGl2IGlkPSJyYWhfcGx1Z2luX2luc3RhbGxlcl9jb250YWlu ZXIiIGNsYXNzPSJyYWhfdWlfY29udGFpbmVyIj4nLm4uCgkJCQoJCQknCQk8cCBjbGFzcz0i cmFoX3VpX25hdiI+Jy4KCQkJCQkJJzxzcGFuIGNsYXNzPSJyYWhfdWlfc2VwIj4mIzE4Nzs8 L3NwYW4+ICcuCgkJCQkJCSc8YSBpZD0icmFoX3BsdWdpbl9pbnN0YWxsZXJfdXBkYXRlIiBo cmVmPSI/ZXZlbnQ9Jy4kZXZlbnQuJyZhbXA7c3RlcD11cGRhdGUmYW1wO190eHBfdG9rZW49 Jy5mb3JtX3Rva2VuKCkuJyI+Jy4KCQkJCQkJCWdUeHQoJ3JhaF9wbHVnaW5faW5zdGFsbGVy X2NoZWNrX2Zvcl91cGRhdGVzJykuCgkJCQkJCSc8L2E+Jy4KCQkJJwkJPC9wPicuCgkJCQoJ CQkoJHVwZGF0ZXMgJiYgJHJzID8gJwkJPHAgaWQ9Indhcm5pbmciPicuJHVwZGF0ZXMuJzwv cD4nIDogJycpLgoJCQkKCQkJJwkJPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGlu Zz0iMCIgaWQ9Imxpc3QiPicubi4KCQkJJwkJCTx0aGVhZD4nLm4uCgkJCScJCQkJPHRyPicu bi4KCQkJJwkJCQkJPHRoPicuZ1R4dCgncmFoX3BsdWdpbl9pbnN0YWxsZXJfbmFtZScpLic8 L3RoPicubi4KCQkJJwkJCQkJPHRoPicuZ1R4dCgncmFoX3BsdWdpbl9pbnN0YWxsZXJfdmVy c2lvbicpLic8L3RoPicubi4KCQkJJwkJCQkJPHRoPicuZ1R4dCgncmFoX3BsdWdpbl9pbnN0 YWxsZXJfZGVzY3JpcHRpb24nKS4nPC90aD4nLm4uCgkJCScJCQkJCTx0aD4nLmdUeHQoJ3Jh aF9wbHVnaW5faW5zdGFsbGVyX2luc3RhbGxlZF92ZXJzaW9uJykuJzwvdGg+Jy5uLgoJCQkn CQkJCQk8dGg+JiMxNjA7PC90aD4nLm4uCgkJCScJCQkJPC90cj4nLm4uCgkJCScJCQk8L3Ro ZWFkPicubi4KCQkJJwkJCTx0Ym9keT4nLm47CgkJCgkJaWYoJHJzKSB7CgkJCWZvcmVhY2go JHJzIGFzICRhKSB7CgoJCQkJJGFjdGlvbiA9ICdpbnN0YWxsJzsKCQkJCSRpbnMgPSAnJiMx NjA7JzsKCQkJIAkKCQkJIAlpZihpc3NldCgkaW5zdGFsbGVkWyRhWyduYW1lJ11dKSkgewoJ CQkgCQkkaW5zID0gJGluc3RhbGxlZFsgJGFbJ25hbWUnXV07CgkJCSAJCSRhY3Rpb24gPSAk aW5zID09ICRhWyd2ZXJzaW9uJ10gPyAnJiMxNjA7JyA6ICd1cGRhdGUnOwoJCQkgCX0KCQkJ CgkJCQkkb3V0W10gPSAKCQkJCQknCQkJCTx0cj4nLm4uCgkJCQkJJwkJCQkJPHRkPicuaHRt bHNwZWNpYWxjaGFycygkYVsnbmFtZSddKS4nPC90ZD4nLm4uCgkJCQkJJwkJCQkJPHRkPicu aHRtbHNwZWNpYWxjaGFycygkYVsndmVyc2lvbiddKS4nPC90ZD4nLm4uCgkJCQkJJwkJCQkJ PHRkPicuaHRtbHNwZWNpYWxjaGFycygkYVsnZGVzY3JpcHRpb24nXSkuJzwvdGQ+Jy5uLgoJ CQkJCScJCQkJCTx0ZD4nLiRpbnMuJzwvdGQ+Jy5uLgoJCQkJCScJCQkJCTx0ZD48YSBocmVm PSI/ZXZlbnQ9Jy4kZXZlbnQuJyZhbXA7c3RlcD1kb3dubG9hZCZhbXA7bmFtZT0nLiRhWydu YW1lJ10uJyZhbXA7X3R4cF90b2tlbj0nLmZvcm1fdG9rZW4oKS4nIj4nLmdUeHQoJ3JhaF9w bHVnaW5faW5zdGFsbGVyXycuJGFjdGlvbikuJzwvYT48L3RkPicubi4KCQkJCQknCQkJCTwv dHI+Jy5uOwoJCQkJfQoJCX0gZWxzZQoJCQkkb3V0W10gPQoJCQkJJwkJCTx0cj4nLm4uCgkJ CQknCQkJCTx0ZCBjb2xzcGFuPSI1Ij4nLigkdXBkYXRlcyA/ICR1cGRhdGVzIDogZ1R4dCgn cmFoX3BsdWdpbl9pbnN0YWxsZXJfbm9fcGx1Z2lucycpKS4nPC90ZD4nLm4uCgkJCQknCQkJ PC90cj4nLm47CgkJCgkJJG91dFtdID0gCgkJCQoJCQknCQkJPC90Ym9keT4nLm4uCgkJCScJ CTwvdGFibGU+Jy5uLgoJCQknCTwvZGl2PicubjsKCQkJCgkJZWNobyBpbXBsb2RlKCcnLCAk b3V0KTsKCX0KCi8qKgoJR2V0IGxpc3Qgb2YgaW5zdGFsbGVkIHBsdWdpbnMKKi8KCglmdW5j dGlvbiByYWhfcGx1Z2luX2luc3RhbGxlcl9pbnN0YWxsZWQoKSB7CgoJCXN0YXRpYyAkY2Fj aGUgPSBOVUxMOwoJCQoJCWlmKCRjYWNoZSAhPT0gTlVMTCkgewoJCQlyZXR1cm4gJGNhY2hl OwoJCX0KCQkKCQkkY2FjaGUgPSBhcnJheSgpOwoJCQkKCQkkcnMgPSAKCQkJc2FmZV9yb3dz KAoJCQkJJ25hbWUsIHZlcnNpb24nLAoJCQkJJ3R4cF9wbHVnaW4nLAoJCQkJJzE9MScKCQkJ KTsKCQkJCgkJZm9yZWFjaCgkcnMgYXMgJGEpCgkJCSRjYWNoZVskYVsnbmFtZSddXSA9ICRh Wyd2ZXJzaW9uJ107CgkJCgkJcmV0dXJuICRjYWNoZTsKCX0KCi8qKgoJQ2hlY2tzIGZvciB1 cGRhdGVzCglAcGFyYW0gJG1hbnVhbCBib29sIElmIHVzZXItbGF1bmNoZWQgdXBkYXRlIGNo ZWNrLCBvciBhdXRvLgoJQHJldHVybiBzdHJpbmcgUmV0dXJuZWQgbWVzc2FnZSBhcyBhIGxh bmd1YWdlIHN0cmluZy4KKi8KCglmdW5jdGlvbiByYWhfcGx1Z2luX2luc3RhbGxlcl9jaGVj aygkbWFudWFsPWZhbHNlKSB7CgkJCgkJZ2xvYmFsICRwcmVmczsKCQkKCQlAJGRpc2FibGVk ID0gIWluaV9nZXQoJ2FsbG93X3VybF9mb3BlbicpICYmICFmdW5jdGlvbl9leGlzdHMoJ2N1 cmxfaW5pdCcpOwoJCQoJCWlmKCRkaXNhYmxlZCkKCQkJcmV0dXJuICdvcGVuX3BvcnRzX29y X2luc3RhbGxfY3VybCc7CgkJCgkJJG5vdyA9IHN0cnRvdGltZSgnbm93Jyk7CgkJCgkJJHdh aXQgPSAhJG1hbnVhbCA/IDYwNDgwMCA6IDE4MDA7CgkJCgkJaWYoJHByZWZzWydyYWhfcGx1 Z2luX2luc3RhbGxlcl91cGRhdGVkJ10gKyAkd2FpdCA+PSAkbm93KSB7CgkJCXJldHVybiAk bWFudWFsID8gJ2FscmVhZHlfdXBfdG9fZGF0ZScgOiAnJzsKCQl9CgkJCgkJJGRlZiA9IHJh aF9wbHVnaW5faW5zdGFsbGVyX2ZnZXQoJ2h0dHA6Ly9yYWhmb3J1bS5iaXovP3JhaF9wbHVn aW5faW5zdGFsbGVyPTEmcmFoX3ZlcnNpb249MicgLCAkbWFudWFsID8gMzAgOiA1KTsKCQkK CQkvKgoJCQlVcGRhdGUgdGhlIGxhc3QtdXBkYXRlIHRpbWVzdGFtcCBpZiB3ZSBnb3QgcGF5 bG9hZAoJCSovCgkJCgkJaWYoJGRlZikgewoJCQkKCQkJc2FmZV91cGRhdGUoCgkJCQkndHhw X3ByZWZzJywKCQkJCSJ2YWw9JyRub3cnIiwKCQkJCSJuYW1lPSdyYWhfcGx1Z2luX2luc3Rh bGxlcl91cGRhdGVkJyIKCQkJKTsKCQkKCQkJJHByZWZzWydyYWhfcGx1Z2luX2luc3RhbGxl cl91cGRhdGVkJ10gPSAkbm93OwoJCX0KCQkKCQlpZighJGRlZiB8fCAhcHJlZ19tYXRjaCgn IV5bYS16QS1aMC05LytdKj17MCwyfSQhJywkZGVmKSkgewoJCQlyZXR1cm4gJ2NvdWxkX25v dF9mZXRjaCc7CgkJfQoJCQoJCSRkZWYgPSBiYXNlNjRfZGVjb2RlKCRkZWYpOwoJCSRtZDUg PSBtZDUoJGRlZik7CgkJCgkJaWYoJG1kNSA9PSAkcHJlZnNbJ3JhaF9wbHVnaW5faW5zdGFs bGVyX2NoZWNrc3VtJ10pCgkJCXJldHVybiAnYWxyZWFkeV91cF90b19kYXRlJzsKCQkKCQlz YWZlX3VwZGF0ZSgKCQkJJ3R4cF9wcmVmcycsCgkJCSJ2YWw9JyRtZDUnIiwKCQkJIm5hbWU9 J3JhaF9wbHVnaW5faW5zdGFsbGVyX2NoZWNrc3VtJyIKCQkpOwoJCQoJCXJhaF9wbHVnaW5f aW5zdGFsbGVyX2ltcG9ydChyYWhfcGx1Z2luX2luc3RhbGxlcl9wYXJzZXIoJGRlZikpOwoJ CQoJCXJldHVybiAnZGVmaW5pdGlvbl91cGRhdGVzX2NoZWNrZWQnOwoJfQoKLyoqCglGaXJl IG1hbnVhbCBsaXN0aW5nIHJlZnJlc2gKKi8KCglmdW5jdGlvbiByYWhfcGx1Z2luX2luc3Rh bGxlcl91cGRhdGUoKSB7CgkJcmFoX3BsdWdpbl9pbnN0YWxsZXJfbGlzdCgnJyx0cnVlKTsK CX0KCi8qKgoJUGFyc2VzIHVwZGF0ZSBmaWxlCglAcGFyYW0gJGZpbGUgc3RyaW5nIEZpbGUg dG8gcGFyc2UuCglAcmV0dXJuIGFycmF5CiovCgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0 YWxsZXJfcGFyc2VyKCRmaWxlKSB7CgoJCSRmaWxlID0gZXhwbG9kZShuLCAkZmlsZSk7CgkJ JHBsdWdpbiA9ICcnOwoJCSRvdXQgPSBhcnJheSgpOwoKCQlmb3JlYWNoKCRmaWxlIGFzICRs aW5lKSB7CgkJCQoJCQkkbGluZSA9IHRyaW0oJGxpbmUpOwoJCQkKCQkJaWYoISRsaW5lIHx8 IHN0cnBvcygkbGluZSwnIycpID09PSAwKQoJCQkJY29udGludWU7CgoJCQkvKgoJCQkJU2V0 IHRoZSBwbHVnaW4gbmFtZQoJCQkqLwoJCQkKCQkJaWYoc3RycG9zKCRsaW5lLCdAJykgPT09 IDAgJiYgc3RycG9zKCRsaW5lLCdfJykgPT0gNCkgewoJCQkJJHBsdWdpbiA9IHN1YnN0cigk bGluZSwgMSk7CgkJCQljb250aW51ZTsKCQkJfQoJCQkKCQkJaWYoISRwbHVnaW4pCgkJCQlj b250aW51ZTsKCQkJCgkJCWlmKCFwcmVnX21hdGNoKCcvXihcdyspXHMqPT5ccyooLispJC8n LCAkbGluZSwgJG0pKQoJCQkJY29udGludWU7CgkJCQkKCQkJaWYoZW1wdHkoJG1bMV0pIHx8 IGVtcHR5KCRtWzJdKSkKCQkJCWNvbnRpbnVlOwoJCQkJCQoJCQkkb3V0WyRwbHVnaW5dWyRt WzFdXSA9ICRtWzJdOwoJCX0KCQkKCQlyZXR1cm4gJG91dDsKCX0KCQovKioKCUltcG9ydHMg dXBkYXRlIGZpbGUgdG8gdGhlIGRhdGFiYXNlCglAcGFyYW0gJGluYyBhcnJheSBEZWZpbml0 aW9ucyB0byBpbXBvcnQuCglAcmV0dXJuIE5vdGhpbmcuCiovCgoJZnVuY3Rpb24gcmFoX3Bs dWdpbl9pbnN0YWxsZXJfaW1wb3J0KCRpbmMpIHsKCQkKCQkkcGx1Z2luID0gYXJyYXkoKTsK CQkKCQkkcnMgPSAKCQkJc2FmZV9yb3dzKAoJCQkJJ25hbWUsIHZlcnNpb24nLAoJCQkJJ3Jh aF9wbHVnaW5faW5zdGFsbGVyX2RlZicsCgkJCQknMT0xJwoJCQkpOwoJCQoJCWZvcmVhY2go JHJzIGFzICRhKQoJCQkkcGx1Z2luWyRhWyduYW1lJ11dID0gJGFbJ3ZlcnNpb24nXTsKCQkK CQlmb3JlYWNoKCRpbmMgYXMgJG5hbWUgPT4gJGEpIHsKCQkJCgkJCWlmKCFpc3NldCgkYVsn ZGVzY3JpcHRpb24nXSkgfHwgIWlzc2V0KCRhWyd2ZXJzaW9uJ10pKQoJCQkJY29udGludWU7 CgkJCQoJCQlpZighaXNzZXQoJHBsdWdpblskbmFtZV0pKSB7CgkJCQkKCQkJCXNhZmVfaW5z ZXJ0KAoJCQkJCSdyYWhfcGx1Z2luX2luc3RhbGxlcl9kZWYnLAoJCQkJCSJuYW1lPSciLmRv U2xhc2goJG5hbWUpLiInLAoJCQkJCXZlcnNpb249JyIuZG9TbGFzaCgkYVsndmVyc2lvbidd KS4iJywKCQkJCQlkZXNjcmlwdGlvbj0nIi5kb1NsYXNoKCRhWydkZXNjcmlwdGlvbiddKS4i JyIKCQkJCSk7CgkJCQkJCgkJCX0KCQkJZWxzZSBpZigkcGx1Z2luWyRuYW1lXSAhPSAkYVsn dmVyc2lvbiddKSB7CgkJCQoJCQkJc2FmZV91cGRhdGUoCgkJCQkJJ3JhaF9wbHVnaW5faW5z dGFsbGVyX2RlZicsCgkJCQkJInZlcnNpb249JyIuZG9TbGFzaCgkYVsndmVyc2lvbiddKS4i JywKCQkJCQlkZXNjcmlwdGlvbj0nIi5kb1NsYXNoKCRhWydkZXNjcmlwdGlvbiddKS4iJyIs CgkJCQkJIm5hbWU9JyIuZG9TbGFzaCgkbmFtZSkuIiciCgkJCQkpOwoJCQkJCgkJCX0KCQkJ CgkJCXVuc2V0KCRwbHVnaW5bJG5hbWVdKTsKCQl9CgkJCgkJaWYoIWVtcHR5KCRwbHVnaW4p ICYmIGlzX2FycmF5KCRwbHVnaW4pKSB7CgkJCQoJCQlmb3JlYWNoKCRwbHVnaW4gYXMgJG5h bWUgPT4gJHZlcnNpb24pCgkJCQkkcmVtb3ZlW10gPSAiJyIuZG9TbGFzaCgkbmFtZSkuIici OwoJCQkJCgkJCXNhZmVfZGVsZXRlKAoJCQkJJ3JhaF9wbHVnaW5faW5zdGFsbGVyX2RlZics CgkJCQknbmFtZSBpbignLiBpbXBsb2RlKCcsJywgJHJlbW92ZSkgLiAnKScKCQkJKTsKCQkJ CgkJfQoJCQoJfQoKLyoqCglEb3dubG9hZCB0aGUgcGx1Z2luIGNvZGUgYW5kIHJ1biBUZXh0 cGF0dGVybidzIHBsdWdpbiBpbnN0YWxsZXIKKi8KCglmdW5jdGlvbiByYWhfcGx1Z2luX2lu c3RhbGxlcl9kb3dubG9hZCgpIHsKCQkKCQlAJGRpc2FibGVkID0gIWluaV9nZXQoJ2FsbG93 X3VybF9mb3BlbicpICYmICFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpOwoJCQoJCWlm KCRkaXNhYmxlZCkgewoJCQlyYWhfcGx1Z2luX2luc3RhbGxlcl9saXN0KCdvcGVuX3BvcnRz X29yX2luc3RhbGxfY3VybCcpOwoJCQlyZXR1cm47CgkJfQoJCQoJCSRuYW1lID0gZ3BzKCdu YW1lJyk7CgkJCgkJJGRlZiA9IAoJCQlzYWZlX3JvdygKCQkJCSduYW1lLCB2ZXJzaW9uJywK CQkJCSdyYWhfcGx1Z2luX2luc3RhbGxlcl9kZWYnLAoJCQkJIm5hbWU9JyIuZG9TbGFzaCgk bmFtZSkuIicgTElNSVQgMCwgMSIKCQkJKTsKCQkKCQlpZighJG5hbWUgfHwgISRkZWYpIHsK CQkJcmFoX3BsdWdpbl9pbnN0YWxsZXJfbGlzdCgncmFoX3BsdWdpbl9pbnN0YWxsZXJfaW5j b3JyZWN0X3NlbGVjdGlvbicpOwoJCQlyZXR1cm47CgkJfQoJCQoJCWlmKGZldGNoKCd2ZXJz aW9uJywgJ3R4cF9wbHVnaW4nLCAnbmFtZScsICRuYW1lKSA9PSAkZGVmWyd2ZXJzaW9uJ10p IHsKCQkJcmFoX3BsdWdpbl9pbnN0YWxsZXJfbGlzdCgncmFoX3BsdWdpbl9pbnN0YWxsZXJf YWxyZWFkeV9pbnN0YWxsZWQnKTsKCQkJcmV0dXJuOwoJCX0KCQkKCQkkdXJsID0gJ2h0dHA6 Ly9yYWhmb3J1bS5iaXovP3JhaF9wbHVnaW5fZG93bmxvYWQ9Jy4kbmFtZTsKCQkkdXJsID0g ZnVuY3Rpb25fZXhpc3RzKCdnemVuY29kZScpID8gJHVybCAuICcmcmFoX3R5cGU9emlwJyA6 ICR1cmw7CgkJCQoJCSRwbHVnaW4gPSByYWhfcGx1Z2luX2luc3RhbGxlcl9mZ2V0KCR1cmwp OwoJCQoJCWlmKGVtcHR5KCRwbHVnaW4pKSB7CgkJCXJhaF9wbHVnaW5faW5zdGFsbGVyX2xp c3QoJ3JhaF9wbHVnaW5faW5zdGFsbGVyX2Rvd25sb2FkaW5nX3BsdWdpbl9mYWlsZWQnKTsK CQkJcmV0dXJuOwoJCX0KCgkJJF9QT1NUWydpbnN0YWxsX25ldyddID0gJ1VwbG9hZCc7CQoJ CSRfUE9TVFsncGx1Z2luJ10gPSAkcGx1Z2luOwoJCSRfUE9TVFsncGx1Z2luNjQnXSA9ICRw bHVnaW47CgkJJF9QT1NUWydldmVudCddID0gJ3BsdWdpbic7CgkJJF9QT1NUWydzdGVwJ10g PSAncGx1Z2luX3ZlcmlmeSc7CgkJJF9QT1NUWydfdHhwX3Rva2VuJ10gPSBmb3JtX3Rva2Vu KCk7CgkJCgkJJHN0ZXAgPSAncGx1Z2luX3ZlcmlmeSc7CgkJJGV2ZW50ID0gJ3BsdWdpbic7 CgkJCgkJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL2luY2x1ZGUvdHhwX3BsdWdpbi5waHAnOwoJ CWV4aXQ7Cgl9CgovKioKCURvd25sb2FkcyByZW1vdGUgZmlsZQoJQHBhcmFtICR1cmwgc3Ry aW5nIFVSTCB0byBkb3dubG9hZC4KCUBwYXJhbSAkdGltZW91dCBpbnQgQ29ubmVjdGlvbiB0 aW1lb3V0IGluIHNlY29uZHMuCglAcmV0dXJuIHN0cmluZyBDb250ZW50cyBvZiB0aGUgZmls ZS4gRmFsc2Ugb24gZmFpbHVyZS4KKi8KCglmdW5jdGlvbiByYWhfcGx1Z2luX2luc3RhbGxl cl9mZ2V0KCR1cmwsICR0aW1lb3V0PTEwKSB7CgkJCgkJLyoKCQkJSWYgY1VSTCBpc24ndCBh dmFpbGFibGUsCgkJCXVzZSBmaWxlX2dldF9jb250ZW50cyBpZiBwb3NzaWJsZQoJCSovCgkJ CQoJCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7CgkJCQoJCQlpZighaW5p X2dldCgnYWxsb3dfdXJsX2ZvcGVuJykpCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCQkkY29u dGV4dCA9IAoJCQkJc3RyZWFtX2NvbnRleHRfY3JlYXRlKAoJCQkJCWFycmF5KAoJCQkJCSdo dHRwJyA9PiAKCQkJCQkJYXJyYXkoCgkJCQkJCQkndGltZW91dCcgPT4gJHRpbWVvdXQKCQkJ CQkJKQoJCQkJCSkKCQkJCSk7CgoJCQlAJGZpbGUgPSBmaWxlX2dldF9jb250ZW50cygkdXJs LCAwLCAkY29udGV4dCk7CgkJCXJldHVybiAhJGZpbGUgPyBmYWxzZSA6IHRyaW0oJGZpbGUp OwoJCX0KCQkKCQkkY2ggPSBjdXJsX2luaXQoKTsKCQljdXJsX3NldG9wdCgkY2gsIENVUkxP UFRfVVJMLCAkdXJsKTsKCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRkFJTE9ORVJST1Is IDEpOwoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CgkJ JGZpbGUgPSBjdXJsX2V4ZWMoJGNoKTsKCQkkaHR0cCA9IGN1cmxfZ2V0aW5mbygkY2gsIENV UkxJTkZPX0hUVFBfQ09ERSk7CgkJY3VybF9jbG9zZSgkY2gpOwoJCQoJCXJldHVybiAkZmls ZSAhPT0gZmFsc2UgJiYgJGh0dHAgPT0gJzIwMCcgPyB0cmltKCRmaWxlKSA6IGZhbHNlOwoJ fQoKLyoqCglSZWRpcmVjdCB0byB0aGUgYWRtaW4tc2lkZSBpbnRlcmZhY2UKKi8KCglmdW5j dGlvbiByYWhfcGx1Z2luX2luc3RhbGxlcl9vcHRpb25zKCkgewoJCWhlYWRlcignTG9jYXRp b246ID9ldmVudD1yYWhfcGx1Z2luX2luc3RhbGxlcicpOwoJCWVjaG8gCgkJCSc8cD4nLm4u CgkJCScJPGEgaHJlZj0iP2V2ZW50PXJhaF9wbHVnaW5faW5zdGFsbGVyIj4nLmdUeHQoJ2Nv bnRpbnVlJykuJzwvYT4nLm4uCgkJCSc8L3A+JzsKCX0KCi8qKgoJQWRkcyBzdHlsZXMgdG8g dGhlIDxoZWFkPgoqLwoKCWZ1bmN0aW9uIHJhaF9wbHVnaW5faW5zdGFsbGVyX2hlYWQoKSB7 CgkJZ2xvYmFsICRldmVudDsKCQkKCQlpZigkZXZlbnQgIT0gJ3JhaF9wbHVnaW5faW5zdGFs bGVyJykKCQkJcmV0dXJuOwoJCQoJCWVjaG8gPDw8RU9GCgkJCTxzdHlsZSB0eXBlPSJ0ZXh0 L2NzcyI+CgkJCQkjcmFoX3BsdWdpbl9pbnN0YWxsZXJfY29udGFpbmVyIHsKCQkJCQl3aWR0 aDogOTUwcHg7CgkJCQkJbWFyZ2luOiAwIGF1dG87CQoJCQkJfQoJCQkJI3JhaF9wbHVnaW5f aW5zdGFsbGVyX2NvbnRhaW5lciB0YWJsZSB7CgkJCQkJd2lkdGg6IDEwMCU7CQoJCQkJfQoJ CQk8L3N0eWxlPgpFT0Y7Cgl9IjtzOjQ6InR5cGUiO3M6MToiMSI7czo1OiJvcmRlciI7czox OiI1IjtzOjU6ImZsYWdzIjtzOjE6IjMiO3M6MzoibWQ1IjtzOjMyOiIyZTM2N2FiMGE0N2Fh MjE1ZWVlZjI3N2I0YTg5YzFkZiI7czo0OiJuYW1lIjtzOjIwOiJyYWhfcGx1Z2luX2luc3Rh bGxlciI7czo3OiJ2ZXJzaW9uIjtzOjM6IjAuMyI7fQ==