# wlk_defensio v1 # A comment spam prevention plugin using the Defensio service. # Walker Hamilton # http://www.walkerhamilton.com # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTI6Indsa19kZWZlbnNpbyI7czo3OiJ2ZXJzaW9uIjtzOjE6 IjEiO3M6NjoiYXV0aG9yIjtzOjE1OiJXYWxrZXIgSGFtaWx0b24iO3M6MTA6ImF1dGhvcl91 cmkiO3M6Mjk6Imh0dHA6Ly93d3cud2Fsa2VyaGFtaWx0b24uY29tIjtzOjExOiJkZXNjcmlw dGlvbiI7czo2MDoiQSBjb21tZW50IHNwYW0gcHJldmVudGlvbiBwbHVnaW4gdXNpbmcgdGhl IERlZmVuc2lvIHNlcnZpY2UuIjtzOjQ6InR5cGUiO2k6MTtzOjQ6ImhlbHAiO3M6MTQxOToi PGgxPndsa19kZWZlbnNpbzwvaDE+Cgo8aDI+SW5zdGFsbGF0aW9uPC9oMj4KCjxvbD4KCTxs aT5TaW5jZSB5b3UgY2FuIHJlYWQgdGhpcyBoZWxwLCB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhl IHBsdWdpbiB0byB0eHAuCgkJPHVsPjxsaT5EaWQgeW91IGFjdGl2YXRlIGl0PzwvbGk+PC91 bD4KCTwvbGk+Cgk8bGk+R28gdG8gIkRlZmVuc2lvLmNvbSI6aHR0cDovL2RlZmVuc2lvLmNv bSBhbmQgcmVnaXN0ZXIgZm9yIGFuIGFjY291bnQuLi5JJ2xsIHdhaXQ8L2xpPgoJPGxpPkdv IHRvIHRoZSBtYW5hZ2Uga2V5IHBhZ2UgaW4geW91ciBhY2NvdW50LCBhbmQgcmVnaXN0ZXIg Zm9yIGEga2V5IGZvciB0aGUgVVJMIHlvdSB0ZXh0cGF0dGVybiBpbnN0YWxsIGNhbiBiZSBm b3VuZCBhdC48L2xpPgoJPGxpPk9uY2UgeW91IGhhdmUgeW91ciBBUEkga2V5LCB3aXRoaW4g dGhlIFRleHRwYXR0ZXJuIGludGVyZmFjZSwgZ28gdG8gRXh0ZW5zaW9ucy0+RGVmZW5zaW8g YW5kIGFkZCB5b3VyIEFQSSBrZXkgdG8gdGhlIG9wdGlvbnMgZm9ybS48L2xpPgo8L29sPgoK PGgyPk9wdGlvbnM8L2gyPgoKPHA+SWYgeW91IFNldCAiQXV0by1tYXJrIGFzIHNwYW0/IiB0 byAiT2ZmIiwgaWYgRGVmZW5zaW8gdGVsbHMgeW91ciBUZXh0cGF0dGVybiBpbnN0YWxsIHRo YXQgYSBjb21tZW50IGlzIHNwYW0sIGl0IHdpbGwgYmUgd2VpZ2h0ZWQgbW9kZXJhdGUgYW5k IERlZmVuc2lvIHdpbGwgbm90IHNldCB0aGUgb2ZmZW5kaW5nIGNvbW1lbnQgdG8gYmUgaGlk ZGVuLjwvcD4KCjxwPlNwYW1pbmVzcyBpcyBkZWZlbnNpb3MgMCB0byAxIG51bWJlciBvZiB0 aGUgcHJvYmFiaWxpdHkgdGhhdCBhIGNvbW1lbnQgaXMgc3BhbS4gVXN1YWxseSwgZXZlcnl0 aGluZyBhYm92ZSAuOCAob24gYSB3ZWxsLXRhdWdodCBEZWZlbnNpbyBhY2NvdW50KSBpcyBz cGFtLjwvcD4KCjxoMj5Vc2FnZTwvaDI+Cgo8cD5CZWNhdXNlIERlZmVuc2lvIGlzIGEgbGVh cm5pbmcgc3lzdGVtLCBtYWtlIHN1cmUgeW91IGdvIHRvIEV4dGVuc2lvbnMtPkRlZmVuc2lv IGZyb20gdGltZSB0byB0aW1lIGFuZCBjb3JyZWN0IGFueSBpbmNvcnJlY3RseSBtYXJrZWQg Y29tbWVudHMuPC9wPgoKPGgyPlVuaW5zdGFsbDwvaDI+Cgo8cD5HbyB0byB0aGUgRXh0ZW5z aW9ucy0+RGVmZW5zaW8gdGFiIGFuZCB0aGUgY2xpY2sgdGhlIGxpbmsgdW5kZXIgdGhlIG9w dGlvbnMgZm9ybSB0aGF0IHNheXMgImNsaWNrIGhlcmUgdG8gdW5pbnN0YWxsIi4gT25jZSB5 b3UgZG8gdGhpcywgZG8gbm90IHJldmlzaXQgdGhlIEV4dGVuc2lvbnMtPkRlZmVuc2lvIHRh YiBhcyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVpbnN0YWxsLiBJbnN0ZWFkLCBnbyB0byBB ZG1pbi0+UGx1Z2lucyBhbmQgcmVtb3ZlIG9yIGRlYWN0aXZhdGUgdGhlIHdsa19kZWZlbnNp byBwbHVnaW4uPC9wPgoKIjtzOjQ6ImNvZGUiO3M6MTk4NTc6IgpyZWdpc3Rlcl9jYWxsYmFj aygnd2xrX2RlZmVuc2lvJywnY29tbWVudC5zYXZlJyk7CgppZiAoQHR4cGludGVyZmFjZSA9 PSAnYWRtaW4nKQp7CglyZWdpc3Rlcl90YWIoImV4dGVuc2lvbnMiLCAid2xrX2RlZmVuc2lv X2FkbWluIiwgIkRlZmVuc2lvIik7CgoJYWRkX3ByaXZzKCd3bGtfZGVmZW5zaW9fYWRtaW4n LCAnMSwyJyk7CglyZWdpc3Rlcl9jYWxsYmFjaygid2xrX2RlZmVuc2lvX2FkbWluIiwgInds a19kZWZlbnNpb19hZG1pbiIpOwoKCXJlZ2lzdGVyX2NhbGxiYWNrKCd3bGtfZGVmZW5zaW9f YW5ub3VuY2UnLCAnYXJ0aWNsZScsICdwdWJsaXNoJyk7Cn0KCmNsYXNzIFdsa0RlZmVuc2lv UmV0dXJuUGFyc2VyIHsKCiAgICB2YXIgJGFyck91dHB1dCA9IGFycmF5KCk7CiAgICB2YXIg JHJlc1BhcnNlcjsKICAgIHZhciAkc3RyWG1sRGF0YTsKICAgIHZhciAkZGVmZW5zaW9BcnJh eTsKCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkeG1sKSB7CiAgICAJJHJldHVybmVyID0g YXJyYXkoKTsKICAgIAkkcl9yID0gJHRoaXMtPnBhcnNlKCR4bWwpOwogICAgCWZvcmVhY2go JHJfclsnY2hpbGRyZW4nXSBhcyAkYXJyKQogICAgCXsKICAgIAkJaWYoaXNzZXQoJGFyclsn dGFnRGF0YSddKSkgeyAkcmV0dXJuZXJbJGFyclsnbmFtZSddXSA9ICRhcnJbJ3RhZ0RhdGEn XTsgfQogICAgCX0KICAgIAkkdGhpcy0+ZGVmZW5zaW9BcnJheSA9ICRyZXR1cm5lcjsKICAg IH0KCiAgICBmdW5jdGlvbiBXbGtEZWZlbnNpb1JldHVyblBhcnNlcigkeG1sKSB7CiAgICAJ cmV0dXJuICR0aGlzLT5fX2NvbnN0cnVjdCgkeG1sKTsKICAgIH0KCglmdW5jdGlvbiBwYXJz ZSgkc3RySW5wdXRYTUwpIHsKCQkkdGhpcy0+cmVzUGFyc2VyID0geG1sX3BhcnNlcl9jcmVh dGUgKCk7CgkJeG1sX3NldF9vYmplY3QoJHRoaXMtPnJlc1BhcnNlciwkdGhpcyk7CgkJeG1s X3NldF9lbGVtZW50X2hhbmRsZXIoJHRoaXMtPnJlc1BhcnNlciwgInRhZ09wZW4iLCAidGFn Q2xvc2VkIik7CgoJCXhtbF9zZXRfY2hhcmFjdGVyX2RhdGFfaGFuZGxlcigkdGhpcy0+cmVz UGFyc2VyLCAidGFnRGF0YSIpOwoKCQkkdGhpcy0+c3RyWG1sRGF0YSA9IHhtbF9wYXJzZSgk dGhpcy0+cmVzUGFyc2VyLCRzdHJJbnB1dFhNTCApOwoJCWlmKCEkdGhpcy0+c3RyWG1sRGF0 YSkgewoJCSAgIGRpZShzcHJpbnRmKCJYTUwgZXJyb3I6ICVzIGF0IGxpbmUgJWQiLAoJCXht bF9lcnJvcl9zdHJpbmcoeG1sX2dldF9lcnJvcl9jb2RlKCR0aGlzLT5yZXNQYXJzZXIpKSwK CQl4bWxfZ2V0X2N1cnJlbnRfbGluZV9udW1iZXIoJHRoaXMtPnJlc1BhcnNlcikpKTsKCQl9 CgoJCXhtbF9wYXJzZXJfZnJlZSgkdGhpcy0+cmVzUGFyc2VyKTsKCgkJcmV0dXJuICR0aGlz LT5hcnJPdXRwdXRbMF07Cgl9CgoJZnVuY3Rpb24gdGFnT3BlbigkcGFyc2VyLCAkbmFtZSwg JGF0dHJzKSB7CgkJaWYoIWVtcHR5KCRuYW1lKSAmJiAhZW1wdHkoJGF0dHJzKSkgewoJCQkk dGFnPWFycmF5KCJuYW1lIj0+c3RydG9sb3dlcigkbmFtZSksImF0dHJzIj0+JGF0dHJzKTsK CQl9IGVsc2UgaWYoIWVtcHR5KCRuYW1lKSAmJiBlbXB0eSgkYXR0cnMpKSB7CgkJCSR0YWc9 YXJyYXkoIm5hbWUiPT5zdHJ0b2xvd2VyKCRuYW1lKSk7CgkJfSBlbHNlIGlmKGVtcHR5KCRu YW1lKSAmJiAhZW1wdHkoJGF0dHJzKSkgewoJCQkkdGFnPWFycmF5KCJhdHRycyI9PiRhdHRy cyk7CgkJfQoJCWFycmF5X3B1c2goJHRoaXMtPmFyck91dHB1dCwkdGFnKTsKCX0KCglmdW5j dGlvbiB0YWdEYXRhKCRwYXJzZXIsICR0YWdEYXRhKSB7CgkJaWYodHJpbSgkdGFnRGF0YSkp IHsKCQkJaWYoaXNzZXQoJHRoaXMtPmFyck91dHB1dFtjb3VudCgkdGhpcy0+YXJyT3V0cHV0 KS0xXVsndGFnRGF0YSddKSkgewoJCQkJJHRoaXMtPmFyck91dHB1dFtjb3VudCgkdGhpcy0+ YXJyT3V0cHV0KS0xXVsndGFnRGF0YSddIC49ICR0YWdEYXRhOwoJCQl9IGVsc2UgewoJCQkJ JHRoaXMtPmFyck91dHB1dFtjb3VudCgkdGhpcy0+YXJyT3V0cHV0KS0xXVsndGFnRGF0YSdd ID0gJHRhZ0RhdGE7CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gdGFnQ2xvc2VkKCRwYXJzZXIs ICRuYW1lKSB7CgkJJHRoaXMtPmFyck91dHB1dFtjb3VudCgkdGhpcy0+YXJyT3V0cHV0KS0y XVsnY2hpbGRyZW4nXVtdID0gJHRoaXMtPmFyck91dHB1dFtjb3VudCgkdGhpcy0+YXJyT3V0 cHV0KS0xXTsKCQlhcnJheV9wb3AoJHRoaXMtPmFyck91dHB1dCk7Cgl9Cgp9CgpjbGFzcyBX bGtEZWZlbnNpbyB7Cgl2YXIgJF9wcm9wZXJ0aWVzID0gYXJyYXkoCgkJCSd1cmxzJyA9PiBh cnJheSgKCQkJCSd2LWtleScgPT4gJ2h0dHA6Ly9hcGkuZGVmZW5zaW8uY29tL2Jsb2cvMS4x L3ZhbGlkYXRlLWtleS8nLAoJCQkJJ3JlcG9ydC1mbicgPT4gJ2h0dHA6Ly9hcGkuZGVmZW5z aW8uY29tL2Jsb2cvMS4xL3JlcG9ydC1mYWxzZS1uZWdhdGl2ZXMvJywKCQkJCSdhdWRpdC1j b21tJyA9PiAnaHR0cDovL2FwaS5kZWZlbnNpby5jb20vYmxvZy8xLjEvYXVkaXQtY29tbWVu dC8nLAoJCQkJJ3JlcG9ydC1mcCcgPT4gJ2h0dHA6Ly9hcGkuZGVmZW5zaW8uY29tL2Jsb2cv MS4xL3JlcG9ydC1mYWxzZS1wb3NpdGl2ZXMvJywKCQkJCSdzdGF0cycgPT4gJ2h0dHA6Ly9h cGkuZGVmZW5zaW8uY29tL2Jsb2cvMS4xL2dldC1zdGF0cy8nLAoJCQkJJ2Fubi1hcnQnID0+ ICdodHRwOi8vYXBpLmRlZmVuc2lvLmNvbS9ibG9nLzEuMS9hbm5vdW5jZS1hcnRpY2xlLycK CQkJKSwKCQkJJ2FwaWtleScgPT4gJycsCgkJCSdzaXRlLW93bmVyJyA9PiAnJwoJCSk7CgoJ ZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoJewoJCWlmKGlzc2V0KCRfR0VUWyd1bmluc3RhbGwn XSkpIHsKCQkJJHRoaXMtPmRiX2FkZCh0cnVlKTsKCQkJZWNobyAnPGRpdiBzdHlsZT0id2lk dGg6NDAwcHg7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzsiPjxoMT5NYWtl IHN1cmUgeW91IGRvIHRoaXMgbmV4dDwvaDE+CgoJCQkJPHA+SWYgeW91IHJldmlzaXQgdGhl IERlZmVuc2lvIHRhYiBoZXJlIHVuZGVyIGV4dGVuc2lvbnMgd2l0aG91dCBkaXNhYmxpbmcg b3IgdW5pbnN0YWxsaW5nIHRoZSB3bGtfZGVmZW5zaW8gcGx1Z2luLCBEZWZlbnNpbyB3aWxs IGJlIHJlaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLiBUbyBhdm9pZCB0aGlzLCBjbGljayB0 aGUgInllcyIgb24gdGhlIERlZmVuc2lvIHJvdyBpbiB0aGUgQWRtaW4tPlBsdWdpbnMgdGFi IHRvIGRpc2FibGUgaXQgb3IgY2xpY2sgdGhlICJ4IiB0byB1bmluc3RhbGwgaXQgYWx0b2dl dGhlci48L3A+PC9kaXY+CgoJCQknOwoJCX0gZWxzZSB7CgkJCS8vY2hlY2sgaWYgaXQncyBn b3QgYW4gYXBpIGtleSBpbnN0YWxsZWQKCQkJJGNoZWNrSW5zdGFsbCA9IGZldGNoKCduYW1l JywndHhwX3ByZWZzJywnbmFtZScsJ3dsa19kZWZlbnNpb19hcGlrZXknKTsKCgkJCWlmKGVt cHR5KCRjaGVja0luc3RhbGwpKSB7CgkJCQkkdGhpcy0+ZGJfYWRkKCk7CgkJCX0gZWxzZSAg ewoJCQkJJHRoaXMtPl9wcm9wZXJ0aWVzWydhcGlrZXknXSA9IGZldGNoKCd2YWwnLCd0eHBf cHJlZnMnLCduYW1lJywnd2xrX2RlZmVuc2lvX2FwaWtleScpOwoJCQkJaWYoaXNzZXQoJF9Q T1NUWyd3bGtfZGVmZW5zaW9fYXBpa2V5J10pKSB7CgkJCQkJc2FmZV9xdWVyeSgnVVBEQVRF ICcuc2FmZV9wZngoJ3R4cF9wcmVmcycpLicgU0VUIHZhbD0iJy5hZGRzbGFzaGVzKCRfUE9T VFsnd2xrX2RlZmVuc2lvX2FwaWtleSddKS4nIiBXSEVSRSBuYW1lPSJ3bGtfZGVmZW5zaW9f YXBpa2V5IicpOwoJCQkJCXNhZmVfcXVlcnkoJ1VQREFURSAnLnNhZmVfcGZ4KCd0eHBfcHJl ZnMnKS4nIFNFVCB2YWw9IicuYWRkc2xhc2hlcygkX1BPU1RbJ3dsa19kZWZlbnNpb19hdXRv X21hcmsnXSkuJyIgV0hFUkUgbmFtZT0id2xrX2RlZmVuc2lvX2F1dG9fbWFyayInKTsKCQkJ CQlzYWZlX3F1ZXJ5KCdVUERBVEUgJy5zYWZlX3BmeCgndHhwX3ByZWZzJykuJyBTRVQgdmFs PSInLmFkZHNsYXNoZXMoJF9QT1NUWyd3bGtfZGVmZW5zaW9fbGltaXQnXSkuJyIgV0hFUkUg bmFtZT0id2xrX2RlZmVuc2lvX2xpbWl0IicpOwoKCQkJCQlwYWdldG9wKCJEZWZlbnNpbyIs ICJZb3VyIERlZmVuc2lvIG9wdGlvbnMgaGF2ZSBiZWVuIHVwZGF0ZWQuIik7CgkJCQkJJHRo aXMtPnNob3dfYXBpX2Zvcm0oKTsKCQkJCQlleGl0KCk7CgkJCQl9IGVsc2UgewoJCQkJCWlm IChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpCgkJCQkJewoJCQkJCQlpZihpc3NldCgkX0dF VFsncmVwb3J0ZmFsc2Vwb3MnXSkpIHsKCQkJCQkJCSR0aGlzLT5yZXBvcnRfZmFsc2VfcG9z aXRpdmUoJF9HRVRbJ3JlcG9ydGZhbHNlcG9zJ10pOwoJCQkJCQl9IGVsc2UgaWYoaXNzZXQo JF9HRVRbJ3JlcG9ydGZhbHNlbmVnJ10pKSB7CgkJCQkJCQkkdGhpcy0+cmVwb3J0X2ZhbHNl X25lZ2F0aXZlKCRfR0VUWydyZXBvcnRmYWxzZW5lZyddKTsKCQkJCQkJfSBlbHNlIHsKCQkJ CQkJCXBhZ2V0b3AoIkRlZmVuc2lvIik7CgkJCQkJCX0KCgkJCQkJCSR0aGlzLT5zaG93X2Fw aV9mb3JtKCk7CgkJCQkJCWVjaG8gJzx0ZCBpZD0iYXJ0aWNsZS1tYWluIiBjb2xzcGFuPSIy Ij4mbmJzcDsnOwoJCQkJCQkkdGhpcy0+YWRtaW5faW50ZXJmYWNlKCk7CgkJCQkJCWVjaG8g JzwvdGQ+PC90cj48L3RhYmxlPic7CgkJCQkJCWV4aXQoKTsKCQkJCQl9CgkJCQl9CgkJCX0K CQl9Cgl9CgoJZnVuY3Rpb24gV2xrRGVmZW5zaW8oKQoJewoJCSR0aGlzLT5fX2NvbnN0cnVj dCgpOwoJfQoKCWZ1bmN0aW9uIGRvQ3VybCgkYXBpX3BvaW50LCAkcG9zdF92YXJzLCAkdHVy bl9vZmZfdXNlcl9pcD1udWxsKQoJewoJCSR0aGlzLT5fcHJvcGVydGllc1snYXBpa2V5J10g PSBmZXRjaCgndmFsJywndHhwX3ByZWZzJywnbmFtZScsJ3dsa19kZWZlbnNpb19hcGlrZXkn KTsKCQkkdGhpcy0+X3Byb3BlcnRpZXNbJ3NpdGUtb3duZXInXSA9ICdodHRwOi8vJy5mZXRj aCgndmFsJywndHhwX3ByZWZzJywnbmFtZScsJ3NpdGV1cmwnKTsKCgkJJHBvc3RfdmFyc1sn b3duZXItdXJsJ10gPSAkdGhpcy0+X3Byb3BlcnRpZXNbJ3NpdGUtb3duZXInXTsKCgkJaWYo ISR0dXJuX29mZl91c2VyX2lwKSB7CgkJCSRwb3N0X3ZhcnNbJ3VzZXItaXAnXSA9ICgkX1NF UlZFUlsnUkVNT1RFX0FERFInXSAhPSBnZXRlbnYoJ1NFUlZFUl9BRERSJykpID8gJF9TRVJW RVJbJ1JFTU9URV9BRERSJ10gOiBnZXRlbnYoJ0hUVFBfWF9GT1JXQVJERURfRk9SJyk7CgkJ fQoKCQkkY3VybCA9IGN1cmxfaW5pdCgkdGhpcy0+X3Byb3BlcnRpZXNbJ3VybHMnXVskYXBp X3BvaW50XS4kdGhpcy0+X3Byb3BlcnRpZXNbJ2FwaWtleSddLicueG1sJyk7CgoJCWN1cmxf c2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ1RleHRwYXR0ZXJuLzAuMSAoK2h0 dHA6Ly93YWxrZXJoYW1pbHRvbi5jb20vZGVmZW5zaW8pJyk7CgkJY3VybF9zZXRvcHQoJGN1 cmwsIENVUkxPUFRfUE9TVCwgMSk7CgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9T VEZJRUxEUywgJHBvc3RfdmFycyk7CgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUkVU VVJOVFJBTlNGRVIsIDEpOwoJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1RJTUVPVVQs IDEwKTsKCgkJJHJlc3BvbnNlID0gY3VybF9leGVjKCRjdXJsKTsKCQljdXJsX2Nsb3NlKCRj dXJsKTsKCgkJcmV0dXJuICRyZXNwb25zZTsKCX0KCglmdW5jdGlvbiBhbm5vdW5jZSgpCgl7 CgkJZ2xvYmFsICRwZXJtbGlua19tb2RlOwoJCWdsb2JhbCAkdGhpc2FydGljbGU7CgkJaWYo JHRoaXNhcnRpY2xlWydhbm5vdGF0ZSddPT0xKQoJCXsKCQkJJGRlZmVuc2lvX3Bvc3RlZCA9 IGRhdGUoJ1lcL21cL2QnLCAkdGhpc2FydGljbGVbJ3Bvc3RlZCddKTsKCQkJJGRlZmVuc2lv X3Blcm1saW5rID0gcGVybWxpbmt1cmwoJHRoaXNhcnRpY2xlKTsKCgkJCSRmb3JtX2FycmF5 ID0gZ2V0Q29tbWVudCgpOwoKCQkJJGF1dGhvciA9IGZldGNoKCdSZWFsTmFtZScsJ3R4cF91 c2VycycsJ25hbWUnLCR0aGlzYXJ0aWNsZVsnYXV0aG9yaWQnXSk7CgkJCSRhdXRob3JfZW1h aWwgPSBmZXRjaCgnZW1haWwnLCd0eHBfdXNlcnMnLCduYW1lJywkdGhpc2FydGljbGVbJ2F1 dGhvcmlkJ10pOwoKCQkJJGRlZmVuc2lvX3ZlcnNpb24gPSBhcnJheSgncGVybWFsaW5rJz0+ JGRlZmVuc2lvX3Blcm1saW5rLCAnYXJ0aWNsZS1jb250ZW50Jz0+JHRoaXNhcnRpY2xlWydl eGNlcnB0J10uJyAnLiR0aGlzYXJ0aWNsZVsnYm9keSddLCAnYXJ0aWNsZS10aXRsZSc9PiR0 aGlzYXJ0aWNsZVsndGl0bGUnXSwgJ2FydGljbGUtYXV0aG9yJz0+JGF1dGhvciwgJ2FydGlj bGUtYXV0aG9yLWVtYWlsJz0+JGF1dGhvcl9lbWFpbCk7CgoJCQkkdGhpcy0+ZG9DdXJsKCdh bm4tYXJ0JywgJGRlZmVuc2lvX3ZlcnNpb24pOwoJCX0KCX0KCglmdW5jdGlvbiBhdWRpdF9j b21tZW50KCkKCXsKCQlnbG9iYWwgJHBlcm1saW5rX21vZGU7CgkJZ2xvYmFsICR0aGlzYXJ0 aWNsZTsKCgkJJGRlZmVuc2lvX3Bvc3RlZCA9IGRhdGUoJ1lcL21cL2QnLCAkdGhpc2FydGlj bGVbJ3Bvc3RlZCddKTsKCQkkZGVmZW5zaW9fcGVybWxpbmsgPSBwZXJtbGlua3VybCgkdGhp c2FydGljbGUpOwoKCQkkZm9ybV9hcnJheSA9IGdldENvbW1lbnQoKTsKCQkvKgoJCQkncGFy ZW50aWQnLAoJCQknbmFtZScsCgkJCSdlbWFpbCcsCgkJCSd3ZWInLAoJCQknbWVzc2FnZScs CgkJCSdiYWNrcGFnZScsCgkJCSdyZW1lbWJlcicKCQkqLwoKCQkkcVNob3dTdGF0dXMgPSAi U0hPVyBUQUJMRSBTVEFUVVMgTElLRSAnIi5zYWZlX3BmeCgndHhwX2Rpc2N1c3MnKS4iJyI7 CgkJJHFTaG93U3RhdHVzUmVzdWx0ID0gc2FmZV9xdWVyeSgkcVNob3dTdGF0dXMpOwoKCQkk cm93ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHFTaG93U3RhdHVzUmVzdWx0KTsKCgkJJG5leHRf aW5jcmVtZW50ID0gJHJvd1snQXV0b19pbmNyZW1lbnQnXTsKCgkJaWYoaXNfbnVtZXJpYygk bmV4dF9pbmNyZW1lbnQpKSB7CgkJCSRkZWZlbnNpb192ZXJzaW9uID0gYXJyYXkoJ2FydGlj bGUtZGF0ZSc9PiRkZWZlbnNpb19wb3N0ZWQsICdjb21tZW50LWF1dGhvcic9PiRmb3JtX2Fy cmF5WyduYW1lJ10sICdjb21tZW50LXR5cGUnPT4nY29tbWVudCcsICdjb21tZW50LWF1dGhv ci1lbWFpbCc9PiRmb3JtX2FycmF5WydlbWFpbCddLCAnY29tbWVudC1hdXRob3ItdXJsJz0+ JGZvcm1fYXJyYXlbJ3dlYiddLCAndXNlci1sb2dnZWQtaW4nPT5mYWxzZSwgJ3Blcm1hbGlu ayc9PiRkZWZlbnNpb19wZXJtbGluaywgJ2NvbW1lbnQtY29udGVudCc9PiRmb3JtX2FycmF5 WydtZXNzYWdlJ10pOwoKCQkJJHJlc3BvbnNlID0gJHRoaXMtPmRvQ3VybCgnYXVkaXQtY29t bScsICRkZWZlbnNpb192ZXJzaW9uKTsKCgkJCSR4bWxfcCA9IG5ldyBXbGtEZWZlbnNpb1Jl dHVyblBhcnNlcigkcmVzcG9uc2UpOwoKCQkJJGV2YWx1YXRvciA9JiBnZXRfY29tbWVudF9l dmFsdWF0b3IoKTsKCgkJCSR0aGVhdXRvID0gZmV0Y2goJ3ZhbCcsJ3R4cF9wcmVmcycsJ25h bWUnLCd3bGtfZGVmZW5zaW9fYXV0b19tYXJrJyk7CgkJCSR0aGVsaW1pdGVyID0gZmV0Y2go J3ZhbCcsJ3R4cF9wcmVmcycsJ25hbWUnLCd3bGtfZGVmZW5zaW9fbGltaXQnKTsKCgkJCWlm KCR4bWxfcC0+ZGVmZW5zaW9BcnJheVsnc3BhbSddPT10cnVlIHx8ICR4bWxfcC0+ZGVmZW5z aW9BcnJheVsnc3BhbSddPT0ndHJ1ZScgfHwgJHhtbF9wLT5kZWZlbnNpb0FycmF5WydzcGFt J109PTEpIHsKCQkJCSRzcGFtID0gMTsKCQkJfSBlbHNlIHsKCQkJCSRzcGFtID0gMDsKCQkJ fQoKCQkJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL2xpYi9jbGFzc1RleHRpbGUucGhwJzsKCQkJ JHRleHRpbGUgPSBuZXcgVGV4dGlsZSgpOwoKCQkJJHRleHRpbGVkX21lc3NhZ2UgPSAkdGV4 dGlsZS0+VGV4dGlsZVRoaXMoJGZvcm1fYXJyYXlbJ21lc3NhZ2UnXSk7CgoJCQlzYWZlX2lu c2VydCgndHhwX2Rpc2N1c3NfZGVmZW5zaW8nLCAiZGlzY3Vzc19pZD0nIi4kbmV4dF9pbmNy ZW1lbnQuIicsIGRlZmVuc2lvX2lkPSciLmFkZHNsYXNoZXMoJHhtbF9wLT5kZWZlbnNpb0Fy cmF5WydzaWduYXR1cmUnXSkuIicsIG5hbWU9JyIuYWRkc2xhc2hlcygkZm9ybV9hcnJheVsn bmFtZSddKS4iJywgZW1haWw9JyIuYWRkc2xhc2hlcygkZm9ybV9hcnJheVsnZW1haWwnXSku IicsIG1lc3NhZ2U9JyIuYWRkc2xhc2hlcygkdGV4dGlsZWRfbWVzc2FnZSkuIicsIHNwYW1p bmVzcz0nIi5hZGRzbGFzaGVzKCR4bWxfcC0+ZGVmZW5zaW9BcnJheVsnc3BhbWluZXNzJ10p LiInLCBzcGFtPSciLiRzcGFtLiInIik7CgoJCQlpZigkdGhlYXV0bz09MSkgewoJCQkJaWYg KCRzcGFtPT0xIHx8ICR4bWxfcC0+ZGVmZW5zaW9BcnJheVsnc3BhbWluZXNzJ10+JHRoZWxp bWl0ZXIgfHwgJHhtbF9wLT5kZWZlbnNpb0FycmF5WydzcGFtaW5lc3MnXT09JHRoZWxpbWl0 ZXIpCgkJCQkJJGV2YWx1YXRvciAtPiBhZGRfZXN0aW1hdGUoU1BBTSwgJHhtbF9wLT5kZWZl bnNpb0FycmF5WydzcGFtaW5lc3MnXSk7CgkJCQlpZiAoJHhtbF9wLT5kZWZlbnNpb0FycmF5 WydzcGFtaW5lc3MnXT4wLjQpCgkJCQkJJGV2YWx1YXRvciAtPiBhZGRfZXN0aW1hdGUoTU9E RVJBVEUsICR4bWxfcC0+ZGVmZW5zaW9BcnJheVsnc3BhbWluZXNzJ10pOwoJCQkJZWxzZQoJ CQkJCSRldmFsdWF0b3IgLT4gYWRkX2VzdGltYXRlKFZJU0lCTEUsICR4bWxfcC0+ZGVmZW5z aW9BcnJheVsnc3BhbWluZXNzJ10pOwoJCQl9IGVsc2UgewoJCQkJJGV2YWx1YXRvciAtPiBh ZGRfZXN0aW1hdGUoVklTSUJMRSwgJHhtbF9wLT5kZWZlbnNpb0FycmF5WydzcGFtaW5lc3Mn XSk7CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gcmVwb3J0X2ZhbHNlX25lZ2F0aXZlKCRkZWZl bnNpb19pZCkKCXsKCQkvLyBnZXQgZGVmZW5zaW8gcm93ICYgY2hlY2sgdG8gbWFrZSBzdXJl IHdlJ3ZlIGdvdCBhIGRpc2N1c3NfaWQKCQkkZGlzY3Vzc19yb3cgPSBzYWZlX3JvdygnZGlz Y3Vzc19pZCwgcmVwb3J0X2ZhbHNlX3Bvc2l0aXZlJywgJ3R4cF9kaXNjdXNzX2RlZmVuc2lv JywgJ2RlZmVuc2lvX2lkPSInLmFkZHNsYXNoZXMoJGRlZmVuc2lvX2lkKS4nIicpOwoKCQkv L2xldCBkZWZlbnNpbyBrbm93IGl0IHJlYWxseSBpcyBzcGFtCgkJJGRlZmVuc2lvX3NpZyA9 IGFycmF5KCdzaWduYXR1cmVzJz0+JGRlZmVuc2lvX2lkKTsKCQkkcmVzcG9uc2UgPSAkdGhp cy0+ZG9DdXJsKCdyZXBvcnQtZm4nLCAkZGVmZW5zaW9fc2lnKTsKCgkJJHhtbF9wID0gbmV3 IFdsa0RlZmVuc2lvUmV0dXJuUGFyc2VyKCRyZXNwb25zZSk7CgoJCS8vIGlmIGl0IHN1Y2Nl ZWRlZCwgZG8gdGhlIGJlbG93CgkJaWYoJHhtbF9wLT5kZWZlbnNpb0FycmF5WydzdGF0dXMn XT09J3N1Y2Nlc3MnKSB7CgkJCS8vIGlmIGl0IHdhcyByZXBvcnRlZCBhcyBhIGZhbHNlX25l Z2F0aXZlIGJlZm9yZSwgZG9uJ3Qgc2V0IGl0IGFzIGEgZmFsc2UgcG9zaXRpdmUKCQkJaWYo JGRpc2N1c3Nfcm93WydyZXBvcnRfZmFsc2VfcG9zaXRpdmUnXT09MCkgewoJCQkJLy9zZXQg ZGlzY3Vzc19kZWZlbnNpbyByb3cgdGhhdCBpdCB3YXMgcmVwb3J0ZWQgYXMgYSBmYWxzZV9u ZWdhdGl2ZQoJCQkJc2FmZV91cGRhdGUoJ3R4cF9kaXNjdXNzX2RlZmVuc2lvJywgJ3JlcG9y dF9mYWxzZV9uZWdhdGl2ZT0xJywgJ2RlZmVuc2lvX2lkPSInLmFkZHNsYXNoZXMoJGRlZmVu c2lvX2lkKS4nIicpOwoJCQl9CgoJCQkvLyBnZXQgYXV0by1tYXJrIHNldHRpbmcKCQkJJHRo ZWF1dG8gPSBmZXRjaCgndmFsJywndHhwX3ByZWZzJywnbmFtZScsJ3dsa19kZWZlbnNpb19h dXRvX21hcmsnKTsKCgkJCWlmKCR0aGVhdXRvPT0xKSB7CgkJCQkvLyBzZXQgdGhlIGNvbW1l bnQgdG8gdmlzaWJsZT0tMSBvbiB0aGUgZGlzY3VzcyB0YWJsZQoJCQkJc2FmZV91cGRhdGUo J3R4cF9kaXNjdXNzJywgJ3Zpc2libGU9Ii0xIicsICdkaXNjdXNzaWQ9IicuYWRkc2xhc2hl cygkZGlzY3Vzc19yb3dbJ2Rpc2N1c3NfaWQnXSkuJyInKTsKCQkJfQoKCQkJcGFnZXRvcCgi RGVmZW5zaW8iLCAiVGhlIGZhbHNlIG5lZ2F0aXZlIHdhcyByZXBvcnRlZCB0byBEZWZlbnNp by4iKTsKCQl9IGVsc2UgewoJCQkvLyBlbHNlLCBsZXQgdGhlbSBrbm93IHRoZSByZXBvcnQg ZmFpbGVkLgoJCQlwYWdldG9wKCJEZWZlbnNpbyIsICJTb3JyeSwgYnV0IHdlIGZhaWxlZCB0 byBub3RpZnkgRGVmZW5zaW8gb2YgdGhlIGZhbHNlIG5lZ2F0aXZlLiBQbGVhc2UgdHJ5IGFn YWluLiIpOwoJCX0KCX0KCglmdW5jdGlvbiByZXBvcnRfZmFsc2VfcG9zaXRpdmUoJGRlZmVu c2lvX2lkKQoJewoJCS8vIGdldCBkZWZlbnNpbyByb3cgJiBjaGVjayB0byBtYWtlIHN1cmUg d2UndmUgZ290IGEgZGlzY3Vzc19pZAoJCSRkaXNjdXNzX3JvdyA9IHNhZmVfcm93KCdkaXNj dXNzX2lkLCByZXBvcnRfZmFsc2VfbmVnYXRpdmUnLCAndHhwX2Rpc2N1c3NfZGVmZW5zaW8n LCAnZGVmZW5zaW9faWQ9IicuYWRkc2xhc2hlcygkZGVmZW5zaW9faWQpLiciJyk7CgoJCS8v bGV0IGRlZmVuc2lvIGtub3cgaXQgd2Fzbid0IHJlYWxseSBzcGFtCgkJJGRlZmVuc2lvX3Np ZyA9IGFycmF5KCdzaWduYXR1cmVzJz0+JGRlZmVuc2lvX2lkKTsKCQkkcmVzcG9uc2UgPSAk dGhpcy0+ZG9DdXJsKCdyZXBvcnQtZnAnLCAkZGVmZW5zaW9fc2lnKTsKCgkJJHhtbF9wID0g bmV3IFdsa0RlZmVuc2lvUmV0dXJuUGFyc2VyKCRyZXNwb25zZSk7CgkJLy8gaWYgaXQgc3Vj Y2VlZGVkLCBkbyB0aGUgYmVsb3cKCQlpZigkeG1sX3AtPmRlZmVuc2lvQXJyYXlbJ3N0YXR1 cyddPT0nc3VjY2VzcycpIHsKCQkJLy8gaWYgaXQgd2FzIHJlcG9ydGVkIGFzIGEgZmFsc2Vf bmVnYXRpdmUgYmVmb3JlLCBkb24ndCBzZXQgaXQgYXMgYSBmYWxzZSBwb3NpdGl2ZQoJCQlp ZigkZGlzY3Vzc19yb3dbJ3JlcG9ydF9mYWxzZV9uZWdhdGl2ZSddPT0wKSB7CgkJCQkvL3Nl dCBkaXNjdXNzX2RlZmVuc2lvIHJvdyB0aGF0IGl0IHdhcyByZXBvcnRlZCBhcyBhIGZhbHNl X3Bvc2l0aXZlCgkJCQlzYWZlX3VwZGF0ZSgndHhwX2Rpc2N1c3NfZGVmZW5zaW8nLCAncmVw b3J0X2ZhbHNlX3Bvc2l0aXZlPTEnLCAnZGVmZW5zaW9faWQ9IicuYWRkc2xhc2hlcygkZGVm ZW5zaW9faWQpLiciJyk7CgkJCX0KCgkJCS8vIGdldCBhdXRvLW1hcmsgc2V0dGluZwoJCQkk dGhlYXV0byA9IGZldGNoKCd2YWwnLCd0eHBfcHJlZnMnLCduYW1lJywnd2xrX2RlZmVuc2lv X2F1dG9fbWFyaycpOwoKCQkJaWYoJHRoZWF1dG89PTEpIHsKCQkJCS8vIHNldCB0aGUgY29t bWVudCB0byB2aXNpYmxlPTEgb24gdGhlIGRpc2N1c3MgdGFibGUKCQkJCXNhZmVfdXBkYXRl KCd0eHBfZGlzY3VzcycsICd2aXNpYmxlPSIxIicsICdkaXNjdXNzaWQ9IicuYWRkc2xhc2hl cygkZGlzY3Vzc19yb3dbJ2Rpc2N1c3NfaWQnXSkuJyInKTsKCQkJfQoKCQkJcGFnZXRvcCgi RGVmZW5zaW8iLCAiVGhlIGZhbHNlIHBvc2l0aXZlIHdhcyByZXBvcnRlZCB0byBEZWZlbnNp by4iKTsKCQl9IGVsc2UgewoJCQkvLyBlbHNlLCBsZXQgdGhlbSBrbm93IHRoZSByZXBvcnQg ZmFpbGVkLgoJCQlwYWdldG9wKCJEZWZlbnNpbyIsICJTb3JyeSwgYnV0IHdlIGZhaWxlZCB0 byBub3RpZnkgRGVmZW5zaW8gb2YgdGhlIGZhbHNlIHBvc2l0aXZlLiBQbGVhc2UgdHJ5IGFn YWluLiIpOwoJCX0KCX0KCglmdW5jdGlvbiBhZG1pbl9pbnRlcmZhY2UoJHN0ZXA9bnVsbCkK CXsKCQlnbG9iYWwgJHByZWZzOwoKCQkkdGhlaWRzID0gc2FmZV9xdWVyeSgnU0VMRUNUIERJ U1RJTkNUKGAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vzc19kZWZlbnNpbycpLidgLmBpZGApIEZS T00gYCcuc2FmZV9wZngoJ3R4cF9kaXNjdXNzX2RlZmVuc2lvJykuJ2AgTEVGVCBKT0lOIGAn LnNhZmVfcGZ4KCd0eHBfZGlzY3VzcycpLidgIE9OIGAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vz c19kZWZlbnNpbycpLidgLmBkaXNjdXNzX2lkYD1gJy5zYWZlX3BmeCgndHhwX2Rpc2N1c3Mn KS4nYC5gZGlzY3Vzc2lkYCBXSEVSRSBgJy5zYWZlX3BmeCgndHhwX2Rpc2N1c3MnKS4nYC5g ZGlzY3Vzc2lkYCBJUyBOVUxMJyk7CgoJCWlmKG15c3FsX251bV9yb3dzKCR0aGVpZHMpPjAp CgkJewoJCQkkaWRzID0gYXJyYXkoKTsKCQkJd2hpbGUoJHJvdyA9IG15c3FsX2ZldGNoX2Fz c29jKCR0aGVpZHMpKSB7CgkJCQkkaWRzW10gPSAkcm93WydpZCddOwoJCQl9CgoJCQlpZihj b3VudCgkaWRzKT4wKSB7CgkJCQkkd2hlcmVfcyA9IGltcGxvZGUoJywgJywgJGlkcyk7CgkJ CQlzYWZlX3F1ZXJ5KCdERUxFVEUgRlJPTSAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vzc19kZWZl bnNpbycpLicgV0hFUkUgJy5zYWZlX3BmeCgndHhwX2Rpc2N1c3NfZGVmZW5zaW8nKS4nLmBp ZGAgSU4gKCcuJHdoZXJlX3MuJyknKTsKCQkJfQoJCX0KCgkJaWYoaXNzZXQoJF9HRVRbJ3Bh Z2UnXSkgJiYgaXNfbnVtZXJpYygkX0dFVFsncGFnZSddKSkKCQl7CgkJCSRwYWdlID0gYWRk c2xhc2hlcygkX0dFVFsncGFnZSddLTEpOwoJCQkkdGhlcGFnZSA9ICRfR0VUWydwYWdlJ107 CgkJfSBlbHNlIHsKCQkJJHBhZ2UgPSAwOwoJCQkkdGhlcGFnZSA9IDE7CgkJfQoKCQkkdGhl X2NvdW50X3IgPSBzYWZlX3F1ZXJ5KCdTRUxFQ1QgQ09VTlQoRElTVElOQ1QoJy5zYWZlX3Bm eCgndHhwX2Rpc2N1c3NfZGVmZW5zaW8nKS4nLmlkKSkgQVMgY291bnQgRlJPTSAnLnNhZmVf cGZ4KCd0eHBfZGlzY3Vzc19kZWZlbnNpbycpLicgTEVGVCBKT0lOICcuc2FmZV9wZngoJ3R4 cF9kaXNjdXNzJykuJyBPTiAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vzc19kZWZlbnNpbycpLicu ZGlzY3Vzc19pZD0nLnNhZmVfcGZ4KCd0eHBfZGlzY3VzcycpLicuZGlzY3Vzc2lkIExFRlQg Sk9JTiAnLnNhZmVfcGZ4KCd0ZXh0cGF0dGVybicpLicgT04gJy5zYWZlX3BmeCgndGV4dHBh dHRlcm4nKS4nLklEPScuc2FmZV9wZngoJ3R4cF9kaXNjdXNzJykuJy5wYXJlbnRpZCcpOwoK CQkkdGhlX2NvdW50ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHRoZV9jb3VudF9yKTsKCQkkdGhl X2NvdW50ID0gJHRoZV9jb3VudFsnY291bnQnXTsKCgkJLy9HcmFiIGFsbCBkZWZlbnNpbydk IGNvbW1lbnRzLCBwYWdpbmF0ZSAobW9zdCByZWNlbnQgMjAgZmlyc3QpCgkJJGRfY29tbWVu dHNfciA9IHNhZmVfcXVlcnkoJ1NFTEVDVCAnLnNhZmVfcGZ4KCd0ZXh0cGF0dGVybicpLicu SUQsICcuc2FmZV9wZngoJ3RleHRwYXR0ZXJuJykuJy5UaXRsZSwgJy5zYWZlX3BmeCgndHhw X2Rpc2N1c3NfZGVmZW5zaW8nKS4nLmlkLCAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vzc19kZWZl bnNpbycpLicuZGVmZW5zaW9faWQsICcuc2FmZV9wZngoJ3R4cF9kaXNjdXNzX2RlZmVuc2lv JykuJy5zcGFtaW5lc3MsICcuc2FmZV9wZngoJ3R4cF9kaXNjdXNzX2RlZmVuc2lvJykuJy5z cGFtLCAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vzc19kZWZlbnNpbycpLicucmVwb3J0X2ZhbHNl X25lZ2F0aXZlLCAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vzc19kZWZlbnNpbycpLicucmVwb3J0 X2ZhbHNlX3Bvc2l0aXZlLCAnLnNhZmVfcGZ4KCd0eHBfZGlzY3VzcycpLicubmFtZSwgJy5z YWZlX3BmeCgndHhwX2Rpc2N1c3MnKS4nLmVtYWlsLCAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vz cycpLicud2ViLCAnLnNhZmVfcGZ4KCd0eHBfZGlzY3VzcycpLicuaXAsICcuc2FmZV9wZngo J3R4cF9kaXNjdXNzJykuJy5tZXNzYWdlLCAnLnNhZmVfcGZ4KCd0eHBfZGlzY3VzcycpLicu dmlzaWJsZSBGUk9NICcuc2FmZV9wZngoJ3R4cF9kaXNjdXNzX2RlZmVuc2lvJykuJyBMRUZU IEpPSU4gJy5zYWZlX3BmeCgndHhwX2Rpc2N1c3MnKS4nIE9OICcuc2FmZV9wZngoJ3R4cF9k aXNjdXNzX2RlZmVuc2lvJykuJy5kaXNjdXNzX2lkPScuc2FmZV9wZngoJ3R4cF9kaXNjdXNz JykuJy5kaXNjdXNzaWQgTEVGVCBKT0lOICcuc2FmZV9wZngoJ3RleHRwYXR0ZXJuJykuJyBP TiAnLnNhZmVfcGZ4KCd0ZXh0cGF0dGVybicpLicuSUQ9Jy5zYWZlX3BmeCgndHhwX2Rpc2N1 c3MnKS4nLnBhcmVudGlkIE9SREVSIEJZICcuc2FmZV9wZngoJ3R4cF9kaXNjdXNzJykuJy5k aXNjdXNzaWQgREVTQyBMSU1JVCAnLiRwYWdlLicsIDIwJyk7CgoJCWlmKG15c3FsX251bV9y b3dzKCRkX2NvbW1lbnRzX3IpPjApCgkJewoJCQkvL0Rpc3BsYXkgdGhlbQoJCQllY2hvICcK CQkJPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBp ZD0ibGlzdCIgYWxpZ249ImNlbnRlciIgd2lkdGg9IjkwJSI+CgkJCQk8dHI+CgkJCQkJPHRo Pk5hbWU8L3RoPgoJCQkJCTx0aD5TdGF0dXM8L3RoPgoJCQkJCTx0aD5QYXJlbnQ8L3RoPgoJ CQkJCTx0aCBjbGFzcz0iZGVmZW5zaW8iPlNwYW0/PC90aD4KCQkJCQk8dGggY2xhc3M9ImRl ZmVuc2lvIj5TcGFtaW5lc3M8L3RoPgoJCQkJPC90cj4KCQkJJzsKCgkJCXdoaWxlKCRjb21t ZW50ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGRfY29tbWVudHNfcikpCgkJCXsKCQkJCS8vcHJp bnRfcigkY29tbWVudCk7CgkJCQllY2hvICcKCQkJCTx0cic7CgkJCQlpZigkY29tbWVudFs2 XT09MSkgewoJCQkJCWVjaG8gJyBzdHlsZT0iYmFja2dyb3VuZDojZmY3ZjUwIic7CgkJCQl9 CgkJCQlpZigkY29tbWVudFs3XT09MSkgewoJCQkJCWVjaG8gJyBzdHlsZT0iYmFja2dyb3Vu ZDojZWVlOGFhIic7CgkJCQl9CgkJCQllY2hvICc+CgkJCQknOwoJCQkJaWYoc3RycG9zKCRj b21tZW50WzEwXSwgJ2h0dHA6Ly8nKT09PWZhbHNlKSB7CgkJCQkJZWNobyAnPHRkPjxhIGhy ZWY9Imh0dHA6Ly8nLiRjb21tZW50WzEwXS4nIiB0aXRsZT0iJy4kY29tbWVudFsxMF0uJyI+ Jy4kY29tbWVudFs4XS4nPC9hPjwvdGQ+JzsKCQkJCX0gZWxzZSB7CgkJCQkJZWNobyAnPHRk PjxhIGhyZWY9IicuJGNvbW1lbnRbMTBdLiciIHRpdGxlPSInLiRjb21tZW50WzEwXS4nIj4n LiRjb21tZW50WzhdLic8L2E+PC90ZD4nOwoJCQkJfQoJCQkJCWVjaG8gJzx0ZD4nOwoJCQkJ CWlmKCRjb21tZW50WzEzXT09Jy0xJykgewoJCQkJCQllY2hvICdIaWRkZW4nOwoJCQkJCX0g ZWxzZSB7CgkJCQkJCWVjaG8gJ1Zpc2libGUnOwoJCQkJCX0KCQkJCQllY2hvICc8L3RkPgoJ CQkJCTx0ZD48YSBocmVmPSI/ZXZlbnQ9bGlzdCYjMzg7c3RlcD1saXN0JiMzODtzZWFyY2hf bWV0aG9kPWlkJiMzODtjcml0PScuJGNvbW1lbnRbMF0uJyIgdGl0bGU9IlZpZXcgdGhpcyBB cnRpY2xlIj4nLiRjb21tZW50WzFdLic8L2E+PC90ZD4KCQkJCQk8dGQ+JzsKCQkJCQlpZigk Y29tbWVudFs1XT09MSkgewoJCQkJCQllY2hvICc8YSBocmVmPSI/ZXZlbnQ9d2xrX2RlZmVu c2lvX2FkbWluJzsKCQkJCQkJaWYoaXNzZXQoJF9HRVRbJ3BhZ2UnXSkpCgkJCQkJCXsKCQkJ CQkJCWVjaG8gJyYjMzg7cGFnZT0nLiRfR0VUWydwYWdlJ107CgkJCQkJCX0KCQkJCQkJZWNo byAnJiMzODtyZXBvcnRmYWxzZXBvcz0nLiRjb21tZW50WzNdLiciIHRpdGxlPVwnU3dpdGNo IHRvICJObyI/XCc+WWVzPC9hPic7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZWNobyAnPGEgaHJl Zj0iP2V2ZW50PXdsa19kZWZlbnNpb19hZG1pbic7CgkJCQkJCWlmKGlzc2V0KCRfR0VUWydw YWdlJ10pKQoJCQkJCQl7CgkJCQkJCQllY2hvICcmIzM4O3BhZ2U9Jy4kX0dFVFsncGFnZSdd OwoJCQkJCQl9CgkJCQkJCWVjaG8gJyYjMzg7cmVwb3J0ZmFsc2VuZWc9Jy4kY29tbWVudFsz XS4nIiB0aXRsZT1cJ1N3aXRjaCB0byAiWWVzIj9cJz5ObzwvYT4nOwoJCQkJCX0KCQkJCQll Y2hvICc8L3RkPgoJCQkJCTx0ZCB0aXRsZT0iU3BhbWluZXNzIFJhdGluZyAoMT09ZGVmaW5p dGUgc3BhbSkiPicuJGNvbW1lbnRbNF0uJzwvdGQ+CgkJCQk8L3RyPgoJCQkJJzsKCQkJfQoK CQkJZWNobyAnCgkJCQk8dHI+CgkJCQkJPHRkIGNvbHNwYW49IjMiIHN0eWxlPSJwYWRkaW5n LXRvcDo1cHg7dGV4dC1hbGlnbjpyaWdodDtib3JkZXI6bm9uZTsiPgoJCQkJCQk8c3BhbiBz dHlsZT0iYmFja2dyb3VuZDojZmY3ZjUwIj4mbmJzcDsgJm5ic3A7PC9zcGFuPiBGYWxzZSBO ZWcgUmVwb3J0ZWQgJm5ic3A7IHwgJm5ic3A7CgkJCQkJCTxzcGFuIHN0eWxlPSJiYWNrZ3Jv dW5kOiNlZWU4YWEiPiZuYnNwOyAmbmJzcDs8L3NwYW4+IEZhbHNlIFBvcyBSZXBvcnRlZAoJ CQkJCTwvdGQ+CgkJCQkJPHRkIGNvbHNwYW49IjIiIHN0eWxlPSJwYWRkaW5nLXRvcDo1cHg7 dGV4dC1hbGlnbjpyaWdodDtib3JkZXI6bm9uZTsiPgoJCQkJJzsKCQkJCWlmKCR0aGVwYWdl PT0xKSB7CgkJCQkJZWNobyAnPHNwYW4gY2xhc3M9Im5hdmxpbmstZGlzYWJsZWQiPiYjODI0 OTsmIzE2MDtQcmV2PC9zcGFuPic7CgkJCQl9IGVsc2UgewoJCQkJCWVjaG8gJzxhIGhyZWY9 Ij9ldmVudD13bGtfZGVmZW5zaW9fYWRtaW4mIzM4O3BhZ2U9Jy4oJHRoZXBhZ2UtMSkuJyIg Y2xhc3M9Im5hdmxpbmsiPiYjODI0OTsmIzE2MDtQcmV2PC9hPic7CgkJCQl9CgoJCQkJZWNo byAnICYjMTYwOyAnOwoKCQkJCWlmKCgkdGhlX2NvdW50LzIwKT09JHRoZXBhZ2UgfHwgKCR0 aGVfY291bnQvMjApPCR0aGVwYWdlKSB7CgkJCQkJCWVjaG8gJzxzcGFuIGNsYXNzPSJuYXZs aW5rLWRpc2FibGVkIj5OZXh0JiMxNjA7JiM4MjUwOzwvc3Bhbj4nOwoJCQkJfSBlbHNlIHsK CQkJCQllY2hvICc8YSBocmVmPSI/ZXZlbnQ9d2xrX2RlZmVuc2lvX2FkbWluJiMzODtwYWdl PScuKCR0aGVwYWdlKzEpLiciIGNsYXNzPSJuYXZsaW5rIj5OZXh0JiMxNjA7JiM4MjUwOzwv YT4nOwoJCQkJfQoJCQllY2hvICcKCQkJCQk8L3RkPgoJCQkJPC90cj4KCQkJPC90YWJsZT4K CQkJJzsKCQl9Cgl9CgoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gLS0tIFRoaXMgb25lIGlzIGZvciB1cGRh dGluZyB0aGUgZGIKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGRiX2FkZCgkdW5JbnN0YWxsID0g bnVsbCkgewoJCWlmKCR1bkluc3RhbGwpIHsKCQkJc2FmZV9kZWxldGUoJ3R4cF9wcmVmcycs Im5hbWUgPSAnd2xrX2RlZmVuc2lvX2FwaWtleSciKTsKCQkJc2FmZV9kZWxldGUoJ3R4cF9w cmVmcycsIm5hbWUgPSAnd2xrX2RlZmVuc2lvX2xpbWl0JyIpOwoJCQlzYWZlX2RlbGV0ZSgn dHhwX3ByZWZzJywibmFtZSA9ICd3bGtfZGVmZW5zaW9fYXV0b19tYXJrJyIpOwoJCQlzYWZl X3F1ZXJ5KCdEUk9QIFRBQkxFIGAnLnNhZmVfcGZ4KCd0eHBfZGlzY3Vzc19kZWZlbnNpbycp LidgJyk7CgkJCXBhZ2V0b3AoJ0RlZmVuc2lvJywgJ0RlZmVuc2lvIGhhcyBiZWVuIHJlbW92 ZWQgZnJvbSB5b3VyIGRhdGFiYXNlLicpOwoJCX0gZWxzZSB7CgkJCXNhZmVfaW5zZXJ0KCd0 eHBfcHJlZnMnLCJwcmVmc19pZCA9ICcxJyxuYW1lID0gJ3dsa19kZWZlbnNpb19hcGlrZXkn LHZhbCA9ICcnLHR5cGUgPSAnMScsZXZlbnQgPSAnd2xrX2RlZmVuc2lvJyxodG1sID0gJ3Rl eHRfaW5wdXQnLHBvc2l0aW9uID0gJzEwJyIpOwoJCQlzYWZlX2luc2VydCgndHhwX3ByZWZz JywicHJlZnNfaWQgPSAnMScsbmFtZSA9ICd3bGtfZGVmZW5zaW9fbGltaXQnLHZhbCA9ICcw LjgnLHR5cGUgPSAnMScsZXZlbnQgPSAnd2xrX2RlZmVuc2lvJyxodG1sID0gJ3RleHRfaW5w dXQnLHBvc2l0aW9uID0gJzIwJyIpOwoJCQlzYWZlX2luc2VydCgndHhwX3ByZWZzJywicHJl ZnNfaWQgPSAnMScsbmFtZSA9ICd3bGtfZGVmZW5zaW9fYXV0b19tYXJrJyx2YWwgPSAnMScs dHlwZSA9ICcxJyxldmVudCA9ICd3bGtfZGVmZW5zaW8nLGh0bWwgPSAneWVzbm9yYWRpbycs cG9zaXRpb24gPSAnMzAnIik7CgkJCXNhZmVfcXVlcnkoIkNSRUFURSBUQUJMRSAiLnNhZmVf cGZ4KCd0eHBfZGlzY3Vzc19kZWZlbnNpbycpLiIgKAoJCQkgIGBpZGAgaW50KDExKSBOT1Qg TlVMTCBhdXRvX2luY3JlbWVudCwKCQkJICBgZGlzY3Vzc19pZGAgaW50KDYpIHVuc2lnbmVk IHplcm9maWxsIE5PVCBOVUxMIGRlZmF1bHQgJzAwMDAwMCcsCgkJCSAgYG5hbWVgIHZhcmNo YXIoMjU1KSBOT1QgTlVMTCBkZWZhdWx0ICcnLAoJCQkgIGBlbWFpbGAgdmFyY2hhcig1MCkg Tk9UIE5VTEwgZGVmYXVsdCAnJywKCQkJICBgbWVzc2FnZWAgdGV4dCBOT1QgTlVMTCwKCQkJ ICBgZGVmZW5zaW9faWRgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCBkZWZhdWx0ICcnLAoJCQkg IGBzcGFtaW5lc3NgIGZsb2F0IE5PVCBOVUxMIGRlZmF1bHQgJzAnLAoJCQkgIGByZXBvcnRf ZmFsc2VfbmVnYXRpdmVgIHRpbnlpbnQoMSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsCgkJCSAg YHJlcG9ydF9mYWxzZV9wb3NpdGl2ZWAgdGlueWludCgxKSBOT1QgTlVMTCBkZWZhdWx0ICcw JywKCQkJICBgc3BhbWAgdGlueWludCgxKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywKCQkJICBQ UklNQVJZIEtFWSAgKGBpZGApCgkJCSkgRU5HSU5FPU15SVNBTSIpOwoKCQkJJHRoaXMtPl9f Y29uc3RydWN0KCk7CgkJCS8vcmV0dXJuICdQcmVmcyBzYXZlZCB0byBkYic7CgkJfQoJfQoK CWZ1bmN0aW9uIHNob3dfYXBpX2Zvcm0oJGFwaV9rZXk9bnVsbCkgewoJCSR0aGVrZXkgPSBm ZXRjaCgndmFsJywndHhwX3ByZWZzJywnbmFtZScsJ3dsa19kZWZlbnNpb19hcGlrZXknKTsK CQkkdGhlYXV0byA9IGZldGNoKCd2YWwnLCd0eHBfcHJlZnMnLCduYW1lJywnd2xrX2RlZmVu c2lvX2F1dG9fbWFyaycpOwoJCSR0aGVsaW1pdGVyID0gZmV0Y2goJ3ZhbCcsJ3R4cF9wcmVm cycsJ25hbWUnLCd3bGtfZGVmZW5zaW9fbGltaXQnKTsKCQkkb3B0aW9ucyA9IGFycmF5KCcw Jz0+JzAnLCAnMC4xJz0+JzAuMScsICcwLjInPT4nMC4yJywgJzAuMyc9PicwLjMnLCAnMC40 Jz0+JzAuNCcsICcwLjUnPT4nMC41JywgJzAuNic9PicwLjYnLCAnMC43Jz0+JzAuNycsICcw LjgnPT4nMC44JywgJzAuOSc9PicwLjknLCAnMSc9PicxJyk7CgoJCWVjaG8gIjx0YWJsZSBj ZWxscGFkZGluZz1cIjNcIiBjZWxsc3BhY2luZz1cIjBcIiBib3JkZXI9XCIwXCIgaWQ9XCJl ZGl0XCIgYWxpZ249XCJjZW50ZXJcIj48dHI+PHRkIGlkPVwiYXJ0aWNsZS1jb2wtMVwiPiI7 CgkJZWNobyBmb3JtKAoJCQlncmFmKCI8ZmllbGRzZXQ+Ii50YWcoIk9wdGlvbnMiLCAibGVn ZW5kIikuIkVudGVyIHlvdXIgQVBJIGtleSBoZXJlOiIuCgkJCQlmSW5wdXQoImhpZGRlbiIs ICJ3bGtfZGVmZW5zaW9fYWRtaW4iLCAnd2xrX2RlZmVuc2lvX2FkbWluJykuCgkJCQlmSW5w dXQoInRleHQiLCAid2xrX2RlZmVuc2lvX2FwaWtleSIsICR0aGVrZXkpLgoJCQkJIjxiciAv PjxiciAvPkF1dG8tbWFyayBhcyBzcGFtPzxiciAvPiIuCgkJCQlvbm9mZlJhZGlvKCJ3bGtf ZGVmZW5zaW9fYXV0b19tYXJrIiwgJHRoZWF1dG8pLgoJCQkJIjxiciAvPjxiciAvPiZoZWxs aXA7aWYgc3BhbWluZXNzICZndDsmIzYxOyAiLgoJCQkJc2VsZWN0SW5wdXQoIndsa19kZWZl bnNpb19saW1pdCIsICRvcHRpb25zLCAkdGhlbGltaXRlcikuCgkJCQkiPGJyIC8+PGJyIC8+ Ii4KCQkJCWZJbnB1dCgic3VibWl0IiwgInNhdmUiLCAiU2F2ZSIsICJzbWFsbGVyYm94Iiku CgkJCQllSW5wdXQoIndsa19kZWZlbnNpb19hZG1pbiIpLgoJCQkJLy8uc0lucHV0KCJzdGVw X2EiKQoJCQkJIjwvZmllbGRzZXQ+IgoJCQkpCgkJKTsKCQllY2hvICc8L2Rpdj4KCQkJPHA+ PGEgaHJlZj0iP2V2ZW50PXdsa19kZWZlbnNpb19hZG1pbiYjMzg7dW5pbnN0YWxsPXRydWUi PmNsaWNrIGhlcmU8L2E+IHRvIHVuaW5zdGFsbDxwPgoJCTwvdGQ+JzsKCX0KfQoKZnVuY3Rp b24gd2xrX2RlZmVuc2lvKCkKewoJJHdsa19kZWYgPSBuZXcgV2xrRGVmZW5zaW8oKTsKCSR3 bGtfZGVmLT5hdWRpdF9jb21tZW50KCk7Cn0KCmZ1bmN0aW9uIHdsa19kZWZlbnNpb19hZG1p bigpCnsKCSR3bGtfZGVmID0gbmV3IFdsa0RlZmVuc2lvKCk7Cn0KCmZ1bmN0aW9uIHdsa19k ZWZlbnNpb19hbm5vdW5jZSgpCnsKCSR3bGtfZGVmID0gbmV3IFdsa0RlZmVuc2lvKCk7Cgkk d2xrX2RlZi0+YW5ub3VuY2UoKTsKfSI7czozOiJtZDUiO3M6MzI6IjM4MjYxN2RiODYyYzU5 MmE1NTI0MDZkNzNhYzJhNmNlIjt9