ZGlmZiAtLWdpdCBhL2F1dG8vY2MvaWNjIGIvYXV0by9jYy9pY2MKaW5kZXggYTMyZWVjNC4uYjAzNmNiNiAxMDA2NDQKLS0tIGEvYXV0by9jYy9pY2MKKysrIGIvYXV0by9jYy9pY2MKQEAgLTU3LDYgKzU3LDEyIEBACiBDRkxBR1M9IiRDRkxBR1MgLXcxIgogI0NGTEFHUz0iJENGTEFHUyAtdzIiCiAKKyMgZGlzYWJsZSB0aGUgSUNDIDguMCBlcnJvcnM6CisjICAgIGVycm9yICMxODE6IGFyZ3VtZW50IGlzIGluY29tcGF0aWJsZSB3aXRoIGNvcnJlc3BvbmRpbmcgZm9ybWF0CisjICAgICAgICAgICAgICAgIHN0cmluZyBjb252ZXJzaW9uCisjICAgIGVycm9yICMyNjk6IGludmFsaWQgZm9ybWF0IHN0cmluZyBjb252ZXJzaW9uCitDRkxBR1M9IiRDRkxBR1MgLXdkMTgxIC13ZDI2OSIKKwogIyBzdG9wIG9uIHdhcm5pbmcKIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIgogCmRpZmYgLS1naXQgYS9hdXRvL2NvbmZpZ3VyZSBiL2F1dG8vY29uZmlndXJlCmluZGV4IDBjZDE3ZWEuLmQwNDZiNTkgMTAwNzU1Ci0tLSBhL2F1dG8vY29uZmlndXJlCisrKyBiL2F1dG8vY29uZmlndXJlCkBAIC01MSw3ICs1MSwxNCBAQAogaWYgdGVzdCAtbiAiJE5HWF9FUlJPUl9MT0dfUEFUSCI7IHRoZW4KICAgICBoYXZlPU5HWF9FUlJPUl9MT0dfUEFUSCB2YWx1ZT0iXCIkTkdYX0VSUk9SX0xPR19QQVRIXCIiIC4gYXV0by9kZWZpbmUKIGZpCisKIGhhdmU9TkdYX0hUVFBfTE9HX1BBVEggdmFsdWU9IlwiJE5HWF9IVFRQX0xPR19QQVRIXCIiIC4gYXV0by9kZWZpbmUKK2hhdmU9TkdYX0hUVFBfQ0xJRU5UX1RFTVBfUEFUSCB2YWx1ZT0iXCIkTkdYX0hUVFBfQ0xJRU5UX1RFTVBfUEFUSFwiIgorLiBhdXRvL2RlZmluZQoraGF2ZT1OR1hfSFRUUF9QUk9YWV9URU1QX1BBVEggdmFsdWU9IlwiJE5HWF9IVFRQX1BST1hZX1RFTVBfUEFUSFwiIgorLiBhdXRvL2RlZmluZQoraGF2ZT1OR1hfSFRUUF9GQVNUQ0dJX1RFTVBfUEFUSCB2YWx1ZT0iXCIkTkdYX0hUVFBfRkFTVENHSV9URU1QX1BBVEhcIiIKKy4gYXV0by9kZWZpbmUKIAogaGF2ZT1OR1hfVVNFUiB2YWx1ZT0iXCIkTkdYX1VTRVJcIiIgLiBhdXRvL2RlZmluZQogaGF2ZT1OR1hfR1JPVVAgdmFsdWU9IlwiJE5HWF9HUk9VUFwiIiAuIGF1dG8vZGVmaW5lCmRpZmYgLS1naXQgYS9hdXRvL2xpYi9vcGVuc3NsL2NvbmYgYi9hdXRvL2xpYi9vcGVuc3NsL2NvbmYKaW5kZXggMGE3MGYzMy4uNjc5MmU3ZiAxMDA2NDQKLS0tIGEvYXV0by9saWIvb3BlbnNzbC9jb25mCisrKyBiL2F1dG8vbGliL29wZW5zc2wvY29uZgpAQCAtMTMsOSArMTMsMTUgQEAKICAgICAgICAgICAgIExJTktfREVQUz0iJExJTktfREVQUyAkT1BFTlNTTC9saWJzc2wuYSAkT1BFTlNTTC9saWJjcnlwdG8uYSIKICAgICAgICAgICAgIENPUkVfTElCUz0iJENPUkVfTElCUyAkT1BFTlNTTC9saWJzc2wuYSAkT1BFTlNTTC9saWJjcnlwdG8uYSIKICAgICAgICAgOzsKLQogICAgIGVzYWMKIAorICAgIGNhc2UgIiROR1hfU1lTVEVNIiBpbgorICAgICAgICBTdW5PU3xMaW51eCkKKyAgICAgICAgICAgIENPUkVfTElCUz0iJENPUkVfTElCUyAtbGRsIgorICAgICAgICA7OworICAgIGVzYWMKKworCiBlbHNlCiAKICAgICBpZiBbICROR1hfUExBVEZPUk0gIT0gd2luMzIgXTsgdGhlbgpkaWZmIC0tZ2l0IGEvYXV0by9saWIvb3BlbnNzbC9tYWtlIGIvYXV0by9saWIvb3BlbnNzbC9tYWtlCmluZGV4IDI4YWIwMDMuLjQwMDc2MTQgMTAwNjQ0Ci0tLSBhL2F1dG8vbGliL29wZW5zc2wvbWFrZQorKysgYi9hdXRvL2xpYi9vcGVuc3NsL21ha2UKQEAgLTYsNiArNiw3IEBACiAgICAgKikKICAgICAgICAgZWNobyAiJE9QRU5TU0wvbGlic3NsLmE6IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICRNQUtFRklMRQogICAgICAgICBlY2hvICIJY2QgJE9QRU5TU0wgXFwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAkTUFLRUZJTEUKKyAgICAgICAgZWNobyAiCSYmIFwkKE1BS0UpIGNsZWFuIFxcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJE1BS0VGSUxFCiAgICAgICAgIGVjaG8gIgkmJiBDQz1cIlwkKENDKVwiIFxcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICRNQUtFRklMRQogICAgICAgICBlY2hvICIJLi9jb25maWcgdGhyZWFkcyBuby1zaGFyZWQgXFwiICAgICAgICAgICAgICAgICAgICA+PiAkTUFLRUZJTEUKICAgICAgICAgZWNobyAiCSYmIFwkKE1BS0UpIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJE1BS0VGSUxFCmRpZmYgLS1naXQgYS9hdXRvL2xpYi96bGliL21ha2UgYi9hdXRvL2xpYi96bGliL21ha2UKaW5kZXggMTg4NGI1MC4uOGMxYWJkYyAxMDA2NDQKLS0tIGEvYXV0by9saWIvemxpYi9tYWtlCisrKyBiL2F1dG8vbGliL3psaWIvbWFrZQpAQCAtNTQsNyArNTQsNyBAQAogCiAkWkxJQi9saWJ6LmE6CSROR1hfTUFLRUZJTEUKIAljZCAkWkxJQiBcXAotCSYmIG1ha2UgY2xlYW4gXFwKKwkmJiBcJChNQUtFKSBjbGVhbiBcXAogCSYmIGNwIGNvbnRyaWIvYXNtNTg2L21hdGNoLlMgLiBcXAogCSYmIENGTEFHUz0iJFpMSUJfT1BUIC1EQVNNViIgQ0M9IlwkKENDKSIgXFwKIAkJLi9jb25maWd1cmUgXFwKQEAgLTcxLDcgKzcxLDcgQEAKIAogJFpMSUIvbGliei5hOgkkTkdYX01BS0VGSUxFCiAJY2QgJFpMSUIgXFwKLQkmJiBtYWtlIGNsZWFuIFxcCisJJiYgXCQoTUFLRSkgY2xlYW4gXFwKIAkmJiBjcCBjb250cmliL2FzbTY4Ni9tYXRjaC5TIC4gXFwKIAkmJiBDRkxBR1M9IiRaTElCX09QVCAtREFTTVYiIENDPSJcJChDQykiIFxcCiAJCS4vY29uZmlndXJlIFxcCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogJFpMSUIvbGliei5hOgkkTkdYX01BS0VGSUxFCiAJY2QgJFpMSUIgXFwKLQkmJiBtYWtlIGNsZWFuIFxcCisJJiYgXCQoTUFLRSkgY2xlYW4gXFwKIAkmJiBDRkxBR1M9IiRaTElCX09QVCIgQ0M9IlwkKENDKSIgXFwKIAkJLi9jb25maWd1cmUgXFwKIAkmJiBcJChNQUtFKSBsaWJ6LmEKZGlmZiAtLWdpdCBhL2F1dG8vbW9kdWxlcyBiL2F1dG8vbW9kdWxlcwppbmRleCA2MDUyYzRkLi4zMjIxZTI2IDEwMDY0NAotLS0gYS9hdXRvL21vZHVsZXMKKysrIGIvYXV0by9tb2R1bGVzCkBAIC0xNDAsNiArMTQwLDExIEBACiAgICAgSFRUUF9TUkNTPSIkSFRUUF9TUkNTICRIVFRQX1BST1hZX1NSQ1MiCiBmaQogCitpZiBbICRIVFRQX0ZBU1RDR0kgPSBZRVMgXTsgdGhlbgorICAgIEhUVFBfTU9EVUxFUz0iJEhUVFBfTU9EVUxFUyAkSFRUUF9GQVNUQ0dJX01PRFVMRSIKKyAgICBIVFRQX1NSQ1M9IiRIVFRQX1NSQ1MgJEhUVFBfRkFTVENHSV9TUkNTIgorZmkKKwogIyBTVFVCCiAjVVNFX01ENT1ZRVMKICNIVFRQX1NSQ1M9IiRIVFRQX1NSQ1MgJEhUUFBfQ0FDSEVfU1JDUyIKZGlmZiAtLWdpdCBhL2F1dG8vb3B0aW9ucyBiL2F1dG8vb3B0aW9ucwppbmRleCAzMGVjMzUyLi4zZDU1MmRmIDEwMDY0NAotLS0gYS9hdXRvL29wdGlvbnMKKysrIGIvYXV0by9vcHRpb25zCkBAIC0xMSw3ICsxMSw2IEBACiBOR1hfUElEX1BBVEg9CiBOR1hfVVNFUj0KIE5HWF9HUk9VUD0KLU5HWF9IVFRQX0xPR19QQVRIPQogCiBDQz0ke0NDOi1nY2N9CiBDUFA9CkBAIC00MCw2ICszOSwxMiBAQAogVVNFX1RIUkVBRFM9Tk8KIAogSFRUUD1ZRVMKKworTkdYX0hUVFBfTE9HX1BBVEg9CitOR1hfSFRUUF9DTElFTlRfVEVNUF9QQVRIPQorTkdYX0hUVFBfUFJPWFlfVEVNUF9QQVRIPQorTkdYX0hUVFBfRkFTVENHSV9URU1QX1BBVEg9CisKIEhUVFBfQ0hBUlNFVD1ZRVMKIEhUVFBfR1pJUD1ZRVMKIEhUVFBfU1NMPU5PCkBAIC01MCw2ICs1NSw3IEBACiBIVFRQX1NUQVRVUz1OTwogSFRUUF9SRVdSSVRFPVlFUwogSFRUUF9QUk9YWT1ZRVMKK0hUVFBfRkFTVENHST1ZRVMKIAogSU1BUD1OTwogCkBAIC0xMDcsNiArMTEzLDkgQEAKIAogICAgICAgICAtLXdpdGhvdXQtaHR0cCkgICAgICAgICAgICAgICAgICBIVFRQPU5PICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAtLWh0dHAtbG9nLXBhdGg9KikgICAgICAgICAgICAgICBOR1hfSFRUUF9MT0dfUEFUSD0iJHZhbHVlIiA7OworICAgICAgICAtLWh0dHAtY2xpZW50LWJvZHktdGVtcC1wYXRoPSopICBOR1hfSFRUUF9DTElFTlRfVEVNUF9QQVRIPSIkdmFsdWUiIDs7CisgICAgICAgIC0taHR0cC1wcm94eS10ZW1wLXBhdGg9KikgICAgICAgIE5HWF9IVFRQX1BST1hZX1RFTVBfUEFUSD0iJHZhbHVlIiA7OworICAgICAgICAtLWh0dHAtZmFzdGNnaS10ZW1wLXBhdGg9KikgICAgICBOR1hfSFRUUF9GQVNUQ0dJX1RFTVBfUEFUSD0iJHZhbHVlIiA7OwogCiAgICAgICAgIC0td2l0aC1odHRwX3NzbF9tb2R1bGUpICAgICAgICAgIEhUVFBfU1NMPVlFUyAgICAgICAgICAgICAgIDs7CiAgICAgICAgIC0td2l0aG91dC1odHRwX2NoYXJzZXRfbW9kdWxlKSAgIEhUVFBfQ0hBUlNFVD1OTyAgICAgICAgICAgIDs7CkBAIC0xMTgsNiArMTI3LDcgQEAKICAgICAgICAgLS13aXRob3V0LWh0dHBfc3RhdHVzX21vZHVsZSkgICAgSFRUUF9TVEFUVVM9Tk8gICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfcmV3cml0ZV9tb2R1bGUpICAgSFRUUF9SRVdSSVRFPU5PICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfcHJveHlfbW9kdWxlKSAgICAgSFRUUF9QUk9YWT1OTyAgICAgICAgICAgICAgOzsKKyAgICAgICAgLS13aXRob3V0LWh0dHBfZmFzdGNnaV9tb2R1bGUpICAgSFRUUF9GQVNUQ0dJPU5PICAgICAgICAgICAgOzsKIAogICAgICAgICAtLXdpdGgtaW1hcCkgICAgICAgICAgICAgICAgICAgICBJTUFQPVlFUyAgICAgICAgICAgICAgICAgICA7OwogCkBAIC0xNjEsMzAgKzE3MSw2OSBAQAogCiBjYXQgPDwgRU5ECiAKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtZXNzYWdlCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtZXNzYWdlCiAKLSAgLS11c2VyPVVTRVIgICAgICAgICAgICAgICAgICAgICAgc2V0IG5vbi1wcml2aWxlZ2UgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHdvcmtlciBwcm9jZXNzZXMKLSAgLS1ncm91cD1HUk9VUCAgICAgICAgICAgICAgICAgICAgc2V0IG5vbi1wcml2aWxlZ2UgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSB3b3JrZXIgcHJvY2Vzc2VzCisgIC0tcHJlZml4PVBBVEggICAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSBpbnN0YWxsYXRpb24gcHJlZml4CisgIC0tc2Jpbi1wYXRoPVBBVEggICAgICAgICAgICAgICAgICAgc2V0IHBhdGggdG8gdGhlIG5naW54IGJpbmFyeSBmaWxlCisgIC0tY29uZi1wYXRoPVBBVEggICAgICAgICAgICAgICAgICAgc2V0IHBhdGggdG8gdGhlIG5naW54LmNvbmYgZmlsZQorICAtLWVycm9yLWxvZy1wYXRoPVBBVEggICAgICAgICAgICAgIHNldCBwYXRoIHRvIHRoZSBlcnJvciBsb2cKKyAgLS1waWQtcGF0aD1QQVRIICAgICAgICAgICAgICAgICAgICBzZXQgcGF0aCB0byBuZ2lueC5waWQgZmlsZQogCi0gIC0td2l0aC1zZWxlY3RfbW9kdWxlICAgICAgICAgICAgIGVuYWJsZSBzZWxlY3QgbW9kdWxlCi0gIC0td2l0aG91dC1zZWxlY3RfbW9kdWxlICAgICAgICAgIGRpc2FibGUgc2VsZWN0IG1vZHVsZQotICAtLXdpdGgtcG9sbF9tb2R1bGUgICAgICAgICAgICAgICBlbmFibGUgcG9sbCBtb2R1bGUKLSAgLS13aXRob3V0LXBvbGxfbW9kdWxlICAgICAgICAgICAgZGlzYWJsZSBwb2xsIG1vZHVsZQorICAtLXVzZXI9VVNFUiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBub24tcHJpdmlsZWdlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHdvcmtlciBwcm9jZXNzZXMKKyAgLS1ncm91cD1HUk9VUCAgICAgICAgICAgICAgICAgICAgICBzZXQgbm9uLXByaXZpbGVnZSBncm91cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgd29ya2VyIHByb2Nlc3NlcwogCi0gIC0td2l0aG91dC1odHRwX2NoYXJzZXRfbW9kdWxlICAgIGRpc2FibGUgbmd4X2h0dHBfY2hhcnNldF9tb2R1bGUKLSAgLS13aXRob3V0LWh0dHBfcmV3cml0ZV9tb2R1bGUgICAgZGlzYWJsZSBuZ3hfaHR0cF9yZXdyaXRlX21vZHVsZQotICAtLXdpdGhvdXQtaHR0cF9nemlwX21vZHVsZSAgICAgICBkaXNhYmxlIG5neF9odHRwX2d6aXBfbW9kdWxlCi0gIC0td2l0aG91dC1odHRwX3Byb3h5X21vZHVsZSAgICAgIGRpc2FibGUgbmd4X2h0dHBfcHJveHlfbW9kdWxlCisgIC0tYnVpbGRkaXI9RElSICAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSBidWlsZCBkaXJlY3RvcnkKIAotICAtLXdpdGgtY2Mtb3B0PU9QVElPTlMgICAgICAgICAgICBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGNvbXBpbGVyCi0gIC0td2l0aC1sZC1vcHQ9T1BUSU9OUyAgICAgICAgICAgIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgbGlua2VyCisgIC0td2l0aC1ydHNpZ19tb2R1bGUgICAgICAgICAgICAgICAgZW5hYmxlIHJ0c2lnIG1vZHVsZQorICAtLXdpdGgtc2VsZWN0X21vZHVsZSAgICAgICAgICAgICAgIGVuYWJsZSBzZWxlY3QgbW9kdWxlCisgIC0td2l0aG91dC1zZWxlY3RfbW9kdWxlICAgICAgICAgICAgZGlzYWJsZSBzZWxlY3QgbW9kdWxlCisgIC0td2l0aC1wb2xsX21vZHVsZSAgICAgICAgICAgICAgICAgZW5hYmxlIHBvbGwgbW9kdWxlCisgIC0td2l0aG91dC1wb2xsX21vZHVsZSAgICAgICAgICAgICAgZGlzYWJsZSBwb2xsIG1vZHVsZQogCi0gIC0td2l0aC1wY3JlPURJUiAgICAgICAgICAgICAgICAgIHBhdGggdG8gUENSRSBsaWJyYXJ5Ci0gIC0td2l0aC1tZDU9RElSICAgICAgICAgICAgICAgICAgIHBhdGggdG8gbWQ1IGxpYnJhcnkKLSAgLS13aXRoLXpsaWI9RElSICAgICAgICAgICAgICAgICAgcGF0aCB0byB6bGliIGxpYnJhcnkKLSAgLS13aXRoLW9wZW5zc2w9RElSICAgICAgICAgICAgICAgcGF0aCB0byBPcGVuU1NMIGxpYnJhcnkKKyAgLS13aXRoLWh0dHBfc3NsX21vZHVsZSAgICAgICAgICAgICBlbmFibGUgbmd4X2h0dHBfc3NsX21vZHVsZQorICAtLXdpdGhvdXQtaHR0cF9jaGFyc2V0X21vZHVsZSAgICAgIGRpc2FibGUgbmd4X2h0dHBfY2hhcnNldF9tb2R1bGUKKyAgLS13aXRob3V0LWh0dHBfZ3ppcF9tb2R1bGUgICAgICAgICBkaXNhYmxlIG5neF9odHRwX2d6aXBfbW9kdWxlCisgIC0td2l0aG91dC1odHRwX3VzZXJpZF9tb2R1bGUgICAgICAgZGlzYWJsZSBuZ3hfaHR0cF91c2VyaWRfbW9kdWxlCisgIC0td2l0aG91dC1odHRwX2FjY2Vzc19tb2R1bGUgICAgICAgZGlzYWJsZSBuZ3hfaHR0cF9hY2Nlc3NfbW9kdWxlCisgIC0td2l0aG91dC1odHRwX2F1dG9pbmRleF9tb2R1bGUgICAgZGlzYWJsZSBuZ3hfaHR0cF9hdXRvaW5kZXhfbW9kdWxlCisgIC0td2l0aG91dC1odHRwX3Jld3JpdGVfbW9kdWxlICAgICAgZGlzYWJsZSBuZ3hfaHR0cF9yZXdyaXRlX21vZHVsZQorICAtLXdpdGhvdXQtaHR0cF9wcm94eV9tb2R1bGUgICAgICAgIGRpc2FibGUgbmd4X2h0dHBfcHJveHlfbW9kdWxlCisgIC0td2l0aG91dC1odHRwX2Zhc3RjZ2lfbW9kdWxlICAgICAgZGlzYWJsZSBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZQorCisgIC0taHR0cC1sb2ctcGF0aD1QQVRIICAgICAgICAgICAgICAgc2V0IHBhdGggdG8gdGhlIGh0dHAgYWNjZXNzIGxvZworICAtLWh0dHAtY2xpZW50LWJvZHktdGVtcC1wYXRoPVBBVEggIHNldCBwYXRoIHRvIHRoZSBodHRwIGNsaWVudCByZXF1ZXN0IGJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgZmlsZXMgcGF0aAorICAtLWh0dHAtcHJveHktdGVtcC1wYXRoPVBBVEggICAgICAgIHNldCBwYXRoIHRvIHRoZSBodHRwIHByb3h5IHRlbXBvcmFyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHBhdGgKKyAgLS1odHRwLWZhc3RjZ2ktdGVtcC1wYXRoPVBBVEggICAgICBzZXQgcGF0aCB0byB0aGUgaHR0cCBmYXN0Y2dpIHRlbXBvcmFyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHBhdGgKKworICAtLXdpdGgtY2M9UEFUSCAgICAgICAgICAgICAgICAgICAgIHNldCBwYXRoIHRvIEMgY29tcGlsZXIKKyAgLS13aXRoLWNwcD1QQVRIICAgICAgICAgICAgICAgICAgICBzZXQgcGF0aCB0byBDIHByZXByb2Nlc3NvcgorICAtLXdpdGgtY2Mtb3B0PU9QVElPTlMgICAgICAgICAgICAgIHNldCBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIEMgY29tcGlsZXIKKyAgLS13aXRoLWxkLW9wdD1PUFRJT05TICAgICAgICAgICAgICBzZXQgYWRkaXRpb25hbCBvcHRpb25zIGZvciBsaW5rZXIKKyAgLS13aXRoLWNwdS1vcHQ9Q1BVICAgICAgICAgICAgICAgICBidWlsZCBmb3Igc3BlY2lmaWVkIENQVSwgdGhlIHZhbGlkIHZhbHVlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW50aXVtLCBwZW50aXVtcHJvLCBwZW50aXVtNCwgc3BhcmM2NAorCisgIC0td2l0aG91dC1wY3JlICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSBQQ1JFIGxpYmFyYXJ5IHVzYWdlCisgIC0td2l0aC1wY3JlPURJUiAgICAgICAgICAgICAgICAgICAgc2V0IHBhdGggdG8gUENSRSBsaWJyYXJ5IHNvdXJjZXMKKyAgLS13aXRoLXBjcmUtb3B0PU9QVElPTlMgICAgICAgICAgICBzZXQgYWRkaXRpb25hbCBvcHRpb25zIGZvciBQQ1JFIGJ1aWxkaW5nCisKKyAgLS13aXRoLW1kNT1ESVIgICAgICAgICAgICAgICAgICAgICBzZXQgcGF0aCB0byBtZDUgbGlicmFyeSBzb3VyY2VzCisgIC0td2l0aC1tZDUtb3B0PU9QVElPTlMgICAgICAgICAgICAgc2V0IGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgbWQ1IGJ1aWxkaW5nCisgIC0td2l0aC1tZDUtYXNtICAgICAgICAgICAgICAgICAgICAgdXNlIG1kNSBhc3NlbWJsZXIgc291cmNlcworCisgIC0td2l0aC16bGliPURJUiAgICAgICAgICAgICAgICAgICAgc2V0IHBhdGggdG8gemxpYiBsaWJyYXJ5IHNvdXJjZXMKKyAgLS13aXRoLXpsaWItb3B0PU9QVElPTlMgICAgICAgICAgICBzZXQgYWRkaXRpb25hbCBvcHRpb25zIGZvciB6bGliIGJ1aWxkaW5nCisgIC0td2l0aC16bGliLWFzbT1DUFUgICAgICAgICAgICAgICAgdXNlIHpsaWIgYXNzZW1ibGVyIHNvdXJjZXMgb3B0aW1pemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwZWNpZmllZCBDUFUsIHRoZSB2YWxpZCB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVudGl1bSwgcGVudGl1bXBybworCisgIC0td2l0aC1vcGVuc3NsPURJUiAgICAgICAgICAgICAgICAgc2V0IHBhdGggdG8gT3BlblNTTCBsaWJyYXJ5IHNvdXJjZXMKKworICAtLXdpdGgtZGVidWcgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSB0aGUgZGVidWdnaW5nIGxvZ2dpbmcKIAogRU5ECiAKQEAgLTIwMSw2ICsyNTAsNyBAQAogICAgIEhUVFBfU1RBVFVTPU5PCiAgICAgSFRUUF9SRVdSSVRFPU5PCiAgICAgSFRUUF9QUk9YWT1OTworICAgIEhUVFBfRkFTVENHST1OTwogZmkKIAogCkBAIC0yODQsMyArMzM0LDQ1IEBACiAgICAgICAgIE5HWF9IVFRQX0xPR19QQVRIPSROR1hfUFJFRklYLyROR1hfSFRUUF9MT0dfUEFUSAogICAgIDs7CiBlc2FjCisKKworY2FzZSAiLiROR1hfSFRUUF9DTElFTlRfVEVNUF9QQVRIIiBpbgorICAgIC4vKikKKyAgICA7OworCisgICAgLikKKyAgICAgICAgTkdYX0hUVFBfQ0xJRU5UX1RFTVBfUEFUSD0kTkdYX1BSRUZJWC9jbGllbnRfYm9keV90ZW1wCisgICAgOzsKKworICAgICopCisgICAgICAgIE5HWF9IVFRQX0NMSUVOVF9URU1QX1BBVEg9JE5HWF9QUkVGSVgvJE5HWF9IVFRQX0NMSUVOVF9URU1QX1BBVEgKKyAgICA7OworZXNhYworCisKK2Nhc2UgIi4kTkdYX0hUVFBfUFJPWFlfVEVNUF9QQVRIIiBpbgorICAgIC4vKikKKyAgICA7OworCisgICAgLikKKyAgICAgICAgTkdYX0hUVFBfUFJPWFlfVEVNUF9QQVRIPSROR1hfUFJFRklYL3Byb3h5X3RlbXAKKyAgICA7OworCisgICAgKikKKyAgICAgICAgTkdYX0hUVFBfUFJPWFlfVEVNUF9QQVRIPSROR1hfUFJFRklYLyROR1hfSFRUUF9QUk9YWV9URU1QX1BBVEgKKyAgICA7OworZXNhYworCisKK2Nhc2UgIi4kTkdYX0hUVFBfRkFTVENHSV9URU1QX1BBVEgiIGluCisgICAgLi8qKQorICAgIDs7CisKKyAgICAuKQorICAgICAgICBOR1hfSFRUUF9GQVNUQ0dJX1RFTVBfUEFUSD0kTkdYX1BSRUZJWC9mYXN0Y2dpX3RlbXAKKyAgICA7OworCisgICAgKikKKyAgICAgICAgTkdYX0hUVFBfRkFTVENHSV9URU1QX1BBVEg9JE5HWF9QUkVGSVgvJE5HWF9IVFRQX0ZBU1RDR0lfVEVNUF9QQVRICisgICAgOzsKK2VzYWMKZGlmZiAtLWdpdCBhL2F1dG8vb3MvY29uZiBiL2F1dG8vb3MvY29uZgppbmRleCBkY2JkYTg4Li43MWExNDNkIDEwMDY0NAotLS0gYS9hdXRvL29zL2NvbmYKKysrIGIvYXV0by9vcy9jb25mCkBAIC01LDEzICs1LDEzIEBACiBpZiB0ZXN0IC16ICIkTkdYX1BMQVRGT1JNIjsgdGhlbgogICAgIGVjaG8gImNoZWNraW5nIGZvciBPUyIKIAotICAgIFNZU1RFTT1gdW5hbWUgLXMgMj4vZGV2L251bGxgCi0gICAgUkVMRUFTRT1gdW5hbWUgLXIgMj4vZGV2L251bGxgCi0gICAgTUFDSElORT1gdW5hbWUgLW0gMj4vZGV2L251bGxgCisgICAgTkdYX1NZU1RFTT1gdW5hbWUgLXMgMj4vZGV2L251bGxgCisgICAgTkdYX1JFTEVBU0U9YHVuYW1lIC1yIDI+L2Rldi9udWxsYAorICAgIE5HWF9NQUNISU5FPWB1bmFtZSAtbSAyPi9kZXYvbnVsbGAKIAotICAgIGVjaG8gIiArICRTWVNURU0gJFJFTEVBU0UgJE1BQ0hJTkUiCisgICAgZWNobyAiICsgJE5HWF9TWVNURU0gJE5HWF9SRUxFQVNFICROR1hfTUFDSElORSIKIAotICAgIE5HWF9QTEFURk9STT0iJFNZU1RFTTokUkVMRUFTRTokTUFDSElORSI7CisgICAgTkdYX1BMQVRGT1JNPSIkTkdYX1NZU1RFTTokTkdYX1JFTEVBU0U6JE5HWF9NQUNISU5FIjsKIGVsc2UKICAgICBlY2hvICJidWlsZGluZyBmb3IgJE5HWF9QTEFURk9STSIKIGZpCkBAIC00Myw2ICs0MywxNSBAQAogZXNhYwogCiAKK2Nhc2UgJE5HWF9NQUNISU5FIGluCisKKyAgICAgaTM4NnxpNjg2fGk4NnBjfGFtZDY0KQorICAgICAgICAgaGF2ZT1OR1hfSEFWRV9OT05BTElHTkVEIC4gYXV0by9oYXZlCisgICAgIDs7CisKK2VzYWMKKworCiBpZiBbICROR1hfUExBVEZPUk0gIT0gd2luMzIgXTsgdGhlbgogCiAgICAgIE5HWF9VU0VSPSR7TkdYX1VTRVI6LW5vYm9keX0KZGlmZiAtLWdpdCBhL2F1dG8vc291cmNlcyBiL2F1dG8vc291cmNlcwppbmRleCAyMjY0ZTc2Li45YzZlYzE5IDEwMDY0NAotLS0gYS9hdXRvL3NvdXJjZXMKKysrIGIvYXV0by9zb3VyY2VzCkBAIC0xMTAsNiArMTEwLDcgQEAKIFVOSVhfSU5DUz0iJENPUkVfSU5DUyAkRVZFTlRfSU5DUyBzcmMvb3MvdW5peCIKIAogVU5JWF9ERVBTPSIkQ09SRV9ERVBTICRFVkVOVF9ERVBTIFwKKyAgICAgICAgICAgIHNyYy9jb3JlL25neF91bml4X2RvbWFpbi5oIFwKICAgICAgICAgICAgIHNyYy9vcy91bml4L25neF90aW1lLmggXAogICAgICAgICAgICAgc3JjL29zL3VuaXgvbmd4X3R5cGVzLmggXAogICAgICAgICAgICAgc3JjL29zL3VuaXgvbmd4X2Vycm5vLmggXApAQCAtMTI1LDYgKzEyNiw3IEBACiAgICAgICAgICAgICBzcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5oIgogCiBVTklYX1NSQ1M9IiRDT1JFX1NSQ1MgJEVWRU5UX1NSQ1MgXAorICAgICAgICAgICAgc3JjL2NvcmUvbmd4X3VuaXhfZG9tYWluLmMgXAogICAgICAgICAgICAgc3JjL29zL3VuaXgvbmd4X3RpbWUuYyBcCiAgICAgICAgICAgICBzcmMvb3MvdW5peC9uZ3hfZXJybm8uYyBcCiAgICAgICAgICAgICBzcmMvb3MvdW5peC9uZ3hfYWxsb2MuYyBcCkBAIC0yMDMsOSArMjA1LDEzIEBACiBOR1hfV0lOMzJfUkM9InNyYy9vcy93aW4zMi9uZ2lueC5yYyIKIAogCisjIHRoZSBodHRwIG1vZHVsZXMgdGhhdCBoYXZlIHRoZWlyIGxvZ2dpbmcgZm9ybWF0cworIyBtdXN0IGJlIGFmdGVyIG5neF9odHRwX2xvZ19tb2R1bGUKKwogSFRUUF9NT0RVTEVTPSJuZ3hfaHR0cF9tb2R1bGUgXAogICAgICAgICAgICAgICBuZ3hfaHR0cF9jb3JlX21vZHVsZSBcCi0gICAgICAgICAgICAgIG5neF9odHRwX2xvZ19tb2R1bGUiCisgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19tb2R1bGUgXAorICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9tb2R1bGUiCiAKIEhUVFBfQ0FDSEVfTU9EVUxFPW5neF9odHRwX2NhY2hlX21vZHVsZQogCkBAIC0yMzEsNiArMjM3LDcgQEAKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmggXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfY2FjaGUuaCBcCisgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmggXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9idXN5X2xvY2suaCBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX2xvZ19oYW5kbGVyLmgiCiAKQEAgLTI0NCw2ICsyNTEsNyBAQAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9jb3B5X2ZpbHRlci5jIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jIFwKKyAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3BhcnNlX3RpbWUuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3RhdGljX2hhbmRsZXIuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaW5kZXhfaGFuZGxlci5jIFwKQEAgLTMwOCw2ICszMTYsMTAgQEAKICMgICAgICAgICAgICAgICAgIHNyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfY2FjaGUuYyBcCiAKIAorSFRUUF9GQVNUQ0dJX01PRFVMRT1uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZQorSFRUUF9GQVNUQ0dJX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX2hhbmRsZXIuYworCisKIElNQVBfSU5DUz0ic3JjL2ltYXAiCiAKIElNQVBfREVQUz0ic3JjL2ltYXAvbmd4X2ltYXAuaCIKZGlmZiAtLWdpdCBhL2F1dG8vc3VtbWFyeSBiL2F1dG8vc3VtbWFyeQppbmRleCA1MzQ1NWNkLi4yNDNkNmEzIDEwMDY0NAotLS0gYS9hdXRvL3N1bW1hcnkKKysrIGIvYXV0by9zdW1tYXJ5CkBAIC0xMDEsMTQgKzEwMSwzOSBAQAogZmkKIAogCi1lY2hvICIgIG5naW54IHBhdGggcHJlZml4OiAkTkdYX1BSRUZJWCIKLWVjaG8gIiAgbmdpbnggYmluYXJ5IGZpbGU6ICROR1hfU0JJTl9QQVRIIgotZWNobyAiICBuZ2lueCBjb25maWd1cmF0aW9uIGZpbGU6ICROR1hfQ09ORl9QQVRIIgotZWNobyAiICBuZ2lueCBwaWQgZmlsZTogJE5HWF9QSURfUEFUSCIKK2lmIFsgJEhUVFBfU1NMID0gWUVTIF07IHRoZW4KKyAgICBpZiBbICRPUEVOU1NMID0gTk9ORSAtbyAkT1BFTlNTTCA9IE5PIF07IHRoZW4KKworY2F0IDw8IEVORAorJDA6IGVycm9yOiB0aGUgSFRUUCBTU0wgbW9kdWxlIHJlcXVpcmVzIHRoZSBPcGVuU1NMIGxpYnJhcnkuCitZb3UgY2FuIGVpdGhlciBkbyBub3QgZW5hYmxlIHRoZSBtb2R1bGUsIG9yIGluc3RhbGwgdGhlIE9wZW5TU0wgbGlicmFyeQoraW50byB0aGUgc3lzdGVtLCBvciBidWlsZCB0aGUgT3BlblNTTCBsaWJyYXJ5IHN0YXRpY2FsbHkgZnJvbSB0aGUgc291cmNlCit3aXRoIG5naW54IGJ5IHVzaW5nIC0td2l0aC1vcGVuc3NsPTxwYXRoPiBvcHRpb24uCisKK0VORAorCisgICAgICAgIGV4aXQgMQorICAgIGZpCitmaQorCisKK2NhdCA8PCBFTkQKKyAgbmdpbnggcGF0aCBwcmVmaXg6ICROR1hfUFJFRklYCisgIG5naW54IGJpbmFyeSBmaWxlOiAkTkdYX1NCSU5fUEFUSAorICBuZ2lueCBjb25maWd1cmF0aW9uIGZpbGU6ICROR1hfQ09ORl9QQVRICisgIG5naW54IHBpZCBmaWxlOiAkTkdYX1BJRF9QQVRICitFTkQKKwogaWYgdGVzdCAtbiAiJE5HWF9FUlJPUl9MT0dfUEFUSCI7IHRoZW4KICAgICBlY2hvICIgIG5naW54IGVycm9yIGxvZyBmaWxlOiAkTkdYX0VSUk9SX0xPR19QQVRIIgogZWxzZQogICAgIGVjaG8gIiAgbmdpbnggbG9ncyBlcnJvcnMgdG8gc3RkZXJyIgogZmkKLWVjaG8gIiAgbmdpbnggaHR0cCBhY2Nlc3MgbG9nIGZpbGU6ICROR1hfSFRUUF9MT0dfUEFUSCIKLWVjaG8KKworY2F0IDw8IEVORAorICBuZ2lueCBodHRwIGFjY2VzcyBsb2cgZmlsZTogJE5HWF9IVFRQX0xPR19QQVRICisgIG5naW54IGh0dHAgY2xpZW50IHJlcXVlc3QgYm9keSB0ZW1wb3JhcnkgZmlsZXM6ICROR1hfSFRUUF9DTElFTlRfVEVNUF9QQVRICisgIG5naW54IGh0dHAgcHJveHkgdGVtcG9yYXJ5IGZpbGVzOiAkTkdYX0hUVFBfUFJPWFlfVEVNUF9QQVRICisgIG5naW54IGh0dHAgZmFzdGNnaSB0ZW1wb3JhcnkgZmlsZXM6ICROR1hfSFRUUF9GQVNUQ0dJX1RFTVBfUEFUSAorCitFTkQKZGlmZiAtLWdpdCBhL2F1dG8vdW5peCBiL2F1dG8vdW5peAppbmRleCA4OTgyOTY4Li4zN2JiNWQyIDEwMDc1NQotLS0gYS9hdXRvL3VuaXgKKysrIGIvYXV0by91bml4CkBAIC0yLDYgKzIsOSBAQAogIyBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CiAKIAoraGF2ZT1OR1hfSEFWRV9VTklYX0RPTUFJTiAuIGF1dG8vaGF2ZQorCisKIENDX1dBUk49CiBuZ3hfZm10X2NvbGxlY3Q9eWVzCiAKZGlmZiAtLWdpdCBhL2RvY3MvdGV4dC9MSUNFTlNFIGIvZG9jcy90ZXh0L0xJQ0VOU0UKaW5kZXggZjA1N2MwYi4uN2E2YTNkNyAxMDA2NDQKLS0tIGEvZG9jcy90ZXh0L0xJQ0VOU0UKKysrIGIvZG9jcy90ZXh0L0xJQ0VOU0UKQEAgLTEsNSArMSw1IEBACiAvKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IElnb3IgU3lzb2V2CisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBJZ29yIFN5c29ldgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IGNmM2IzYWYuLjUxNDRhNWIgMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC02LDYgKzYsMTMwIEBACiAgICAgICAgICAgICB0aXRsZT0ibmdpbngiPgogCiAKKzxjaGFuZ2VzIHZlcj0iMC4xLjE0IiBkYXRlPSIxOC4wMS4yMDA1Ij4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK9DB0sHNxdTS2SDB19TPy8/OxsnH1dLBw8nJCistLWh0dHAtY2xpZW50LWJvZHktdGVtcC1wYXRoPVBBVEgsCistLWh0dHAtcHJveHktdGVtcC1wYXRoPVBBVEgKK8kgLS1odHRwLWZhc3RjZ2ktdGVtcC1wYXRoPVBBVEgKKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBhdXRvY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzOgorLS1odHRwLWNsaWVudC1ib2R5LXRlbXAtcGF0aD1QQVRILAorLS1odHRwLXByb3h5LXRlbXAtcGF0aD1QQVRILAorYW5kIC0taHR0cC1mYXN0Y2dpLXRlbXAtcGF0aD1QQVRICis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgorPHBhcmEgbGFuZz0icnUiPgoryc3RIMvB1MHMz8fBINMg19LFzcXOztnNySDGwcrMwc3JLCDTz8TF0tbB3cnFINTFzM8g2sHQ0s/TwSDLzMnFztTBLAor2sHEwaPU09EgxMnSxcvUydfPyiBjbGllbnRfYm9keV90ZW1wX3BhdGgsCivQzyDVzc/M3sHOycAgJmx0O3ByZWZpeCZndDsvY2xpZW50X2JvZHlfdGVtcC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBkaXJlY3RvcnkgbmFtZSBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlcyB3aXRoIHRoZSBjbGllbnQgcmVxdWVzdCBib2R5CitpcyBzcGVjaWZpZWQgYnkgZGlyZWN0aXZlIGNsaWVudF9ib2R5X3RlbXBfcGF0aCwKK2J5IGRlZmF1bHQgaXQgaXMgJmx0O3ByZWZpeCZndDsvY2xpZW50X2JvZHlfdGVtcC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorzc/E1czYIG5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlIMkgxMnSxcvUydfZCitmYXN0Y2dpX3Bhc3MsCitmYXN0Y2dpX3Jvb3QsCitmYXN0Y2dpX2luZGV4LAorZmFzdGNnaV9wYXJhbXMsCitmYXN0Y2dpX2Nvbm5lY3RfdGltZW91dCwKK2Zhc3RjZ2lfc2VuZF90aW1lb3V0LAorZmFzdGNnaV9yZWFkX3RpbWVvdXQsCitmYXN0Y2dpX3NlbmRfbG93YXQsCitmYXN0Y2dpX2hlYWRlcl9idWZmZXJfc2l6ZSwKK2Zhc3RjZ2lfYnVmZmVycywKK2Zhc3RjZ2lfYnVzeV9idWZmZXJzX3NpemUsCitmYXN0Y2dpX3RlbXBfcGF0aCwKK2Zhc3RjZ2lfbWF4X3RlbXBfZmlsZV9zaXplLAorZmFzdGNnaV90ZW1wX2ZpbGVfd3JpdGVfc2l6ZSwKK2Zhc3RjZ2lfbmV4dF91cHN0cmVhbQorySBmYXN0Y2dpX3hfcG93ZXJlZF9ieS4KKworPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlIGFuZCB0aGUgZGlyZWN0aXZlczoKK2Zhc3RjZ2lfcGFzcywKK2Zhc3RjZ2lfcm9vdCwKK2Zhc3RjZ2lfaW5kZXgsCitmYXN0Y2dpX3BhcmFtcywKK2Zhc3RjZ2lfY29ubmVjdF90aW1lb3V0LAorZmFzdGNnaV9zZW5kX3RpbWVvdXQsCitmYXN0Y2dpX3JlYWRfdGltZW91dCwKK2Zhc3RjZ2lfc2VuZF9sb3dhdCwKK2Zhc3RjZ2lfaGVhZGVyX2J1ZmZlcl9zaXplLAorZmFzdGNnaV9idWZmZXJzLAorZmFzdGNnaV9idXN5X2J1ZmZlcnNfc2l6ZSwKK2Zhc3RjZ2lfdGVtcF9wYXRoLAorZmFzdGNnaV9tYXhfdGVtcF9maWxlX3NpemUsCitmYXN0Y2dpX3RlbXBfZmlsZV93cml0ZV9zaXplLAorZmFzdGNnaV9uZXh0X3Vwc3RyZWFtLAorYW5kIGZhc3RjZ2lfeF9wb3dlcmVkX2J5LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK8/bycLLwSAiW2FsZXJ0XSB6ZXJvIHNpemUgYnVmIjsKK8/bycLLwSDQz9HXyczB09gg1yAwLjEuMy4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAiW2FsZXJ0XSB6ZXJvIHNpemUgYnVmIiBlcnJvcjsKK2J1ZyBhcHBlYXJlZCBpbiAwLjEuMy4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImNoYW5nZSI+Cis8cGFyYSBsYW5nPSJydSI+CivXIMTJ0sXL1MnXxSBwcm94eV9wYXNzIM7V1s7PIM/C0drB1MXM2M7PINXLwdrZ18HU2CBVUkkg0M/TzMUgyc3FzskgyM/T1MEuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgVVJJIG11c3QgYmUgc3BlY2lmaWVkIGFmdGVyIHRoZSBob3N0IG5hbWUgaW4gdGhlIHByb3h5X3Bhc3MgZGlyZWN0aXZlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iY2hhbmdlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8XTzMkg1yBVUkkg19PU0sXewczT0SDTyc3Xz8wgJTNGLCDUzyDPziDT3snUwczT0SDOwd7BzM/NINPU0s/LySDB0sfVzcXO1M/XLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICUzRiBzeW1ib2wgaW4gdGhlIFVSSSB3YXMgY29uc2lkZXJlZCBhcyB0aGUgYXJndW1lbnQgc3RyaW5nIHN0YXJ0LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivQz8TExdLWy8EgdW5peCBkb21haW4g02/LxdTP1yDXIM3PxNXMxSBuZ3hfaHR0cF9wcm94eV9tb2R1bGUuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgdW5peCBkb21haW4gc29ja2V0cyBzdXBwb3J0IGluIHRoZSBuZ3hfaHR0cF9wcm94eV9tb2R1bGUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnX2SBzc2xfZW5naW5lIMkgc3NsX2NpcGhlcnMuPGJyLz4KK/PQwdPJws8g88XSx8XAIPPL18/Sw8/X1SDawSBTU0wtwcvTxczF0sHUz9IuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgc3NsX2VuZ2luZSBhbmQgc3NsX2NpcGhlcnMgZGlyZWN0aXZlcy48YnIvPgorVGhhbmtzIHRvIFNlcmdleSBTa3ZvcnRzb3YgZm9yIFNTTC1hY2NlbGVyYXRvci4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8L2NoYW5nZXM+CisKKwogPGNoYW5nZXMgdmVyPSIwLjEuMTMiIGRhdGU9IjIxLjEyLjIwMDQiPgogCiA8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmdpbnguYyBiL3NyYy9jb3JlL25naW54LmMKaW5kZXggMjY0MDZiMy4uNjhkYTJiYSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmdpbnguYworKysgYi9zcmMvY29yZS9uZ2lueC5jCkBAIC00NTEsMTIgKzQ1MSwxNSBAQAogICAgIGlmICghKGNjZiA9IG5neF9wY2FsbG9jKGN5Y2xlLT5wb29sLCBzaXplb2Yobmd4X2NvcmVfY29uZl90KSkpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICAvKiBzZXQgYnkgcGNhbGxvYygpCisKKyAgICAvKgorICAgICAqIHNldCBieSBwY2FsbG9jKCkKICAgICAgKgotICAgICAqIGNjZi0+cGlkID0gTlVMTDsKLSAgICAgKiBjY2YtPm5ld3BpZCA9IE5VTEw7Ci0gICAgICogY2NmLT5wcmlvcml0eSA9IDA7CisgICAgICogICAgIGNjZi0+cGlkID0gTlVMTDsKKyAgICAgKiAgICAgY2NmLT5uZXdwaWQgPSBOVUxMOworICAgICAqICAgICBjY2YtPnByaW9yaXR5ID0gMDsKICAgICAgKi8KKwogICAgIGNjZi0+ZGFlbW9uID0gTkdYX0NPTkZfVU5TRVQ7CiAgICAgY2NmLT5tYXN0ZXIgPSBOR1hfQ09ORl9VTlNFVDsKICAgICBjY2YtPndvcmtlcl9wcm9jZXNzZXMgPSBOR1hfQ09ORl9VTlNFVDsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25naW54LmggYi9zcmMvY29yZS9uZ2lueC5oCmluZGV4IDMyODY1MTkuLjRiOThjZGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25naW54LmgKKysrIGIvc3JjL2NvcmUvbmdpbnguaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgX05HSU5YX0hfSU5DTFVERURfCiAKIAotI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMS4xMyIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjEuMTQiCiAKICNkZWZpbmUgTkdJTlhfVkFSICAgICAgICAgICJOR0lOWCIKICNkZWZpbmUgTkdYX05FV1BJRF9FWFQgICAgICIubmV3YmluIgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2J1Zi5oIGIvc3JjL2NvcmUvbmd4X2J1Zi5oCmluZGV4IDc2ODQwMGQuLmZiZmQzOTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9idWYuaAorKysgYi9zcmMvY29yZS9uZ3hfYnVmLmgKQEAgLTY5LDcgKzY5LDcgQEAKIH0gbmd4X2J1ZnNfdDsKIAogCi10eXBlZGVmIGludCAgKCpuZ3hfb3V0cHV0X2NoYWluX2ZpbHRlcl9wdCkodm9pZCAqY3R4LCBuZ3hfY2hhaW5fdCAqb3V0KTsKK3R5cGVkZWYgbmd4X2ludF90ICgqbmd4X291dHB1dF9jaGFpbl9maWx0ZXJfcHQpKHZvaWQgKmN0eCwgbmd4X2NoYWluX3QgKmluKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgICAqYnVmOwpAQCAtMTQxLDcgKzE0MSw3IEBACiAKIAogbmd4X2ludF90IG5neF9vdXRwdXRfY2hhaW4obmd4X291dHB1dF9jaGFpbl9jdHhfdCAqY3R4LCBuZ3hfY2hhaW5fdCAqaW4pOwotbmd4X2ludF90IG5neF9jaGFpbl93cml0ZXIodm9pZCAqZGF0YSwgbmd4X2NoYWluX3QgKmluKTsKK25neF9pbnRfdCBuZ3hfY2hhaW5fd3JpdGVyKHZvaWQgKmN0eCwgbmd4X2NoYWluX3QgKmluKTsKIAogbmd4X2ludF90IG5neF9jaGFpbl9hZGRfY29weShuZ3hfcG9vbF90ICpwb29sLCBuZ3hfY2hhaW5fdCAqKmNoYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2hhaW5fdCAqaW4pOwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oCmluZGV4IDBlOTQwNTYuLjhkY2RkNTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuaAorKysgYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmgKQEAgLTIzOSw4ICsyMzksOCBAQAogICAgIH0KIAogI2RlZmluZSBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZiwgcHJldiwgZGVmYXVsdCkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvbmYubGVuID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHByZXYubGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjb25mLmRhdGEgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChwcmV2LmRhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBjb25mLmxlbiA9IHByZXYubGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIGNvbmYuZGF0YSA9IHByZXYuZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5jIGIvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uYwppbmRleCBjYzk2NDBjLi42NGJlMWVjIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5jCisrKyBiL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmMKQEAgLTE4LDcgKzE4LDcgQEAKIHsKICAgICBzaXplX3QgICAgICAgICAgICAgICBsZW47CiAgICAgbmd4X2xpc3RlbmluZ190ICAgICAqbHM7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luICAqYWRkcl9pbjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICpzaW47CiAKICAgICBpZiAoIShscyA9IG5neF9hcnJheV9wdXNoKCZjZi0+Y3ljbGUtPmxpc3RlbmluZykpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjYsMTMgKzI2LDEzIEBACiAKICAgICBuZ3hfbWVtemVybyhscywgc2l6ZW9mKG5neF9saXN0ZW5pbmdfdCkpOwogCi0gICAgaWYgKCEoYWRkcl9pbiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkpKSB7CisgICAgaWYgKCEoc2luID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKSkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgYWRkcl9pbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgYWRkcl9pbi0+c2luX2FkZHIuc19hZGRyID0gYWRkcjsKLSAgICBhZGRyX2luLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIHNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2luLT5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOworICAgIHNpbi0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKIAogCiAgICAgbHMtPmFkZHJfdGV4dC5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwKQEAgLTUwLDggKzUwLDcgQEAKICAgICBscy0+ZmQgPSAobmd4X3NvY2tldF90KSAtMTsKICAgICBscy0+ZmFtaWx5ID0gQUZfSU5FVDsKICAgICBscy0+dHlwZSA9IFNPQ0tfU1RSRUFNOwotICAgIGxzLT5wcm90b2NvbCA9IElQUFJPVE9fSVA7Ci0gICAgbHMtPnNvY2thZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSBhZGRyX2luOworICAgIGxzLT5zb2NrYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luOwogICAgIGxzLT5zb2NrbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CiAgICAgbHMtPmFkZHIgPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW4sIHNpbl9hZGRyKTsKICAgICBscy0+YWRkcl90ZXh0X21heF9sZW4gPSBJTkVUX0FERFJTVFJMRU47CkBAIC02NSw3ICs2NCw3IEBACiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbGVuOwogICAgIG5neF91aW50X3QgICAgICAgICAgIGk7CiAgICAgbmd4X2xpc3RlbmluZ190ICAgICAqbHM7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luICAqYWRkcl9pbjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICpzaW47CiAKICAgICBscyA9IGN5Y2xlLT5saXN0ZW5pbmcuZWx0czsKICAgICBmb3IgKGkgPSAwOyBpIDwgY3ljbGUtPmxpc3RlbmluZy5uZWx0czsgaSsrKSB7CkBAIC04Niw5ICs4NSw5IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGFkZHJfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIGxzW2ldLnNvY2thZGRyOworICAgICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIGxzW2ldLnNvY2thZGRyOwogCi0gICAgICAgIGlmIChhZGRyX2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKKyAgICAgICAgaWYgKHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CiAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQ1JJVCwgY3ljbGUtPmxvZywgbmd4X3NvY2tldF9lcnJubywKICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBpbmhlcml0ZWQgc29ja2V0ICMlZCBoYXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZmFtaWx5IiwgbHNbaV0uZmQpOwpAQCAtMTA1LDcgKzEwNCw3IEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgbHNbaV0uZmFtaWx5ID0gYWRkcl9pbi0+c2luX2ZhbWlseTsKKyAgICAgICAgbHNbaV0uZmFtaWx5ID0gc2luLT5zaW5fZmFtaWx5OwogICAgICAgICBsZW4gPSBuZ3hfc29ja19udG9wKGxzW2ldLmZhbWlseSwgbHNbaV0uc29ja2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNbaV0uYWRkcl90ZXh0LmRhdGEsIElORVRfQUREUlNUUkxFTik7CiAgICAgICAgIGlmIChsZW4gPT0gMCkgewpAQCAtMTEzLDcgKzExMiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBsc1tpXS5hZGRyX3RleHQubGVuID0gbmd4X3NwcmludGYobHNbaV0uYWRkcl90ZXh0LmRhdGEgKyBsZW4sICI6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKGFkZHJfaW4tPnNpbl9wb3J0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHNpbi0+c2luX3BvcnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsc1tpXS5hZGRyX3RleHQuZGF0YTsKICAgICB9CiAKQEAgLTE2Myw3ICsxNjIsNyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzID0gbmd4X3NvY2tldChsc1tpXS5mYW1pbHksIGxzW2ldLnR5cGUsIGxzW2ldLnByb3RvY29sKTsKKyAgICAgICAgICAgIHMgPSBuZ3hfc29ja2V0KGxzW2ldLmZhbWlseSwgbHNbaV0udHlwZSwgMCk7CiAKICAgICAgICAgICAgIGlmIChzID09IC0xKSB7CiAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBsb2csIG5neF9zb2NrZXRfZXJybm8sCkBAIC0zMTMsNyArMzEyLDcgQEAKIHsKICAgICBuZ3hfc29ja2V0X3QgIGZkOwogCi0gICAgaWYgKGMtPnBvb2wgPT0gTlVMTCkgeworICAgIGlmIChjLT5mZCA9PSAtMSkgewogICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGMtPmxvZywgMCwgImNvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM4OCw4ICszODcsNiBAQAogICAgIGMtPmZkID0gKG5neF9zb2NrZXRfdCkgLTE7CiAgICAgYy0+ZGF0YSA9IE5VTEw7CiAKLSAgICBuZ3hfZGVzdHJveV9wb29sKGMtPnBvb2wpOwotCiAgICAgaWYgKG5neF9jbG9zZV9zb2NrZXQoZmQpID09IC0xKSB7CiAKICAgICAgICAgLyogd2UgdXNlIG5neF9jeWNsZS0+bG9nIGJlY2F1c2UgYy0+bG9nIHdhcyBpbiBjLT5wb29sICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5oIGIvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uaAppbmRleCA0MGYxOWE4Li4yMDU4OWE1IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5oCisrKyBiL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmgKQEAgLTIzLDcgKzIzLDYgQEAKIAogICAgIGludCAgICAgICAgICAgICAgIGZhbWlseTsKICAgICBpbnQgICAgICAgICAgICAgICB0eXBlOwotICAgIGludCAgICAgICAgICAgICAgIHByb3RvY29sOwogCiAgICAgdm9pZCAgICAgICAgICAgICgqaGFuZGxlcikobmd4X2Nvbm5lY3Rpb25fdCAqYyk7IC8qIGhhbmRsZXIgb2YgYWNjZXB0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvcmUuaCBiL3NyYy9jb3JlL25neF9jb3JlLmgKaW5kZXggNzlmYjAwOS4uZGI0M2E0NCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2NvcmUuaAorKysgYi9zcmMvY29yZS9uZ3hfY29yZS5oCkBAIC0xOCw2ICsxOCw3IEBACiB0eXBlZGVmIHN0cnVjdCBuZ3hfY29tbWFuZF9zICAgICBuZ3hfY29tbWFuZF90OwogdHlwZWRlZiBzdHJ1Y3Qgbmd4X2ZpbGVfcyAgICAgICAgbmd4X2ZpbGVfdDsKIHR5cGVkZWYgc3RydWN0IG5neF9ldmVudF9zICAgICAgIG5neF9ldmVudF90OwordHlwZWRlZiBzdHJ1Y3Qgbmd4X3BlZXJzX3MgICAgICAgbmd4X3BlZXJzX3Q7CiB0eXBlZGVmIHN0cnVjdCBuZ3hfY29ubmVjdGlvbl9zICBuZ3hfY29ubmVjdGlvbl90OwogCiB0eXBlZGVmIHZvaWQgKCpuZ3hfZXZlbnRfaGFuZGxlcl9wdCkobmd4X2V2ZW50X3QgKmV2KTsKQEAgLTYwLDYgKzYxLDkgQEAKICNpbmNsdWRlIDxuZ3hfcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bmd4X3RpbWVzLmg+CiAjaW5jbHVkZSA8bmd4X2luZXQuaD4KKyNpZiAoTkdYX0hBVkVfVU5JWF9ET01BSU4pCisjaW5jbHVkZSA8bmd4X3VuaXhfZG9tYWluLmg+CisjZW5kaWYKICNpbmNsdWRlIDxuZ3hfY3ljbGUuaD4KICNpbmNsdWRlIDxuZ3hfcHJvY2Vzc19jeWNsZS5oPgogI2luY2x1ZGUgPG5neF9jb25mX2ZpbGUuaD4KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9jeWNsZS5jIGIvc3JjL2NvcmUvbmd4X2N5Y2xlLmMKaW5kZXggOTU5MmE4MS4uYWQ5MDQ5ZSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2N5Y2xlLmMKKysrIGIvc3JjL2NvcmUvbmd4X2N5Y2xlLmMKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8bmd4X2V2ZW50Lmg+CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfY21wX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqczEsIHN0cnVjdCBzb2NrYWRkciAqczIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfY21wX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqc2ExLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhMik7CiBzdGF0aWMgdm9pZCBuZ3hfY2xlYW5fb2xkX2N5Y2xlcyhuZ3hfZXZlbnRfdCAqZXYpOwogCiAKQEAgLTUzMSwxOCArNTMxLDE4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfY21wX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqczEsIHN0cnVjdCBzb2NrYWRkciAqczIpCitzdGF0aWMgbmd4X2ludF90IG5neF9jbXBfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyICpzYTEsIHN0cnVjdCBzb2NrYWRkciAqc2EyKQogewogICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgKnNpbjEsICpzaW4yOwogCiAgICAgLyogQUZfSU5FVCBvbmx5ICovCiAKLSAgICBpZiAoczEtPnNhX2ZhbWlseSAhPSBBRl9JTkVUIHx8IHMyLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkgeworICAgIGlmIChzYTEtPnNhX2ZhbWlseSAhPSBBRl9JTkVUIHx8IHNhMi0+c2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKICAgICAgICAgcmV0dXJuIE5HWF9ERUNMSU5FRDsKICAgICB9CiAKLSAgICBzaW4xID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzMTsKLSAgICBzaW4yID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzMjsKKyAgICBzaW4xID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYTE7CisgICAgc2luMiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2EyOwogCiAgICAgaWYgKHNpbjEtPnNpbl9hZGRyLnNfYWRkciAhPSBzaW4yLT5zaW5fYWRkci5zX2FkZHIpIHsKICAgICAgICAgcmV0dXJuIE5HWF9ERUNMSU5FRDsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9maWxlLmMgYi9zcmMvY29yZS9uZ3hfZmlsZS5jCmluZGV4IDA4ZDlhYmEuLjM3OTgzZmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9maWxlLmMKKysrIGIvc3JjL2NvcmUvbmd4X2ZpbGUuYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgc3NpemVfdCAgICAgIGxldmVsOwogICAgIG5neF91aW50X3QgICBpLCBuOwogICAgIG5neF9zdHJfdCAgICp2YWx1ZTsKLSAgICBuZ3hfcGF0aF90ICAqcGF0aCwgKipwcCwgKipzbG90OworICAgIG5neF9wYXRoX3QgICpwYXRoLCAqKnNsb3Q7CiAKICAgICBzbG90ID0gKG5neF9wYXRoX3QgKiopIChwICsgY21kLT5vZmZzZXQpOwogCkBAIC0yMDksNyArMjA5LDcgQEAKIAogICAgIHBhdGgtPm5hbWUgPSB2YWx1ZVsxXTsKICAgICBwYXRoLT5sZW4gPSAwOwotICAgIHBhdGgtPmdjX2hhbmRsZXIgPSAobmd4X2djX2hhbmRsZXJfcHQpIGNtZC0+cG9zdDsKKyAgICBwYXRoLT5jbGVhbmVyID0gKG5neF9nY19oYW5kbGVyX3B0KSBjbWQtPnBvc3Q7CiAgICAgcGF0aC0+Y29uZl9maWxlID0gY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGE7CiAgICAgcGF0aC0+bGluZSA9IGNmLT5jb25mX2ZpbGUtPmxpbmU7CiAKQEAgLTIyNyw0MiArMjI3LDY1IEBACiAgICAgICAgIHBhdGgtPmxldmVsW2krK10gPSAwOwogICAgIH0KIAorICAgICpzbG90ID0gcGF0aDsKIAotICAgIHBwID0gY2YtPmN5Y2xlLT5wYXRoZXMuZWx0czsKKyAgICBpZiAobmd4X2FkZF9wYXRoKGNmLCBzbG90KSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCituZ3hfaW50X3Qgbmd4X2FkZF9wYXRoKG5neF9jb25mX3QgKmNmLCBuZ3hfcGF0aF90ICoqc2xvdCkKK3sKKyAgICBuZ3hfdWludF90ICAgaSwgbjsKKyAgICBuZ3hfcGF0aF90ICAqcGF0aCwgKipwOworCisgICAgcGF0aCA9ICpzbG90OworCisgICAgcCA9IGNmLT5jeWNsZS0+cGF0aGVzLmVsdHM7CiAgICAgZm9yIChpID0gMDsgaSA8IGNmLT5jeWNsZS0+cGF0aGVzLm5lbHRzOyBpKyspIHsKLSAgICAgICAgaWYgKHBwW2ldLT5uYW1lLmxlbiA9PSBwYXRoLT5uYW1lLmxlbgotICAgICAgICAgICAgJiYgbmd4X3N0cmNtcChwcFtpXS0+bmFtZS5kYXRhLCBwYXRoLT5uYW1lLmRhdGEpID09IDApCisgICAgICAgIGlmIChwW2ldLT5uYW1lLmxlbiA9PSBwYXRoLT5uYW1lLmxlbgorICAgICAgICAgICAgJiYgbmd4X3N0cmNtcChwW2ldLT5uYW1lLmRhdGEsIHBhdGgtPm5hbWUuZGF0YSkgPT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IDM7IG4rKykgewotICAgICAgICAgICAgICAgIGlmIChwcFtpXS0+bGV2ZWxbbl0gIT0gcGF0aC0+bGV2ZWxbbl0pIHsKKyAgICAgICAgICAgICAgICBpZiAocFtpXS0+bGV2ZWxbbl0gIT0gcGF0aC0+bGV2ZWxbbl0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGgtPmNvbmZfZmlsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcGF0aCBuYW1lIFwiJVZcIiBpbiAlczoldWkgaGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBzYW1lIG5hbWUgYXMgZGVmYXVsdCBwYXRoIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZGlmZmVyZW50IGxldmVscywgeW91IG5lZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmaW5lIGRlZmF1bHQgcGF0aCBpbiBodHRwIHNlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFtpXS0+bmFtZSwgcFtpXS0+Y29uZl9maWxlLCBwW2ldLT5saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgc2FtZSBcIiVWXCIgcGF0aCBuYW1lIGluICVzOiV1aSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgdGhlIGRpZmZlcmVudCBsZXZlbHMgdGhhbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcFtpXS0+bmFtZSwgcHBbaV0tPmNvbmZfZmlsZSwgcHBbaV0tPmxpbmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgc2FtZSBwYXRoIG5hbWUgXCIlVlwiIGluICVzOiV1aSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgdGhlIGRpZmZlcmVudCBsZXZlbHMgdGhhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwW2ldLT5uYW1lLCBwW2ldLT5jb25mX2ZpbGUsIHBbaV0tPmxpbmUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChwcFtpXS0+bGV2ZWxbbl0gPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwW2ldLT5sZXZlbFtuXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKnNsb3QgPSBwcFtpXTsKKyAgICAgICAgICAgICpzbG90ID0gcFtpXTsKIAotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICAgICAgfQogICAgIH0KIAotICAgICpzbG90ID0gcGF0aDsKLQotCi0gICAgaWYgKCEocHAgPSBuZ3hfYXJyYXlfcHVzaCgmY2YtPmN5Y2xlLT5wYXRoZXMpKSkgewotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgaWYgKCEocCA9IG5neF9hcnJheV9wdXNoKCZjZi0+Y3ljbGUtPnBhdGhlcykpKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgKnBwID0gcGF0aDsKKyAgICAqcCA9IHBhdGg7CiAKLSAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfZmlsZS5oIGIvc3JjL2NvcmUvbmd4X2ZpbGUuaAppbmRleCA5NGZkOGM3Li5iYzY0ZWQ4IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfZmlsZS5oCisrKyBiL3NyYy9jb3JlL25neF9maWxlLmgKQEAgLTM1LDcgKzM1LDcgQEAKICAgICBuZ3hfc3RyX3QgICAgICAgICAgIG5hbWU7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICBsZW47CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICBsZXZlbFszXTsKLSAgICBuZ3hfZ2NfaGFuZGxlcl9wdCAgIGdjX2hhbmRsZXI7CisgICAgbmd4X2djX2hhbmRsZXJfcHQgICBjbGVhbmVyOwogCiAgICAgdV9jaGFyICAgICAgICAgICAgICpjb25mX2ZpbGU7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICBsaW5lOwpAQCAtNTgsNiArNTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9wb29sX3QgKnBvb2wsIGludCBwZXJzaXN0ZW50KTsKIHZvaWQgbmd4X2NyZWF0ZV9oYXNoZWRfZmlsZW5hbWUobmd4X2ZpbGVfdCAqZmlsZSwgbmd4X3BhdGhfdCAqcGF0aCk7CiBuZ3hfaW50X3Qgbmd4X2NyZWF0ZV9wYXRoKG5neF9maWxlX3QgKmZpbGUsIG5neF9wYXRoX3QgKnBhdGgpOworbmd4X2ludF90IG5neF9hZGRfcGF0aChuZ3hfY29uZl90ICpjZiwgbmd4X3BhdGhfdCAqKnNsb3QpOwogbmd4X2ludF90IG5neF9jcmVhdGVfcGF0aGVzKG5neF9jeWNsZV90ICpjeWNsZSwgbmd4X3VpZF90IHVzZXIpOwogCiB2b2lkIG5neF9pbml0X3RlbXBfbnVtYmVyKCk7CkBAIC02NiwxOSArNjcsMzQgQEAKIGNoYXIgKm5neF9jb25mX3NldF9wYXRoX3Nsb3Qobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CiAKIAotI2RlZmluZSBuZ3hfY29uZl9tZXJnZV9wYXRoX3ZhbHVlKGNvbmYsIHByZXYsIHBhdGgsIGwxLCBsMiwgbDMsIHBvb2wpICAgICAgICBcCi0gICAgaWYgKGNvbmYgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHByZXYgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgbmd4X3Rlc3RfbnVsbChjb25mLCBuZ3hfcGFsbG9jKHBvb2wsIHNpemVvZihuZ3hfcGF0aF90KSksIE5VTEwpOyBcCi0gICAgICAgICAgICBjb25mLT5uYW1lLmxlbiA9IHNpemVvZihwYXRoKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbmYtPm5hbWUuZGF0YSA9ICh1X2NoYXIgKikgcGF0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29uZi0+bGV2ZWxbMF0gPSBsMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb25mLT5sZXZlbFsxXSA9IGwyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbmYtPmxldmVsWzJdID0gbDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29uZi0+bGVuID0gbDEgKyBsMiArIGwzICsgKGwxID8gMTowKSArIChsMiA/IDE6MCkgKyAobDMgPyAxOjApOyBcCi0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbmYgPSBwcmV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIG5neF9jb25mX21lcmdlX3BhdGhfdmFsdWUoY3VyciwgcHJldiwgcGF0aCwgbDEsIGwyLCBsMywgY2xlYW4sIGNmKSAgICBcCisgICAgaWYgKGN1cnIgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChwcmV2ID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIShjdXJyID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9wYXRoX3QpKSkpIHsgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJyLT5uYW1lLmxlbiA9IHNpemVvZihwYXRoKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJyLT5uYW1lLmRhdGEgPSAodV9jaGFyICopIHBhdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobmd4X2NvbmZfZnVsbF9uYW1lKGNmLT5jeWNsZSwgJmN1cnItPm5hbWUpID09IE5HWF9FUlJPUikgeyAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJyLT5sZXZlbFswXSA9IGwxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJyLT5sZXZlbFsxXSA9IGwyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJyLT5sZXZlbFsyXSA9IGwzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJyLT5sZW4gPSBsMSArIGwyICsgbDMgKyAobDEgPyAxOjApICsgKGwyID8gMTowKSArIChsMyA/IDE6MCk7ICBcCisgICAgICAgICAgICBjdXJyLT5jbGVhbmVyID0gY2xlYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJyLT5jb25mX2ZpbGUgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobmd4X2FkZF9wYXRoKGNmLCAmY3VycikgPT0gTkdYX0VSUk9SKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJyID0gcHJldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9pbmV0LmMgYi9zcmMvY29yZS9uZ3hfaW5ldC5jCmluZGV4IDIyYTUzMzQuLjU2ZDJlOTggMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9pbmV0LmMKKysrIGIvc3JjL2NvcmUvbmd4X2luZXQuYwpAQCAtNCw5ICs0LDEwIEBACiAgKi8KIAogCi0KICNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CiAjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnRfY29ubmVjdC5oPgogCiAKIC8qCkBAIC0xNiw3ICsxNyw3IEBACiAgKiBhbmQgdGhleSBhcmUgZmFzdGVyIGJ5IDEuNS0yLjUgdGltZXMsIHNvIGl0IGlzIHdvcnRoIHRvIGtlZXAgdGhlbS4KICAqCiAgKiBCeSB0aGUgd2F5LCB0aGUgaW1wbGVtZW50YXRpb24gdXNpbmcgbmd4X3NwcmludGYoKSBpcyBmYXN0ZXIgYnkgMi41LTMgdGltZXMKLSAqIHRoYW4gdXNpbmcgRnJlZUJTRCBsaWJjJ3Mgc25ycGludGYoKS4KKyAqIHRoYW4gdXNpbmcgRnJlZUJTRCBsaWJjJ3Mgc25wcmludGYoKS4KICAqLwogCiAKQEAgLTY0LDEzICs2NSwxMyBAQAogCiAvKiBBRl9JTkVUIG9ubHkgKi8KIAotc2l6ZV90IG5neF9zb2NrX250b3AoaW50IGZhbWlseSwgc3RydWN0IHNvY2thZGRyICphZGRyLCB1X2NoYXIgKnRleHQsCitzaXplX3Qgbmd4X3NvY2tfbnRvcChpbnQgZmFtaWx5LCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCB1X2NoYXIgKnRleHQsCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgKnA7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbjsKICAgICBuZ3hfdWludF90ICAgICAgICAgICBpOwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgKmFkZHJfaW47CisgICAgc3RydWN0IHNvY2thZGRyX2luICAqc2luOwogCiAgICAgaWYgKGxlbiA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtODAsOCArODEsOCBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBhZGRyX2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBhZGRyOwotICAgIHAgPSAodV9jaGFyICopICZhZGRyX2luLT5zaW5fYWRkcjsKKyAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIHNhOworICAgIHAgPSAodV9jaGFyICopICZzaW4tPnNpbl9hZGRyOwogCiAgICAgaWYgKGxlbiA+IElORVRfQUREUlNUUkxFTikgewogICAgICAgICBsZW4gPSBJTkVUX0FERFJTVFJMRU47CkBAIC0yMTYsNTYgKzIxNywyNTkgQEAKIH0KIAogCi0jaWYgMAotCi1uZ3hfaW50X3Qgbmd4X2luZXRfYWRkcl9wb3J0KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9zdHJfdCAqYWRkcl9wb3J0KQorbmd4X3BlZXJzX3QgKm5neF9pbmV0X3Vwc3RyZWFtX3BhcnNlKG5neF9jb25mX3QgKmNmLCBuZ3hfaW5ldF91cHN0cmVhbV90ICp1KQogewotICAgIHVfY2hhciAgICAgICAgICAqaG9zdDsKLSAgICBuZ3hfaW50X3QgICAgICAgIHBvcnQ7Ci0gICAgbmd4X3VpbnRfdCAgICAgICBwOwotICAgIHN0cnVjdCBob3N0ZW50ICAqaDsKKyAgICBjaGFyICAgICAgICAgICAgICAgICplcnI7CisgICAgdV9jaGFyICAgICAgICAgICAgICAqaG9zdDsKKyAgICBpbl9hZGRyX3QgICAgICAgICAgICBpbl9hZGRyOworICAgIG5neF91aW50X3QgICAgICAgICAgIGksIGxlbjsKKyAgICBuZ3hfcGVlcnNfdCAgICAgICAgICpwZWVyczsKKyAgICBzdHJ1Y3QgaG9zdGVudCAgICAgICpoOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgKnNpbjsKIAotICAgIGZvciAocCA9IDA7IHAgPCBhZGRyX3BvcnQtPmxlbjsgcCsrKSB7Ci0gICAgICAgIGlmIChhZGRyX3BvcnQtPmRhdGFbcF0gPT0gJzonKSB7CisgICAgZXJyID0gbmd4X2luZXRfcGFyc2VfaG9zdF9wb3J0KHUpOworCisgICAgaWYgKGVycikgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW4gdXBzdHJlYW0gXCIlVlwiIiwgZXJyLCAmdS0+bmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICh1LT5kZWZhdWx0X3BvcnQpIHsKKyAgICAgICAgaWYgKHUtPmRlZmF1bHRfcG9ydF92YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIHBvcnQgaW4gdXBzdHJlYW0gXCIlVlwiIiwgJnUtPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB1LT5wb3J0ID0gdS0+ZGVmYXVsdF9wb3J0X3ZhbHVlOworCisgICAgICAgIGlmICghKHUtPnBvcnRfdGV4dC5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKCI2NTUzNiIpIC0gMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHUtPnBvcnRfdGV4dC5sZW4gPSBuZ3hfc3ByaW50Zih1LT5wb3J0X3RleHQuZGF0YSwgIiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUtPmRlZmF1bHRfcG9ydF92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdS0+cG9ydF90ZXh0LmRhdGE7CisKKyAgICB9IGVsc2UgaWYgKHUtPnBvcnQpIHsKKyAgICAgICAgaWYgKHUtPnBvcnQgPT0gdS0+ZGVmYXVsdF9wb3J0X3ZhbHVlKSB7CisgICAgICAgICAgICB1LT5kZWZhdWx0X3BvcnQgPSAxOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gcG9ydCBpbiB1cHN0cmVhbSBcIiVWXCIiLCAmdS0+bmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICh1LT5ob3N0LmxlbiA9PSAwKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBob3N0IGluIHVwc3RyZWFtIFwiJVZcIiIsICZ1LT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdS0+cG9ydCA9IGh0b25zKHUtPnBvcnQpOworCisgICAgaWYgKCEoaG9zdCA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHUtPmhvc3QubGVuICsgMSkpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG5neF9jcHlzdHJuKGhvc3QsIHUtPmhvc3QuZGF0YSwgdS0+aG9zdC5sZW4gKyAxKTsKKworICAgIC8qIEFGX0lORVQgb25seSAqLworCisgICAgaW5fYWRkciA9IGluZXRfYWRkcigoY2hhciAqKSBob3N0KTsKKworICAgIGlmIChpbl9hZGRyID09IElOQUREUl9OT05FKSB7CisgICAgICAgIGggPSBnZXRob3N0YnluYW1lKChjaGFyICopIGhvc3QpOworCisgICAgICAgIGlmIChoID09IE5VTEwgfHwgaC0+aF9hZGRyX2xpc3RbMF0gPT0gTlVMTCkgeworICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0ICVzIGlzIG5vdCBmb3VuZCBpbiB1cHN0cmVhbSBcIiVWXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsICZ1LT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaC0+aF9hZGRyX2xpc3RbaV0gIT0gTlVMTDsgaSsrKSB7IC8qIHZvaWQgKi8gfQorCisgICAgICAgIC8qIE1QOiBuZ3hfc2hhcmVkX3BhbGxvYygpICovCisKKyAgICAgICAgcGVlcnMgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3BlZXJzX3QpICsgc2l6ZW9mKG5neF9wZWVyX3QpICogKGkgLSAxKSk7CisKKyAgICAgICAgaWYgKHBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcGVlcnMtPm51bWJlciA9IGk7CisgICAgICAgIHBlZXJzLT53ZWlnaHQgPSAxOworCisgICAgICAgIGZvciAoaSA9IDA7IGgtPmhfYWRkcl9saXN0W2ldICE9IE5VTEw7IGkrKykgeworCisgICAgICAgICAgICBpZiAoIShzaW4gPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICAgICAgc2luLT5zaW5fcG9ydCA9IHUtPnBvcnQ7CisgICAgICAgICAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopKGgtPmhfYWRkcl9saXN0W2ldKTsKKworICAgICAgICAgICAgcGVlcnMtPnBlZXJbaV0uc29ja2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIHNpbjsKKyAgICAgICAgICAgIHBlZXJzLT5wZWVyW2ldLnNvY2tsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKworICAgICAgICAgICAgbGVuID0gSU5FVF9BRERSU1RSTEVOIC0gMSArIDEgKyB1LT5wb3J0X3RleHQubGVuOworICAgIAorICAgICAgICAgICAgaWYgKCEocGVlcnMtPnBlZXJbaV0ubmFtZS5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgbGVuKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuID0gbmd4X3NvY2tfbnRvcChBRl9JTkVULCAoc3RydWN0IHNvY2thZGRyICopIHNpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcnMtPnBlZXJbaV0ubmFtZS5kYXRhLCBsZW4pOworCisgICAgICAgICAgICBwZWVycy0+cGVlcltpXS5uYW1lLmRhdGFbbGVuKytdID0gJzonOworCisgICAgICAgICAgICBuZ3hfbWVtY3B5KHBlZXJzLT5wZWVyW2ldLm5hbWUuZGF0YSArIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdS0+cG9ydF90ZXh0LmRhdGEsIHUtPnBvcnRfdGV4dC5sZW4pOworCisgICAgICAgICAgICBwZWVycy0+cGVlcltpXS5uYW1lLmxlbiA9IGxlbiArIHUtPnBvcnRfdGV4dC5sZW47CisKKyAgICAgICAgICAgIHBlZXJzLT5wZWVyW2ldLnVyaV9zZXBhcmF0b3IgPSAiIjsKKworICAgICAgICAgICAgcGVlcnMtPnBlZXJbaV0ud2VpZ2h0ID0gMTsKKyAgICAgICAgICAgIHBlZXJzLT5wZWVyW2ldLm1heF9mYWlscyA9IDE7CisgICAgICAgICAgICBwZWVycy0+cGVlcltpXS5mYWlsX3RpbWVvdXQgPSA2MDsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvKiBNUDogbmd4X3NoYXJlZF9wYWxsb2MoKSAqLworCisgICAgICAgIGlmICghKHBlZXJzID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfcGVlcnNfdCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShzaW4gPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBwZWVycy0+bnVtYmVyID0gMTsKKworICAgICAgICBzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBzaW4tPnNpbl9wb3J0ID0gdS0+cG9ydDsKKyAgICAgICAgc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpbl9hZGRyOworCisgICAgICAgIHBlZXJzLT5wZWVyWzBdLnNvY2thZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSBzaW47CisgICAgICAgIHBlZXJzLT5wZWVyWzBdLnNvY2tsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKworICAgICAgICBsZW4gPSB1LT5ob3N0LmxlbiArIDEgKyB1LT5wb3J0X3RleHQubGVuOworCisgICAgICAgIHBlZXJzLT5wZWVyWzBdLm5hbWUubGVuID0gbGVuOworCisgICAgICAgIGlmICghKHBlZXJzLT5wZWVyWzBdLm5hbWUuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIGxlbikpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHUtPmhvc3QubGVuOworCisgICAgICAgIG5neF9tZW1jcHkocGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhLCB1LT5ob3N0LmRhdGEsIGxlbik7CisKKyAgICAgICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhW2xlbisrXSA9ICc6JzsKKworICAgICAgICBuZ3hfbWVtY3B5KHBlZXJzLT5wZWVyWzBdLm5hbWUuZGF0YSArIGxlbiwKKyAgICAgICAgICAgICAgICAgICB1LT5wb3J0X3RleHQuZGF0YSwgdS0+cG9ydF90ZXh0Lmxlbik7CisKKyAgICAgICAgcGVlcnMtPnBlZXJbMF0udXJpX3NlcGFyYXRvciA9ICIiOworICAgIH0KKworICAgIHJldHVybiBwZWVyczsKK30KKworCitjaGFyICpuZ3hfaW5ldF9wYXJzZV9ob3N0X3BvcnQobmd4X2luZXRfdXBzdHJlYW1fdCAqdSkKK3sKKyAgICBzaXplX3QgICAgICBpOworICAgIG5neF9pbnRfdCAgIHBvcnQ7CisgICAgbmd4X3N0cl90ICAqdXJsOworCisgICAgdXJsID0gJnUtPnVybDsKKworICAgIGlmICh1LT5wb3J0X29ubHkpIHsKKyAgICAgICAgaSA9IDA7CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodXJsLT5kYXRhWzBdID09ICc6JyB8fCB1cmwtPmRhdGFbMF0gPT0gJy8nKSB7CisgICAgICAgICAgICByZXR1cm4gImludmFsaWQgaG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBpID0gMTsKKyAgICB9CisKKyAgICB1LT5ob3N0LmRhdGEgPSB1cmwtPmRhdGE7CisgICAgdS0+aG9zdF9oZWFkZXIgPSAqdXJsOworCisgICAgZm9yICgvKiB2b2lkICovOyBpIDwgdXJsLT5sZW47IGkrKykgeworCisgICAgICAgIGlmICh1cmwtPmRhdGFbaV0gPT0gJzonKSB7CisgICAgICAgICAgICB1LT5wb3J0X3RleHQuZGF0YSA9ICZ1cmwtPmRhdGFbaV0gKyAxOworICAgICAgICAgICAgdS0+aG9zdC5sZW4gPSBpOworCisgICAgICAgICAgICBpZiAoIXUtPnVyaV9wYXJ0KSB7CisgICAgICAgICAgICAgICAgdS0+cG9ydF90ZXh0LmxlbiA9ICZ1cmwtPmRhdGFbdXJsLT5sZW5dIC0gdS0+cG9ydF90ZXh0LmRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodXJsLT5kYXRhW2ldID09ICcvJykgeworICAgICAgICAgICAgdS0+dXJpLmRhdGEgPSAmdXJsLT5kYXRhW2ldOworICAgICAgICAgICAgdS0+dXJpLmxlbiA9IHVybC0+bGVuIC0gaTsKKyAgICAgICAgICAgIHUtPmhvc3RfaGVhZGVyLmxlbiA9IGk7CisKKyAgICAgICAgICAgIGlmICh1LT5ob3N0LmxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgdS0+aG9zdC5sZW4gPSBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodS0+cG9ydF90ZXh0LmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHUtPmRlZmF1bHRfcG9ydCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHUtPnBvcnRfdGV4dC5sZW4gPSAmdXJsLT5kYXRhW2ldIC0gdS0+cG9ydF90ZXh0LmRhdGE7CisKKyAgICAgICAgICAgIGlmICh1LT5wb3J0X3RleHQubGVuID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQgcG9ydCI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaW5fYWRkci0+aG9zdC5sZW4gPSBwOwotICAgIGlmICghKGluX2FkZHItPmhvc3QuZGF0YSA9IG5neF9wYWxsb2MocG9vbCwgcCArIDEpKSkgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIGlmICh1LT5wb3J0X3RleHQuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHBvcnQgPSBuZ3hfYXRvaSh1cmwtPmRhdGEsIHVybC0+bGVuKTsKKworICAgICAgICBpZiAocG9ydCA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgIHUtPmRlZmF1bHRfcG9ydCA9IDE7CisgICAgICAgICAgICB1LT5ob3N0LmxlbiA9IHVybC0+bGVuOworCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHUtPnBvcnRfdGV4dCA9ICp1cmw7CisgICAgICAgIHUtPndpbGRjYXJkID0gMTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh1LT5wb3J0X3RleHQubGVuID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAibm8gVVJJIjsKKyAgICAgICAgfQorCisgICAgICAgIHBvcnQgPSBuZ3hfYXRvaSh1LT5wb3J0X3RleHQuZGF0YSwgdS0+cG9ydF90ZXh0Lmxlbik7CisKKyAgICAgICAgaWYgKHBvcnQgPT0gTkdYX0VSUk9SIHx8IHBvcnQgPCAxIHx8IHBvcnQgPiA2NTUzNikgeworICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkIHBvcnQiOworICAgICAgICB9CiAgICAgfQogCi0gICAgbmd4X2NweXN0cm4oaW5fYWRkci0+aG9zdC5kYXRhLCBhZGRyX3BvcnQtPmRhdGEsIHAgKyAxKTsKKyAgICB1LT5wb3J0ID0gKGluX3BvcnRfdCkgcG9ydDsKIAotICAgIGlmIChwID09IGFkZHJfcG9ydC0+bGVuKSB7Ci0gICAgICAgIHAgPSAwOwotICAgIH0KLQotICAgIHBvcnQgPSBuZ3hfYXRvaSgmYWRkcltwXSwgYXJnc1sxXS5sZW4gLSBwKTsKLSAgICBpZiAocG9ydCA9PSBOR1hfRVJST1IgJiYgcCA9PSAwKSB7Ci0KLSAgICAgICAgLyogZGVmYXVsdCBwb3J0ICovCi0gICAgICAgIGlhcC0+cG9ydCA9IDA7Ci0KLSAgICB9IGVsc2UgaWYgKChwb3J0ID09IE5HWF9FUlJPUiAmJiBwICE9IDApIC8qICJsaXN0ZW4gaG9zdDpOT05OVU1CRVIiICovCi0gICAgICAgICAgICAgICB8fCAocG9ydCA8IDEgfHwgcG9ydCA+IDY1NTM2KSkgeyAvKiAibGlzdGVuIDk5OTk5IiAqLwotCi0gICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHBvcnQgXCIlc1wiIGluIFwiJXNcIiBkaXJlY3RpdmUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdCBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgNjU1MzUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZHJbcF0sIGNtZC0+bmFtZS5kYXRhKTsKLQotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0KLSAgICB9IGVsc2UgaWYgKHAgPT0gMCkgewotICAgICAgICBscy0+YWRkciA9IElOQUREUl9BTlk7Ci0gICAgICAgIGxzLT5wb3J0ID0gKGluX3BvcnRfdCkgcG9ydDsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwotICAgIH0KLQotICAgIHJldHVybiBOR1hfT0s7CisgICAgcmV0dXJuIE5VTEw7CiB9Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2luZXQuaCBiL3NyYy9jb3JlL25neF9pbmV0LmgKaW5kZXggZDBlMWY4ZC4uYTAxZmM4YSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2luZXQuaAorKysgYi9zcmMvY29yZS9uZ3hfaW5ldC5oCkBAIC04LDE3ICs4LDQ0IEBACiAjZGVmaW5lIF9OR1hfSU5FVF9IX0lOQ0xVREVEXwogCiAKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKworCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgaW5fYWRkcl90ICBhZGRyOwogICAgIGluX2FkZHJfdCAgbWFzazsKIH0gbmd4X2luZXRfY2lkcl90OwogCiAKLXNpemVfdCBuZ3hfc29ja19udG9wKGludCBmYW1pbHksIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgdV9jaGFyICp0ZXh0LAordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9zdHJfdCAgICAgbmFtZTsgICAgICAgICAgIC8qICJzY2hlbWE6aG9zdDpwb3J0L3VyaSIgKi8KKyAgICBuZ3hfc3RyX3QgICAgIHVybDsgICAgICAgICAgICAvKiAiaG9zdDpwb3J0L3VyaSIgKi8KKyAgICBuZ3hfc3RyX3QgICAgIGhvc3Q7CisgICAgbmd4X3N0cl90ICAgICB1cmk7CisgICAgbmd4X3N0cl90ICAgICBob3N0X2hlYWRlcjsgICAgLyogImhvc3Q6cG9ydCIgKi8KKyAgICBuZ3hfc3RyX3QgICAgIHBvcnRfdGV4dDsgICAgICAvKiAicG9ydCIgKi8KKworICAgIGluX3BvcnRfdCAgICAgcG9ydDsKKworICAgIGluX3BvcnRfdCAgICAgZGVmYXVsdF9wb3J0X3ZhbHVlOworCisgICAgdW5zaWduZWQgICAgICBkZWZhdWx0X3BvcnQ6MTsKKyAgICB1bnNpZ25lZCAgICAgIHdpbGRjYXJkOjE7CisKKyAgICB1bnNpZ25lZCAgICAgIHVyaV9wYXJ0OjE7CisgICAgdW5zaWduZWQgICAgICBwb3J0X29ubHk6MTsKK30gbmd4X2luZXRfdXBzdHJlYW1fdDsKKworCitzaXplX3Qgbmd4X3NvY2tfbnRvcChpbnQgZmFtaWx5LCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCB1X2NoYXIgKnRleHQsCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKIHNpemVfdCBuZ3hfaW5ldF9udG9wKGludCBmYW1pbHksIHZvaWQgKmFkZHIsIHVfY2hhciAqdGV4dCwgc2l6ZV90IGxlbik7CiAKIG5neF9pbnRfdCBuZ3hfcHRvY2lkcihuZ3hfc3RyX3QgKnRleHQsIHZvaWQgKmNpZHIpOwogCituZ3hfcGVlcnNfdCAqbmd4X2luZXRfdXBzdHJlYW1fcGFyc2Uobmd4X2NvbmZfdCAqY2YsIG5neF9pbmV0X3Vwc3RyZWFtX3QgKnUpOworY2hhciAqbmd4X2luZXRfcGFyc2VfaG9zdF9wb3J0KG5neF9pbmV0X3Vwc3RyZWFtX3QgKnUpOworCiAKICNlbmRpZiAvKiBfTkdYX0lORVRfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9vdXRwdXRfY2hhaW4uYyBiL3NyYy9jb3JlL25neF9vdXRwdXRfY2hhaW4uYwppbmRleCBiOTI1ZTQ4Li4yYjhkYTIyIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfb3V0cHV0X2NoYWluLmMKKysrIGIvc3JjL2NvcmUvbmd4X291dHB1dF9jaGFpbi5jCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICAgICAgICBpZiAoYnNpemUgPT0gMCAmJiAhbmd4X2J1Zl9zcGVjaWFsKGN0eC0+aW4tPmJ1ZikpIHsKIAogICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgY3R4LT5wb29sLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemVybyBzaXplIGJ1ZiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInplcm8gc2l6ZSBidWYgaW4gb3V0cHV0Iik7CiAKICAgICAgICAgICAgICAgICBuZ3hfZGVidWdfcG9pbnQoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3JlZ2V4LmMgYi9zcmMvY29yZS9uZ3hfcmVnZXguYwppbmRleCAzNWI0ODkyLi45YjBjNzRlIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcmVnZXguYworKysgYi9zcmMvY29yZS9uZ3hfcmVnZXguYwpAQCAtNTQsMTEgKzU0LDExIEBACiAgICAgaWYgKHJlID09IE5VTEwpIHsKICAgICAgICBpZiAoKHNpemVfdCkgZXJyb2ZmID09IHBhdHRlcm4tPmxlbikgewogICAgICAgICAgICBuZ3hfc25wcmludGYoZXJyLT5kYXRhLCBlcnItPmxlbiAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAicGNyZV9jb21waWxlKCkgZmFpbGVkOiAlcyBpbiBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgInBjcmVfY29tcGlsZSgpIGZhaWxlZDogJXMgaW4gXCIlc1wiJVoiLAogICAgICAgICAgICAgICAgICAgICAgICAgZXJyc3RyLCBwYXR0ZXJuLT5kYXRhKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmd4X3NucHJpbnRmKGVyci0+ZGF0YSwgZXJyLT5sZW4gLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgInBjcmVfY29tcGlsZSgpIGZhaWxlZDogJXMgaW4gXCIlc1wiIGF0IFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAicGNyZV9jb21waWxlKCkgZmFpbGVkOiAlcyBpbiBcIiVzXCIgYXQgXCIlc1wiJVoiLAogICAgICAgICAgICAgICAgICAgICAgICAgZXJyc3RyLCBwYXR0ZXJuLT5kYXRhLCBwYXR0ZXJuLT5kYXRhICsgZXJyb2ZmKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9zdHJpbmcuYyBiL3NyYy9jb3JlL25neF9zdHJpbmcuYwppbmRleCBkZDZkMDZhLi4zN2E3NWFhIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmMKKysrIGIvc3JjL2NvcmUvbmd4X3N0cmluZy5jCkBAIC04Niw3ICs4NiwxMSBAQAogCiB1X2NoYXIgKm5neF92c25wcmludGYodV9jaGFyICpidWYsIHNpemVfdCBtYXgsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQogewotICAgIHVfY2hhciAgICAgICAgICpwLCB6ZXJvLCAqbGFzdCwgdGVtcFtOR1hfSU5UNjRfTEVOXTsKKyAgICB1X2NoYXIgICAgICAgICAqcCwgemVybywgKmxhc3QsIHRlbXBbTkdYX0lOVDY0X0xFTiArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWxseSB3ZSBuZWVkIHRlbXBbTkdYX0lOVDY0X0xFTl0gb25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1dCBpY2Mgc2hvd3MgdGhlIHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIGludCAgICAgICAgICAgICBkOwogICAgIHNpemVfdCAgICAgICAgICBsZW47CiAgICAgdWludDMyX3QgICAgICAgIHVpMzI7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmggYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmgKaW5kZXggZDBiODdlMC4uYWJlZjgyZCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3N0cmluZy5oCisrKyBiL3NyYy9jb3JlL25neF9zdHJpbmcuaApAQCAtNjQsNyArNjQsNyBAQAogCiAvKiBtc3ZjIGFuZCBpY2MgY29tcGlsZSBtZW1jcHkoKSB0byB0aGUgaW5saW5lICJyZXAgbW92cyIgKi8KICNkZWZpbmUgbmd4X21lbWNweShkc3QsIHNyYywgbikgICBtZW1jcHkoZHN0LCBzcmMsIG4pCi0jZGVmaW5lIG5neF9jcHltZW0oZHN0LCBzcmMsIG4pICAgKCh1X2NoYXIgKikgbWVtY3B5KGRzdCwgc3JjLCBuKSkgKyBuCisjZGVmaW5lIG5neF9jcHltZW0oZHN0LCBzcmMsIG4pICAgKCh1X2NoYXIgKikgbWVtY3B5KGRzdCwgc3JjLCBuKSkgKyAobikKIAogCiAvKiBtc3ZjIGFuZCBpY2MgY29tcGlsZSBtZW1jbXAoKSB0byB0aGUgaW5saW5lIGxvb3AgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF91bml4X2RvbWFpbi5jIGIvc3JjL2NvcmUvbmd4X3VuaXhfZG9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2Nzc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL25neF91bml4X2RvbWFpbi5jCkBAIC0wLDAgKzEsODQgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnRfY29ubmVjdC5oPgorCisKKy8qIFNvbGFyaXMgaGFzIHByZWRlZmluZWQgIiNkZWZpbmUgc3VuIDEiICovCisjdW5kZWYgc3VuCisKKworbmd4X3BlZXJzX3QgKm5neF91bml4X3Vwc3RyZWFtX3BhcnNlKG5neF9jb25mX3QgKmNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90ICp1KQoreworICAgIHNpemVfdCAgICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICBpOworICAgIG5neF9wZWVyc190ICAgICAgICAgKnBlZXJzOworICAgIHN0cnVjdCBzb2NrYWRkcl91biAgKnN1bjsKKworICAgIGxlbiA9IHUtPnVybC5sZW4gLSA1OworCisgICAgaWYgKHUtPnVyaV9wYXJ0KSB7CisgICAgICAgIGZvciAoaSA9IDU7IGkgPCB1LT51cmwubGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh1LT51cmwuZGF0YVtpXSA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBpIC0gNTsKKyAgICAgICAgICAgICAgICB1LT51cmkubGVuID0gdS0+dXJsLmxlbiAtIDUgLSBsZW4gLSAxOworICAgICAgICAgICAgICAgIHUtPnVyaS5kYXRhID0gdS0+dXJsLmRhdGEgKyA1ICsgbGVuICsgMTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHUtPnVyaS5sZW4gPT0gMCkgeworICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgdW5peCBkb21haW4gdXBzdHJlYW0gXCIlVlwiIGhhcyBubyBVUkkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1LT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgdW5peCBkb21haW4gc29ja2V0IFwiJVZcIiBoYXMgbm8gcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdS0+bmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChsZW4gKyAxID4gc2l6ZW9mKHN1bi0+c3VuX3BhdGgpKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgdW5peCBkb21haW4gc29ja2V0IHBhdGggXCIlVlwiIGlzIHRvbyBsb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1LT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogTVA6IG5neF9zaGFyZWRfcGFsbG9jKCkgKi8KKworICAgIGlmICghKHBlZXJzID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfcGVlcnNfdCkpKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIShzdW4gPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bikpKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwZWVycy0+bnVtYmVyID0gMTsKKworICAgIHN1bi0+c3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgICAgbmd4X2NweXN0cm4oKHVfY2hhciAqKSBzdW4tPnN1bl9wYXRoLCB1LT51cmwuZGF0YSArIDUsIGxlbiArIDEpOworCisgICAgcGVlcnMtPnBlZXJbMF0uc29ja2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIHN1bjsKKyAgICBwZWVycy0+cGVlclswXS5zb2NrbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bik7CisKKyAgICBwZWVycy0+cGVlclswXS5uYW1lLmxlbiA9IDUgKyBsZW47CisgICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhID0gdS0+dXJsLmRhdGE7CisKKyAgICBwZWVycy0+cGVlclswXS51cmlfc2VwYXJhdG9yID0gIjoiOworCisgICAgcmV0dXJuIHBlZXJzOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3VuaXhfZG9tYWluLmggYi9zcmMvY29yZS9uZ3hfdW5peF9kb21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzFkZTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbmd4X3VuaXhfZG9tYWluLmgKQEAgLTAsMCArMSwyOSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgorICovCisKKworI2lmbmRlZiBfTkdYX1VOSVhfRE9NQUlOX0hfSU5DTFVERURfCisjZGVmaW5lIF9OR1hfVU5JWF9ET01BSU5fSF9JTkNMVURFRF8KKworCisjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgorI2luY2x1ZGUgPG5neF9jb3JlLmg+CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9zdHJfdCAgICAgbmFtZTsgICAgICAgICAgIC8qICJzY2hlbWE6dW5peDpwYXRoOi91cmkiICovCisgICAgbmd4X3N0cl90ICAgICB1cmw7ICAgICAgICAgICAgLyogInVuaXg6cGF0aDovdXJpIiAqLworICAgIG5neF9zdHJfdCAgICAgdXJpOworCisgICAgbmd4X3VpbnRfdCAgICB1cmlfcGFydDsgICAgICAgLyogdW5zaWduZWQgIHVyaV9wYXJ0OjE7ICovCit9IG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90OworCisKK25neF9wZWVyc190ICpuZ3hfdW5peF91cHN0cmVhbV9wYXJzZShuZ3hfY29uZl90ICpjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCAqdSk7CisKKworI2VuZGlmIC8qIF9OR1hfVU5JWF9ET01BSU5fSF9JTkNMVURFRF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHQuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0LmMKaW5kZXggZjEyYzAwMy4uNzBhN2M4OSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHQuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2FjY2VwdC5jCkBAIC0zMTMsMTIgKzMxMywxMiBAQAogCiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgKmFkZHI7CiAgICAgICAgIGluX2FkZHJfdCAgICAgICAgICAgIGk7Ci0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgKmFkZHJfaW47CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgKnNpbjsKIAotICAgICAgICBhZGRyX2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYTsKKyAgICAgICAgc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYTsKICAgICAgICAgYWRkciA9IGVjZi0+ZGVidWdfY29ubmVjdGlvbi5lbHRzOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZWNmLT5kZWJ1Z19jb25uZWN0aW9uLm5lbHRzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhZGRyW2ldID09IGFkZHJfaW4tPnNpbl9hZGRyLnNfYWRkcikgeworICAgICAgICAgICAgaWYgKGFkZHJbaV0gPT0gc2luLT5zaW5fYWRkci5zX2FkZHIpIHsKICAgICAgICAgICAgICAgICBsb2ctPmxvZ19sZXZlbCA9IE5HWF9MT0dfREVCVUdfQ09OTkVDVElPTnxOR1hfTE9HX0RFQlVHX0FMTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0ZXguYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0ZXguYwppbmRleCA0ODY2MzZiLi4zY2ZiYTY4IDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50X2FjY2VwdGV4LmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHRleC5jCkBAIC05Miw3ICs5Miw3IEBACiAKICAgICAgICAgLyogVE9ETzogbG9vayB1cCByZXVzZWQgc29ja2V0cyAqLwogCi0gICAgICAgIHMgPSBuZ3hfc29ja2V0KGxzLT5mYW1pbHksIGxzLT50eXBlLCBscy0+cHJvdG9jb2wpOworICAgICAgICBzID0gbmd4X3NvY2tldChscy0+ZmFtaWx5LCBscy0+dHlwZSwgMCk7CiAKICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19FVkVOVCwgbHMtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3NvY2tldF9uICIgczolZCIsIHMpOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9jb25uZWN0LmMgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2Nvbm5lY3QuYwppbmRleCA2ZjBkOTRmLi43NTI3N2E3IDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50X2Nvbm5lY3QuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2Nvbm5lY3QuYwpAQCAtMjUsNyArMjUsNiBAQAogICAgIG5neF9ldmVudF90ICAgICAgICAgKnJldiwgKndldjsKICAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOwogICAgIG5neF9ldmVudF9jb25mX3QgICAgKmVjZjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICBhZGRyOwogCiAgICAgbm93ID0gbmd4X3RpbWUoKTsKIApAQCAtNTQsNyArNTMsNyBAQAogICAgIHBjLT5jb25uZWN0aW9uID0gTlVMTDsKIAogICAgIGlmIChwYy0+cGVlcnMtPm51bWJlciA9PSAxKSB7Ci0gICAgICAgIHBlZXIgPSAmcGMtPnBlZXJzLT5wZWVyc1swXTsKKyAgICAgICAgcGVlciA9ICZwYy0+cGVlcnMtPnBlZXJbMF07CiAKICAgICB9IGVsc2UgewogCkBAIC02NCw0NSArNjMsNDcgQEAKIAogICAgICAgICAgICAgLyogaXQncyBhIGZpcnN0IHRyeSAtIGdldCBhIGN1cnJlbnQgcGVlciAqLwogCi0gICAgICAgICAgICBwYy0+Y3VyX3BlZXIgPSBwYy0+cGVlcnMtPmN1cnJlbnQrKzsKKyAgICAgICAgICAgIHBjLT5jdXJfcGVlciA9IHBjLT5wZWVycy0+Y3VycmVudDsKKworICAgICAgICAgICAgcGMtPnBlZXJzLT53ZWlnaHQtLTsKKworICAgICAgICAgICAgaWYgKHBjLT5wZWVycy0+d2VpZ2h0ID09IDApIHsKKyAgICAgICAgICAgICAgICBwYy0+cGVlcnMtPmN1cnJlbnQrKzsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHBjLT5wZWVycy0+Y3VycmVudCA+PSBwYy0+cGVlcnMtPm51bWJlcikgewogICAgICAgICAgICAgICAgIHBjLT5wZWVycy0+Y3VycmVudCA9IDA7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYy0+cGVlcnMtPndlaWdodCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGMtPnBlZXJzLT53ZWlnaHQgPSBwYy0+cGVlcnMtPnBlZXJbcGMtPnBlZXJzLT5jdXJyZW50XS53ZWlnaHQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocGMtPnBlZXJzLT5tYXhfZmFpbHMgPT0gMCkgewotICAgICAgICAgICAgcGVlciA9ICZwYy0+cGVlcnMtPnBlZXJzW3BjLT5jdXJfcGVlcl07CisgICAgICAgIGZvciAoIDs7ICkgeworICAgICAgICAgICAgcGVlciA9ICZwYy0+cGVlcnMtPnBlZXJbcGMtPmN1cl9wZWVyXTsKIAotICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBlZXItPmZhaWxzIDw9IHBlZXItPm1heF9mYWlscykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvKiB0aGUgcGVlcnMgc3VwcG9ydCBhIGZhdWx0IHRvbGVyYW5jZSAqLworICAgICAgICAgICAgaWYgKG5vdyAtIHBlZXItPmFjY2Vzc2VkID4gcGVlci0+ZmFpbF90aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgcGVlci0+ZmFpbHMgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKCA7OyApIHsKLSAgICAgICAgICAgICAgICBwZWVyID0gJnBjLT5wZWVycy0+cGVlcnNbcGMtPmN1cl9wZWVyXTsKKyAgICAgICAgICAgIHBjLT5jdXJfcGVlcisrOwogCi0gICAgICAgICAgICAgICAgaWYgKHBlZXItPmZhaWxzIDw9IHBjLT5wZWVycy0+bWF4X2ZhaWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYy0+Y3VyX3BlZXIgPj0gcGMtPnBlZXJzLT5udW1iZXIpIHsKKyAgICAgICAgICAgICAgICBwYy0+Y3VyX3BlZXIgPSAwOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG5vdyAtIHBlZXItPmFjY2Vzc2VkID4gcGMtPnBlZXJzLT5mYWlsX3RpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGVlci0+ZmFpbHMgPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBwYy0+dHJpZXMtLTsKIAotICAgICAgICAgICAgICAgIHBjLT5jdXJfcGVlcisrOworICAgICAgICAgICAgaWYgKHBjLT50cmllcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogbmd4X3VubG9ja19tdXRleChwYy0+cGVlcnMtPm11dGV4KTsgKi8KIAotICAgICAgICAgICAgICAgIGlmIChwYy0+Y3VyX3BlZXIgPj0gcGMtPnBlZXJzLT5udW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcGMtPmN1cl9wZWVyID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYy0+dHJpZXMtLTsKLQotICAgICAgICAgICAgICAgIGlmIChwYy0+dHJpZXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBuZ3hfdW5sb2NrX211dGV4KHBjLT5wZWVycy0+bXV0ZXgpOyAqLwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTAsNyArMTExLDcgQEAKICAgICAvKiBuZ3hfdW5sb2NrX211dGV4KHBjLT5wZWVycy0+bXV0ZXgpOyAqLwogCiAKLSAgICBzID0gbmd4X3NvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgICAgcyA9IG5neF9zb2NrZXQocGVlci0+c29ja2FkZHItPnNhX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOwogCiAgICAgaWYgKHMgPT0gLTEpIHsKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBwYy0+bG9nLCBuZ3hfc29ja2V0X2Vycm5vLApAQCAtMjU3LDE2ICsyNTgsMTAgQEAKICAgICAgICAgfQogICAgIH0gCiAKLSAgICBuZ3hfbWVtemVybygmYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotCi0gICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBhZGRyLnNpbl9wb3J0ID0gcGVlci0+cG9ydDsKLSAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IHBlZXItPmFkZHI7Ci0KICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0VWRU5ULCBwYy0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJjb25uZWN0IHRvICVWLCAjJWQiLCAmcGVlci0+YWRkcl9wb3J0X3RleHQsIGMtPm51bWJlcik7CisgICAgICAgICAgICAgICAgICAgImNvbm5lY3QgdG8gJVYsICMlZCIsICZwZWVyLT5uYW1lLCBjLT5udW1iZXIpOwogCi0gICAgcmMgPSBjb25uZWN0KHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICByYyA9IGNvbm5lY3QocywgcGVlci0+c29ja2FkZHIsIHBlZXItPnNvY2tsZW4pOwogCiAgICAgaWYgKHJjID09IC0xKSB7CiAgICAgICAgIGVyciA9IG5neF9zb2NrZXRfZXJybm87CkBAIC0zNjcsOCArMzYyLDggQEAKIAogICAgIC8qIG5neF9sb2NrX211dGV4KHBjLT5wZWVycy0+bXV0ZXgpOyAqLwogCi0gICAgcGMtPnBlZXJzLT5wZWVyc1twYy0+Y3VyX3BlZXJdLmZhaWxzKys7Ci0gICAgcGMtPnBlZXJzLT5wZWVyc1twYy0+Y3VyX3BlZXJdLmFjY2Vzc2VkID0gbm93OworICAgIHBjLT5wZWVycy0+cGVlcltwYy0+Y3VyX3BlZXJdLmZhaWxzKys7CisgICAgcGMtPnBlZXJzLT5wZWVyW3BjLT5jdXJfcGVlcl0uYWNjZXNzZWQgPSBub3c7CiAKICAgICAvKiBuZ3hfdW5sb2NrX211dGV4KHBjLT5wZWVycy0+bXV0ZXgpOyAqLwogCmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X2Nvbm5lY3QuaCBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfY29ubmVjdC5oCmluZGV4IDA0MDg2OTQuLjRmM2VlMmUgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfY29ubmVjdC5oCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfY29ubmVjdC5oCkBAIC0xNywzNCArMTcsNDAgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW5fYWRkcl90ICAgICAgICAgIGFkZHI7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgIGhvc3Q7Ci0gICAgaW5fcG9ydF90ICAgICAgICAgIHBvcnQ7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgIGFkZHJfcG9ydF90ZXh0OworICAgIHN0cnVjdCBzb2NrYWRkciAgICAqc29ja2FkZHI7CisgICAgc29ja2xlbl90ICAgICAgICAgICBzb2NrbGVuOwogCi0gICAgbmd4X2ludF90ICAgICAgICAgIGZhaWxzOwotICAgIHRpbWVfdCAgICAgICAgICAgICBhY2Nlc3NlZDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgIG5hbWU7CisgICAgY2hhciAgICAgICAgICAgICAgICp1cmlfc2VwYXJhdG9yOworCisgICAgbmd4X3VpbnRfdCAgICAgICAgICB3ZWlnaHQ7CisKKyAgICBuZ3hfdWludF90ICAgICAgICAgIGZhaWxzOworICAgIHRpbWVfdCAgICAgICAgICAgICAgYWNjZXNzZWQ7CisKKyAgICBuZ3hfdWludF90ICAgICAgICAgIG1heF9mYWlsczsKKyAgICB0aW1lX3QgICAgICAgICAgICAgIGZhaWxfdGltZW91dDsKIH0gbmd4X3BlZXJfdDsKIAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2ludF90ICAgICAgICAgICBjdXJyZW50OwotICAgIG5neF9pbnRfdCAgICAgICAgICAgbnVtYmVyOwotICAgIG5neF9pbnRfdCAgICAgICAgICAgbWF4X2ZhaWxzOwotICAgIHRpbWVfdCAgICAgICAgICAgICAgZmFpbF90aW1lb3V0OwotICAgIG5neF9pbnRfdCAgICAgICAgICAgbGFzdF9jYWNoZWQ7CitzdHJ1Y3Qgbmd4X3BlZXJzX3MgeworICAgIG5neF91aW50X3QgICAgICAgICAgY3VycmVudDsKKyAgICBuZ3hfdWludF90ICAgICAgICAgIHdlaWdodDsKKworICAgIG5neF91aW50X3QgICAgICAgICAgbnVtYmVyOworICAgIG5neF91aW50X3QgICAgICAgICAgbGFzdF9jYWNoZWQ7CiAKICAvKiBuZ3hfbXV0ZXhfdCAgICAgICAgKm11dGV4OyAqLwogICAgIG5neF9jb25uZWN0aW9uX3QgICoqY2FjaGVkOwogCi0gICAgbmd4X3BlZXJfdCAgICAgICAgICBwZWVyc1sxXTsKLX0gbmd4X3BlZXJzX3Q7CisgICAgbmd4X3BlZXJfdCAgICAgICAgICBwZWVyWzFdOworfTsKIAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X3BlZXJzX3QgICAgICAgKnBlZXJzOwotICAgIG5neF9pbnRfdCAgICAgICAgICBjdXJfcGVlcjsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgdHJpZXM7CisgICAgbmd4X3VpbnRfdCAgICAgICAgIGN1cl9wZWVyOworICAgIG5neF91aW50X3QgICAgICAgICB0cmllczsKIAogICAgIG5neF9jb25uZWN0aW9uX3QgICpjb25uZWN0aW9uOwogI2lmIChOR1hfVEhSRUFEUykKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKaW5kZXggYzBlYzZhZC4uMTVhMjVkMSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKQEAgLTgsNiArOCw4IEBACiAjaW5jbHVkZSA8bmd4X2NvcmUuaD4KICNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisKIAogc3RhdGljIHZvaWQgbmd4X3NzbF93cml0ZV9oYW5kbGVyKG5neF9ldmVudF90ICp3ZXYpOwogc3RhdGljIHNzaXplX3Qgbmd4X3NzbF93cml0ZShuZ3hfY29ubmVjdGlvbl90ICpjLCB1X2NoYXIgKmRhdGEsIHNpemVfdCBzaXplKTsKQEAgLTE2LDggKzE4LDExIEBACiAKIG5neF9pbnRfdCBuZ3hfc3NsX2luaXQobmd4X2xvZ190ICpsb2cpCiB7CisgICAgRU5HSU5FICAqZW5naW5lOworCiAgICAgU1NMX2xpYnJhcnlfaW5pdCgpOwogICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyAgICBFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKTsKIAogICAgIHJldHVybiBOR1hfT0s7CiB9CkBAIC03MSw2ICs3Niw0OCBAQAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwgIlNTTF9yZWFkOiAlZCIsIG4pOyAKIAogICAgIGlmIChuID4gMCkgeworCisjaWYgKE5HWF9ERUJVRykKKworICAgICAgICBpZiAoIWMtPnNzbC0+aGFuZHNoYWtlZCAmJiBTU0xfaXNfaW5pdF9maW5pc2hlZChjLT5zc2wtPnNzbCkpIHsKKyAgICAgICAgICAgIGNoYXIgICAgICAgICBidWZbMTI5XSwgKnMsICpkOworICAgICAgICAgICAgU1NMX0NJUEhFUiAgKmNpcGhlcjsKKworICAgICAgICAgICAgYy0+c3NsLT5oYW5kc2hha2VkID0gMTsKKworICAgICAgICAgICAgY2lwaGVyID0gU1NMX2dldF9jdXJyZW50X2NpcGhlcihjLT5zc2wtPnNzbCk7CisKKyAgICAgICAgICAgIGlmIChjaXBoZXIpIHsKKyAgICAgICAgICAgICAgICBTU0xfQ0lQSEVSX2Rlc2NyaXB0aW9uKGNpcGhlciwgJmJ1ZlsxXSwgMTI4KTsKKworICAgICAgICAgICAgICAgIGZvciAocyA9ICZidWZbMV0sIGQgPSBidWY7ICpzOyBzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpzID09ICcgJyAmJiAqZCA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpzID09ICdcbicgfHwgKnMgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAqKytkID0gKnM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCpkICE9ICcgJykgeworICAgICAgICAgICAgICAgICAgICBkKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmQgPSAnXDAnOworCisgICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19FVkVOVCwgYy0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTU0wgY2lwaGVyOiBcIiVzXCIiLCAmYnVmWzFdKTsgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIG5vIHNoYXJlZCBjaXBoZXJzIik7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNlbmRpZgorCiAgICAgICAgIGlmIChjLT5zc2wtPnNhdmVkX3dyaXRlX2hhbmRsZXIpIHsKIAogICAgICAgICAgICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBjLT5zc2wtPnNhdmVkX3dyaXRlX2hhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X29wZW5zc2wuaCBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCmluZGV4IDZlN2I3MDUuLjIyNGNjODQgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCkBAIC0yNSw2ICsyNSwxMCBAQAogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgbm9fcmN2X3NodXQ6MTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgIG5vX3NlbmRfc2h1dDoxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgc2h1dGRvd25fc2V0OjE7CisKKyNpZiAoTkdYX0RFQlVHKQorICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgaGFuZHNoYWtlZDoxOworI2VuZGlmCiB9IG5neF9zc2xfdDsKIAogCmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X3BpcGUuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfcGlwZS5jCmluZGV4IDMxMGYwY2UuLmFkNjc5MzEgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfcGlwZS5jCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfcGlwZS5jCkBAIC0zNzksNyArMzc5LDcgQEAKIAogbmd4X2ludF90IG5neF9ldmVudF9waXBlX3dyaXRlX3RvX2Rvd25zdHJlYW0obmd4X2V2ZW50X3BpcGVfdCAqcCkKIHsKLSAgICBvZmZfdCAgICAgICAgIGJzaXplOworICAgIHNpemVfdCAgICAgICAgYnNpemU7CiAgICAgbmd4X3VpbnRfdCAgICBmbHVzaDsKICAgICBuZ3hfYnVmX3QgICAgKmI7CiAgICAgbmd4X2NoYWluX3QgICpvdXQsICoqbGwsICpjbCwgKnRsOwpAQCAtNDMzLDE2ICs0MzMsMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgLyogYnNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1c3kgYnVmcyAqLworICAgICAgICAvKiBic2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVzeSByZWN5Y2xlZCBidWZzICovCiAKICAgICAgICAgYnNpemUgPSAwOwogCiAgICAgICAgIGZvciAoY2wgPSBwLT5idXN5OyBjbDsgY2wgPSBjbC0+bmV4dCkgewotICAgICAgICAgICAgYnNpemUgKz0gY2wtPmJ1Zi0+ZW5kIC0gY2wtPmJ1Zi0+c3RhcnQ7CisgICAgICAgICAgICBpZiAoY2wtPmJ1Zi0+cmVjeWNsZWQpIHsKKyAgICAgICAgICAgICAgICBic2l6ZSArPSBjbC0+YnVmLT5lbmQgLSBjbC0+YnVmLT5zdGFydDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIHAtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgInBpcGUgd3JpdGUgYnVzeTogJU8iLCBic2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICJwaXBlIHdyaXRlIGJ1c3k6ICV1eiIsIGJzaXplKTsKIAogICAgICAgICBvdXQgPSBOVUxMOwogICAgICAgICBsbCA9IE5VTEw7CkBAIC00NTIsMTkgKzQ1NCwyMyBAQAogICAgICAgICAgICAgaWYgKHAtPm91dCkgewogICAgICAgICAgICAgICAgIGNsID0gcC0+b3V0OwogCi0gICAgICAgICAgICAgICAgaWYgKGJzaXplICsgbmd4X2J1Zl9zaXplKGNsLT5idWYpID4gcC0+YnVzeV9zaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsLT5idWYtPnJlY3ljbGVkCisgICAgICAgICAgICAgICAgICAgICYmIGJzaXplICsgY2wtPmJ1Zi0+bGFzdCAtIGNsLT5idWYtPnBvcyA+IHAtPmJ1c3lfc2l6ZSkKKyAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGZsdXNoID0gMTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcC0+b3V0ID0gcC0+b3V0LT5uZXh0OwotICAgICAgICAgICAgICAgIG5neF9ldmVudF9waXBlX2ZyZWVfc2hhZG93X3Jhd19idWYoJnAtPmZyZWVfcmF3X2J1ZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC0+YnVmKTsKKworICAgICAgICAgICAgICAgIG5neF9ldmVudF9waXBlX2ZyZWVfc2hhZG93X3Jhd19idWYoJnAtPmZyZWVfcmF3X2J1ZnMsIGNsLT5idWYpOwogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFwLT5jYWNoYWJsZSAmJiBwLT5pbikgewogICAgICAgICAgICAgICAgIGNsID0gcC0+aW47CiAKLSAgICAgICAgICAgICAgICBpZiAoYnNpemUgKyBuZ3hfYnVmX3NpemUoY2wtPmJ1ZikgPiBwLT5idXN5X3NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2wtPmJ1Zi0+cmVjeWNsZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgYnNpemUgKyBjbC0+YnVmLT5sYXN0IC0gY2wtPmJ1Zi0+cG9zID4gcC0+YnVzeV9zaXplKQorICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZmx1c2ggPSAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00NzUsNyArNDgxLDEwIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJzaXplICs9IG5neF9idWZfc2l6ZShjbC0+YnVmKTsKKyAgICAgICAgICAgIGlmIChjbC0+YnVmLT5yZWN5Y2xlZCkgeworICAgICAgICAgICAgICAgIGJzaXplICs9IGNsLT5idWYtPmxhc3QgLSBjbC0+YnVmLT5wb3M7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNsLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgIG5neF9jaGFpbl9hZGRfbGluayhvdXQsIGxsLCBjbCk7CiAgICAgICAgIH0KQEAgLTYxOCw4ICs2MjcsNiBAQAogCiAgICAgICAgIGItPmluX2ZpbGUgPSAxOwogICAgICAgICBiLT50ZW1wX2ZpbGUgPSAxOwotICAgICAgICBiLT50ZW1wb3JhcnkgPSAwOwotICAgICAgICBiLT5yZWN5Y2xlZCA9IDA7CiAKICAgICAgICAgbmd4X2NoYWluX2FkZF9saW5rKHAtPm91dCwgcC0+bGFzdF9vdXQsIGNsKTsKIApAQCAtNjY4LDcgKzY3NSw3IEBACiAKICAgICBuZ3hfYWxsb2NfbGlua19hbmRfc2V0X2J1ZihjbCwgYiwgcC0+cG9vbCwgTkdYX0VSUk9SKTsKIAotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIHAtPmxvZywgMCwgImJ1ZiAjJWQiLCBiLT5udW0pOworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIHAtPmxvZywgMCwgImlucHV0IGJ1ZiAjJWQiLCBiLT5udW0pOwogCiAgICAgbmd4X2NoYWluX2FkZF9saW5rKHAtPmluLCBwLT5sYXN0X2luLCBjbCk7CiAKQEAgLTc4MSw3ICs3ODgsMTQgQEAKICAgICAgICAgICAgICAgICBiID0gY2wtPmJ1Zi0+c2hhZG93OwogICAgICAgICAgICAgICAgIGItPnBvcyA9IGItPmxhc3QgPSBiLT5zdGFydDsKICAgICAgICAgICAgICAgICBiLT5zaGFkb3cgPSBOVUxMOwotICAgICAgICAgICAgICAgIG5neF9hbGxvY19saW5rX2FuZF9zZXRfYnVmKHRsLCBiLCBwLT5wb29sLCBOR1hfQUJPUlQpOworCisgICAgICAgICAgICAgICAgaWYgKCEodGwgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwLT5wb29sKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9BQk9SVDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0bC0+YnVmID0gYjsKKyAgICAgICAgICAgICAgICB0bC0+bmV4dCA9IE5VTEw7CisKICAgICAgICAgICAgICAgICBuZ3hfZXZlbnRfcGlwZV9hZGRfZnJlZV9idWYoJnAtPmZyZWVfcmF3X2J1ZnMsIHRsKTsKIAogICAgICAgICAgICAgICAgIGNsLT5idWYtPmxhc3Rfc2hhZG93ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX2hhbmRsZXIuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX2hhbmRsZXIuYwppbmRleCA5ZTVjNDNjLi4wMTc5Njg5IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hY2Nlc3NfaGFuZGxlci5jCkBAIC04MCw3ICs4MCw3IEBACiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2FjY2Vzc19oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgICphZGRyX2luOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgICAgICAgICAqc2luOwogICAgIG5neF9odHRwX2FjY2Vzc19ydWxlX3QgICAgICAqcnVsZTsKICAgICBuZ3hfaHR0cF9hY2Nlc3NfbG9jX2NvbmZfdCAgKmFsY2Y7CiAKQEAgLTkyLDE2ICs5MiwxNiBAQAogCiAgICAgLyogQUZfSU5FVCBvbmx5ICovCiAKLSAgICBhZGRyX2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSByLT5jb25uZWN0aW9uLT5zb2NrYWRkcjsKKyAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIHItPmNvbm5lY3Rpb24tPnNvY2thZGRyOwogCiAgICAgcnVsZSA9IGFsY2YtPnJ1bGVzLT5lbHRzOwogICAgIGZvciAoaSA9IDA7IGkgPCBhbGNmLT5ydWxlcy0+bmVsdHM7IGkrKykgewogCiAgICAgICAgIG5neF9sb2dfZGVidWczKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAiJTA4WEQgJTA4WEQgJTA4WEQiLAotICAgICAgICAgICAgICAgICAgICAgICBhZGRyX2luLT5zaW5fYWRkci5zX2FkZHIsIHJ1bGVbaV0ubWFzaywgcnVsZVtpXS5hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc2luLT5zaW5fYWRkci5zX2FkZHIsIHJ1bGVbaV0ubWFzaywgcnVsZVtpXS5hZGRyKTsKIAotICAgICAgICBpZiAoKGFkZHJfaW4tPnNpbl9hZGRyLnNfYWRkciAmIHJ1bGVbaV0ubWFzaykgPT0gcnVsZVtpXS5hZGRyKSB7CisgICAgICAgIGlmICgoc2luLT5zaW5fYWRkci5zX2FkZHIgJiBydWxlW2ldLm1hc2spID09IHJ1bGVbaV0uYWRkcikgewogICAgICAgICAgICAgaWYgKHJ1bGVbaV0uZGVueSkgewogICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MgZm9yYmlkZGVuIGJ5IHJ1bGUiKTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODY0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfaGFuZGxlci5jCkBAIC0wLDAgKzEsMTk2OCBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgorICovCisKKworI2luY2x1ZGUgPG5neF9jb25maWcuaD4KKyNpbmNsdWRlIDxuZ3hfY29yZS5oPgorI2luY2x1ZGUgPG5neF9odHRwLmg+CisjaW5jbHVkZSA8bmdpbnguaD4KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fY29uZl90ICAgICAgICB1cHN0cmVhbTsKKworICAgIG5neF9wZWVyc190ICAgICAgICAgICAgICAgICAgICAqcGVlcnM7CisKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczsKKworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgcm9vdDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICpsb2NhdGlvbjsKK30gbmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfbGlzdF90ICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM7CisKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKnN0YXR1czsKKworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqY29udGVudF90eXBlOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqY29udGVudF9sZW5ndGg7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICp4X3Bvd2VyZWRfYnk7CisKKyNpZiAoTkdYX0hUVFBfR1pJUCkKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmNvbnRlbnRfZW5jb2Rpbmc7CisjZW5kaWYKK30gbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyc19pbl90ICAgaGVhZGVyc19pbjsKK30gbmd4X2h0dHBfZmFzdGNnaV91cHN0cmVhbV90OworCisKK3R5cGVkZWYgZW51bSB7CisgICAgbmd4X2h0dHBfZmFzdGNnaV9zdF92ZXJzaW9uID0gMCwKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3R5cGUsCisgICAgbmd4X2h0dHBfZmFzdGNnaV9zdF9yZXF1ZXN0X2lkX2hpLAorICAgIG5neF9odHRwX2Zhc3RjZ2lfc3RfcmVxdWVzdF9pZF9sbywKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX3N0X2NvbnRlbnRfbGVuZ3RoX2hpLAorICAgIG5neF9odHRwX2Zhc3RjZ2lfc3RfY29udGVudF9sZW5ndGhfbG8sCisgICAgbmd4X2h0dHBfZmFzdGNnaV9zdF9wYWRkaW5nX2xlbmd0aCwKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3Jlc2VydmVkLAorICAgIG5neF9odHRwX2Zhc3RjZ2lfc3RfZGF0YSwKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3BhZGRpbmcsCit9IG5neF9odHRwX2Zhc3RjZ2lfc3RhdGVfZTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfZmFzdGNnaV9zdGF0ZV9lICAgICAgc3RhdGU7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAqcG9zOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmxhc3Q7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgdHlwZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzsKKworICAgIG5neF9odHRwX2Zhc3RjZ2lfdXBzdHJlYW1fdCAgKnVwc3RyZWFtOworfSBuZ3hfaHR0cF9mYXN0Y2dpX2N0eF90OworCisKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9SRU1PVEVfQUREUiAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9SRU1PVEVfVVNFUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfTkFNRSAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfQUREUiAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfUE9SVCAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TQ1JJUFRfTkFNRSAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9BVVRIX1RZUEUgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfUFJPVE9DT0wgICAgICAweDAxMDAKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfU09GVFdBUkUgICAgICAweDAyMDAKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9HQVRFV0FZX0lOVEVSRkFDRSAgICAweDA0MDAKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9SRVFVRVNUX1VSSSAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9SRURJUkVDVF9TVEFUVVMgICAgICAweDEwMDAKKworCisjZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfUkVTUE9OREVSICAgICAgMQorCisjZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfQkVHSU5fUkVRVUVTVCAgMQorI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX0FCT1JUX1JFUVVFU1QgIDIKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9FTkRfUkVRVUVTVCAgICAzCisjZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfUEFSQU1TICAgICAgICAgNAorI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX1NURElOICAgICAgICAgIDUKKyNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TVERPVVQgICAgICAgICA2CisjZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfU1RERVJSICAgICAgICAgNworI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX0RBVEEgICAgICAgICAgIDgKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdV9jaGFyICB2ZXJzaW9uOworICAgIHVfY2hhciAgdHlwZTsKKyAgICB1X2NoYXIgIHJlcXVlc3RfaWRfaGk7CisgICAgdV9jaGFyICByZXF1ZXN0X2lkX2xvOworICAgIHVfY2hhciAgY29udGVudF9sZW5ndGhfaGk7CisgICAgdV9jaGFyICBjb250ZW50X2xlbmd0aF9sbzsKKyAgICB1X2NoYXIgIHBhZGRpbmdfbGVuZ3RoOworICAgIHVfY2hhciAgcmVzZXJ2ZWQ7Cit9IG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVfY2hhciAgcm9sZV9oaTsKKyAgICB1X2NoYXIgIHJvbGVfbG87CisgICAgdV9jaGFyICBmbGFnczsKKyAgICB1X2NoYXIgIHJlc2VydmVkWzVdOworfSBuZ3hfaHR0cF9mYXN0Y2dpX2JlZ2luX3JlcXVlc3RfdDsKKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2Zhc3RjZ2lfY3JlYXRlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmFzdGNnaV9yZWluaXRfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9mYXN0Y2dpX3Byb2Nlc3NfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2Zhc3RjZ2lfc2VuZF9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmFzdGNnaV9pbnB1dF9maWx0ZXIobmd4X2V2ZW50X3BpcGVfdCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2J1Zl90ICpidWYpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9mYXN0Y2dpX3Byb2Nlc3NfcmVjb3JkKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9mYXN0Y2dpX2N0eF90ICpmKTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX2Zhc3RjZ2lfYWJvcnRfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfZmFzdGNnaV9maW5hbGl6ZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaW50X3QgcmMpOworCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfZmFzdGNnaV9wYXNzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9odHRwX2Zhc3RjZ2lfbG93YXRfY2hlY2sobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkICpuZ3hfaHR0cF9mYXN0Y2dpX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfZmFzdGNnaV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpOworCisKK3N0YXRpYyBuZ3hfc3RyX3Qgbmd4X2h0dHBfZmFzdGNnaV9tZXRob2RzW10gPSB7CisgICAgbmd4X3N0cmluZygiR0VUIiksCisgICAgbmd4X3N0cmluZygiSEVBRCIpLAorICAgIG5neF9zdHJpbmcoIlBPU1QiKQorfTsKKworCitzdGF0aWMgbmd4X2h0dHBfaGVhZGVyX3Qgbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJTdGF0dXMiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luX3QsIHN0YXR1cykgfSwKKworICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1UeXBlIiksCisgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyc19pbl90LCBjb250ZW50X3R5cGUpIH0sCisKKyAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIiksCisgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5fdCwgY29udGVudF9sZW5ndGgpIH0sCisKKyAgICB7IG5neF9zdHJpbmcoIlgtUG93ZXJlZC1CeSIpLAorICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5fdCwgeF9wb3dlcmVkX2J5KSB9LAorCisjaWYgKE5HWF9IVFRQX0daSVApCisgICAgeyBuZ3hfc3RyaW5nKCJDb250ZW50LUVuY29kaW5nIiksCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luX3QsIGNvbnRlbnRfZW5jb2RpbmcpIH0sCisjZW5kaWYKKworICAgIHsgbmd4X251bGxfc3RyaW5nLCAwIH0KK307CisKKworc3RhdGljIG5neF9jb25mX3Bvc3RfdCAgbmd4X2h0dHBfZmFzdGNnaV9sb3dhdF9wb3N0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmd4X2h0dHBfZmFzdGNnaV9sb3dhdF9jaGVjayB9IDsKKworc3RhdGljIG5neF9jb25mX2JpdG1hc2tfdCAgbmd4X2h0dHBfZmFzdGNnaV9uZXh0X3Vwc3RyZWFtX21hc2tzW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJlcnJvciIpLCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9FUlJPUiB9LAorICAgIHsgbmd4X3N0cmluZygidGltZW91dCIpLCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9USU1FT1VUIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJpbnZhbGlkX2hlYWRlciIpLCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9JTlZBTElEX0hFQURFUiB9LAorICAgIHsgbmd4X3N0cmluZygiaHR0cF81MDAiKSwgTkdYX0hUVFBfVVBTVFJFQU1fRlRfSFRUUF81MDAgfSwKKyAgICB7IG5neF9zdHJpbmcoImh0dHBfNDA0IiksIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0hUVFBfNDA0IH0sCisgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAgfQorfTsKKworCitzdGF0aWMgbmd4X2NvbmZfYml0bWFza190ICBuZ3hfaHR0cF9mYXN0Y2dpX3BhcmFtc19tYXNrc1tdID0geworICAgIHsgbmd4X3N0cmluZygicmVtb3RlX2FkZHIiKSwgTkdYX0hUVFBfRkFTVENHSV9SRU1PVEVfQUREUiB9LAorICAgIHsgbmd4X3N0cmluZygic2VydmVyX3BvcnQiKSwgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfUE9SVCB9LAorICAgIHsgbmd4X3N0cmluZygic2VydmVyX2FkZHIiKSwgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfQUREUiB9LAorICAgIHsgbmd4X3N0cmluZygic2VydmVyX25hbWUiKSwgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfTkFNRSB9LAorICAgIHsgbmd4X3N0cmluZygic2NyaXB0X25hbWUiKSwgTkdYX0hUVFBfRkFTVENHSV9TQ1JJUFRfTkFNRSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXJfcHJvdG9jb2wiKSwgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfUFJPVE9DT0wgfSwKKyAgICB7IG5neF9zdHJpbmcoInNlcnZlcl9zb2Z0d2FyZSIpLCBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9TT0ZUV0FSRSB9LAorICAgIHsgbmd4X3N0cmluZygiZ2F0ZXdheV9pbnRlcmZhY2UiKSwgTkdYX0hUVFBfRkFTVENHSV9HQVRFV0FZX0lOVEVSRkFDRSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJyZWRpcmVjdF9zdGF0dXMiKSwgTkdYX0hUVFBfRkFTVENHSV9SRURJUkVDVF9TVEFUVVMgfSwKKyAgICB7IG5neF9zdHJpbmcoInJlcXVlc3RfdXJpIiksIE5HWF9IVFRQX0ZBU1RDR0lfUkVRVUVTVF9VUkkgfSwKKworICAgIHsgbmd4X251bGxfc3RyaW5nLCAwIH0KK307CisKKworc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX2Zhc3RjZ2lfY29tbWFuZHNbXSA9IHsKKworICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9wYXNzIiksCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9odHRwX2Zhc3RjZ2lfcGFzcywKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIDAsCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfcm9vdCIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X3N0cl9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCByb290KSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9pbmRleCIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X3N0cl9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCBpbmRleCksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfY29ubmVjdF90aW1lb3V0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfbXNlY19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5jb25uZWN0X3RpbWVvdXQpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX3NlbmRfdGltZW91dCIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X21zZWNfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgdXBzdHJlYW0uc2VuZF90aW1lb3V0KSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9zZW5kX2xvd2F0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5zZW5kX2xvd2F0KSwKKyAgICAgICZuZ3hfaHR0cF9mYXN0Y2dpX2xvd2F0X3Bvc3QgfSwKKworICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9oZWFkZXJfYnVmZmVyX3NpemUiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9zaXplX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QsIHVwc3RyZWFtLmhlYWRlcl9idWZmZXJfc2l6ZSksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfeF9wb3dlcmVkX2J5IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QsIHVwc3RyZWFtLnhfcG93ZXJlZF9ieSksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfcmVhZF90aW1lb3V0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfbXNlY19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5yZWFkX3RpbWVvdXQpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX2J1ZmZlcnMiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMiwKKyAgICAgIG5neF9jb25mX3NldF9idWZzX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QsIHVwc3RyZWFtLmJ1ZnMpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX2J1c3lfYnVmZmVyc19zaXplIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5idXN5X2J1ZmZlcnNfc2l6ZSksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfdGVtcF9wYXRoIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEyMzQsCisgICAgICBuZ3hfY29uZl9zZXRfcGF0aF9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS50ZW1wX3BhdGgpLAorICAgICAgKHZvaWQgKikgbmd4X2dhcmJhZ2VfY29sbGVjdG9yX3RlbXBfaGFuZGxlciB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX21heF90ZW1wX2ZpbGVfc2l6ZSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgdXBzdHJlYW0ubWF4X3RlbXBfZmlsZV9zaXplKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV90ZW1wX2ZpbGVfd3JpdGVfc2l6ZSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgdXBzdHJlYW0udGVtcF9maWxlX3dyaXRlX3NpemUpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX25leHRfdXBzdHJlYW0iKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9BTlksCisgICAgICBuZ3hfY29uZl9zZXRfYml0bWFza19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5uZXh0X3Vwc3RyZWFtKSwKKyAgICAgICZuZ3hfaHR0cF9mYXN0Y2dpX25leHRfdXBzdHJlYW1fbWFza3MgfSwKKworICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9wYXJhbXMiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9BTlksCisgICAgICBuZ3hfY29uZl9zZXRfYml0bWFza19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCBwYXJhbXMpLAorICAgICAgJm5neF9odHRwX2Zhc3RjZ2lfcGFyYW1zX21hc2tzIH0sCisKKyAgICAgIG5neF9udWxsX2NvbW1hbmQKK307CisKKworbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlX2N0eCA9IHsKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCisKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLworCisgICAgbmd4X2h0dHBfZmFzdGNnaV9jcmVhdGVfbG9jX2NvbmYsICAgICAgLyogY3JlYXRlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX21lcmdlX2xvY19jb25mICAgICAgICAvKiBtZXJnZSBsb2NhdGlvbiBjb25maWd1cmF0aW9uICovCit9OworCisKK25neF9tb2R1bGVfdCAgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUgPSB7CisgICAgTkdYX01PRFVMRSwKKyAgICAmbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGVfY3R4LCAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLworICAgIG5neF9odHRwX2Zhc3RjZ2lfY29tbWFuZHMsICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCisgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1vZHVsZSAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgcHJvY2VzcyAqLworfTsKKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2Zhc3RjZ2lfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCit7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICAgICAgICAqdTsKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QgICpmbGNmOworCisgICAgZmxjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUpOworCisgICAgaWYgKCEodSA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF91cHN0cmVhbV90KSkpKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgfQorCisgICAgdS0+cGVlci5sb2cgPSByLT5jb25uZWN0aW9uLT5sb2c7CisgICAgdS0+cGVlci5sb2dfZXJyb3IgPSBOR1hfRVJST1JfRVJSOworICAgIHUtPnBlZXIucGVlcnMgPSBmbGNmLT5wZWVyczsKKyAgICB1LT5wZWVyLnRyaWVzID0gZmxjZi0+cGVlcnMtPm51bWJlcjsKKyNpZiAoTkdYX1RIUkVBRFMpCisgICAgdS0+cGVlci5sb2NrID0gJnItPmNvbm5lY3Rpb24tPmxvY2s7CisjZW5kaWYKKworICAgIHUtPm91dHB1dC50YWcgPSAobmd4X2J1Zl90YWdfdCkgJm5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlOworCisgICAgdS0+Y29uZiA9ICZmbGNmLT51cHN0cmVhbTsKKworICAgIHUtPmxvY2F0aW9uID0gZmxjZi0+bG9jYXRpb247CisKKyAgICB1LT5jcmVhdGVfcmVxdWVzdCA9IG5neF9odHRwX2Zhc3RjZ2lfY3JlYXRlX3JlcXVlc3Q7CisgICAgdS0+cmVpbml0X3JlcXVlc3QgPSBuZ3hfaHR0cF9mYXN0Y2dpX3JlaW5pdF9yZXF1ZXN0OworICAgIHUtPnByb2Nlc3NfaGVhZGVyID0gbmd4X2h0dHBfZmFzdGNnaV9wcm9jZXNzX2hlYWRlcjsKKyAgICB1LT5zZW5kX2hlYWRlciA9IG5neF9odHRwX2Zhc3RjZ2lfc2VuZF9oZWFkZXI7CisgICAgdS0+YWJvcnRfcmVxdWVzdCA9IG5neF9odHRwX2Zhc3RjZ2lfYWJvcnRfcmVxdWVzdDsKKyAgICB1LT5maW5hbGl6ZV9yZXF1ZXN0ID0gbmd4X2h0dHBfZmFzdGNnaV9maW5hbGl6ZV9yZXF1ZXN0OworCisgICAgdS0+cGlwZS5pbnB1dF9maWx0ZXIgPSBuZ3hfaHR0cF9mYXN0Y2dpX2lucHV0X2ZpbHRlcjsKKyAgICB1LT5waXBlLmlucHV0X2N0eCA9IHI7CisKKyAgICB1LT5sb2dfY3R4ID0gci0+Y29ubmVjdGlvbi0+bG9nLT5kYXRhOworICAgIHUtPmxvZ19oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2Vycm9yOworCisgICAgdS0+c2NoZW1hLmxlbiA9IHNpemVvZigiZmFzdGNnaTovLyIpIC0gMTsKKyAgICB1LT5zY2hlbWEuZGF0YSA9ICh1X2NoYXIgKikgImZhc3RjZ2k6Ly8iOworICAgIHUtPnVyaS5sZW4gPSBzaXplb2YoIi8iKSAtIDE7CisgICAgdS0+dXJpLmRhdGEgPSAodV9jaGFyICopICIvIjsKKworICAgIHItPnVwc3RyZWFtID0gdTsKKworICAgIHJjID0gbmd4X2h0dHBfcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KHIsIG5neF9odHRwX3Vwc3RyZWFtX2luaXQpOworCisgICAgaWYgKHJjID49IE5HWF9IVFRQX1NQRUNJQUxfUkVTUE9OU0UpIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiBOR1hfRE9ORTsKK30KKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2Zhc3RjZ2lfY3JlYXRlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyKQoreworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gsICpwb3MsIGFkZHJfdGV4dFtJTkVUX0FERFJTVFJMRU5dOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgbGVuLCBpbmRleCwgcGFkZGluZywgYWRkcl9sZW47CisgICAgb2ZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3BvczsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICAgICAgKmI7CisgICAgc29ja2xlbl90ICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVuOworICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICAgICAgICAgICAqY2wsICpib2R5OworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbiwgbmV4dDsKKyAgICBuZ3hfbGlzdF9wYXJ0X3QgICAgICAgICAgICAgICAgICAgKnBhcnQ7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgICpoZWFkZXI7CisgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgICAgICAgICBzaW47CisgICAgbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAgICAgICAgICpoOworICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAgICAgICAqZmxjZjsKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX2JlZ2luX3JlcXVlc3RfdCAgKmJyOworCisgICAgZmxjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUpOworCisgICAgaWYgKChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9BRERSKSAmJiByLT5pbl9hZGRyID09IDApIHsKKworICAgICAgICBzbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisgICAgICAgIGlmIChnZXRzb2NrbmFtZShyLT5jb25uZWN0aW9uLT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgJnNsZW4pID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQ1JJVCwgci0+Y29ubmVjdGlvbi0+bG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc29ja2V0X2Vycm5vLCAiZ2V0c29ja25hbWUoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByLT5pbl9hZGRyID0gc2luLnNpbl9hZGRyLnNfYWRkcjsKKyAgICB9CisKKyAgICBhZGRyX2xlbiA9IG5neF9pbmV0X250b3Aoci0+Y29ubmVjdGlvbi0+bGlzdGVuaW5nLT5mYW1pbHksICZyLT5pbl9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyX3RleHQsIElORVRfQUREUlNUUkxFTik7CisgICAgaWYgKGFkZHJfbGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKworICAgIGlmIChyLT51cHN0cmVhbS0+bWV0aG9kKSB7CisgICAgICAgIGxlbiA9IDEgKyAxICsgc2l6ZW9mKCJSRVFVRVNUX01FVEhPRCIpIC0gMQorICAgICAgICAgICAgICAgICsgbmd4X2h0dHBfZmFzdGNnaV9tZXRob2RzW3ItPnVwc3RyZWFtLT5tZXRob2QgLSAxXS5sZW47CisgICAgCisgICAgfSBlbHNlIHsKKyAgICAgICAgbGVuID0gMSArICgoci0+bWV0aG9kX25hbWUubGVuIC0gMSA+IDEyNykgPyA0IDogMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoIlJFUVVFU1RfTUVUSE9EIikgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgci0+bWV0aG9kX25hbWUubGVuIC0gMTsKKyAgICB9CisKKworICAgIGluZGV4ID0gKHItPnVyaS5kYXRhW3ItPnVyaS5sZW4gLSAxXSA9PSAnLycpID8gZmxjZi0+aW5kZXgubGVuIDogMDsKKworICAgIGxlbiArPSAxICsgKChmbGNmLT5yb290LmxlbiArIHItPnVyaS5sZW4gKyBpbmRleCA+IDEyNykgPyA0IDogMSkKKyAgICAgICAgICAgICArIHNpemVvZigiUEFUSF9UUkFOU0xBVEVEIikgLSAxCisgICAgICAgICAgICAgKyBmbGNmLT5yb290LmxlbiArIHItPnVyaS5sZW4gKyBpbmRleDsKKworICAgIGlmIChyLT5hcmdzLmxlbikgeworICAgICAgICBsZW4gKz0gMSArICgoci0+YXJncy5sZW4gPiAxMjcpID8gNCA6IDEpICsgc2l6ZW9mKCJRVUVSWV9TVFJJTkciKSAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHItPmFyZ3MubGVuOworICAgIH0KKworICAgIGlmIChyLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX24gPiAwKSB7CisgICAgICAgIGxlbiArPSAxICsgKChyLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoLT52YWx1ZS5sZW4gPiAxMjcpID8gNCA6IDEpCisgICAgICAgICAgICAgICAgICsgc2l6ZW9mKCJDT05URU5UX0xFTkdUSCIpIC0gMQorICAgICAgICAgICAgICAgICArIHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGgtPnZhbHVlLmxlbjsKKyAgICB9CisKKworICAgIGlmIChyLT5oZWFkZXJzX2luLmNvbnRlbnRfdHlwZSkgeworICAgICAgICBsZW4gKz0gMSArICgoci0+aGVhZGVyc19pbi5jb250ZW50X3R5cGUtPnZhbHVlLmxlbiA+IDEyNykgPyA0IDogMSkKKyAgICAgICAgICAgICAgICAgKyBzaXplb2YoIkNPTlRFTlRfVFlQRSIpIC0gMQorICAgICAgICAgICAgICAgICArIHItPmhlYWRlcnNfaW4uY29udGVudF90eXBlLT52YWx1ZS5sZW47CisgICAgfQorCisKKyAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9SRURJUkVDVF9TVEFUVVMpIHsKKyAgICAgICAgbGVuICs9IDEgKyAxICsgc2l6ZW9mKCJSRURJUkVDVF9TVEFUVVMyMDAiKSAtIDE7CisgICAgfQorCisgICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVRVUVTVF9VUkkpIHsKKyAgICAgICAgbGVuICs9IDEgKyAoKHItPnVyaS5sZW4gPiAxMjcpID8gNCA6IDEpCisgICAgICAgICAgICAgICAgICsgc2l6ZW9mKCJSRVFVRVNUX1VSSSIpIC0gMSArIHItPnVyaS5sZW47CisgICAgfQorCisgICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0NSSVBUX05BTUUpIHsKKyAgICAgICAgbGVuICs9IDEgKyAoKHItPnVyaS5sZW4gKyBpbmRleCA+IDEyNykgPyA0IDogMSkKKyAgICAgICAgICAgICAgICAgKyBzaXplb2YoIlNDUklQVF9OQU1FIikgLSAxICsgci0+dXJpLmxlbiArIGluZGV4IDsKKyAgICB9CisKKyAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9SRU1PVEVfQUREUikgeworICAgICAgICBsZW4gKz0gMSArIDEgKyBzaXplb2YoIlJFTU9URV9BRERSIikgLSAxICsgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmxlbjsKKyAgICB9CisKKyAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfTkFNRSkgeworICAgICAgICBsZW4gKz0gMSArIDEgKyBzaXplb2YoIlNFUlZFUl9OQU1FIikgLSAxICsgci0+c2VydmVyX25hbWUubGVuOworICAgIH0KKworICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QT1JUKSB7CisgICAgICAgIGxlbiArPSAxICsgMSArIHNpemVvZigiU0VSVkVSX1BPUlQiKSAtIDEgKyByLT5wb3J0X3RleHQtPmxlbiAtIDE7CisgICAgfQorCisgICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX0FERFIpIHsKKyAgICAgICAgbGVuICs9IDEgKyAxICsgc2l6ZW9mKCJTRVJWRVJfQUREUiIpIC0gMSArIGFkZHJfbGVuOworICAgIH0KKworICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QUk9UT0NPTAorICAgICAgICAmJiByLT5odHRwX3Byb3RvY29sLmxlbikKKyAgICB7CisgICAgICAgIGxlbiArPSAxICsgKChyLT5odHRwX3Byb3RvY29sLmxlbiA+IDEyNykgPyA0IDogMSkKKyAgICAgICAgICAgICAgICAgKyBzaXplb2YoIlNFUlZFUl9QUk9UT0NPTCIpIC0gMSArIHItPmh0dHBfcHJvdG9jb2wubGVuOworICAgIH0KKworICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9TT0ZUV0FSRSkgeworICAgICAgICBsZW4gKz0gMSArIDEgKyBzaXplb2YoIlNFUlZFUl9TT0ZUV0FSRSIpIC0gMSArIHNpemVvZihOR0lOWF9WRVIpIC0gMTsKKyAgICB9CisKKyAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9HQVRFV0FZX0lOVEVSRkFDRSkgeworICAgICAgICBsZW4gKz0gMSArIDEgKyBzaXplb2YoIkdBVEVXQVlfSU5URVJGQUNFIikgLSAxICsgc2l6ZW9mKCJDR0kvMS4xIikgLSAxOworICAgIH0KKworCisgICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKKyAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOworCisgICAgZm9yIChpID0gMDsgLyogdm9pZCAqLzsgaSsrKSB7CisKKyAgICAgICAgaWYgKGkgPj0gcGFydC0+bmVsdHMpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFydCA9IHBhcnQtPm5leHQ7CisgICAgICAgICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBsZW4gKz0gKChoZWFkZXJbaV0ua2V5LmxlbiA+IDEyNykgPyA0IDogMSkKKyAgICAgICAgICAgICAgICsgKChoZWFkZXJbaV0udmFsdWUubGVuID4gMTI3KSA/IDQgOiAxKQorICAgICAgICAgICAgICAgKyA1ICsgaGVhZGVyW2ldLmtleS5sZW4gKyBoZWFkZXJbaV0udmFsdWUubGVuOworICAgIH0KKworCisgICAgaWYgKGxlbiA+IDY1NTM1KSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJmYXN0Y2dpOiB0aGUgcmVxdWVzdCByZWNvcmQgaXMgdG9vIGJpZyIpOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworCisgICAgcGFkZGluZyA9IDggLSBsZW4gJSA4OworICAgIHBhZGRpbmcgPSAocGFkZGluZyA9PSA4KSA/IDAgOiBwYWRkaW5nOworCisKKyAgICBzaXplID0gc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QpCisgICAgICAgICAgICsgc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfYmVnaW5fcmVxdWVzdF90KQorCisgICAgICAgICAgICsgc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QpICAvKiBOR1hfSFRUUF9GQVNUQ0dJX1BBUkFNUyAqLworICAgICAgICAgICArIGxlbiArIHBhZGRpbmcKKyAgICAgICAgICAgKyBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCkgIC8qIE5HWF9IVFRQX0ZBU1RDR0lfUEFSQU1TICovCisKKyAgICAgICAgICAgKyBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCk7IC8qIE5HWF9IVFRQX0ZBU1RDR0lfU1RESU4gKi8KKworCisgICAgaWYgKCEoYiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgc2l6ZSkpKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBjbC0+YnVmID0gYjsKKworICAgIGggPSAobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAqKSBiLT5wb3M7CisKKyAgICBoLT52ZXJzaW9uID0gMTsKKyAgICBoLT50eXBlID0gTkdYX0hUVFBfRkFTVENHSV9CRUdJTl9SRVFVRVNUOworICAgIGgtPnJlcXVlc3RfaWRfaGkgPSAwOworICAgIGgtPnJlcXVlc3RfaWRfbG8gPSAxOworICAgIGgtPmNvbnRlbnRfbGVuZ3RoX2hpID0gMDsKKyAgICBoLT5jb250ZW50X2xlbmd0aF9sbyA9IHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2JlZ2luX3JlcXVlc3RfdCk7CisgICAgaC0+cGFkZGluZ19sZW5ndGggPSAwOworICAgIGgtPnJlc2VydmVkID0gMDsKKworICAgIGJyID0gKG5neF9odHRwX2Zhc3RjZ2lfYmVnaW5fcmVxdWVzdF90ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGItPnBvcyArIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90KSk7CisgICAgYnItPnJvbGVfaGkgPSAwOworICAgIGJyLT5yb2xlX2xvID0gTkdYX0hUVFBfRkFTVENHSV9SRVNQT05ERVI7CisgICAgYnItPmZsYWdzID0gMDsgLyogTkdYX0hUVFBfRkFTVENHSV9LRUVQX0NPTk4gKi8KKyAgICBici0+cmVzZXJ2ZWRbMF0gPSAwOworICAgIGJyLT5yZXNlcnZlZFsxXSA9IDA7CisgICAgYnItPnJlc2VydmVkWzJdID0gMDsKKyAgICBici0+cmVzZXJ2ZWRbM10gPSAwOworICAgIGJyLT5yZXNlcnZlZFs0XSA9IDA7CisKKyAgICBoID0gKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QgKikKKyAgICAgICAgICAgICAoYi0+cG9zICsgc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QpCisgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2JlZ2luX3JlcXVlc3RfdCkpOworCisgICAgaC0+dmVyc2lvbiA9IDE7CisgICAgaC0+dHlwZSA9IE5HWF9IVFRQX0ZBU1RDR0lfUEFSQU1TOworICAgIGgtPnJlcXVlc3RfaWRfaGkgPSAwOworICAgIGgtPnJlcXVlc3RfaWRfbG8gPSAxOworICAgIGgtPmNvbnRlbnRfbGVuZ3RoX2hpID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKKyAgICBoLT5jb250ZW50X2xlbmd0aF9sbyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKKyAgICBoLT5wYWRkaW5nX2xlbmd0aCA9ICh1X2NoYXIpIHBhZGRpbmc7CisgICAgaC0+cmVzZXJ2ZWQgPSAwOworCisgICAgYi0+bGFzdCA9IGItPnBvcyArIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90KQorICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9iZWdpbl9yZXF1ZXN0X3QpCisgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90KTsKKworCisgICAgKmItPmxhc3QrKyA9IHNpemVvZigiUEFUSF9UUkFOU0xBVEVEIikgLSAxOworCisgICAgbGVuID0gZmxjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgaW5kZXg7CisgICAgaWYgKGxlbiA+IDEyNykgeworICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKCgobGVuID4+IDI0KSAmIDB4N2YpIHwgMHg4MCk7CisgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7CisgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAobGVuICYgMHhmZik7CisKKyAgICB9IGVsc2UgeworICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgbGVuOworICAgIH0KKworICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJQQVRIX1RSQU5TTEFURUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiUEFUSF9UUkFOU0xBVEVEIikgLSAxKTsKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBmbGNmLT5yb290LmRhdGEsIGZsY2YtPnJvb3QubGVuKTsKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT51cmkuZGF0YSwgci0+dXJpLmxlbik7CisKKyAgICBpZiAoaW5kZXgpIHsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgZmxjZi0+aW5kZXguZGF0YSwgaW5kZXgpOworICAgIH0KKworCisgICAgKmItPmxhc3QrKyA9IHNpemVvZigiUkVRVUVTVF9NRVRIT0QiKSAtIDE7CisKKyAgICBpZiAoci0+dXBzdHJlYW0tPm1ldGhvZCkgeworICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9mYXN0Y2dpX21ldGhvZHNbci0+dXBzdHJlYW0tPm1ldGhvZCAtIDFdLmxlbjsKKworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiUkVRVUVTVF9NRVRIT0QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIlJFUVVFU1RfTUVUSE9EIikgLSAxKTsKKworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZmFzdGNnaV9tZXRob2RzW3ItPnVwc3RyZWFtLT5tZXRob2QgLSAxXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZmFzdGNnaV9tZXRob2RzW3ItPnVwc3RyZWFtLT5tZXRob2QgLSAxXS5sZW4pOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgbGVuID0gci0+bWV0aG9kX25hbWUubGVuIC0gMTsKKyAgICAgICAgaWYgKGxlbiA+IDEyNykgeworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgoKGxlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgbGVuOworICAgICAgICB9CisKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlJFUVVFU1RfTUVUSE9EIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJSRVFVRVNUX01FVEhPRCIpIC0gMSk7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPm1ldGhvZF9uYW1lLmRhdGEsIGxlbik7CisgICAgfQorCisKKyAgICBpZiAoci0+YXJncy5sZW4pIHsKKyAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiUVVFUllfU1RSSU5HIikgLSAxOworCisgICAgICAgIGxlbiA9IHItPmFyZ3MubGVuOworICAgICAgICBpZiAobGVuID4gMTI3KSB7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKCgobGVuID4+IDI0KSAmIDB4N2YpIHwgMHg4MCk7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAobGVuICYgMHhmZik7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSBsZW47CisgICAgICAgIH0KKworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiUVVFUllfU1RSSU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJRVUVSWV9TVFJJTkciKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5hcmdzLmRhdGEsIGxlbik7CisgICAgfQorCisKKyAgICBpZiAoci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aF9uID4gMCkgeworICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJDT05URU5UX0xFTkdUSCIpIC0gMTsKKworICAgICAgICBsZW4gPSByLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoLT52YWx1ZS5sZW47CisgICAgICAgIGlmIChsZW4gPiAxMjcpIHsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKChsZW4gPj4gMjQpICYgMHg3ZikgfCAweDgwKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJDT05URU5UX0xFTkdUSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiQ09OVEVOVF9MRU5HVEgiKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoLT52YWx1ZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgIH0KKworCisgICAgaWYgKHItPmhlYWRlcnNfaW4uY29udGVudF90eXBlKSB7CisgICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIkNPTlRFTlRfVFlQRSIpIC0gMTsKKworICAgICAgICBsZW4gPSByLT5oZWFkZXJzX2luLmNvbnRlbnRfdHlwZS0+dmFsdWUubGVuOworICAgICAgICBpZiAobGVuID4gMTI3KSB7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKCgobGVuID4+IDI0KSAmIDB4N2YpIHwgMHg4MCk7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAobGVuICYgMHhmZik7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSBsZW47CisgICAgICAgIH0KKworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiQ09OVEVOVF9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJDT05URU5UX1RZUEUiKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5oZWFkZXJzX2luLmNvbnRlbnRfdHlwZS0+dmFsdWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICB9CisKKworICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1JFRElSRUNUX1NUQVRVUykgeworICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJSRURJUkVDVF9TVEFUVVMiKSAtIDE7CisgICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIjIwMCIpIC0gMTsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlJFRElSRUNUX1NUQVRVUzIwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiUkVESVJFQ1RfU1RBVFVTMjAwIikgLSAxKTsKKyAgICB9CisKKworICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1JFUVVFU1RfVVJJKSB7CisgICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIlJFUVVFU1RfVVJJIikgLSAxOworCisgICAgICAgIGxlbiA9IHItPnVyaS5sZW47CisgICAgICAgIGlmIChsZW4gPiAxMjcpIHsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKChsZW4gPj4gMjQpICYgMHg3ZikgfCAweDgwKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJSRVFVRVNUX1VSSSIsIHNpemVvZigiUkVRVUVTVF9VUkkiKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT51cmkuZGF0YSwgbGVuKTsKKyAgICB9CisKKworICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NDUklQVF9OQU1FKSB7CisgICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIlNDUklQVF9OQU1FIikgLSAxOworCisgICAgICAgIGxlbiA9IHItPnVyaS5sZW4gKyBpbmRleDsKKyAgICAgICAgaWYgKGxlbiA+IDEyNykgeworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgoKGxlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgbGVuOworICAgICAgICB9CisKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlNDUklQVF9OQU1FIiwgc2l6ZW9mKCJTQ1JJUFRfTkFNRSIpIC0gMSk7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnVyaS5kYXRhLCByLT51cmkubGVuKTsKKworICAgICAgICBpZiAoaW5kZXgpIHsKKyAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGZsY2YtPmluZGV4LmRhdGEsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVNT1RFX0FERFIpIHsKKyAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiUkVNT1RFX0FERFIiKSAtIDE7CisgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0Lmxlbik7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJSRU1PVEVfQUREUiIsIHNpemVvZigiUkVNT1RFX0FERFIiKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0Lmxlbik7CisgICAgfQorCisKKyAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfTkFNRSkgeworICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJTRVJWRVJfTkFNRSIpIC0gMTsKKyAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIHItPnNlcnZlcl9uYW1lLmxlbjsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlNFUlZFUl9OQU1FIiwgc2l6ZW9mKCJTRVJWRVJfTkFNRSIpIC0gMSk7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnNlcnZlcl9uYW1lLmRhdGEsIHItPnNlcnZlcl9uYW1lLmxlbik7CisgICAgfQorCisKKyAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfUE9SVCkgeworICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJTRVJWRVJfUE9SVCIpIC0gMTsKKyAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChyLT5wb3J0X3RleHQtPmxlbiAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiU0VSVkVSX1BPUlQiLCBzaXplb2YoIlNFUlZFUl9QT1JUIikgLSAxKTsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+cG9ydF90ZXh0LT5kYXRhICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cG9ydF90ZXh0LT5sZW4gLSAxKTsKKyAgICB9CisKKworICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9BRERSKSB7CisgICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIlNFUlZFUl9BRERSIikgLSAxOworICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgYWRkcl9sZW47CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJTRVJWRVJfQUREUiIsIHNpemVvZigiU0VSVkVSX0FERFIiKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBhZGRyX3RleHQsIGFkZHJfbGVuKTsKKyAgICB9CisKKworICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QUk9UT0NPTAorICAgICAgICAmJiByLT5odHRwX3Byb3RvY29sLmxlbikKKyAgICB7CisgICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIlNFUlZFUl9QUk9UT0NPTCIpIC0gMTsKKworICAgICAgICBsZW4gPSByLT5odHRwX3Byb3RvY29sLmxlbjsKKyAgICAgICAgaWYgKGxlbiA+IDEyNykgeworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgoKGxlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgbGVuOworICAgICAgICB9CisKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlNFUlZFUl9QUk9UT0NPTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiU0VSVkVSX1BST1RPQ09MIikgLSAxKTsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aHR0cF9wcm90b2NvbC5kYXRhLCBsZW4pOworICAgIH0KKworCisgICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX1NPRlRXQVJFKSB7CisgICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIlNFUlZFUl9TT0ZUV0FSRSIpIC0gMTsKKyAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChzaXplb2YoTkdJTlhfVkVSKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiU0VSVkVSX1NPRlRXQVJFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJTRVJWRVJfU09GVFdBUkUiKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBOR0lOWF9WRVIsIHNpemVvZihOR0lOWF9WRVIpIC0gMSk7CisgICAgfQorCisKKyAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9HQVRFV0FZX0lOVEVSRkFDRSkgeworICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJHQVRFV0FZX0lOVEVSRkFDRSIpIC0gMTsKKyAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChzaXplb2YoIkNHSS8xLjEiKSAtIDEpOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiR0FURVdBWV9JTlRFUkZBQ0UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkdBVEVXQVlfSU5URVJGQUNFIikgLSAxKTsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIkNHSS8xLjEiLCBzaXplb2YoIkNHSS8xLjEiKSAtIDEpOworICAgIH0KKworCisgICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKKyAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOworCisgICAgZm9yIChpID0gMDsgLyogdm9pZCAqLzsgaSsrKSB7CisKKyAgICAgICAgaWYgKGkgPj0gcGFydC0+bmVsdHMpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFydCA9IHBhcnQtPm5leHQ7CisgICAgICAgICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSA1ICsgaGVhZGVyW2ldLmtleS5sZW47CisgICAgICAgIGlmIChsZW4gPiAxMjcpIHsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKChsZW4gPj4gMjQpICYgMHg3ZikgfCAweDgwKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IGhlYWRlcltpXS52YWx1ZS5sZW47CisgICAgICAgIGlmIChsZW4gPiAxMjcpIHsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKChsZW4gPj4gMjQpICYgMHg3ZikgfCAweDgwKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJIVFRQXyIsIHNpemVvZigiSFRUUF8iKSAtIDEpOworCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBoZWFkZXJbaV0ua2V5LmxlbjsgbisrKSB7CisgICAgICAgICAgICBjaCA9IGhlYWRlcltpXS5rZXkuZGF0YVtuXTsKKworICAgICAgICAgICAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHsKKyAgICAgICAgICAgICAgICBjaCAmPSB+MHgyMDsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBjaCA9ICdfJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmItPmxhc3QrKyA9IGNoOworICAgICAgICB9CisKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgaGVhZGVyW2ldLnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltpXS52YWx1ZS5sZW4pOworICAgIH0KKworCisgICAgaWYgKHBhZGRpbmcpIHsKKyAgICAgICAgbmd4X21lbXplcm8oYi0+bGFzdCwgcGFkZGluZyk7CisgICAgICAgIGItPmxhc3QgKz0gcGFkZGluZzsKKyAgICB9CisKKworICAgIGggPSAobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAqKSBiLT5sYXN0OworICAgIGItPmxhc3QgKz0gc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QpOworCisgICAgaC0+dmVyc2lvbiA9IDE7CisgICAgaC0+dHlwZSA9IE5HWF9IVFRQX0ZBU1RDR0lfUEFSQU1TOworICAgIGgtPnJlcXVlc3RfaWRfaGkgPSAwOworICAgIGgtPnJlcXVlc3RfaWRfbG8gPSAxOworICAgIGgtPmNvbnRlbnRfbGVuZ3RoX2hpID0gMDsKKyAgICBoLT5jb250ZW50X2xlbmd0aF9sbyA9IDA7CisgICAgaC0+cGFkZGluZ19sZW5ndGggPSAwOworICAgIGgtPnJlc2VydmVkID0gMDsKKworICAgIGggPSAobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAqKSBiLT5sYXN0OworICAgIGItPmxhc3QgKz0gc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QpOworCisgICAgYm9keSA9IHItPnJlcXVlc3RfYm9keS0+YnVmczsKKyAgICByLT5yZXF1ZXN0X2JvZHktPmJ1ZnMgPSBjbDsKKworI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKKyAgICBmaWxlX3BvcyA9IDA7CisgICAgcG9zID0gTlVMTDsKKyNlbmRpZgorCisgICAgd2hpbGUgKGJvZHkpIHsKKworICAgICAgICBpZiAoYm9keS0+YnVmLT5pbl9maWxlKSB7CisgICAgICAgICAgICBmaWxlX3BvcyA9IGJvZHktPmJ1Zi0+ZmlsZV9wb3M7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvcyA9IGJvZHktPmJ1Zi0+cG9zOworICAgICAgICB9CisKKyAgICAgICAgbmV4dCA9IDA7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKCEoYiA9IG5neF9hbGxvY19idWYoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmd4X21lbWNweShiLCBib2R5LT5idWYsIHNpemVvZihuZ3hfYnVmX3QpKTsKKworICAgICAgICAgICAgaWYgKGJvZHktPmJ1Zi0+aW5fZmlsZSkgeworICAgICAgICAgICAgICAgIGItPmZpbGVfcG9zID0gZmlsZV9wb3M7CisgICAgICAgICAgICAgICAgZmlsZV9wb3MgKz0gMzIgKiAxMDI0OworCisgICAgICAgICAgICAgICAgaWYgKGZpbGVfcG9zID4gYm9keS0+YnVmLT5maWxlX2xhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9wb3MgPSBib2R5LT5idWYtPmZpbGVfbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYi0+ZmlsZV9sYXN0ID0gZmlsZV9wb3M7CisgICAgICAgICAgICAgICAgbGVuID0gKG5neF91aW50X3QpIChmaWxlX3BvcyAtIGItPmZpbGVfcG9zKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiLT5wb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgcG9zICs9IDMyICogMTAyNDsKKworICAgICAgICAgICAgICAgIGlmIChwb3MgPiBib2R5LT5idWYtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gYm9keS0+YnVmLT5sYXN0OworICAgICAgICAgICAgICAgICAgICBuZXh0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiLT5sYXN0ID0gcG9zOworICAgICAgICAgICAgICAgIGxlbiA9IChuZ3hfdWludF90KSAocG9zIC0gYi0+cG9zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFkZGluZyA9IDggLSBsZW4gJSA4OworICAgICAgICAgICAgcGFkZGluZyA9IChwYWRkaW5nID09IDgpID8gMCA6IHBhZGRpbmc7CisKKyAgICAgICAgICAgIGgtPnZlcnNpb24gPSAxOworICAgICAgICAgICAgaC0+dHlwZSA9IE5HWF9IVFRQX0ZBU1RDR0lfU1RESU47CisgICAgICAgICAgICBoLT5yZXF1ZXN0X2lkX2hpID0gMDsKKyAgICAgICAgICAgIGgtPnJlcXVlc3RfaWRfbG8gPSAxOworICAgICAgICAgICAgaC0+Y29udGVudF9sZW5ndGhfaGkgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgaC0+Y29udGVudF9sZW5ndGhfbG8gPSAodV9jaGFyKSAobGVuICYgMHhmZik7CisgICAgICAgICAgICBoLT5wYWRkaW5nX2xlbmd0aCA9ICh1X2NoYXIpIHBhZGRpbmc7CisgICAgICAgICAgICBoLT5yZXNlcnZlZCA9IDA7CisKKyAgICAgICAgICAgIGlmICghKGNsLT5uZXh0ID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsKKyAgICAgICAgICAgIGNsLT5idWYgPSBiOworCisgICAgICAgICAgICBiID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFkZGluZyk7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbWVtemVybyhiLT5sYXN0LCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICBiLT5sYXN0ICs9IHBhZGRpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGggPSAobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAqKSBiLT5sYXN0OworICAgICAgICAgICAgYi0+bGFzdCArPSBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCk7CisKKyAgICAgICAgICAgIGlmICghKGNsLT5uZXh0ID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsKKyAgICAgICAgICAgIGNsLT5idWYgPSBiOworCisgICAgICAgIH0gd2hpbGUgKCFuZXh0KTsKKworICAgICAgICBib2R5ID0gYm9keS0+bmV4dDsKKyAgICB9CisKKyAgICBoLT52ZXJzaW9uID0gMTsKKyAgICBoLT50eXBlID0gTkdYX0hUVFBfRkFTVENHSV9TVERJTjsKKyAgICBoLT5yZXF1ZXN0X2lkX2hpID0gMDsKKyAgICBoLT5yZXF1ZXN0X2lkX2xvID0gMTsKKyAgICBoLT5jb250ZW50X2xlbmd0aF9oaSA9IDA7CisgICAgaC0+Y29udGVudF9sZW5ndGhfbG8gPSAwOworICAgIGgtPnBhZGRpbmdfbGVuZ3RoID0gMDsKKyAgICBoLT5yZXNlcnZlZCA9IDA7CisKKyAgICBjbC0+bmV4dCA9IE5VTEw7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmFzdGNnaV9yZWluaXRfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCit7CisgICAgbmd4X2h0dHBfZmFzdGNnaV9jdHhfdCAgKmY7CisKKyAgICBmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUpOworCisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKworICAgIGYtPnN0YXRlID0gbmd4X2h0dHBfZmFzdGNnaV9zdF92ZXJzaW9uOworCisgICAgbmd4X21lbXplcm8oJmYtPnVwc3RyZWFtLT5oZWFkZXJzX2luLAorICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5fdCkpOworCisgICAgaWYgKGYtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydC5lbHRzKSB7CisgICAgICAgIGlmIChuZ3hfbGlzdF9pbml0KCZmLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzLCByLT5wb29sLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3RhYmxlX2VsdF90KSkgPT0gTkdYX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2Zhc3RjZ2lfcHJvY2Vzc19oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQoreworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICpzdGFydCwgKmxhc3Q7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgKnN0YXR1c19saW5lOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICByYywgc3RhdHVzOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICBpOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICpoOworICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICAgICp1OworICAgIG5neF9odHRwX2Zhc3RjZ2lfY3R4X3QgICpmOworCisgICAgZiA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHIsIG5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlKTsKKworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCEoZiA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2N0eF90KSkpKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2h0dHBfc2V0X2N0eChyLCBmLCBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZSk7CisKKyAgICAgICAgZi0+dXBzdHJlYW0gPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV91cHN0cmVhbV90KSk7CisgICAgICAgIGlmIChmLT51cHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5neF9saXN0X2luaXQoJmYtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMsIHItPnBvb2wsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKSA9PSBOR1hfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1ID0gci0+dXBzdHJlYW07CisKKyAgICBmb3IgKCA7OyApIHsKKworICAgICAgICBpZiAoZi0+c3RhdGUgPCBuZ3hfaHR0cF9mYXN0Y2dpX3N0X2RhdGEpIHsKKworICAgICAgICAgICAgZi0+cG9zID0gdS0+aGVhZGVyX2luLnBvczsKKyAgICAgICAgICAgIGYtPmxhc3QgPSB1LT5oZWFkZXJfaW4ubGFzdDsKKworICAgICAgICAgICAgcmMgPSBuZ3hfaHR0cF9mYXN0Y2dpX3Byb2Nlc3NfcmVjb3JkKHIsIGYpOworCisgICAgICAgICAgICB1LT5oZWFkZXJfaW4ucG9zID0gZi0+cG9zOworICAgICAgICAgICAgdS0+aGVhZGVyX2luLmxhc3QgPSBmLT5sYXN0OworCisgICAgICAgICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJjID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9VUFNUUkVBTV9JTlZBTElEX0hFQURFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGYtPnR5cGUgIT0gTkdYX0hUVFBfRkFTVENHSV9TVERPVVQpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gc2VudCB1bmV4cGVjdGVkIEZhc3RDR0kgcmVjb3JkOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT50eXBlKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9VUFNUUkVBTV9JTlZBTElEX0hFQURFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGYtPmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseSBGYXN0Q0dJIHN0ZG91dCIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1VQU1RSRUFNX0lOVkFMSURfSEVBREVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGYtPnN0YXRlID09IG5neF9odHRwX2Zhc3RjZ2lfc3RfcGFkZGluZykgeworCisgICAgICAgICAgICBpZiAodS0+aGVhZGVyX2luLnBvcyArIGYtPnBhZGRpbmcgPCB1LT5oZWFkZXJfaW4ubGFzdCkgeworICAgICAgICAgICAgICAgIGYtPnN0YXRlID0gbmd4X2h0dHBfZmFzdGNnaV9zdF92ZXJzaW9uOworICAgICAgICAgICAgICAgIHUtPmhlYWRlcl9pbi5wb3MgKz0gZi0+cGFkZGluZzsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodS0+aGVhZGVyX2luLnBvcyArIGYtPnBhZGRpbmcgPT0gdS0+aGVhZGVyX2luLmxhc3QpIHsKKyAgICAgICAgICAgICAgICBmLT5zdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfdmVyc2lvbjsKKyAgICAgICAgICAgICAgICB1LT5oZWFkZXJfaW4ucG9zID0gdS0+aGVhZGVyX2luLmxhc3Q7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0FHQUlOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmLT5wYWRkaW5nIC09IHUtPmhlYWRlcl9pbi5sYXN0IC0gdS0+aGVhZGVyX2luLnBvczsKKyAgICAgICAgICAgIHUtPmhlYWRlcl9pbi5wb3MgPSB1LT5oZWFkZXJfaW4ubGFzdDsKKworICAgICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGYtPnN0YXRlID09IG5neF9odHRwX2Zhc3RjZ2lfc3RfZGF0YSAqLworCisgICAgICAgIHN0YXJ0ID0gdS0+aGVhZGVyX2luLnBvczsKKworICAgICAgICBpZiAodS0+aGVhZGVyX2luLnBvcyArIGYtPmxlbmd0aCA8IHUtPmhlYWRlcl9pbi5sYXN0KSB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBzZXQgdS0+aGVhZGVyX2luLmxhc3QgdG8gdGhlIGVuZCBvZiB0aGUgRmFzdENHSSByZWNvcmQgZGF0YQorICAgICAgICAgICAgICogZm9yIG5neF9odHRwX3BhcnNlX2hlYWRlcl9saW5lKCkKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBsYXN0ID0gdS0+aGVhZGVyX2luLmxhc3Q7CisgICAgICAgICAgICB1LT5oZWFkZXJfaW4ubGFzdCA9IHUtPmhlYWRlcl9pbi5wb3MgKyBmLT5sZW5ndGg7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxhc3QgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgZm9yICggOzsgKSB7CisKKyAgICAgICAgICAgIHJjID0gbmd4X2h0dHBfcGFyc2VfaGVhZGVyX2xpbmUociwgJnUtPmhlYWRlcl9pbik7CisKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgZmFzdGNnaSBwYXJzZXI6ICVkIiwgcmMpOworCisgICAgICAgICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyYyA9PSBOR1hfT0spIHsKKworICAgICAgICAgICAgICAgIC8qIGEgaGVhZGVyIGxpbmUgaGFzIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSAqLworCisgICAgICAgICAgICAgICAgaWYgKCEoaCA9IG5neF9saXN0X3B1c2goJmYtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGgtPmtleS5sZW4gPSByLT5oZWFkZXJfbmFtZV9lbmQgLSByLT5oZWFkZXJfbmFtZV9zdGFydDsKKyAgICAgICAgICAgICAgICBoLT52YWx1ZS5sZW4gPSByLT5oZWFkZXJfZW5kIC0gci0+aGVhZGVyX3N0YXJ0OworCisgICAgICAgICAgICAgICAgaC0+a2V5LmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmtleS5sZW4gKyAxICsgaC0+dmFsdWUubGVuICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGgtPmtleS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoLT52YWx1ZS5kYXRhID0gaC0+a2V5LmRhdGEgKyBoLT5rZXkubGVuICsgMTsKKworICAgICAgICAgICAgICAgIG5neF9jcHlzdHJuKGgtPmtleS5kYXRhLCByLT5oZWFkZXJfbmFtZV9zdGFydCwgaC0+a2V5LmxlbiArIDEpOworICAgICAgICAgICAgICAgIG5neF9jcHlzdHJuKGgtPnZhbHVlLmRhdGEsIHItPmhlYWRlcl9zdGFydCwgaC0+dmFsdWUubGVuICsgMSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5baV0ubmFtZS5sZW4gIT0gMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5baV0ubmFtZS5sZW4gIT0gaC0+a2V5LmxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobmd4X3N0cmNhc2VjbXAobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luW2ldLm5hbWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5rZXkuZGF0YSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKigobmd4X3RhYmxlX2VsdF90ICoqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyICopICZmLT51cHN0cmVhbS0+aGVhZGVyc19pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5baV0ub2Zmc2V0KSkgPSBoOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBmYXN0Y2dpIGhlYWRlcjogXCIlVjogJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmtleSwgJmgtPnZhbHVlKTsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmMgPT0gTkdYX0hUVFBfUEFSU0VfSEVBREVSX0RPTkUpIHsKKworICAgICAgICAgICAgICAgIC8qIGEgd2hvbGUgaGVhZGVyIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgKi8KKworICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIGZhc3RjZ2kgaGVhZGVyIGRvbmUiKTsKKworICAgICAgICAgICAgICAgIGlmIChmLT51cHN0cmVhbS0+aGVhZGVyc19pbi5zdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2xpbmUgPSAmZi0+dXBzdHJlYW0tPmhlYWRlcnNfaW4uc3RhdHVzLT52YWx1ZTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZ3hfYXRvaShzdGF0dXNfbGluZS0+ZGF0YSwgMyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LnN0YXR1c19saW5lID0gKnN0YXR1c19saW5lOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuc3RhdHVzID0gMjAwOworICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5sZW4gPSBzaXplb2YoIjIwMCBPSyIpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuc3RhdHVzX2xpbmUuZGF0YSA9ICh1X2NoYXIgKikgIjIwMCBPSyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdS0+c3RhdGUtPnN0YXR1cyA9IHItPmhlYWRlcnNfb3V0LnN0YXR1czsKKyNpZiAwCisgICAgICAgICAgICAgICAgaWYgKHUtPmNhY2hhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHUtPmNhY2hhYmxlID0gbmd4X2h0dHBfdXBzdHJlYW1faXNfY2FjaGFibGUocik7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdGhlcmUgd2FzIGVycm9yIHdoaWxlIGEgaGVhZGVyIGxpbmUgcGFyc2luZyAqLworCisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcl9lcnJvcnNbcmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTkdYX0hUVFBfUEFSU0VfSEVBREVSX0VSUk9SXSk7CisKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9VUFNUUkVBTV9JTlZBTElEX0hFQURFUjsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3QpIHsKKyAgICAgICAgICAgIHUtPmhlYWRlcl9pbi5sYXN0ID0gbGFzdDsKKyAgICAgICAgfQorCisgICAgICAgIGYtPmxlbmd0aCAtPSB1LT5oZWFkZXJfaW4ucG9zIC0gc3RhcnQ7CisKKyAgICAgICAgaWYgKHJjID09IE5HWF9BR0FJTikgeworICAgICAgICAgICAgaWYgKHUtPmhlYWRlcl9pbi5wb3MgPT0gdS0+aGVhZGVyX2luLmxhc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0FHQUlOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIHNwbGl0IGEgaGVhZGVyIGluIEZhc3RDR0kgcmVjb3JkcyIpOworCisgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfVVBTVFJFQU1fSU5WQUxJRF9IRUFERVI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZi0+bGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGlmIChmLT5wYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgZi0+c3RhdGUgPSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3BhZGRpbmc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGYtPnN0YXRlID0gbmd4X2h0dHBfZmFzdGNnaV9zdF92ZXJzaW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9Cit9CisKKworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9mYXN0Y2dpX3NlbmRfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgbmd4X2xpc3RfcGFydF90ICAgICAgICAgICAgICAgICpwYXJ0OworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqaG8sICpoOworICAgIG5neF9odHRwX2Zhc3RjZ2lfY3R4X3QgICAgICAgICAqZjsKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5fdCAgKmhlYWRlcnNfaW47CisKKyAgICBmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUpOworCisgICAgaGVhZGVyc19pbiA9ICZmLT51cHN0cmVhbS0+aGVhZGVyc19pbjsKKyAgICBwYXJ0ID0gJmhlYWRlcnNfaW4tPmhlYWRlcnMucGFydDsKKyAgICBoID0gcGFydC0+ZWx0czsKKworICAgIGZvciAoaSA9IDA7IC8qIHZvaWQgKi87IGkrKykgeworCisgICAgICAgIGlmIChpID49IHBhcnQtPm5lbHRzKSB7CisgICAgICAgICAgICBpZiAocGFydC0+bmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OworICAgICAgICAgICAgaCA9IHBhcnQtPmVsdHM7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlnbm9yZSBzb21lIGhlYWRlcnMgKi8KKworICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+c3RhdHVzKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCZoW2ldID09IGhlYWRlcnNfaW4tPnhfcG93ZXJlZF9ieQorICAgICAgICAgICAgJiYgIXItPnVwc3RyZWFtLT5jb25mLT54X3Bvd2VyZWRfYnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKworICAgICAgICAvKiAiQ29udGVudC1UeXBlIiBpcyBoYW5kbGVkIHNwZWNpYWxseSAqLworCisgICAgICAgIGlmICgmaFtpXSA9PSBoZWFkZXJzX2luLT5jb250ZW50X3R5cGUpIHsKKyAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZSA9ICZoW2ldOworICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT5rZXkubGVuID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKworICAgICAgICAvKiBjb3B5IHNvbWUgaGVhZGVyIHBvaW50ZXJzIGFuZCBzZXQgdXAgci0+aGVhZGVyc19vdXQgKi8KKworICAgICAgICBpZiAoIShobyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpKSkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgICpobyA9IGhbaV07CisKKyNpZiAoTkdYX0hUVFBfR1pJUCkKKyAgICAgICAgaWYgKCZoW2ldID09IGhlYWRlcnNfaW4tPmNvbnRlbnRfZW5jb2RpbmcpIHsKKyAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfZW5jb2RpbmcgPSBobzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+Y29udGVudF9sZW5ndGgpIHsKKyAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoID0gaG87CisgICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uID0gbmd4X2F0b2koaG8tPnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG8tPnZhbHVlLmxlbik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZ3hfaHR0cF9zZW5kX2hlYWRlcihyKTsKK30KKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2Zhc3RjZ2lfaW5wdXRfZmlsdGVyKG5neF9ldmVudF9waXBlX3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9idWZfdCAqYnVmKQoreworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAqYjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgbGluZTsKKyAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAqY2w7CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgKnI7CisgICAgbmd4X2h0dHBfZmFzdGNnaV9jdHhfdCAgKmY7CisKKyAgICBpZiAoYnVmLT5wb3MgPT0gYnVmLT5sYXN0KSB7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgciA9IHAtPmlucHV0X2N0eDsKKyAgICBmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUpOworCisgICAgYiA9IE5VTEw7CisKKyAgICBmLT5wb3MgPSBidWYtPnBvczsKKyAgICBmLT5sYXN0ID0gYnVmLT5sYXN0OworCisgICAgZm9yICggOzsgKSB7CisgICAgICAgIGlmIChmLT5zdGF0ZSA8IG5neF9odHRwX2Zhc3RjZ2lfc3RfZGF0YSkgeworCisgICAgICAgICAgICByYyA9IG5neF9odHRwX2Zhc3RjZ2lfcHJvY2Vzc19yZWNvcmQociwgZik7CisKKyAgICAgICAgICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJjID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmLT50eXBlID09IE5HWF9IVFRQX0ZBU1RDR0lfU1RET1VUICYmIGYtPmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZi0+c3RhdGUgPSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3ZlcnNpb247CisgICAgICAgICAgICAgICAgcC0+dXBzdHJlYW1fZG9uZSA9IDE7CisKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHAtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBmYXN0Y2dpIGNsb3NlZCBzdGRvdXQiKTsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZi0+dHlwZSA9PSBOR1hfSFRUUF9GQVNUQ0dJX0VORF9SRVFVRVNUKSB7CisgICAgICAgICAgICAgICAgZi0+c3RhdGUgPSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3ZlcnNpb247CisgICAgICAgICAgICAgICAgcC0+dXBzdHJlYW1fZG9uZSA9IDE7CisKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHAtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBmYXN0Y2dpIHNlbnQgZW5kIHJlcXVlc3QiKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpZiAoZi0+c3RhdGUgPT0gbmd4X2h0dHBfZmFzdGNnaV9zdF9wYWRkaW5nKSB7CisKKyAgICAgICAgICAgIGlmIChmLT5wb3MgKyBmLT5wYWRkaW5nIDwgZi0+bGFzdCkgeworICAgICAgICAgICAgICAgIGYtPnN0YXRlID0gbmd4X2h0dHBfZmFzdGNnaV9zdF92ZXJzaW9uOworICAgICAgICAgICAgICAgIGYtPnBvcyArPSBmLT5wYWRkaW5nOworCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmLT5wb3MgKyBmLT5wYWRkaW5nID09IGYtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICBmLT5zdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfdmVyc2lvbjsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmLT5wYWRkaW5nIC09IGYtPmxhc3QgLSBmLT5wb3M7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICAvKiBmLT5zdGF0ZSA9PSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X2RhdGEgKi8KKworICAgICAgICBpZiAoZi0+dHlwZSA9PSBOR1hfSFRUUF9GQVNUQ0dJX1NUREVSUikgeworCisgICAgICAgICAgICBpZiAoZi0+bGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgbGluZS5kYXRhID0gZi0+cG9zOworCisgICAgICAgICAgICAgICAgaWYgKGYtPnBvcyArIGYtPmxlbmd0aCA8PSBmLT5sYXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmUubGVuID0gZi0+bGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBmLT5wb3MgKz0gZi0+bGVuZ3RoOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgICAgIGxpbmUubGVuID0gZi0+bGFzdCAtIGYtPnBvczsKKyAgICAgICAgICAgICAgICAgICAgZi0+bGVuZ3RoIC09IGYtPmxhc3QgLSBmLT5wb3M7CisgICAgICAgICAgICAgICAgICAgIGYtPnBvcyA9IGYtPmxhc3Q7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBUT0RPOiBjb3B5IHNwbGl0IHN0ZGVyciBvdXRwdXQgaW50byBidWZmZXIsCisgICAgICAgICAgICAgICAgICogICAgICAgY2xlYW4gaXQgdXAKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHAtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYXN0Q0dJIHN0ZGVycjogJVYiLCAmbGluZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZi0+cG9zID09IGYtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmLT5zdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfdmVyc2lvbjsKKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIGYtPnR5cGUgPT0gTkdYX0hUVFBfRkFTVENHSV9TVERPVVQgKi8KKworICAgICAgICBpZiAocC0+ZnJlZSkgeworICAgICAgICAgICAgYiA9IHAtPmZyZWUtPmJ1ZjsKKyAgICAgICAgICAgIHAtPmZyZWUgPSBwLT5mcmVlLT5uZXh0OworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShiID0gbmd4X2FsbG9jX2J1ZihwLT5wb29sKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmd4X21lbXplcm8oYiwgc2l6ZW9mKG5neF9idWZfdCkpOworCisgICAgICAgIGItPnBvcyA9IGYtPnBvczsKKyAgICAgICAgYi0+c2hhZG93ID0gYnVmOworICAgICAgICBiLT50YWcgPSBwLT50YWc7CisgICAgICAgIGItPnRlbXBvcmFyeSA9IDE7CisgICAgICAgIGItPnJlY3ljbGVkID0gMTsKKyAgICAgICAgYnVmLT5zaGFkb3cgPSBiOworCisgICAgICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsocC0+cG9vbCkpKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2wtPmJ1ZiA9IGI7CisgICAgICAgIGNsLT5uZXh0ID0gTlVMTDsKKworICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBwLT5sb2csIDAsICJpbnB1dCBidWYgIyVkIiwgYi0+bnVtKTsKKworICAgICAgICBuZ3hfY2hhaW5fYWRkX2xpbmsocC0+aW4sIHAtPmxhc3RfaW4sIGNsKTsKKworICAgICAgICBpZiAoZi0+cG9zICsgZi0+bGVuZ3RoIDwgZi0+bGFzdCkgeworCisgICAgICAgICAgICBpZiAoZi0+cGFkZGluZykgeworICAgICAgICAgICAgICAgIGYtPnN0YXRlID0gbmd4X2h0dHBfZmFzdGNnaV9zdF9wYWRkaW5nOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmLT5zdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfdmVyc2lvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZi0+cG9zICs9IGYtPmxlbmd0aDsKKyAgICAgICAgICAgIGItPmxhc3QgPSBmLT5wb3M7CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGYtPnBvcyArIGYtPmxlbmd0aCA9PSBmLT5sYXN0KSB7CisKKyAgICAgICAgICAgIGlmIChmLT5wYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgZi0+c3RhdGUgPSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3BhZGRpbmc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGYtPnN0YXRlID0gbmd4X2h0dHBfZmFzdGNnaV9zdF92ZXJzaW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiLT5sYXN0ID0gZi0+bGFzdDsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmLT5sZW5ndGggLT0gZi0+bGFzdCAtIGYtPnBvczsKKworICAgICAgICBiLT5sYXN0ID0gZi0+bGFzdDsKKworICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIGlmIChiKSB7CisgICAgICAgIGItPmxhc3Rfc2hhZG93ID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmFzdGNnaV9wcm9jZXNzX3JlY29yZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZmFzdGNnaV9jdHhfdCAqZikKK3sKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICBjaCwgKnA7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICAgICAqdTsKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX3N0YXRlX2UgICBzdGF0ZTsKKworICAgIHUgPSByLT51cHN0cmVhbTsKKworICAgIHN0YXRlID0gZi0+c3RhdGU7CisKKyAgICBmb3IgKHAgPSBmLT5wb3M7IHAgPCBmLT5sYXN0OyBwKyspIHsKKworICAgICAgICBjaCA9ICpwOworCisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBmYXN0Y2dpIHJlY29yZCBieXRlOiAlMDJYZCIsIGNoKTsKKworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisKKyAgICAgICAgY2FzZSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3ZlcnNpb246CisgICAgICAgICAgICBpZiAoY2ggIT0gMSkgeworICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSBzZW50IHVuc3VwcG9ydGVkIEZhc3RDR0kgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3RvY29sIHZlcnNpb246ICVkIiwgY2gpOworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfdHlwZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ugbmd4X2h0dHBfZmFzdGNnaV9zdF90eXBlOgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSBOR1hfSFRUUF9GQVNUQ0dJX1NURE9VVDoKKyAgICAgICAgICAgIGNhc2UgTkdYX0hUVFBfRkFTVENHSV9TVERFUlI6CisgICAgICAgICAgICBjYXNlIE5HWF9IVFRQX0ZBU1RDR0lfRU5EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgIGYtPnR5cGUgPSAobmd4X3VpbnRfdCkgY2g7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gc2VudCBpbnZhbGlkIEZhc3RDR0kgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY29yZCB0eXBlOiAlZCIsIGNoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfcmVxdWVzdF9pZF9oaTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHdlIHN1cHBvcnQgdGhlIHNpbmdsZSByZXF1ZXN0IHBlciBjb25uZWN0aW9uICovCisKKyAgICAgICAgY2FzZSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3JlcXVlc3RfaWRfaGk6CisgICAgICAgICAgICBpZiAoY2ggIT0gMCkgeworICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSBzZW50IHVuZXhwZWN0ZWQgRmFzdENHSSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBpZCBoaWdoIGJ5dGU6ICVkIiwgY2gpOworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfcmVxdWVzdF9pZF9sbzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ugbmd4X2h0dHBfZmFzdGNnaV9zdF9yZXF1ZXN0X2lkX2xvOgorICAgICAgICAgICAgaWYgKGNoICE9IDEpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gc2VudCB1bmV4cGVjdGVkIEZhc3RDR0kgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgaWQgbG93IGJ5dGU6ICVkIiwgY2gpOworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfY29udGVudF9sZW5ndGhfaGk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIG5neF9odHRwX2Zhc3RjZ2lfc3RfY29udGVudF9sZW5ndGhfaGk6CisgICAgICAgICAgICBmLT5sZW5ndGggPSBjaCA8PCA4OworICAgICAgICAgICAgc3RhdGUgPSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X2NvbnRlbnRfbGVuZ3RoX2xvOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X2NvbnRlbnRfbGVuZ3RoX2xvOgorICAgICAgICAgICAgZi0+bGVuZ3RoIHw9IChzaXplX3QpIGNoOworICAgICAgICAgICAgc3RhdGUgPSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3BhZGRpbmdfbGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3BhZGRpbmdfbGVuZ3RoOgorICAgICAgICAgICAgZi0+cGFkZGluZyA9IChzaXplX3QpIGNoOworICAgICAgICAgICAgc3RhdGUgPSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3Jlc2VydmVkOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3Jlc2VydmVkOgorICAgICAgICAgICAgc3RhdGUgPSBuZ3hfaHR0cF9mYXN0Y2dpX3N0X2RhdGE7CisKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgZmFzdGNnaSByZWNvcmQgbGVuZ3RoOiAleiIsIGYtPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGYtPnBvcyA9IHAgKyAxOworICAgICAgICAgICAgZi0+c3RhdGUgPSBzdGF0ZTsKKworICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKKworICAgICAgICAvKiBzdXBwcmVzcyB3YXJuaW5nICovCisgICAgICAgIGNhc2Ugbmd4X2h0dHBfZmFzdGNnaV9zdF9kYXRhOgorICAgICAgICBjYXNlIG5neF9odHRwX2Zhc3RjZ2lfc3RfcGFkZGluZzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZi0+cG9zID0gcCArIDE7CisgICAgZi0+c3RhdGUgPSBzdGF0ZTsKKworICAgIHJldHVybiBOR1hfQUdBSU47Cit9CisKKworc3RhdGljIHZvaWQgbmd4X2h0dHBfZmFzdGNnaV9hYm9ydF9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiYWJvcnQgaHR0cCBmYXN0Y2dpIHJlcXVlc3QiKTsKKworICAgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF9mYXN0Y2dpX2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9pbnRfdCByYykKK3sKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiZmluYWxpemUgaHR0cCBmYXN0Y2dpIHJlcXVlc3QiKTsKKworICAgIHJldHVybjsKK30KKworCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfZmFzdGNnaV9wYXNzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90ICpsY2YgPSBjb25mOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfaW5ldF91cHN0cmVhbV90ICAgICAgICAgIGluZXRfdXBzdHJlYW07CisgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgICpjbGNmOworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKKyAgICBuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCAgIHVuaXhfdXBzdHJlYW07CisjZW5kaWYKKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBpZiAobmd4X3N0cm5jYXNlY21wKHZhbHVlWzFdLmRhdGEsICJ1bml4OiIsIDUpID09IDApIHsKKworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKKworICAgICAgICBuZ3hfbWVtemVybygmdW5peF91cHN0cmVhbSwgc2l6ZW9mKG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90KSk7CisKKyAgICAgICAgdW5peF91cHN0cmVhbS5uYW1lID0gdmFsdWVbMV07CisgICAgICAgIHVuaXhfdXBzdHJlYW0udXJsID0gdmFsdWVbMV07CisKKworICAgICAgICBpZiAoIShsY2YtPnBlZXJzID0gbmd4X3VuaXhfdXBzdHJlYW1fcGFyc2UoY2YsICZ1bml4X3Vwc3RyZWFtKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisjZWxzZQorICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworCisjZW5kaWYKKworICAgIH0gZWxzZSB7CisgICAgICAgIG5neF9tZW16ZXJvKCZpbmV0X3Vwc3RyZWFtLCBzaXplb2Yobmd4X2luZXRfdXBzdHJlYW1fdCkpOworCisgICAgICAgIGluZXRfdXBzdHJlYW0ubmFtZSA9IHZhbHVlWzFdOworICAgICAgICBpbmV0X3Vwc3RyZWFtLnVybCA9IHZhbHVlWzFdOworICAgIAorICAgICAgICBpZiAoIShsY2YtPnBlZXJzID0gbmd4X2luZXRfdXBzdHJlYW1fcGFyc2UoY2YsICZpbmV0X3Vwc3RyZWFtKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbG9jX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIGxjZi0+bG9jYXRpb24gPSAmY2xjZi0+bmFtZTsKKyAgICBjbGNmLT5oYW5kbGVyID0gbmd4X2h0dHBfZmFzdGNnaV9oYW5kbGVyOworCisgICAgaWYgKGNsY2YtPm5hbWUuZGF0YVtjbGNmLT5uYW1lLmxlbiAtIDFdID09ICcvJykgeworICAgICAgICBjbGNmLT5hdXRvX3JlZGlyZWN0ID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CisKKworc3RhdGljIGNoYXIgKm5neF9odHRwX2Zhc3RjZ2lfbG93YXRfY2hlY2sobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworI2lmIChOR1hfRlJFRUJTRCkKKyAgICBzc2l6ZV90ICpucCA9IGRhdGE7CisKKyAgICBpZiAoKm5wID49IG5neF9mcmVlYnNkX25ldF9pbmV0X3RjcF9zZW5kc3BhY2UpIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZmFzdGNnaV9zZW5kX2xvd2F0XCIgbXVzdCBiZSBsZXNzIHRoYW4gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzeXNjdGwgbmV0LmluZXQudGNwLnNlbmRzcGFjZSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2ZyZWVic2RfbmV0X2luZXRfdGNwX3NlbmRzcGFjZSk7CisKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworI2VsaWYgIShOR1hfSEFWRV9TT19TTkRMT1dBVCkKKyAgICBzc2l6ZV90ICpucCA9IGRhdGE7CisKKyAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19XQVJOLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIlwiZmFzdGNnaV9zZW5kX2xvd2F0XCIgaXMgbm90IHN1cHBvcnRlZCwgaWdub3JlZCIpOworCisgICAgKm5wID0gMDsKKworI2VuZGlmCisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CisKKworc3RhdGljIHZvaWQgKm5neF9odHRwX2Zhc3RjZ2lfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKQoreworICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAgKmNvbmY7CisKKyAgICBpZiAoIShjb25mID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QpKSkpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogc2V0IGJ5IG5neF9wY2FsbG9jKCk6CisgICAgICoKKyAgICAgKiAgICAgY29uZi0+dXBzdHJlYW0uYnVmcy5udW0gPSAwOworICAgICAqICAgICBjb25mLT51cHN0cmVhbS5wYXRoID0gTlVMTDsKKyAgICAgKiAgICAgY29uZi0+dXBzdHJlYW0ubmV4dF91cHN0cmVhbSA9IDA7CisgICAgICogICAgIGNvbmYtPnVwc3RyZWFtLnRlbXBfcGF0aCA9IE5VTEw7CisgICAgICogICAgIGNvbmYtPnBhcmFtcyA9IDA7CisgICAgICogICAgIGNvbmYtPnJvb3QubGVuID0gMDsKKyAgICAgKiAgICAgY29uZi0+cm9vdC5kYXRhID0gTlVMTDsKKyAgICAgKiAgICAgY29uZi0+aW5kZXgubGVuID0gMDsKKyAgICAgKiAgICAgY29uZi0+aW5kZXguZGF0YSA9IE5VTEw7CisgICAgICogICAgIGNvbmYtPmxvY2F0aW9uID0gTlVMTDsKKyAgICAgKi8KKworICAgIGNvbmYtPnVwc3RyZWFtLmNvbm5lY3RfdGltZW91dCA9IE5HWF9DT05GX1VOU0VUX01TRUM7CisgICAgY29uZi0+dXBzdHJlYW0uc2VuZF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKKyAgICBjb25mLT51cHN0cmVhbS5zZW5kX2xvd2F0ID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKKworICAgIGNvbmYtPnVwc3RyZWFtLmhlYWRlcl9idWZmZXJfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CisgICAgY29uZi0+dXBzdHJlYW0ucmVhZF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKKyAgICBjb25mLT51cHN0cmVhbS5idXN5X2J1ZmZlcnNfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CisKKyAgICBjb25mLT51cHN0cmVhbS5tYXhfdGVtcF9maWxlX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOyAKKyAgICBjb25mLT51cHN0cmVhbS50ZW1wX2ZpbGVfd3JpdGVfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CisgICAgCisgICAgY29uZi0+dXBzdHJlYW0ueF9wb3dlcmVkX2J5ID0gTkdYX0NPTkZfVU5TRVQ7CisKKyAgICAvKiAiZmFzdGNnaV9jeWNsaWNfdGVtcF9maWxlIiBpcyBkaXNhYmxlZCAqLworICAgIGNvbmYtPnVwc3RyZWFtLmN5Y2xpY190ZW1wX2ZpbGUgPSAwOworCisgICAgcmV0dXJuIGNvbmY7Cit9CisKKworc3RhdGljIGNoYXIgKm5neF9odHRwX2Zhc3RjZ2lfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQoreworICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAqcHJldiA9IHBhcmVudDsKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QgKmNvbmYgPSBjaGlsZDsKKworICAgIHNpemVfdCAgc2l6ZTsKKworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0LCA2MDAwMCk7CisgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5zZW5kX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5zZW5kX3RpbWVvdXQsIDYwMDAwKTsKKyAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnNlbmRfbG93YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5zZW5kX2xvd2F0LCAwKTsKKworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ucmVhZF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucmVhZF90aW1lb3V0LCA2MDAwMCk7CisKKyAgICBuZ3hfY29uZl9tZXJnZV9tc2VjX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnhfcG93ZXJlZF9ieSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnhfcG93ZXJlZF9ieSwgMSk7CisKKworICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+dXBzdHJlYW0uaGVhZGVyX2J1ZmZlcl9zaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLmhlYWRlcl9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIG5neF9wYWdlc2l6ZSk7CisKKyAgICBuZ3hfY29uZl9tZXJnZV9idWZzX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLmJ1ZnMsIHByZXYtPnVwc3RyZWFtLmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCBuZ3hfcGFnZXNpemUpOworCisgICAgaWYgKGNvbmYtPnVwc3RyZWFtLmJ1ZnMubnVtIDwgMikgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlcmUgbXVzdCBiZSBhdCBsZWFzdCAyIFwiZmFzdGNnaV9idWZmZXJzXCIiKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworCisgICAgc2l6ZSA9IGNvbmYtPnVwc3RyZWFtLmhlYWRlcl9idWZmZXJfc2l6ZTsKKyAgICBpZiAoc2l6ZSA8IGNvbmYtPnVwc3RyZWFtLmJ1ZnMuc2l6ZSkgeworICAgICAgICBzaXplID0gY29uZi0+dXBzdHJlYW0uYnVmcy5zaXplOworICAgIH0KKworCisgICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT51cHN0cmVhbS5idXN5X2J1ZmZlcnNfc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5idXN5X2J1ZmZlcnNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX1VOU0VUX1NJWkUpOworCisgICAgaWYgKGNvbmYtPnVwc3RyZWFtLmJ1c3lfYnVmZmVyc19zaXplID09IE5HWF9DT05GX1VOU0VUX1NJWkUpIHsKKyAgICAgICAgY29uZi0+dXBzdHJlYW0uYnVzeV9idWZmZXJzX3NpemUgPSAyICogc2l6ZTsKKworICAgIH0gZWxzZSBpZiAoY29uZi0+dXBzdHJlYW0uYnVzeV9idWZmZXJzX3NpemUgPCBzaXplKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAiXCJmYXN0Y2dpX2J1c3lfYnVmZmVyc19zaXplXCIgbXVzdCBiZSBlcXVhbCBvciBiaWdnZXIgdGhhbiAiCisgICAgICAgICAgICAgIm1heGltdW0gb2YgdGhlIHZhbHVlIG9mIFwiZmFzdGNnaV9oZWFkZXJfYnVmZmVyX3NpemVcIiBhbmQgIgorICAgICAgICAgICAgICJvbmUgb2YgdGhlIFwiZmFzdGNnaV9idWZmZXJzXCIiKTsKKworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisKKyAgICB9IGVsc2UgaWYgKGNvbmYtPnVwc3RyZWFtLmJ1c3lfYnVmZmVyc19zaXplCisgICAgICAgICAgICAgICA+IChjb25mLT51cHN0cmVhbS5idWZzLm51bSAtIDEpICogY29uZi0+dXBzdHJlYW0uYnVmcy5zaXplKQorICAgIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICJcImZhc3RjZ2lfYnVzeV9idWZmZXJzX3NpemVcIiBtdXN0IGJlIGxlc3MgdGhhbiAiCisgICAgICAgICAgICAgInRoZSBzaXplIG9mIGFsbCBcImZhc3RjZ2lfYnVmZmVyc1wiIG1pbnVzIG9uZSBidWZmZXIiKTsKKworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisKKyAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnRlbXBfZmlsZV93cml0ZV9zaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnRlbXBfZmlsZV93cml0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfVU5TRVRfU0laRSk7CisKKyAgICBpZiAoY29uZi0+dXBzdHJlYW0udGVtcF9maWxlX3dyaXRlX3NpemUgPT0gTkdYX0NPTkZfVU5TRVRfU0laRSkgeworICAgICAgICBjb25mLT51cHN0cmVhbS50ZW1wX2ZpbGVfd3JpdGVfc2l6ZSA9IDIgKiBzaXplOworCisgICAgfSBlbHNlIGlmIChjb25mLT51cHN0cmVhbS50ZW1wX2ZpbGVfd3JpdGVfc2l6ZSA8IHNpemUpIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICJcImZhc3RjZ2lfdGVtcF9maWxlX3dyaXRlX3NpemVcIiBtdXN0IGJlIGVxdWFsIG9yIGJpZ2dlciB0aGFuICIKKyAgICAgICAgICAgICAibWF4aW11bSBvZiB0aGUgdmFsdWUgb2YgXCJmYXN0Y2dpX2hlYWRlcl9idWZmZXJfc2l6ZVwiIGFuZCAiCisgICAgICAgICAgICAgIm9uZSBvZiB0aGUgXCJmYXN0Y2dpX2J1ZmZlcnNcIiIpOworCisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKworICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+dXBzdHJlYW0ubWF4X3RlbXBfZmlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ubWF4X3RlbXBfZmlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfVU5TRVRfU0laRSk7CisKKyAgICBpZiAoY29uZi0+dXBzdHJlYW0ubWF4X3RlbXBfZmlsZV9zaXplID09IE5HWF9DT05GX1VOU0VUX1NJWkUpIHsKKworICAgICAgICBjb25mLT51cHN0cmVhbS5tYXhfdGVtcF9maWxlX3NpemUgPSAxMDI0ICogMTAyNCAqIDEwMjQ7CisKKyAgICB9IGVsc2UgaWYgKGNvbmYtPnVwc3RyZWFtLm1heF90ZW1wX2ZpbGVfc2l6ZSAhPSAwCisgICAgICAgICAgICAgICAmJiBjb25mLT51cHN0cmVhbS5tYXhfdGVtcF9maWxlX3NpemUgPCBzaXplKQorICAgIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICJcImZhc3RjZ2lfbWF4X3RlbXBfZmlsZV9zaXplXCIgbXVzdCBiZSBlcXVhbCB0byB6ZXJvIHRvIGRpc2FibGUgIgorICAgICAgICAgICAgICJ0aGUgdGVtcG9yYXJ5IGZpbGVzIHVzYWdlIG9yIG11c3QgYmUgZXF1YWwgb3IgYmlnZ2VyIHRoYW4gIgorICAgICAgICAgICAgICJtYXhpbXVtIG9mIHRoZSB2YWx1ZSBvZiBcImZhc3RjZ2lfaGVhZGVyX2J1ZmZlcl9zaXplXCIgYW5kICIKKyAgICAgICAgICAgICAib25lIG9mIHRoZSBcImZhc3RjZ2lfYnVmZmVyc1wiIik7CisKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworCisgICAgbmd4X2NvbmZfbWVyZ2VfYml0bWFza192YWx1ZShjb25mLT51cHN0cmVhbS5uZXh0X3Vwc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ubmV4dF91cHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOR1hfQ09ORl9CSVRNQVNLX1NFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9VUFNUUkVBTV9GVF9FUlJPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9VUFNUUkVBTV9GVF9USU1FT1VUKSk7CisKKyAgICBuZ3hfY29uZl9tZXJnZV9wYXRoX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnRlbXBfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnRlbXBfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0ZBU1RDR0lfVEVNUF9QQVRILCAxLCAyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2dhcmJhZ2VfY29sbGVjdG9yX3RlbXBfaGFuZGxlciwgY2YpOworCisKKyAgICBuZ3hfY29uZl9tZXJnZV9iaXRtYXNrX3ZhbHVlKGNvbmYtPnBhcmFtcywgcHJldi0+cGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5HWF9DT05GX0JJVE1BU0tfU0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX0ZBU1RDR0lfUkVNT1RFX0FERFIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0hUVFBfRkFTVENHSV9SRU1PVEVfVVNFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9OQU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX1BPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0hUVFBfRkFTVENHSV9TQ1JJUFRfTkFNRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9GQVNUQ0dJX0FVVEhfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9GQVNUQ0dJX1JFUVVFU1RfVVJJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX0ZBU1RDR0lfUkVESVJFQ1RfU1RBVFVTKSk7CisKKyAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+cm9vdCwgcHJldi0+cm9vdCwgIiIpOworCisgICAgaWYgKGNvbmYtPnJvb3QubGVuICYmIGNvbmYtPnJvb3QuZGF0YVtjb25mLT5yb290LmxlbiAtIDFdID09ICcvJykgeworICAgICAgICBjb25mLT5yb290Lmxlbi0tOworICAgIH0KKworICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5pbmRleCwgcHJldi0+aW5kZXgsICIiKTsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXIuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXIuYwppbmRleCBiMDkzZDU4Li4wY2QxZDkxIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlci5jCkBAIC04MCwxMiArODAsMTMgQEAKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9nemlwX2ZpbHRlcl9hbGxvYyh2b2lkICpvcGFxdWUsIHVfaW50IGl0ZW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHNpemUpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfZ3ppcF9maWx0ZXJfZnJlZSh2b2lkICpvcGFxdWUsIHZvaWQgKmFkZHJlc3MpOwotc3RhdGljIGludCBuZ3hfaHR0cF9nemlwX2Vycm9yKG5neF9odHRwX2d6aXBfY3R4X3QgKmN0eCk7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF9nemlwX2Vycm9yKG5neF9odHRwX2d6aXBfY3R4X3QgKmN0eCk7CiAKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2d6aXBfbG9nX3JhdGlvKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfcHJlX2NvbmYobmd4X2NvbmZfdCAqY2YpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9nemlwX2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZik7CisKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZ3ppcF9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX2d6aXBfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2d6aXBfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwKQEAgLTIwNSw3ICsyMDYsNyBAQAogCiAKIHN0YXRpYyBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlX2N0eCA9IHsKLSAgICBuZ3hfaHR0cF9nemlwX3ByZV9jb25mLCAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIG5neF9odHRwX2d6aXBfYWRkX2xvZ19mb3JtYXRzLCAgICAgICAgIC8qIHByZSBjb25mICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTIyOSwyMiArMjMwLDIzIEBACiAKIAogc3RhdGljIG5neF9odHRwX2xvZ19vcF9uYW1lX3Qgbmd4X2h0dHBfZ3ppcF9sb2dfZm10X29wc1tdID0gewotICAgIHsgbmd4X3N0cmluZygiZ3ppcF9yYXRpbyIpLCBOR1hfSU5UMzJfTEVOICsgMywgbmd4X2h0dHBfZ3ppcF9sb2dfcmF0aW8gfSwKLSAgICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCB9CisgICAgeyBuZ3hfc3RyaW5nKCJnemlwX3JhdGlvIiksIE5HWF9JTlQzMl9MRU4gKyAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBuZ3hfaHR0cF9nemlwX2xvZ19yYXRpbyB9LAorICAgIHsgbmd4X251bGxfc3RyaW5nLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH0KIH07CiAKIAogCiBzdGF0aWMgdV9jaGFyICBnemhlYWRlclsxMF0gPSB7IDB4MWYsIDB4OGIsIFpfREVGTEFURUQsIDAsIDAsIDAsIDAsIDAsIDAsIDMgfTsKIAotI2lmIChOR1hfSEFWRV9MSVRUTEVfRU5ESUFOKQorI2lmIChOR1hfSEFWRV9MSVRUTEVfRU5ESUFOICYmIE5HWF9IQVZFX05PTkFMSUdORUQpCiAKIHN0cnVjdCBnenRyYWlsZXIgewogICAgIHVpbnQzMl90ICBjcmMzMjsKICAgICB1aW50MzJfdCAgemxlbjsKIH07CiAKLSNlbHNlIC8qIE5HWF9IQVZFX0JJR19FTkRJQU4gKi8KKyNlbHNlIC8qIE5HWF9IQVZFX0JJR19FTkRJQU4gfHwgIU5HWF9IQVZFX05PTkFMSUdORUQgKi8KIAogc3RydWN0IGd6dHJhaWxlciB7CiAgICAgdV9jaGFyICBjcmMzMls0XTsKQEAgLTQ5NywxMSArNDk5LDEzIEBACiAgICAgICAgIGlmIChyYyAhPSBaX09LKSB7CiAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmxhdGVJbml0MigpIGZhaWxlZDogJWQiLCByYyk7Ci0gICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghKGIgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2J1Zl90KSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIGItPm1lbW9yeSA9IDE7CkBAIC01MDksNyArNTEzLDggQEAKICAgICAgICAgYi0+bGFzdCA9IGItPnBvcyArIDEwOwogCiAgICAgICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogICAgICAgICBjbC0+YnVmID0gYjsKICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwpAQCAtNTIyLDcgKzUyNyw4IEBACiAgICAgICAgICAqLwogCiAgICAgICAgIGlmIChuZ3hfaHR0cF9uZXh0X2JvZHlfZmlsdGVyKHIsIGNsKSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgY3R4LT5sYXN0X291dCA9ICZjdHgtPm91dDsKQEAgLTUzMyw3ICs1MzksOCBAQAogCiAgICAgaWYgKGluKSB7CiAgICAgICAgIGlmIChuZ3hfY2hhaW5fYWRkX2NvcHkoci0+cG9vbCwgJmN0eC0+aW4sIGluKSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogCkBAIC02MDcsNyArNjE0LDggQEAKICAgICAgICAgICAgICAgICAgICAgY3R4LT5vdXRfYnVmID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYtPmJ1ZnMuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjdHgtPm91dF9idWYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2d6aXBfZXJyb3IoY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2d6aXBfZXJyb3IoY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBjdHgtPm91dF9idWYtPnRhZyA9IChuZ3hfYnVmX3RhZ190KQpAQCAtNjM0LDcgKzY0Miw4IEBACiAgICAgICAgICAgICBpZiAocmMgIT0gWl9PSyAmJiByYyAhPSBaX1NUUkVBTV9FTkQpIHsKICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZsYXRlKCkgZmFpbGVkOiAlZCwgJWQiLCBjdHgtPmZsdXNoLCByYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2d6aXBfZXJyb3IoY3R4KTsKKyAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzUoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCkBAIC02NjMsNyArNjcyLDggQEAKICAgICAgICAgICAgICAgICAvKiB6bGliIHdhbnRzIHRvIG91dHB1dCBzb21lIG1vcmUgZ3ppcHBlZCBkYXRhICovCiAKICAgICAgICAgICAgICAgICBpZiAoIShjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNsLT5idWYgPSBjdHgtPm91dF9idWY7CiAgICAgICAgICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwpAQCAtNjgzLDcgKzY5Myw4IEBACiAgICAgICAgICAgICAgICAgY3R4LT5mbHVzaCA9IFpfTk9fRkxVU0g7CiAKICAgICAgICAgICAgICAgICBpZiAoIShjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNsLT5idWYgPSBjdHgtPm91dF9idWY7CiAgICAgICAgICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwpAQCAtNzAzLDEzICs3MTQsMTUgQEAKICAgICAgICAgICAgICAgICBpZiAocmMgIT0gWl9PSykgewogICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmbGF0ZUVuZCgpIGZhaWxlZDogJWQiLCByYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2d6aXBfZXJyb3IoY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBuZ3hfcGZyZWUoci0+cG9vbCwgY3R4LT5wcmVhbGxvY2F0ZWQpOwogCiAgICAgICAgICAgICAgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2d6aXBfZXJyb3IoY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjbC0+YnVmID0gY3R4LT5vdXRfYnVmOwogICAgICAgICAgICAgICAgIGNsLT5uZXh0ID0gTlVMTDsKQEAgLTcyMywxMyArNzM2LDE1IEBACiAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoIShiID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLCA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgYi0+bGFzdF9idWYgPSAxOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjbC0+YnVmID0gYjsKICAgICAgICAgICAgICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwpAQCAtNzM5LDE5ICs3NTQsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgYi0+bGFzdCArPSA4OwogICAgICAgICAgICAgICAgIH0KIAotI2lmIChOR1hfSEFWRV9MSVRUTEVfRU5ESUFOKQorI2lmIChOR1hfSEFWRV9MSVRUTEVfRU5ESUFOICYmIE5HWF9IQVZFX05PTkFMSUdORUQpCisKICAgICAgICAgICAgICAgICB0cmFpbGVyLT5jcmMzMiA9IGN0eC0+Y3JjMzI7CiAgICAgICAgICAgICAgICAgdHJhaWxlci0+emxlbiA9IGN0eC0+emluOwotI2Vsc2UKLSAgICAgICAgICAgICAgICB0cmFpbGVyLT5jcmMzMlswXSA9IGN0eC0+Y3JjMzIgJiAweGZmOwotICAgICAgICAgICAgICAgIHRyYWlsZXItPmNyYzMyWzFdID0gKGN0eC0+Y3JjMzIgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgICAgIHRyYWlsZXItPmNyYzMyWzJdID0gKGN0eC0+Y3JjMzIgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgICAgICB0cmFpbGVyLT5jcmMzMlszXSA9IChjdHgtPmNyYzMyID4+IDI0KSAmIDB4ZmY7CiAKLSAgICAgICAgICAgICAgICB0cmFpbGVyLT56bGVuWzBdID0gY3R4LT56aW4gJiAweGZmOwotICAgICAgICAgICAgICAgIHRyYWlsZXItPnpsZW5bMV0gPSAoY3R4LT56aW4gPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgICAgIHRyYWlsZXItPnpsZW5bMl0gPSAoY3R4LT56aW4gPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgICAgICB0cmFpbGVyLT56bGVuWzNdID0gKGN0eC0+emluID4+IDI0KSAmIDB4ZmY7CisjZWxzZQorICAgICAgICAgICAgICAgIHRyYWlsZXItPmNyYzMyWzBdID0gKHVfY2hhcikgKGN0eC0+Y3JjMzIgJiAweGZmKTsKKyAgICAgICAgICAgICAgICB0cmFpbGVyLT5jcmMzMlsxXSA9ICh1X2NoYXIpICgoY3R4LT5jcmMzMiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIHRyYWlsZXItPmNyYzMyWzJdID0gKHVfY2hhcikgKChjdHgtPmNyYzMyID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIHRyYWlsZXItPmNyYzMyWzNdID0gKHVfY2hhcikgKChjdHgtPmNyYzMyID4+IDI0KSAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgdHJhaWxlci0+emxlblswXSA9ICh1X2NoYXIpIChjdHgtPnppbiAmIDB4ZmYpOworICAgICAgICAgICAgICAgIHRyYWlsZXItPnpsZW5bMV0gPSAodV9jaGFyKSAoKGN0eC0+emluID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgdHJhaWxlci0+emxlblsyXSA9ICh1X2NoYXIpICgoY3R4LT56aW4gPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgdHJhaWxlci0+emxlblszXSA9ICh1X2NoYXIpICgoY3R4LT56aW4gPj4gMjQpICYgMHhmZik7CiAjZW5kaWYKIAogICAgICAgICAgICAgICAgIGN0eC0+enN0cmVhbS5hdmFpbF9pbiA9IDA7CkBAIC03NjQsNyArNzgxLDggQEAKIAogICAgICAgICAgICAgaWYgKGNvbmYtPm5vX2J1ZmZlciAmJiBjdHgtPmluID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoIShjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOworICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNsLT5idWYgPSBjdHgtPm91dF9idWY7CiAgICAgICAgICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwpAQCAtNzkxLDcgKzgwOSw4IEBACiAgICAgICAgICAqLwogCiAgICAgICAgIGlmIChsYXN0ID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2d6aXBfZXJyb3IoY3R4KTsKKyAgICAgICAgICAgIG5neF9odHRwX2d6aXBfZXJyb3IoY3R4KTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIAogICAgICAgICBuZ3hfY2hhaW5fdXBkYXRlX2NoYWlucygmY3R4LT5mcmVlLCAmY3R4LT5idXN5LCAmY3R4LT5vdXQsCkBAIC04NTgsNyArODc3LDcgQEAKIAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9nemlwX2xvZ19yYXRpbyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIHppbnQsIHpmcmFjOwogICAgIG5neF9odHRwX2d6aXBfY3R4X3QgICpjdHg7CkBAIC04ODksNyArOTA4LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IG5neF9odHRwX2d6aXBfZXJyb3Iobmd4X2h0dHBfZ3ppcF9jdHhfdCAqY3R4KQorc3RhdGljIHZvaWQgbmd4X2h0dHBfZ3ppcF9lcnJvcihuZ3hfaHR0cF9nemlwX2N0eF90ICpjdHgpCiB7CiAgICAgZGVmbGF0ZUVuZCgmY3R4LT56c3RyZWFtKTsKIApAQCAtOTAyLDI2ICs5MjEsMjQgQEAKIAogICAgIGN0eC0+ZG9uZSA9IDE7CiAKLSAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIHJldHVybjsKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfcHJlX2NvbmYobmd4X2NvbmZfdCAqY2YpCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfYWRkX2xvZ19mb3JtYXRzKG5neF9jb25mX3QgKmNmKQogewogICAgIG5neF9odHRwX2xvZ19vcF9uYW1lX3QgICpvcDsKIAogICAgIGZvciAob3AgPSBuZ3hfaHR0cF9nemlwX2xvZ19mbXRfb3BzOyBvcC0+bmFtZS5sZW47IG9wKyspIHsgLyogdm9pZCAqLyB9Ci0gICAgb3AtPm9wID0gTlVMTDsKKyAgICBvcC0+cnVuID0gTlVMTDsKIAotICAgIG9wID0gbmd4X2h0dHBfbG9nX2ZtdF9vcHM7Ci0KLSAgICBmb3IgKG9wID0gbmd4X2h0dHBfbG9nX2ZtdF9vcHM7IG9wLT5vcDsgb3ArKykgeworICAgIGZvciAob3AgPSBuZ3hfaHR0cF9sb2dfZm10X29wczsgb3AtPnJ1bjsgb3ArKykgewogICAgICAgICBpZiAob3AtPm5hbWUubGVuID09IDApIHsKLSAgICAgICAgICAgIG9wID0gKG5neF9odHRwX2xvZ19vcF9uYW1lX3QgKikgb3AtPm9wOworICAgICAgICAgICAgb3AgPSAobmd4X2h0dHBfbG9nX29wX25hbWVfdCAqKSBvcC0+cnVuOwogICAgICAgICB9CiAgICAgfQogCi0gICAgb3AtPm9wID0gKG5neF9odHRwX2xvZ19vcF9wdCkgbmd4X2h0dHBfZ3ppcF9sb2dfZm10X29wczsKKyAgICBvcC0+cnVuID0gKG5neF9odHRwX2xvZ19vcF9ydW5fcHQpIG5neF9odHRwX2d6aXBfbG9nX2ZtdF9vcHM7CiAKICAgICByZXR1cm4gTkdYX09LOwogfQpAQCAtOTQ4LDE0ICs5NjUsMTEgQEAKICAgICB9CiAKICAgICAvKgotCi0gICAgc2V0IGJ5IG5neF9wY2FsbG9jKCk6Ci0KLSAgICBjb25mLT5idWZzLm51bSA9IDA7Ci0gICAgY29uZi0+cHJveGllZCA9IDA7Ci0KLSAgICBjb25mLT50eXBlcyA9IE5VTEw7Ci0KKyAgICAgKiBzZXQgYnkgbmd4X3BjYWxsb2MoKToKKyAgICAgKgorICAgICAqICAgICBjb25mLT5idWZzLm51bSA9IDA7CisgICAgICogICAgIGNvbmYtPnByb3hpZWQgPSAwOworICAgICAqICAgICBjb25mLT50eXBlcyA9IE5VTEw7CiAgICAgICovCiAKICAgICBjb25mLT5lbmFibGUgPSBOR1hfQ09ORl9VTlNFVDsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKaW5kZXggMzVhYjJjNC4uOWNiNmUxNyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKQEAgLTgsMTEgKzgsMTUgQEAKICNpbmNsdWRlIDxuZ3hfY29yZS5oPgogI2luY2x1ZGUgPG5neF9odHRwLmg+CiAKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorCiAKICNkZWZpbmUgTkdYX0RFRkxBVVRfQ0VSVElGSUNBVEUgICAgICAiY2VydC5wZW0iCiAjZGVmaW5lIE5HWF9ERUZMQVVUX0NFUlRJRklDQVRFX0tFWSAgImNlcnQucGVtIgogCiAKK3N0YXRpYyB2b2lkICpuZ3hfaHR0cF9zc2xfY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfc3NsX2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9zc2xfY3JlYXRlX3Nydl9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9zc2xfbWVyZ2Vfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpOwpAQCAtMjAsNiArMjQsMTMgQEAKIAogc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX3NzbF9jb21tYW5kc1tdID0gewogCisgICAgeyBuZ3hfc3RyaW5nKCJzc2xfZW5naW5lIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc3RyX3Nsb3QsCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfc3NsX21haW5fY29uZl90LCBlbmdpbmUpLAorICAgICAgTlVMTCB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJzc2wiKSwKICAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GX0ZMQUcsCiAgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LApAQCAtNDEsNiArNTIsMTMgQEAKICAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzbF9zcnZfY29uZl90LCBjZXJ0aWZpY2F0ZV9rZXkpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJzc2xfY2lwaGVycyIpLAorICAgICAgTkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc3RyX3Nsb3QsCisgICAgICBOR1hfSFRUUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdCwgY2lwaGVycyksCisgICAgICBOVUxMIH0sCisKICAgICAgIG5neF9udWxsX2NvbW1hbmQKIH07CiAKQEAgLTQ4LDggKzY2LDggQEAKIHN0YXRpYyBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfc3NsX21vZHVsZV9jdHggPSB7CiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KIAotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLworICAgIG5neF9odHRwX3NzbF9jcmVhdGVfbWFpbl9jb25mLCAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBuZ3hfaHR0cF9zc2xfaW5pdF9tYWluX2NvbmYsICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwogCiAgICAgbmd4X2h0dHBfc3NsX2NyZWF0ZV9zcnZfY29uZiwgICAgICAgICAgLyogY3JlYXRlIHNlcnZlciBjb25maWd1cmF0aW9uICovCiAgICAgbmd4X2h0dHBfc3NsX21lcmdlX3Nydl9jb25mLCAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTY5LDYgKzg3LDU2IEBACiB9OwogCiAKK3N0YXRpYyB2b2lkICpuZ3hfaHR0cF9zc2xfY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZikKK3sKKyAgICBuZ3hfaHR0cF9zc2xfbWFpbl9jb25mX3QgICptY2Y7CisKKyAgICBpZiAoIShtY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3NzbF9tYWluX2NvbmZfdCkpKSkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzZXQgYnkgbmd4X3BjYWxsb2MoKToKKyAgICAgKgorICAgICAqICAgICBtY2YtPmVuZ2luZS5sZW4gPSAwOworICAgICAqICAgICBtY2YtPmVuZ2luZS5kYXRhID0gTlVMTDsKKyAgICAgKi8KKworICAgIHJldHVybiBtY2Y7Cit9CisKKworc3RhdGljIGNoYXIgKm5neF9odHRwX3NzbF9pbml0X21haW5fY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqY29uZikKK3sKKyAgICBuZ3hfaHR0cF9zc2xfbWFpbl9jb25mX3QgKm1jZiA9IGNvbmY7CisKKyAgICBFTkdJTkUgICplbmdpbmU7CisKKyAgICBpZiAobWNmLT5lbmdpbmUubGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIH0KKworICAgIGVuZ2luZSA9IEVOR0lORV9ieV9pZCgoY29uc3QgY2hhciAqKSBtY2YtPmVuZ2luZS5kYXRhKTsKKworICAgIGlmIChlbmdpbmUgPT0gTlVMTCkgeworICAgICAgICBuZ3hfc3NsX2Vycm9yKE5HWF9MT0dfV0FSTiwgY2YtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAiRU5HSU5FX2J5X2lkKFwiJVZcIikgZmFpbGVkIiwgJm1jZi0+ZW5naW5lKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGlmIChFTkdJTkVfc2V0X2RlZmF1bHQoZW5naW5lLCBFTkdJTkVfTUVUSE9EX0FMTCkgPT0gMCkgeworICAgICAgICBuZ3hfc3NsX2Vycm9yKE5HWF9MT0dfV0FSTiwgY2YtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAiRU5HSU5FX3NldF9kZWZhdWx0KFwiJVZcIiwgRU5HSU5FX01FVEhPRF9BTEwpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgJm1jZi0+ZW5naW5lKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIEVOR0lORV9mcmVlKGVuZ2luZSk7CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CisKKwogc3RhdGljIHZvaWQgKm5neF9odHRwX3NzbF9jcmVhdGVfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YpCiB7CiAgICAgbmd4X2h0dHBfc3NsX3Nydl9jb25mX3QgICpzY2Y7CkBAIC03Nyw2ICsxNDUsMTcgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAorICAgIC8qCisgICAgICogc2V0IGJ5IG5neF9wY2FsbG9jKCk6CisgICAgICoKKyAgICAgKiAgICAgc2NmLT5jZXJ0aWZpY2F0ZS5sZW4gPSAwOworICAgICAqICAgICBzY2YtPmNlcnRpZmljYXRlLmRhdGEgPSBOVUxMOworICAgICAqICAgICBzY2YtPmNlcnRpZmljYXRlX2tleS5sZW4gPSAwOworICAgICAqICAgICBzY2YtPmNlcnRpZmljYXRlX2tleS5kYXRhID0gTlVMTDsKKyAgICAgKiAgICAgc2NmLT5jaXBoZXJzLmxlbiA9IDA7CisgICAgICogICAgIHNjZi0+Y2lwaGVycy5kYXRhID0gTlVMTDsKKyAgICAgKi8KKwogICAgIHNjZi0+ZW5hYmxlID0gTkdYX0NPTkZfVU5TRVQ7CiAKICAgICByZXR1cm4gc2NmOwpAQCAtMTAxLDYgKzE4MCw5IEBACiAgICAgbmd4X2NvbmZfbWVyZ2Vfc3RyX3ZhbHVlKGNvbmYtPmNlcnRpZmljYXRlX2tleSwgcHJldi0+Y2VydGlmaWNhdGVfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfREVGTEFVVF9DRVJUSUZJQ0FURV9LRVkpOwogCisgICAgbmd4X2NvbmZfbWVyZ2Vfc3RyX3ZhbHVlKGNvbmYtPmNpcGhlcnMsIHByZXYtPmNpcGhlcnMsICIiKTsKKworCiAgICAgLyogVE9ETzogY29uZmlndXJlIG1ldGhvZHMgKi8KIAogICAgIGNvbmYtPnNzbF9jdHggPSBTU0xfQ1RYX25ldyhTU0x2MjNfc2VydmVyX21ldGhvZCgpKTsKQEAgLTExMCw2ICsxOTIsMTYgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChjb25mLT5jaXBoZXJzLmxlbikgeworICAgICAgICBpZiAoU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY29uZi0+c3NsX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgY29uZi0+Y2lwaGVycy5kYXRhKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBuZ3hfc3NsX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChcIiVWXCIpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25mLT5jaXBoZXJzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKGNvbmYtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgY29uZi0+Y2VydGlmaWNhdGUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfRklMRVRZUEVfUEVNKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuaCBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5oCmluZGV4IGVhY2EyYTYuLjg3MTY2ODcgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5oCkBAIC0xNCwxMCArMTQsMTcgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X3N0cl90ICAgICAgIGVuZ2luZTsKK30gbmd4X2h0dHBfc3NsX21haW5fY29uZl90OworCisKK3R5cGVkZWYgc3RydWN0IHsKICAgICBuZ3hfZmxhZ190ICAgICAgZW5hYmxlOwogICAgIG5neF9zdHJfdCAgICAgICBjZXJ0aWZpY2F0ZTsKICAgICBuZ3hfc3RyX3QgICAgICAgY2VydGlmaWNhdGVfa2V5OwogCisgICAgbmd4X3N0cl90ICAgICAgIGNpcGhlcnM7CisKICAgICBuZ3hfc3NsX2N0eF90ICAqc3NsX2N0eDsKIH0gbmd4X2h0dHBfc3NsX3Nydl9jb25mX3Q7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfdXNlcmlkX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyLmMKaW5kZXggMjM4NWNlZS4uYWVlMTYxYiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyLmMKQEAgLTQ0LDEzICs0NCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91c2VyaWRfY3R4X3QgKmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXNlcmlkX2NvbmZfdCAqY29uZik7CiAKK3N0YXRpYyBzaXplX3Qgbmd4X2h0dHBfdXNlcmlkX2xvZ191aWRfZ290X2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfdXNlcmlkX2xvZ191aWRfZ290KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CitzdGF0aWMgc2l6ZV90IG5neF9odHRwX3VzZXJpZF9sb2dfdWlkX3NldF9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3VzZXJpZF9sb2dfdWlkX3NldChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3VzZXJpZF9hZGRfbG9nX2Zvcm1hdHMobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF91c2VyaWRfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF91c2VyaWRfcHJlX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX3VzZXJpZF9jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfdXNlcmlkX21lcmdlX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjaGlsZCk7CkBAIC0xNDIsNyArMTQ2LDcgQEAKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGVfY3R4ID0gewotICAgIG5neF9odHRwX3VzZXJpZF9wcmVfY29uZiwgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgbmd4X2h0dHBfdXNlcmlkX2FkZF9sb2dfZm9ybWF0cywgICAgICAgLyogcHJlIGNvbmYgKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtMTY2LDkgKzE3MCwxMyBAQAogCiAKIHN0YXRpYyBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90IG5neF9odHRwX3VzZXJpZF9sb2dfZm10X29wc1tdID0gewotICAgIHsgbmd4X3N0cmluZygidWlkX2dvdCIpLCAwLCBuZ3hfaHR0cF91c2VyaWRfbG9nX3VpZF9nb3QgfSwKLSAgICB7IG5neF9zdHJpbmcoInVpZF9zZXQiKSwgMCwgbmd4X2h0dHBfdXNlcmlkX2xvZ191aWRfc2V0IH0sCi0gICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAsIE5VTEwgfQorICAgIHsgbmd4X3N0cmluZygidWlkX2dvdCIpLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91c2VyaWRfbG9nX3VpZF9nb3RfZ2V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91c2VyaWRfbG9nX3VpZF9nb3QgfSwKKyAgICB7IG5neF9zdHJpbmcoInVpZF9zZXQiKSwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXNlcmlkX2xvZ191aWRfc2V0X2dldGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXNlcmlkX2xvZ191aWRfc2V0IH0sCisgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfQogfTsKIAogCkBAIC0yOTgsNyArMzA2LDcgQEAKICAgICB1X2NoYXIgICAgICAgICAgICAgICpjb29raWUsICpwOwogICAgIHNpemVfdCAgICAgICAgICAgICAgIGxlbjsKICAgICBzb2NrbGVuX3QgICAgICAgICAgICBzbGVuOwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgIGFkZHJfaW47CisgICAgc3RydWN0IHNvY2thZGRyX2luICAgc2luOwogICAgIG5neF9zdHJfdCAgICAgICAgICAgIHNyYywgZHN0OwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgKnNldF9jb29raWUsICpwM3A7CiAKQEAgLTMyMSwxNCArMzI5LDEzIEBACiAgICAgICAgICAgICBpZiAoci0+aW5fYWRkciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgc2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwogICAgICAgICAgICAgICAgIGlmIChnZXRzb2NrbmFtZShyLT5jb25uZWN0aW9uLT5mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcl9pbiwgJnNsZW4pID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopICZzaW4sICZzbGVuKSA9PSAtMSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCByLT5jb25uZWN0aW9uLT5sb2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3NvY2tldF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0c29ja25hbWUoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc29ja2V0X2Vycm5vLCAiZ2V0c29ja25hbWUoKSBmYWlsZWQiKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByLT5pbl9hZGRyID0gYWRkcl9pbi5zaW5fYWRkci5zX2FkZHI7CisgICAgICAgICAgICAgICAgci0+aW5fYWRkciA9IHNpbi5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGN0eC0+dWlkX3NldFswXSA9IGh0b25sKHItPmluX2FkZHIpOwpAQCAtMzUyLDcgKzM1OSw3IEBACiAgICAgICAgIGxlbiArPSBzaXplb2YoZXhwaXJlcykgLSAxICsgMjsKICAgICB9CiAKLSAgICBpZiAoY29uZi0+ZG9tYWluLmxlbiA+IDEpIHsKKyAgICBpZiAoY29uZi0+ZG9tYWluLmxlbikgewogICAgICAgICBsZW4gKz0gY29uZi0+ZG9tYWluLmxlbjsKICAgICB9CiAKQEAgLTM3OSw3ICszODYsNyBAQAogICAgICAgICBwID0gbmd4X2h0dHBfY29va2llX3RpbWUocCwgbmd4X3RpbWUoKSArIGNvbmYtPmV4cGlyZXMpOwogICAgIH0KIAotICAgIGlmIChjb25mLT5kb21haW4ubGVuID4gMSkgeworICAgIGlmIChjb25mLT5kb21haW4ubGVuKSB7CiAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIGNvbmYtPmRvbWFpbi5kYXRhLCBjb25mLT5kb21haW4ubGVuKTsKICAgICB9CiAKQEAgLTM5Nyw3ICs0MDQsNyBAQAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJ1aWQgY29va2llOiBcIiVWXCIiLCAmc2V0X2Nvb2tpZS0+dmFsdWUpOwogCi0gICAgaWYgKGNvbmYtPnAzcC5sZW4gPT0gMSkgeworICAgIGlmIChjb25mLT5wM3AubGVuID09IDApIHsKICAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKQEAgLTQxMyw4ICs0MjAsOCBAQAogfQogCiAKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3VzZXJpZF9sb2dfdWlkX2dvdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIHNpemVfdCBuZ3hfaHR0cF91c2VyaWRfbG9nX3VpZF9nb3RfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKIHsKICAgICBuZ3hfaHR0cF91c2VyaWRfY3R4X3QgICAqY3R4OwogICAgIG5neF9odHRwX3VzZXJpZF9jb25mX3QgICpjb25mOwpAQCAtNDIyLDIwICs0MjksMzAgQEAKICAgICBjdHggPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZSk7CiAKICAgICBpZiAoY3R4ID09IE5VTEwgfHwgY3R4LT51aWRfZ290WzNdID09IDApIHsKLSAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAxOwotICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAorICAgIGNvbmYgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3VzZXJpZF9maWx0ZXJfbW9kdWxlKTsKKworICAgIHJldHVybiBjb25mLT5uYW1lLmxlbiArIDEgKyAzMjsKK30KKworCitzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF91c2VyaWRfbG9nX3VpZF9nb3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCit7CisgICAgbmd4X2h0dHBfdXNlcmlkX2N0eF90ICAgKmN0eDsKKyAgICBuZ3hfaHR0cF91c2VyaWRfY29uZl90ICAqY29uZjsKKworICAgIGN0eCA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHIsIG5neF9odHRwX3VzZXJpZF9maWx0ZXJfbW9kdWxlKTsKKworICAgIGlmIChjdHggPT0gTlVMTCB8fCBjdHgtPnVpZF9nb3RbM10gPT0gMCkgewogICAgICAgICAqYnVmID0gJy0nOwogICAgICAgICByZXR1cm4gYnVmICsgMTsKICAgICB9CiAKICAgICBjb25mID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZSk7CiAKLSAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgKGNvbmYtPm5hbWUubGVuICsgMSArIDMyKTsKLSAgICB9Ci0KICAgICBidWYgPSBuZ3hfY3B5bWVtKGJ1ZiwgY29uZi0+bmFtZS5kYXRhLCBjb25mLT5uYW1lLmxlbik7CiAKICAgICAqYnVmKysgPSAnPSc7CkBAIC00NDYsOCArNDYzLDggQEAKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF91c2VyaWRfbG9nX3VpZF9zZXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBzaXplX3Qgbmd4X2h0dHBfdXNlcmlkX2xvZ191aWRfc2V0X2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCiB7CiAgICAgbmd4X2h0dHBfdXNlcmlkX2N0eF90ICAgKmN0eDsKICAgICBuZ3hfaHR0cF91c2VyaWRfY29uZl90ICAqY29uZjsKQEAgLTQ1NSwyMCArNDcyLDMwIEBACiAgICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUpOwogCiAgICAgaWYgKGN0eCA9PSBOVUxMIHx8IGN0eC0+dWlkX3NldFszXSA9PSAwKSB7Ci0gICAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgMTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKKyAgICBjb25mID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZSk7CisKKyAgICByZXR1cm4gY29uZi0+bmFtZS5sZW4gKyAxICsgMzI7Cit9CisKKworc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfdXNlcmlkX2xvZ191aWRfc2V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQoreworICAgIG5neF9odHRwX3VzZXJpZF9jdHhfdCAgICpjdHg7CisgICAgbmd4X2h0dHBfdXNlcmlkX2NvbmZfdCAgKmNvbmY7CisKKyAgICBjdHggPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZSk7CisKKyAgICBpZiAoY3R4ID09IE5VTEwgfHwgY3R4LT51aWRfc2V0WzNdID09IDApIHsKICAgICAgICAgKmJ1ZiA9ICctJzsKICAgICAgICAgcmV0dXJuIGJ1ZiArIDE7CiAgICAgfQogCiAgICAgY29uZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUpOwogCi0gICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAodV9jaGFyICopIChjb25mLT5uYW1lLmxlbiArIDEgKyAzMik7Ci0gICAgfQotCiAgICAgYnVmID0gbmd4X2NweW1lbShidWYsIGNvbmYtPm5hbWUuZGF0YSwgY29uZi0+bmFtZS5sZW4pOwogCiAgICAgKmJ1ZisrID0gJz0nOwpAQCAtNDc5LDMxICs1MDYsMjkgQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3VzZXJpZF9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXNlcmlkX2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZikKIHsKLSAgICBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIgPSBuZ3hfaHR0cF90b3BfaGVhZGVyX2ZpbHRlcjsKLSAgICBuZ3hfaHR0cF90b3BfaGVhZGVyX2ZpbHRlciA9IG5neF9odHRwX3VzZXJpZF9maWx0ZXI7CisgICAgbmd4X2h0dHBfbG9nX29wX25hbWVfdCAgKm9wOworCisgICAgZm9yIChvcCA9IG5neF9odHRwX3VzZXJpZF9sb2dfZm10X29wczsgb3AtPm5hbWUubGVuOyBvcCsrKSB7IC8qIHZvaWQgKi8gfQorICAgIG9wLT5ydW4gPSBOVUxMOworCisgICAgZm9yIChvcCA9IG5neF9odHRwX2xvZ19mbXRfb3BzOyBvcC0+cnVuOyBvcCsrKSB7CisgICAgICAgIGlmIChvcC0+bmFtZS5sZW4gPT0gMCkgeworICAgICAgICAgICAgb3AgPSAobmd4X2h0dHBfbG9nX29wX25hbWVfdCAqKSBvcC0+cnVuOworICAgICAgICB9CisgICAgfQorCisgICAgb3AtPnJ1biA9IChuZ3hfaHR0cF9sb2dfb3BfcnVuX3B0KSBuZ3hfaHR0cF91c2VyaWRfbG9nX2ZtdF9vcHM7CiAKICAgICByZXR1cm4gTkdYX09LOwogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXNlcmlkX3ByZV9jb25mKG5neF9jb25mX3QgKmNmKQorc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF91c2VyaWRfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7Ci0gICAgbmd4X2h0dHBfbG9nX29wX25hbWVfdCAgKm9wOwotCi0gICAgZm9yIChvcCA9IG5neF9odHRwX3VzZXJpZF9sb2dfZm10X29wczsgb3AtPm5hbWUubGVuOyBvcCsrKSB7IC8qIHZvaWQgKi8gfQotICAgIG9wLT5vcCA9IE5VTEw7Ci0KLSAgICBvcCA9IG5neF9odHRwX2xvZ19mbXRfb3BzOwotCi0gICAgZm9yIChvcCA9IG5neF9odHRwX2xvZ19mbXRfb3BzOyBvcC0+b3A7IG9wKyspIHsKLSAgICAgICAgaWYgKG9wLT5uYW1lLmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICBvcCA9IChuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICopIG9wLT5vcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG9wLT5vcCA9IChuZ3hfaHR0cF9sb2dfb3BfcHQpIG5neF9odHRwX3VzZXJpZF9sb2dfZm10X29wczsKKyAgICBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIgPSBuZ3hfaHR0cF90b3BfaGVhZGVyX2ZpbHRlcjsKKyAgICBuZ3hfaHR0cF90b3BfaGVhZGVyX2ZpbHRlciA9IG5neF9odHRwX3VzZXJpZF9maWx0ZXI7CiAKICAgICByZXR1cm4gTkdYX09LOwogfQpAQCAtNTE3LDE4ICs1NDIsMTggQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIC8qIHNldCBieSBuZ3hfcGNhbGxvYygpOgotCi0gICAgY29uZi0+bmFtZS5sZW4gPSAwOwotICAgIGNvbmYtPm5hbWUuZGF0ZSA9IE5VTEw7Ci0gICAgY29uZi0+ZG9tYWluLmxlbiA9IDA7Ci0gICAgY29uZi0+ZG9tYWluLmRhdGUgPSBOVUxMOwotICAgIGNvbmYtPnBhdGgubGVuID0gMDsKLSAgICBjb25mLT5wYXRoLmRhdGUgPSBOVUxMOwotICAgIGNvbmYtPnAzcC5sZW4gPSAwOwotICAgIGNvbmYtPnAzcC5kYXRlID0gTlVMTDsKLQotICAgICovCisgICAgLyoKKyAgICAgKiBzZXQgYnkgbmd4X3BjYWxsb2MoKToKKyAgICAgKgorICAgICAqICAgICBjb25mLT5uYW1lLmxlbiA9IDA7CisgICAgICogICAgIGNvbmYtPm5hbWUuZGF0ZSA9IE5VTEw7CisgICAgICogICAgIGNvbmYtPmRvbWFpbi5sZW4gPSAwOworICAgICAqICAgICBjb25mLT5kb21haW4uZGF0ZSA9IE5VTEw7CisgICAgICogICAgIGNvbmYtPnBhdGgubGVuID0gMDsKKyAgICAgKiAgICAgY29uZi0+cGF0aC5kYXRlID0gTlVMTDsKKyAgICAgKiAgICAgY29uZi0+cDNwLmxlbiA9IDA7CisgICAgICogICAgIGNvbmYtPnAzcC5kYXRlID0gTlVMTDsKKyAgICAgKi8KIAogICAgIGNvbmYtPmVuYWJsZSA9IE5HWF9DT05GX1VOU0VUOwogICAgIGNvbmYtPnNlcnZpY2UgPSBOR1hfQ09ORl9VTlNFVDsKQEAgLTU0Nyw5ICs1NzIsOSBAQAogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmVuYWJsZSwgcHJldi0+ZW5hYmxlLCBOR1hfSFRUUF9VU0VSSURfT0ZGKTsKIAogICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5uYW1lLCBwcmV2LT5uYW1lLCAidWlkIik7Ci0gICAgbmd4X2NvbmZfbWVyZ2Vfc3RyX3ZhbHVlKGNvbmYtPmRvbWFpbiwgcHJldi0+ZG9tYWluLCAiLiIpOworICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5kb21haW4sIHByZXYtPmRvbWFpbiwgIiIpOwogICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5wYXRoLCBwcmV2LT5wYXRoLCAiOyBwYXRoPS8iKTsKLSAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+cDNwLCBwcmV2LT5wM3AsICIuIik7CisgICAgbmd4X2NvbmZfbWVyZ2Vfc3RyX3ZhbHVlKGNvbmYtPnAzcCwgcHJldi0+cDNwLCAiIik7CiAKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5zZXJ2aWNlLCBwcmV2LT5zZXJ2aWNlLCBOR1hfQ09ORl9VTlNFVCk7CiAgICAgbmd4X2NvbmZfbWVyZ2Vfc2VjX3ZhbHVlKGNvbmYtPmV4cGlyZXMsIHByZXYtPmV4cGlyZXMsIDApOwpAQCAtNTY1LDggKzU5MCw4IEBACiAgICAgdV9jaGFyICAqcCwgKm5ldzsKIAogICAgIGlmIChkb21haW4tPmxlbiA9PSA0ICYmIG5neF9zdHJjbXAoZG9tYWluLT5kYXRhLCAibm9uZSIpID09IDApIHsKLSAgICAgICAgZG9tYWluLT5sZW4gPSAxOwotICAgICAgICBkb21haW4tPmRhdGEgPSAodV9jaGFyICopICIuIjsKKyAgICAgICAgZG9tYWluLT5sZW4gPSAwOworICAgICAgICBkb21haW4tPmRhdGEgPSAodV9jaGFyICopICIiOwogCiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKICAgICB9CkBAIC02NDUsOCArNjcwLDggQEAKICAgICBuZ3hfc3RyX3QgICpwM3AgPSBkYXRhOwogCiAgICAgaWYgKHAzcC0+bGVuID09IDQgJiYgbmd4X3N0cmNtcChwM3AtPmRhdGEsICJub25lIikgPT0gMCkgewotICAgICAgICBwM3AtPmxlbiA9IDE7Ci0gICAgICAgIHAzcC0+ZGF0YSA9ICh1X2NoYXIgKikgIi4iOworICAgICAgICBwM3AtPmxlbiA9IDA7CisgICAgICAgIHAzcC0+ZGF0YSA9ICh1X2NoYXIgKikgIiI7CiAgICAgfQogCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYwppbmRleCA2MmUzNDhlLi43YTFjMDNjIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYwpAQCAtMTMsMTQgKzEzLDIwIEBACiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Byb3h5X2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfY2FjaGVfZ2V0KG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKIAorc3RhdGljIHNpemVfdCBuZ3hfaHR0cF9wcm94eV9sb2dfcHJveHlfc3RhdGVfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9wcm94eV9sb2dfcHJveHlfc3RhdGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLCB1aW50cHRyX3QgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKKworI2lmIDAKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Byb3h5X2xvZ19jYWNoZV9zdGF0ZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Byb3h5X2xvZ19yZWFzb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworI2VuZGlmCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfcHJlX2NvbmYobmd4X2NvbmZfdCAqY2YpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9hZGRfbG9nX2Zvcm1hdHMobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX3Byb3h5X2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfcHJveHlfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CkBAIC0yMzEsNyArMjM3LDYgQEAKICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIGRlZmF1bHRfZXhwaXJlcyksCiAgICAgICBOVUxMIH0sCiAKLQogICAgIHsgbmd4X3N0cmluZygicHJveHlfbmV4dF91cHN0cmVhbSIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0FOWSwKICAgICAgIG5neF9jb25mX3NldF9iaXRtYXNrX3Nsb3QsCkBAIC0yNTEsNyArMjU2LDcgQEAKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfcHJveHlfbW9kdWxlX2N0eCA9IHsKLSAgICBuZ3hfaHR0cF9wcm94eV9wcmVfY29uZiwgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIG5neF9odHRwX3Byb3h5X2FkZF9sb2dfZm9ybWF0cywgICAgICAgIC8qIHByZSBjb25mICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTI3MCwxNiArMjc1LDIyIEBACiAgICAgbmd4X2h0dHBfcHJveHlfY29tbWFuZHMsICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbW9kdWxlICovCi0gICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBjaGlsZCAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgcHJvY2VzcyAqLwogfTsKIAogCiAKIHN0YXRpYyBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90IG5neF9odHRwX3Byb3h5X2xvZ19mbXRfb3BzW10gPSB7Ci0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eSIpLCAwLCBuZ3hfaHR0cF9wcm94eV9sb2dfcHJveHlfc3RhdGUgfSwKKyAgICB7IG5neF9zdHJpbmcoInByb3h5IiksIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9sb2dfcHJveHlfc3RhdGVfZ2V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfbG9nX3Byb3h5X3N0YXRlIH0sCisKKyNpZiAwCiAgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9jYWNoZV9zdGF0ZSIpLCAwLCBuZ3hfaHR0cF9wcm94eV9sb2dfY2FjaGVfc3RhdGUgfSwKICAgICB7IG5neF9zdHJpbmcoInByb3h5X3JlYXNvbiIpLCAwLCBuZ3hfaHR0cF9wcm94eV9sb2dfcmVhc29uIH0sCi0gICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAsIE5VTEwgfQorI2VuZGlmCisKKyAgICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCwgTlVMTCwgTlVMTCB9CiB9OwogCiAKQEAgLTMwMSw4ICszMTIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGNvbnRlbnRfdHlwZSkgfSwKICAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgY29udGVudF9sZW5ndGgpIH0sCisKKyNpZiAoTkdYX0hUVFBfR1pJUCkKICAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtRW5jb2RpbmciKSwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgY29udGVudF9lbmNvZGluZykgfSwKKyNlbmRpZgorCiAgICAgeyBuZ3hfc3RyaW5nKCJMYXN0LU1vZGlmaWVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGxhc3RfbW9kaWZpZWQpIH0sCiAgICAgeyBuZ3hfc3RyaW5nKCJMb2NhdGlvbiIpLApAQCAtNzc5LDExICs3OTQsMTIgQEAKICAgICBwZWVyID0gJmN0eC0+cHJveHktPnVwc3RyZWFtLT5wZWVyOwogCiAgICAgcCA9IG5neF9zbnByaW50ZihidWYsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICIgd2hpbGUgJXMsIGNsaWVudDogJVYsIFVSTDogJVYsIHVwc3RyZWFtOiAlViVWIiwKKyAgICAgICAgICAgICAgICAgICAgICIgd2hpbGUgJXMsIGNsaWVudDogJVYsIFVSTDogJVYsIHVwc3RyZWFtOiBodHRwOi8vJVYlcyVWIiwKICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cHJveHktPmFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICZyLT5jb25uZWN0aW9uLT5hZGRyX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAmci0+dW5wYXJzZWRfdXJpLAotICAgICAgICAgICAgICAgICAgICAgJnBlZXItPnBlZXJzLT5wZWVyc1twZWVyLT5jdXJfcGVlcl0uYWRkcl9wb3J0X3RleHQsCisgICAgICAgICAgICAgICAgICAgICAmcGVlci0+cGVlcnMtPnBlZXJbcGVlci0+Y3VyX3BlZXJdLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBjdHgtPnByb3h5LT5sY2YtPnVwc3RyZWFtLT51cmlfc2VwYXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgJmN0eC0+cHJveHktPmxjZi0+dXBzdHJlYW0tPnVyaSk7CiAgICAgbGVuIC09IHAgLSBidWY7CiAgICAgYnVmID0gcDsKQEAgLTgzNSw4ICs4NTEsMjQgQEAKIH0KIAogCitzdGF0aWMgc2l6ZV90IG5neF9odHRwX3Byb3h5X2xvZ19wcm94eV9zdGF0ZV9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQoreworICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICAqcDsKKworICAgIHAgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2Vycl9jdHgociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKKworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIHAtPnN0YXRlcy5uZWx0cyAqIC8qIFNUVUIgKi8gMTAwOworfQorCisKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Byb3h5X2xvZ19wcm94eV9zdGF0ZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsIHVpbnRwdHJfdCBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKIHsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgaTsKICAgICBuZ3hfaHR0cF9wcm94eV9jdHhfdCAgICAqcDsKQEAgLTg0NSwyMSArODc3LDEwIEBACiAgICAgcCA9IG5neF9odHRwX2dldF9tb2R1bGVfZXJyX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwogCiAgICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopIDE7Ci0gICAgICAgIH0KLQogICAgICAgICAqYnVmID0gJy0nOwogICAgICAgICByZXR1cm4gYnVmICsgMTsKICAgICB9CiAKLQotICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICAvKiBmaW5kIHRoZSByZXF1ZXN0IGxpbmUgbGVuZ3RoICovCi0gICAgICAgIHJldHVybiAodV9jaGFyICopICh1aW50cHRyX3QpIChwLT5zdGF0ZXMubmVsdHMgKiAvKiBTVFVCICovIDEwMCk7Ci0gICAgfQotCi0KICAgICBpID0gMDsKICAgICBzdGF0ZSA9IHAtPnN0YXRlcy5lbHRzOwogCkBAIC05MzUsNiArOTU2LDggQEAKIH0KIAogCisjaWYgMAorCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9wcm94eV9sb2dfY2FjaGVfc3RhdGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLCB1aW50cHRyX3QgZGF0YSkKIHsKQEAgLTEwMTQsMjMgKzEwMzcsMjMgQEAKICAgICB9CiB9CiAKKyNlbmRpZgogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Byb3h5X3ByZV9jb25mKG5neF9jb25mX3QgKmNmKQorCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Byb3h5X2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZikKIHsKICAgICBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICAqb3A7CiAKICAgICBmb3IgKG9wID0gbmd4X2h0dHBfcHJveHlfbG9nX2ZtdF9vcHM7IG9wLT5uYW1lLmxlbjsgb3ArKykgeyAvKiB2b2lkICovIH0KLSAgICBvcC0+b3AgPSBOVUxMOworICAgIG9wLT5ydW4gPSBOVUxMOwogCi0gICAgb3AgPSBuZ3hfaHR0cF9sb2dfZm10X29wczsKLQotICAgIGZvciAob3AgPSBuZ3hfaHR0cF9sb2dfZm10X29wczsgb3AtPm9wOyBvcCsrKSB7CisgICAgZm9yIChvcCA9IG5neF9odHRwX2xvZ19mbXRfb3BzOyBvcC0+cnVuOyBvcCsrKSB7CiAgICAgICAgIGlmIChvcC0+bmFtZS5sZW4gPT0gMCkgewotICAgICAgICAgICAgb3AgPSAobmd4X2h0dHBfbG9nX29wX25hbWVfdCAqKSBvcC0+b3A7CisgICAgICAgICAgICBvcCA9IChuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICopIG9wLT5ydW47CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBvcC0+b3AgPSAobmd4X2h0dHBfbG9nX29wX3B0KSBuZ3hfaHR0cF9wcm94eV9sb2dfZm10X29wczsKKyAgICBvcC0+cnVuID0gKG5neF9odHRwX2xvZ19vcF9ydW5fcHQpIG5neF9odHRwX3Byb3h5X2xvZ19mbXRfb3BzOwogCiAgICAgcmV0dXJuIE5HWF9PSzsKIH0KQEAgLTEwNDQsMjQgKzEwNjcsMTkgQEAKICAgICAgICAgICAgICAgICAgIG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCkpLAogICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOwogCi0gICAgLyogc2V0IGJ5IG5neF9wY2FsbG9jKCk6Ci0KLSAgICBjb25mLT5idWZzLm51bSA9IDA7Ci0KLSAgICBjb25mLT5wYXRoID0gTlVMTDsKLQotICAgIGNvbmYtPm5leHRfdXBzdHJlYW0gPSAwOwotICAgIGNvbmYtPnVzZV9zdGFsZSA9IDA7Ci0KLSAgICBjb25mLT51cHN0cmVhbXMgPSBOVUxMOwotICAgIGNvbmYtPnBlZXJzID0gTlVMTDsKLQotICAgIGNvbmYtPmNhY2hlX3BhdGggPSBOVUxMOwotICAgIGNvbmYtPnRlbXBfcGF0aCA9IE5VTEw7Ci0KLSAgICBjb25mLT5idXN5X2xvY2sgPSBOVUxMOwotCi0gICAgKi8KKyAgICAvKgorICAgICAqIHNldCBieSBuZ3hfcGNhbGxvYygpOgorICAgICAqCisgICAgICogICAgY29uZi0+YnVmcy5udW0gPSAwOworICAgICAqICAgIGNvbmYtPnBhdGggPSBOVUxMOworICAgICAqICAgIGNvbmYtPm5leHRfdXBzdHJlYW0gPSAwOworICAgICAqICAgIGNvbmYtPnVzZV9zdGFsZSA9IDA7CisgICAgICogICAgY29uZi0+dXBzdHJlYW1zID0gTlVMTDsKKyAgICAgKiAgICBjb25mLT5wZWVycyA9IE5VTEw7CisgICAgICogICAgY29uZi0+Y2FjaGVfcGF0aCA9IE5VTEw7CisgICAgICogICAgY29uZi0+dGVtcF9wYXRoID0gTlVMTDsKKyAgICAgKiAgICBjb25mLT5idXN5X2xvY2sgPSBOVUxMOworICAgICAqLwogCiAgICAgY29uZi0+Y29ubmVjdF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKICAgICBjb25mLT5zZW5kX3RpbWVvdXQgPSBOR1hfQ09ORl9VTlNFVF9NU0VDOwpAQCAtMTIxMCwxMSArMTIyOCwxNSBAQAogICAgIG5neF9jb25mX21lcmdlX2JpdG1hc2tfdmFsdWUoY29uZi0+dXNlX3N0YWxlLCBwcmV2LT51c2Vfc3RhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9CSVRNQVNLX1NFVCk7CiAKKyNpZiAwCiAgICAgbmd4X2NvbmZfbWVyZ2VfcGF0aF92YWx1ZShjb25mLT5jYWNoZV9wYXRoLCBwcmV2LT5jYWNoZV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIiwgMSwgMiwgMCwgY2YtPnBvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfUFJPWFlfQ0FDSEVfUEFUSCwgMSwgMiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9nYXJiYWdlX2NvbGxlY3Rvcl90ZW1wX2hhbmRsZXIsIGNmKTsKKyNlbmRpZgogCiAgICAgbmd4X2NvbmZfbWVyZ2VfcGF0aF92YWx1ZShjb25mLT50ZW1wX3BhdGgsIHByZXYtPnRlbXBfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wIiwgMSwgMiwgMCwgY2YtPnBvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfUFJPWFlfVEVNUF9QQVRILCAxLCAyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2dhcmJhZ2VfY29sbGVjdG9yX3RlbXBfaGFuZGxlciwgY2YpOwogCiAgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+Y2FjaGUsIHByZXYtPmNhY2hlLCAwKTsKIApAQCAtMTI1NiwyNCArMTI3OCwyMyBAQAogfQogCiAKLQogc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3NldF9wYXNzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZikKIHsKICAgICBuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90ICpsY2YgPSBjb25mOwogCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgaSwgbGVuOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKmVycjsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICpob3N0OwotICAgIGluX2FkZHJfdCAgICAgICAgICAgICAgICAgIGFkZHI7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAqdmFsdWU7Ci0gICAgc3RydWN0IGhvc3RlbnQgICAgICAgICAgICAqaDsKLSAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOwotCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICp2YWx1ZSwgKnVybDsKKyAgICBuZ3hfaW5ldF91cHN0cmVhbV90ICAgICAgICAgIGluZXRfdXBzdHJlYW07CisgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgICpjbGNmOworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKKyAgICBuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCAgIHVuaXhfdXBzdHJlYW07CisjZW5kaWYKIAogICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CiAKLSAgICBpZiAobmd4X3N0cm5jYXNlY21wKHZhbHVlWzFdLmRhdGEsICJodHRwOi8vIiwgNykgIT0gMCkgeworICAgIHVybCA9ICZ2YWx1ZVsxXTsKKworICAgIGlmIChuZ3hfc3RybmNhc2VjbXAodXJsLT5kYXRhLCAiaHR0cDovLyIsIDcpICE9IDApIHsKICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLCAiaW52YWxpZCBVUkwgcHJlZml4Iik7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CkBAIC0xMjg0LDEyMSArMTMwNSw1MiBAQAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgbGNmLT51cHN0cmVhbS0+dXJsLmxlbiA9IHZhbHVlWzFdLmxlbjsKLSAgICBpZiAoIShsY2YtPnVwc3RyZWFtLT51cmwuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHZhbHVlWzFdLmxlbiArIDEpKSkgewotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQorICAgIGlmIChuZ3hfc3RybmNhc2VjbXAodXJsLT5kYXRhICsgNywgInVuaXg6IiwgNSkgPT0gMCkgewogCi0gICAgbmd4X2NweXN0cm4obGNmLT51cHN0cmVhbS0+dXJsLmRhdGEsIHZhbHVlWzFdLmRhdGEsIHZhbHVlWzFdLmxlbiArIDEpOworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKIAotICAgIHZhbHVlWzFdLmRhdGEgKz0gNzsKLSAgICB2YWx1ZVsxXS5sZW4gLT0gNzsKKyAgICAgICAgbmd4X21lbXplcm8oJnVuaXhfdXBzdHJlYW0sIHNpemVvZihuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCkpOwogCi0gICAgZXJyID0gbmd4X2h0dHBfcHJveHlfcGFyc2VfdXBzdHJlYW0oJnZhbHVlWzFdLCBsY2YtPnVwc3RyZWFtKTsKKyAgICAgICAgdW5peF91cHN0cmVhbS5uYW1lID0gKnVybDsKKyAgICAgICAgdW5peF91cHN0cmVhbS51cmwubGVuID0gdXJsLT5sZW4gLSA3OworICAgICAgICB1bml4X3Vwc3RyZWFtLnVybC5kYXRhID0gdXJsLT5kYXRhICsgNzsKKyAgICAgICAgdW5peF91cHN0cmVhbS51cmlfcGFydCA9IDE7CiAKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwgZXJyKTsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotICAgIGlmICghKGhvc3QgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBsY2YtPnVwc3RyZWFtLT5ob3N0LmxlbiArIDEpKSkgewotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCi0gICAgbmd4X2NweXN0cm4oaG9zdCwgbGNmLT51cHN0cmVhbS0+aG9zdC5kYXRhLCBsY2YtPnVwc3RyZWFtLT5ob3N0LmxlbiArIDEpOwotCi0gICAgLyogQUZfSU5FVCBvbmx5ICovCi0KLSAgICBhZGRyID0gaW5ldF9hZGRyKChjaGFyICopIGhvc3QpOwotCi0gICAgaWYgKGFkZHIgPT0gSU5BRERSX05PTkUpIHsKLSAgICAgICAgaCA9IGdldGhvc3RieW5hbWUoKGNoYXIgKikgaG9zdCk7Ci0KLSAgICAgICAgaWYgKGggPT0gTlVMTCB8fCBoLT5oX2FkZHJfbGlzdFswXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsICJob3N0ICVzIG5vdCBmb3VuZCIsIGhvc3QpOworICAgICAgICBpZiAoIShsY2YtPnBlZXJzID0gbmd4X3VuaXhfdXBzdHJlYW1fcGFyc2UoY2YsICZ1bml4X3Vwc3RyZWFtKSkpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaSA9IDA7IGgtPmhfYWRkcl9saXN0W2ldICE9IE5VTEw7IGkrKykgeyAvKiB2b2lkICovIH0KKyAgICAgICAgbGNmLT51cHN0cmVhbS0+aG9zdF9oZWFkZXIubGVuID0gc2l6ZW9mKCJsb2NhbGhvc3QiKSAtIDE7CisgICAgICAgIGxjZi0+dXBzdHJlYW0tPmhvc3RfaGVhZGVyLmRhdGEgPSAodV9jaGFyICopICJsb2NhbGhvc3QiOworICAgICAgICBsY2YtPnVwc3RyZWFtLT51cmkgPSB1bml4X3Vwc3RyZWFtLnVyaTsKKyAgICAgICAgbGNmLT51cHN0cmVhbS0+dXJpX3NlcGFyYXRvciA9ICI6IjsKKyAgICAgICAgbGNmLT51cHN0cmVhbS0+ZGVmYXVsdF9wb3J0ID0gMTsKIAotICAgICAgICAvKiBNUDogbmd4X3NoYXJlZF9wYWxsb2MoKSAqLworI2Vsc2UKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSB1bml4IGRvbWFpbiBzb2NrZXRzIGFyZSBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKIAotICAgICAgICBsY2YtPnBlZXJzID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3BlZXJzX3QpICsgc2l6ZW9mKG5neF9wZWVyX3QpICogKGkgLSAxKSk7Ci0KLSAgICAgICAgaWYgKGxjZi0+cGVlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgbGNmLT5wZWVycy0+bnVtYmVyID0gaTsKLQotICAgICAgICAvKiBTVFVCICovCi0gICAgICAgIGxjZi0+cGVlcnMtPm1heF9mYWlscyA9IDE7Ci0gICAgICAgIGxjZi0+cGVlcnMtPmZhaWxfdGltZW91dCA9IDYwOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGgtPmhfYWRkcl9saXN0W2ldICE9IE5VTEw7IGkrKykgewotICAgICAgICAgICAgbGNmLT5wZWVycy0+cGVlcnNbaV0uaG9zdC5kYXRhID0gaG9zdDsKLSAgICAgICAgICAgIGxjZi0+cGVlcnMtPnBlZXJzW2ldLmhvc3QubGVuID0gbGNmLT51cHN0cmVhbS0+aG9zdC5sZW47Ci0gICAgICAgICAgICBsY2YtPnBlZXJzLT5wZWVyc1tpXS5hZGRyID0gKihpbl9hZGRyX3QgKikoaC0+aF9hZGRyX2xpc3RbaV0pOwotICAgICAgICAgICAgbGNmLT5wZWVycy0+cGVlcnNbaV0ucG9ydCA9IGxjZi0+dXBzdHJlYW0tPnBvcnQ7Ci0KLSAgICAgICAgICAgIGxlbiA9IElORVRfQUREUlNUUkxFTiAtIDEgKyAxICsgbGNmLT51cHN0cmVhbS0+cG9ydF90ZXh0LmxlbjsKLQotICAgICAgICAgICAgbGNmLT5wZWVycy0+cGVlcnNbaV0uYWRkcl9wb3J0X3RleHQuZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9wYWxsb2MoY2YtPnBvb2wsIGxlbik7Ci0gICAgICAgICAgICBpZiAobGNmLT5wZWVycy0+cGVlcnNbaV0uYWRkcl9wb3J0X3RleHQuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsZW4gPSBuZ3hfaW5ldF9udG9wKEFGX0lORVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsY2YtPnBlZXJzLT5wZWVyc1tpXS5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2YtPnBlZXJzLT5wZWVyc1tpXS5hZGRyX3BvcnRfdGV4dC5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOwotCi0gICAgICAgICAgICBsY2YtPnBlZXJzLT5wZWVyc1tpXS5hZGRyX3BvcnRfdGV4dC5kYXRhW2xlbisrXSA9ICc6JzsKLQotICAgICAgICAgICAgbmd4X21lbWNweShsY2YtPnBlZXJzLT5wZWVyc1tpXS5hZGRyX3BvcnRfdGV4dC5kYXRhICsgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICBsY2YtPnVwc3RyZWFtLT5wb3J0X3RleHQuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGNmLT51cHN0cmVhbS0+cG9ydF90ZXh0Lmxlbik7Ci0KLSAgICAgICAgICAgIGxjZi0+cGVlcnMtPnBlZXJzW2ldLmFkZHJfcG9ydF90ZXh0LmxlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArIGxjZi0+dXBzdHJlYW0tPnBvcnRfdGV4dC5sZW47Ci0gICAgICAgIH0KKyNlbmRpZgogCiAgICAgfSBlbHNlIHsKKyAgICAgICAgbmd4X21lbXplcm8oJmluZXRfdXBzdHJlYW0sIHNpemVvZihuZ3hfaW5ldF91cHN0cmVhbV90KSk7CiAKLSAgICAgICAgLyogTVA6IG5neF9zaGFyZWRfcGFsbG9jKCkgKi8KKyAgICAgICAgaW5ldF91cHN0cmVhbS5uYW1lID0gKnVybDsKKyAgICAgICAgaW5ldF91cHN0cmVhbS51cmwubGVuID0gdXJsLT5sZW4gLSA3OworICAgICAgICBpbmV0X3Vwc3RyZWFtLnVybC5kYXRhID0gdXJsLT5kYXRhICsgNzsKKyAgICAgICAgaW5ldF91cHN0cmVhbS5kZWZhdWx0X3BvcnRfdmFsdWUgPSA4MDsKKyAgICAgICAgaW5ldF91cHN0cmVhbS51cmlfcGFydCA9IDE7CiAKLSAgICAgICAgaWYgKCEobGNmLT5wZWVycyA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3BlZXJzX3QpKSkpIHsKKyAgICAgICAgaWYgKCEobGNmLT5wZWVycyA9IG5neF9pbmV0X3Vwc3RyZWFtX3BhcnNlKGNmLCAmaW5ldF91cHN0cmVhbSkpKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBsY2YtPnBlZXJzLT5udW1iZXIgPSAxOwotCi0gICAgICAgIGxjZi0+cGVlcnMtPnBlZXJzWzBdLmhvc3QuZGF0YSA9IGhvc3Q7Ci0gICAgICAgIGxjZi0+cGVlcnMtPnBlZXJzWzBdLmhvc3QubGVuID0gbGNmLT51cHN0cmVhbS0+aG9zdC5sZW47Ci0gICAgICAgIGxjZi0+cGVlcnMtPnBlZXJzWzBdLmFkZHIgPSBhZGRyOwotICAgICAgICBsY2YtPnBlZXJzLT5wZWVyc1swXS5wb3J0ID0gbGNmLT51cHN0cmVhbS0+cG9ydDsKLQotICAgICAgICBsZW4gPSBsY2YtPnVwc3RyZWFtLT5ob3N0LmxlbiArIDEgKyBsY2YtPnVwc3RyZWFtLT5wb3J0X3RleHQubGVuOwotCi0gICAgICAgIGxjZi0+cGVlcnMtPnBlZXJzWzBdLmFkZHJfcG9ydF90ZXh0LmxlbiA9IGxlbjsKLQotICAgICAgICBsY2YtPnBlZXJzLT5wZWVyc1swXS5hZGRyX3BvcnRfdGV4dC5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgbGVuKTsKLSAgICAgICAgaWYgKGxjZi0+cGVlcnMtPnBlZXJzWzBdLmFkZHJfcG9ydF90ZXh0LmRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgbGVuID0gbGNmLT51cHN0cmVhbS0+aG9zdC5sZW47Ci0KLSAgICAgICAgbmd4X21lbWNweShsY2YtPnBlZXJzLT5wZWVyc1swXS5hZGRyX3BvcnRfdGV4dC5kYXRhLAotICAgICAgICAgICAgICAgICAgIGxjZi0+dXBzdHJlYW0tPmhvc3QuZGF0YSwgbGVuKTsKLQotICAgICAgICBsY2YtPnBlZXJzLT5wZWVyc1swXS5hZGRyX3BvcnRfdGV4dC5kYXRhW2xlbisrXSA9ICc6JzsKLQotICAgICAgICBuZ3hfbWVtY3B5KGxjZi0+cGVlcnMtPnBlZXJzWzBdLmFkZHJfcG9ydF90ZXh0LmRhdGEgKyBsZW4sCi0gICAgICAgICAgICAgICAgICAgbGNmLT51cHN0cmVhbS0+cG9ydF90ZXh0LmRhdGEsCi0gICAgICAgICAgICAgICAgICAgbGNmLT51cHN0cmVhbS0+cG9ydF90ZXh0Lmxlbik7CisgICAgICAgIGxjZi0+dXBzdHJlYW0tPmhvc3RfaGVhZGVyID0gaW5ldF91cHN0cmVhbS5ob3N0X2hlYWRlcjsKKyAgICAgICAgbGNmLT51cHN0cmVhbS0+cG9ydF90ZXh0ID0gaW5ldF91cHN0cmVhbS5wb3J0X3RleHQ7CisgICAgICAgIGxjZi0+dXBzdHJlYW0tPnVyaSA9IGluZXRfdXBzdHJlYW0udXJpOworICAgICAgICBsY2YtPnVwc3RyZWFtLT51cmlfc2VwYXJhdG9yID0gIiI7CiAgICAgfQogCiAgICAgY2xjZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9sb2NfY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwpAQCAtMTQxMCw5MyArMTM2Miw3IEBACiAgICAgICAgIGNsY2YtPmF1dG9fcmVkaXJlY3QgPSAxOwogICAgIH0KIAotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9wYXJzZV91cHN0cmVhbShuZ3hfc3RyX3QgKnVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9jb25mX3QgKnUpCi17Ci0gICAgc2l6ZV90ICBpOwotCi0gICAgaWYgKHVybC0+ZGF0YVswXSA9PSAnOicgfHwgdXJsLT5kYXRhWzBdID09ICcvJykgewotICAgICAgICByZXR1cm4gImludmFsaWQgdXBzdHJlYW0gVVJMIjsKLSAgICB9Ci0KLSAgICB1LT5ob3N0LmRhdGEgPSB1cmwtPmRhdGE7Ci0gICAgdS0+aG9zdF9oZWFkZXIuZGF0YSA9IHVybC0+ZGF0YTsKLQotICAgIGZvciAoaSA9IDE7IGkgPCB1cmwtPmxlbjsgaSsrKSB7Ci0gICAgICAgIGlmICh1cmwtPmRhdGFbaV0gPT0gJzonKSB7Ci0gICAgICAgICAgICB1LT5wb3J0X3RleHQuZGF0YSA9ICZ1cmwtPmRhdGFbaV0gKyAxOwotICAgICAgICAgICAgdS0+aG9zdC5sZW4gPSBpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVybC0+ZGF0YVtpXSA9PSAnLycpIHsKLSAgICAgICAgICAgIHUtPnVyaS5kYXRhID0gJnVybC0+ZGF0YVtpXTsKLSAgICAgICAgICAgIHUtPnVyaS5sZW4gPSB1cmwtPmxlbiAtIGk7Ci0gICAgICAgICAgICB1LT5ob3N0X2hlYWRlci5sZW4gPSBpOwotCi0gICAgICAgICAgICBpZiAodS0+aG9zdC5sZW4gPT0gMCkgewotICAgICAgICAgICAgICAgIHUtPmhvc3QubGVuID0gaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHUtPnBvcnRfdGV4dC5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICB1LT5kZWZhdWx0X3BvcnQgPSAxOwotICAgICAgICAgICAgICAgIHUtPnBvcnQgPSBodG9ucyg4MCk7Ci0gICAgICAgICAgICAgICAgdS0+cG9ydF90ZXh0LmxlbiA9IDI7Ci0gICAgICAgICAgICAgICAgdS0+cG9ydF90ZXh0LmRhdGEgPSAodV9jaGFyICopICI4MCI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHUtPnBvcnRfdGV4dC5sZW4gPSAmdXJsLT5kYXRhW2ldIC0gdS0+cG9ydF90ZXh0LmRhdGE7Ci0KLSAgICAgICAgICAgIGlmICh1LT5wb3J0X3RleHQubGVuID4gMCkgewotICAgICAgICAgICAgICAgIHUtPnBvcnQgPSAoaW5fcG9ydF90KSBuZ3hfYXRvaSh1LT5wb3J0X3RleHQuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS0+cG9ydF90ZXh0Lmxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKHUtPnBvcnQgPiAwKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHUtPnBvcnQgPT0gODApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUtPmRlZmF1bHRfcG9ydCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB1LT5wb3J0ID0gaHRvbnModS0+cG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkIHBvcnQgaW4gdXBzdHJlYW0gVVJMIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh1LT5ob3N0LmxlbiA9PSAwKSB7Ci0gICAgICAgIHUtPmhvc3QubGVuID0gaTsKLSAgICB9Ci0KLSAgICB1LT5ob3N0X2hlYWRlci5sZW4gPSBpOwotCi0gICAgdS0+dXJpLmRhdGEgPSAodV9jaGFyICopICIvIjsKLSAgICB1LT51cmkubGVuID0gMTsKLQotICAgIGlmICh1LT5wb3J0X3RleHQuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHUtPmRlZmF1bHRfcG9ydCA9IDE7Ci0gICAgICAgIHUtPnBvcnQgPSBodG9ucyg4MCk7Ci0gICAgICAgIHUtPnBvcnRfdGV4dC5sZW4gPSAyOwotICAgICAgICB1LT5wb3J0X3RleHQuZGF0YSA9ICh1X2NoYXIgKikgIjgwIjsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdS0+cG9ydF90ZXh0LmxlbiA9ICZ1cmwtPmRhdGFbaV0gLSB1LT5wb3J0X3RleHQuZGF0YTsKLQotICAgIGlmICh1LT5wb3J0X3RleHQubGVuID4gMCkgewotICAgICAgICB1LT5wb3J0ID0gKGluX3BvcnRfdCkgbmd4X2F0b2kodS0+cG9ydF90ZXh0LmRhdGEsIHUtPnBvcnRfdGV4dC5sZW4pOwotICAgICAgICBpZiAodS0+cG9ydCA+IDApIHsKLSAgICAgICAgICAgIHUtPnBvcnQgPSBodG9ucyh1LT5wb3J0KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICJpbnZhbGlkIHBvcnQgaW4gdXBzdHJlYW0gVVJMIjsKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmggYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuaAppbmRleCA4YWI4OGFkLi45MTVjYTYyIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuaAorKysgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuaApAQCAtNDcsNiArNDcsOCBAQAogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfdGV4dDsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICpsb2NhdGlvbjsKIAorICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVyaV9zZXBhcmF0b3I7CisKICAgICBpbl9wb3J0X3QgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OwogCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9wb3J0OjE7CkBAIC0xMzEsNyArMTMzLDExIEBACiAgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAqY29ubmVjdGlvbjsKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpjb250ZW50X3R5cGU7CiAgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAqY29udGVudF9sZW5ndGg7CisKKyNpZiAoTkdYX0hUVFBfR1pJUCkKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpjb250ZW50X2VuY29kaW5nOworI2VuZGlmCisKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpsYXN0X21vZGlmaWVkOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgKmxvY2F0aW9uOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgKmFjY2VwdF9yYW5nZXM7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hlYWRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oZWFkZXIuYwppbmRleCBjZDVkZWViLi43OGFlNjUzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hlYWRlci5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGVhZGVyLmMKQEAgLTI2LDEyICsyNiw3IEBACiAgICAgcGFydCA9ICZoZWFkZXJzX2luLT5oZWFkZXJzLnBhcnQ7CiAgICAgaCA9IHBhcnQtPmVsdHM7CiAKLSNpZiAwCi0gICAgaCA9IGhlYWRlcnNfaW4tPmhlYWRlcnMuZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVyc19pbi0+aGVhZGVycy5uZWx0czsgaSsrKSB7Ci0jZW5kaWYKLQotICAgIGZvciAoaSA9IDAgOyAvKiB2b2lkICovOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyAvKiB2b2lkICovOyBpKyspIHsKICAgCiAgICAgICAgIGlmIChpID49IHBhcnQtPm5lbHRzKSB7CiAgICAgICAgICAgICBpZiAocGFydC0+bmV4dCA9PSBOVUxMKSB7CkBAIC0xMTMsMTAgKzEwOCwxMiBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorI2lmIChOR1hfSFRUUF9HWklQKQogICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+Y29udGVudF9lbmNvZGluZykgewogICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9lbmNvZGluZyA9IGhvOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyNlbmRpZgogCiAgICAgICAgIGlmICgmaFtpXSA9PSBoZWFkZXJzX2luLT5sYXN0X21vZGlmaWVkKSB7CiAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkID0gaG87CkBAIC0xNjksNyArMTY2LDggQEAKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAodWMtPnVybC5sZW4gPiBsb2MtPnZhbHVlLmxlbgorICAgIGlmIChwLT5sY2YtPnByZXNlcnZlX2hvc3QKKyAgICAgICAgfHwgdWMtPnVybC5sZW4gPiBsb2MtPnZhbHVlLmxlbgogICAgICAgICB8fCBuZ3hfcnN0cm5jbXAobG9jLT52YWx1ZS5kYXRhLCB1Yy0+dXJsLmRhdGEsIHVjLT51cmwubGVuKSAhPSAwKQogICAgIHsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV91cHN0cmVhbS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV91cHN0cmVhbS5jCmluZGV4IDQ3ZDJiMTcuLjRkZmQ0ZTYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3Vwc3RyZWFtLmMKQEAgLTE0LDcgKzE0LDcgQEAKIAogCiBzdGF0aWMgbmd4X2NoYWluX3QgKm5neF9odHRwX3Byb3h5X2NyZWF0ZV9yZXF1ZXN0KG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X2luaXRfdXBzdHJlYW0odm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9pbml0X3Vwc3RyZWFtKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9yZWluaXRfdXBzdHJlYW0obmd4X2h0dHBfcHJveHlfY3R4X3QgKnApOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfY29ubmVjdChuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9zZW5kX3JlcXVlc3Qobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApOwpAQCAtNTMsOSArNTMsNyBAQAogaW50IG5neF9odHRwX3Byb3h5X3JlcXVlc3RfdXBzdHJlYW0obmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCiB7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHJjOwotICAgIG5neF90ZW1wX2ZpbGVfdCAgICAgICAgICAgICp0ZjsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAqcjsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X2JvZHlfdCAgICAqcmI7CiAgICAgbmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fdCAgKnU7CiAKICAgICByID0gcC0+cmVxdWVzdDsKQEAgLTc1LDM2ICs3Myw3IEBACiAKICAgICB1LT5tZXRob2QgPSByLT5tZXRob2Q7CiAKLSAgICBpZiAoIShyYiA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9yZXF1ZXN0X2JvZHlfdCkpKSkgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLSAgICByLT5yZXF1ZXN0X2JvZHkgPSByYjsKLQotICAgIGlmIChyLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX24gPD0gMCkgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9pbml0X3Vwc3RyZWFtKHApOwotICAgICAgICByZXR1cm4gTkdYX0RPTkU7Ci0gICAgfQotCi0gICAgaWYgKCEodGYgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X3RlbXBfZmlsZV90KSkpKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgdGYtPmZpbGUuZmQgPSBOR1hfSU5WQUxJRF9GSUxFOwotICAgIHRmLT5maWxlLmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKLSAgICB0Zi0+cGF0aCA9IHAtPmxjZi0+dGVtcF9wYXRoOwotICAgIHRmLT5wb29sID0gci0+cG9vbDsKLSAgICB0Zi0+d2FybiA9ICJhIGNsaWVudCByZXF1ZXN0IGJvZHkgaXMgYnVmZmVyZWQgdG8gYSB0ZW1wb3JhcnkgZmlsZSI7Ci0gICAgLyogdGYtPnBlcnNpc3RlbnQgPSAwOyAqLwotCi0gICAgcmItPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9pbml0X3Vwc3RyZWFtOwotICAgIHJiLT5kYXRhID0gcDsKLSAgICAvKiByYi0+YnVmcyA9IE5VTEw7ICovCi0gICAgLyogcmItPmJ1ZiA9IE5VTEw7ICovCi0gICAgLyogcmItPnJlc3QgPSAwOyAqLwotCi0gICAgcmItPnRlbXBfZmlsZSA9IHRmOwotCi0gICAgcmMgPSBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkocik7CisgICAgcmMgPSBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkociwgbmd4X2h0dHBfcHJveHlfaW5pdF91cHN0cmVhbSk7CiAKICAgICBpZiAocmMgPj0gTkdYX0hUVFBfU1BFQ0lBTF9SRVNQT05TRSkgewogICAgICAgICByZXR1cm4gcmM7CkBAIC00MjgsMTcgKzM5NywxNiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X2luaXRfdXBzdHJlYW0odm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X2luaXRfdXBzdHJlYW0obmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewotICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICpwID0gZGF0YTsKIAogICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICAgKmNsOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgKnI7CisgICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgICAgICAqcDsKICAgICBuZ3hfb3V0cHV0X2NoYWluX2N0eF90ICAgICpvdXRwdXQ7CiAgICAgbmd4X2NoYWluX3dyaXRlcl9jdHhfdCAgICAqd3JpdGVyOwogICAgIG5neF9odHRwX3Byb3h5X2xvZ19jdHhfdCAgKmN0eDsKIAotICAgIHIgPSBwLT5yZXF1ZXN0OworICAgIHAgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwogCiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBpbml0IHVwc3RyZWFtLCBjbGllbnQgdGltZXI6ICVkIiwKQEAgLTUwMiw3ICs0NzAsNyBAQAogICAgIG91dHB1dC0+cG9vbCA9IHItPnBvb2w7CiAgICAgb3V0cHV0LT5idWZzLm51bSA9IDE7CiAgICAgb3V0cHV0LT50YWcgPSAobmd4X2J1Zl90YWdfdCkgJm5neF9odHRwX3Byb3h5X21vZHVsZTsKLSAgICBvdXRwdXQtPm91dHB1dF9maWx0ZXIgPSAobmd4X291dHB1dF9jaGFpbl9maWx0ZXJfcHQpIG5neF9jaGFpbl93cml0ZXI7CisgICAgb3V0cHV0LT5vdXRwdXRfZmlsdGVyID0gbmd4X2NoYWluX3dyaXRlcjsKIAogICAgIGlmICghKHdyaXRlciA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9jaGFpbl93cml0ZXJfY3R4X3QpKSkpIHsKICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwpAQCAtNzAwLDcgKzY2OCw3IEBACiAgICAgfQogCiAgICAgcC0+c3RhdGUtPnBlZXIgPQotICAgICAmcC0+dXBzdHJlYW0tPnBlZXIucGVlcnMtPnBlZXJzW3AtPnVwc3RyZWFtLT5wZWVyLmN1cl9wZWVyXS5hZGRyX3BvcnRfdGV4dDsKKyAgICAgICAgICAgICAgICZwLT51cHN0cmVhbS0+cGVlci5wZWVycy0+cGVlcltwLT51cHN0cmVhbS0+cGVlci5jdXJfcGVlcl0ubmFtZTsKIAogICAgIGlmIChyYyA9PSBOR1hfQ09OTkVDVF9FUlJPUikgewogICAgICAgICBuZ3hfaHR0cF9wcm94eV9uZXh0X3Vwc3RyZWFtKHAsIE5HWF9IVFRQX1BST1hZX0ZUX0VSUk9SKTsKQEAgLTczMyw3ICs3MDEsNyBAQAogICAgIH0KIAogICAgIGlmIChyLT5yZXF1ZXN0X2JvZHktPmJ1ZikgewotICAgICAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUtPmZpbGUuZmQgIT0gTkdYX0lOVkFMSURfRklMRSkgeworICAgICAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUpIHsKIAogICAgICAgICAgICAgaWYgKCEob3V0cHV0LT5mcmVlID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CiAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLApAQCAtMTM0Nyw2ICsxMzE1LDcgQEAKICAgICB9CiAgICAgZXAtPnByZXJlYWRfYnVmcy0+YnVmID0gcC0+aGVhZGVyX2luOwogICAgIGVwLT5wcmVyZWFkX2J1ZnMtPm5leHQgPSBOVUxMOworICAgIHAtPmhlYWRlcl9pbi0+cmVjeWNsZWQgPSAxOwogCiAgICAgZXAtPnByZXJlYWRfc2l6ZSA9IHAtPmhlYWRlcl9pbi0+bGFzdCAtIHAtPmhlYWRlcl9pbi0+cG9zOwogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cC5oIGIvc3JjL2h0dHAvbmd4X2h0dHAuaAppbmRleCA0MjU1MGFhLi45NDI1ZTNiIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cC5oCisrKyBiL3NyYy9odHRwL25neF9odHRwLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxuZ3hfZ2FyYmFnZV9jb2xsZWN0b3IuaD4KIAogdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfcmVxdWVzdF9zICBuZ3hfaHR0cF9yZXF1ZXN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9sb2dfY3R4X3MgIG5neF9odHRwX2xvZ19jdHhfdDsKIHR5cGVkZWYgc3RydWN0IG5neF9odHRwX2NsZWFudXBfcyAgbmd4X2h0dHBfY2xlYW51cF90OwogdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfaW5fYWRkcl9zICBuZ3hfaHR0cF9pbl9hZGRyX3Q7CiAKQEAgLTIyLDYgKzIzLDcgQEAKIC8qIFNUVUIgKi8KICNpbmNsdWRlIDxuZ3hfaHR0cF9jYWNoZS5oPgogCisjaW5jbHVkZSA8bmd4X2h0dHBfdXBzdHJlYW0uaD4KICNpbmNsdWRlIDxuZ3hfaHR0cF9yZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8bmd4X2h0dHBfY29uZmlnLmg+CiAjaW5jbHVkZSA8bmd4X2h0dHBfYnVzeV9sb2NrLmg+CkBAIC0zMyw4ICszNSw4IEBACiAjZW5kaWYKIAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdV9pbnQgICAgICAgICAgICAgIGNvbm5lY3Rpb247CitzdHJ1Y3Qgbmd4X2h0dHBfbG9nX2N0eF9zIHsKKyAgICBuZ3hfdWludF90ICAgICAgICAgY29ubmVjdGlvbjsKIAogICAgIC8qCiAgICAgICogd2UgZGVjbGFyZSAiYWN0aW9uIiBhcyAiY2hhciAqIiBiZWNhdXNlIHRoZSBhY3Rpb25zIGFyZSB1c3VhbGx5CkBAIC00NSwxOCArNDcsMjMgQEAKICAgICBjaGFyICAgICAgICAgICAgICAgICphY3Rpb247CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAqY2xpZW50OwogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgKnJlcXVlc3Q7Ci19IG5neF9odHRwX2xvZ19jdHhfdDsKK307CiAKIAogI2RlZmluZSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBtb2R1bGUpICAgICAgIHItPmN0eFttb2R1bGUuY3R4X2luZGV4XQogI2RlZmluZSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2Vycl9jdHgociwgbW9kdWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgKHItPmVycl9jdHggPyByLT5lcnJfY3R4W21vZHVsZS5jdHhfaW5kZXhdIDogci0+Y3R4W21vZHVsZS5jdHhfaW5kZXhdKQogCisvKiBTVFVCICovCiAjZGVmaW5lIG5neF9odHRwX2NyZWF0ZV9jdHgociwgY3gsIG1vZHVsZSwgc2l6ZSwgZXJyb3IpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgbmd4X3Rlc3RfbnVsbChjeCwgbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZSksIGVycm9yKTsgICAgICAgICBcCiAgICAgICAgICAgICAgICAgci0+Y3R4W21vZHVsZS5jdHhfaW5kZXhdID0gY3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICB9IHdoaWxlICgwKQorLyoqLworCisjZGVmaW5lIG5neF9odHRwX3NldF9jdHgociwgYywgbW9kdWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByLT5jdHhbbW9kdWxlLmN0eF9pbmRleF0gPSBjOwogCiAjZGVmaW5lIG5neF9odHRwX2RlbGV0ZV9jdHgociwgbW9kdWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICByLT5jdHhbbW9kdWxlLmN0eF9pbmRleF0gPSBOVUxMOwpAQCAtODAsNyArODcsOCBAQAogdm9pZCBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKG5neF9jb25uZWN0aW9uX3QgKmMpOwogCiAKLW5neF9pbnRfdCBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKK25neF9pbnRfdCBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xpZW50X2JvZHlfaGFuZGxlcl9wdCBwb3N0X2hhbmRsZXIpOwogCiBuZ3hfaW50X3Qgbmd4X2h0dHBfc2VuZF9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIG5neF9pbnRfdCBuZ3hfaHR0cF9zcGVjaWFsX3Jlc3BvbnNlX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBpbnQgZXJyb3IpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKaW5kZXggNDc4YmIwOC4uOTQyOWVhNiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCkBAIC0yMDUsNiArMjA1LDEzIEBACiAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QsIGNsaWVudF9ib2R5X3RpbWVvdXQpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJjbGllbnRfYm9keV90ZW1wX3BhdGgiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMTIzNCwKKyAgICAgIG5neF9jb25mX3NldF9wYXRoX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QsIGNsaWVudF9ib2R5X3RlbXBfcGF0aCksCisgICAgICAodm9pZCAqKSBuZ3hfZ2FyYmFnZV9jb2xsZWN0b3JfdGVtcF9oYW5kbGVyIH0sCisKICAgICB7IG5neF9zdHJpbmcoInNlbmRmaWxlIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCkBAIC0xMjg4LDE1ICsxMjk1LDExIEBACiAgICAgbmd4X3Rlc3RfbnVsbChjc2NmLAogICAgICAgICAgICAgICAgICAgbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QpKSwKICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKLQogICAgIC8qCi0KLSAgICBzZXQgYnkgbmd4X3BjYWxsb2MoKToKLQotICAgIGNvbmYtPmNsaWVudF9sYXJnZV9idWZmZXJzLm51bSA9IDA7Ci0KLSAgICAqLwotCisgICAgICoKKyAgICAgKiBzZXQgYnkgbmd4X3BjYWxsb2MoKToKKyAgICAgKiAgICAgY29uZi0+Y2xpZW50X2xhcmdlX2J1ZmZlcnMubnVtID0gMDsKKyAgICAgKi8KIAogICAgIG5neF9pbml0X2FycmF5KGNzY2YtPmxvY2F0aW9ucywgY2YtPnBvb2wsCiAgICAgICAgICAgICAgICAgICAgNSwgc2l6ZW9mKHZvaWQgKiksIE5HWF9DT05GX0VSUk9SKTsKQEAgLTEzOTgsMjIgKzE0MDEsMjIgQEAKICAgICAgICAgICAgICAgICAgIG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29yZV9sb2NfY29uZl90KSksCiAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CiAKLSAgICAvKiBzZXQgYnkgbmd4X3BjYWxsb2MoKToKLQotICAgIGxjZi0+cm9vdC5sZW4gPSAwOwotICAgIGxjZi0+cm9vdC5kYXRhID0gTlVMTDsKLSAgICBsY2YtPnR5cGVzID0gTlVMTDsKLSAgICBsY2YtPmRlZmF1bHRfdHlwZS5sZW4gPSAwOwotICAgIGxjZi0+ZGVmYXVsdF90eXBlLmRhdGEgPSBOVUxMOwotICAgIGxjZi0+ZXJyX2xvZyA9IE5VTEw7Ci0gICAgbGNmLT5lcnJvcl9wYWdlcyA9IE5VTEw7Ci0KLSAgICBsY2YtPnJlZ2V4ID0gTlVMTDsKLSAgICBsY2YtPmV4YWN0X21hdGNoID0gMDsKLSAgICBsY2YtPmF1dG9fcmVkaXJlY3QgPSAwOwotICAgIGxjZi0+YWxpYXMgPSAwOwotCi0gICAgKi8KKyAgICAvKgorICAgICAqIHNldCBieSBuZ3hfcGNhbGxvYygpOgorICAgICAqCisgICAgICogICAgIGxjZi0+cm9vdC5sZW4gPSAwOworICAgICAqICAgICBsY2YtPnJvb3QuZGF0YSA9IE5VTEw7CisgICAgICogICAgIGxjZi0+dHlwZXMgPSBOVUxMOworICAgICAqICAgICBsY2YtPmRlZmF1bHRfdHlwZS5sZW4gPSAwOworICAgICAqICAgICBsY2YtPmRlZmF1bHRfdHlwZS5kYXRhID0gTlVMTDsKKyAgICAgKiAgICAgbGNmLT5lcnJfbG9nID0gTlVMTDsKKyAgICAgKiAgICAgbGNmLT5lcnJvcl9wYWdlcyA9IE5VTEw7CisgICAgICogICAgIGxjZi0+Y2xpZW50X2JvZHlfcGF0aCA9IE5VTEw7CisgICAgICogICAgIGxjZi0+cmVnZXggPSBOVUxMOworICAgICAqICAgICBsY2YtPmV4YWN0X21hdGNoID0gMDsKKyAgICAgKiAgICAgbGNmLT5hdXRvX3JlZGlyZWN0ID0gMDsKKyAgICAgKiAgICAgbGNmLT5hbGlhcyA9IDA7CisgICAgICovCiAKICAgICBsY2YtPmNsaWVudF9tYXhfYm9keV9zaXplID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKICAgICBsY2YtPmNsaWVudF9ib2R5X2J1ZmZlcl9zaXplID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKQEAgLTE1MjYsNiArMTUyOSwxMSBAQAogICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+bGluZ2VyaW5nX3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5saW5nZXJpbmdfdGltZW91dCwgNTAwMCk7CiAKKyAgICBuZ3hfY29uZl9tZXJnZV9wYXRoX3ZhbHVlKGNvbmYtPmNsaWVudF9ib2R5X3RlbXBfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmNsaWVudF9ib2R5X3RlbXBfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0NMSUVOVF9URU1QX1BBVEgsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZ2FyYmFnZV9jb2xsZWN0b3JfdGVtcF9oYW5kbGVyLCBjZik7CisKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5yZXNldF90aW1lZG91dF9jb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnJlc2V0X3RpbWVkb3V0X2Nvbm5lY3Rpb24sIDApOwogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPm1zaWVfcGFkZGluZywgcHJldi0+bXNpZV9wYWRkaW5nLCAxKTsKQEAgLTE3NDYsNyArMTc1NCw3IEBACiAKICAgICAgICAgaWYgKG92ZXJ3cml0ZSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB2YWx1ZSBcIiVWXCIiLCB2YWx1ZVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdmFsdWUgXCIlVlwiIiwgJnZhbHVlW2ldKTsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaAppbmRleCAxMzgwNjdkLi5lZWU0M2JjIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKQEAgLTE5OSw2ICsxOTksOCBAQAogCiAgICAgbmd4X2FycmF5X3QgICplcnJvcl9wYWdlczsgICAgICAgICAgICAgLyogZXJyb3JfcGFnZSAqLwogCisgICAgbmd4X3BhdGhfdCAgICpjbGllbnRfYm9keV90ZW1wX3BhdGg7ICAgLyogY2xpZW50X2JvZHlfdGVtcF9wYXRoICovCisKICAgICBuZ3hfaHR0cF9jYWNoZV9oYXNoX3QgICpvcGVuX2ZpbGVzOwogCiAgICAgbmd4X2xvZ190ICAgICplcnJfbG9nOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuYyBiL3NyYy9odHRwL25neF9odHRwX2xvZ19oYW5kbGVyLmMKaW5kZXggNjcwMmM0Zi4uMTQyMDEwNyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5jCkBAIC0xMSw0MCArMTEsNjQgQEAKIAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfYWRkcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3BpcGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdGltZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19tc2VjKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7Ci1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19zdGF0dXMobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2xlbmd0aChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfYXBhY2hlX2xlbmd0aChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19yZXF1ZXN0X2xlbmd0aChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworCitzdGF0aWMgc2l6ZV90IG5neF9odHRwX2xvZ19yZXF1ZXN0X2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKKworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luX2NvbXBpbGUobmd4X2h0dHBfbG9nX29wX3QgKm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3N0cl90ICp2YWx1ZSk7CitzdGF0aWMgc2l6ZV90IG5neF9odHRwX2xvZ19oZWFkZXJfaW5fZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2hlYWRlcl9pbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CitzdGF0aWMgc2l6ZV90IG5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9pbl9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9pbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKKworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9sb2dfaGVhZGVyX291dF9jb21waWxlKG5neF9odHRwX2xvZ19vcF90ICpvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3RyX3QgKnZhbHVlKTsKK3N0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXRfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19oZWFkZXJfb3V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworc3RhdGljIHNpemVfdCBuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfb3V0X2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9vdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKKwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2Nvbm5lY3Rpb25faGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLCB1aW50cHRyX3QgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3RyYW5zZmVyX2VuY29kaW5nX2hlYWRlcl9vdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7Ci1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfaW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLCB1aW50cHRyX3QgZGF0YSk7Ci1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfaGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOwotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19wcmVfY29uZihuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgbmd4X3RhYmxlX2VsdF90ICpuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXIobmd4X2xpc3RfdCAqaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3RyX3QgKnZhbHVlKTsKKworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9sb2dfc2V0X2Zvcm1hdHMobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX2xvZ19jcmVhdGVfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9sb2dfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9sb2dfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwKQEAgLTc4LDcgKzEwMiw3IEBACiAKIAogbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2xvZ19tb2R1bGVfY3R4ID0gewotICAgIG5neF9odHRwX2xvZ19wcmVfY29uZiwgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgbmd4X2h0dHBfbG9nX3NldF9mb3JtYXRzLCAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KIAogICAgIG5neF9odHRwX2xvZ19jcmVhdGVfbWFpbl9jb25mLCAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtMTEwLDI4ICsxMzQsMzggQEAKIAogCiBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90IG5neF9odHRwX2xvZ19mbXRfb3BzW10gPSB7Ci0gICAgeyBuZ3hfc3RyaW5nKCJhZGRyIiksIElORVRfQUREUlNUUkxFTiAtIDEsIG5neF9odHRwX2xvZ19hZGRyIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJjb25uIiksIE5HWF9JTlQzMl9MRU4sIG5neF9odHRwX2xvZ19jb25uZWN0aW9uIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJwaXBlIiksIDEsIG5neF9odHRwX2xvZ19waXBlIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJhZGRyIiksIElORVRfQUREUlNUUkxFTiAtIDEsIE5VTEwsIE5VTEwsIG5neF9odHRwX2xvZ19hZGRyIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJjb25uIiksIE5HWF9JTlQzMl9MRU4sIE5VTEwsIE5VTEwsIG5neF9odHRwX2xvZ19jb25uZWN0aW9uIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJwaXBlIiksIDEsIE5VTEwsIE5VTEwsIG5neF9odHRwX2xvZ19waXBlIH0sCiAgICAgeyBuZ3hfc3RyaW5nKCJ0aW1lIiksIHNpemVvZigiMjgvU2VwLzE5NzA6MTI6MDA6MDAiKSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ190aW1lIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJtc2VjIiksIE5HWF9USU1FX1RfTEVOICsgNCwgbmd4X2h0dHBfbG9nX21zZWMgfSwKLSAgICB7IG5neF9zdHJpbmcoInJlcXVlc3QiKSwgMCwgbmd4X2h0dHBfbG9nX3JlcXVlc3QgfSwKLSAgICB7IG5neF9zdHJpbmcoInN0YXR1cyIpLCAzLCBuZ3hfaHR0cF9sb2dfc3RhdHVzIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJsZW5ndGgiKSwgTkdYX09GRl9UX0xFTiwgbmd4X2h0dHBfbG9nX2xlbmd0aCB9LAotICAgIHsgbmd4X3N0cmluZygiYXBhY2hlX2xlbmd0aCIpLCBOR1hfT0ZGX1RfTEVOLCBuZ3hfaHR0cF9sb2dfYXBhY2hlX2xlbmd0aCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBuZ3hfaHR0cF9sb2dfdGltZSB9LAorICAgIHsgbmd4X3N0cmluZygibXNlYyIpLCBOR1hfVElNRV9UX0xFTiArIDQsIE5VTEwsIE5VTEwsIG5neF9odHRwX2xvZ19tc2VjIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJzdGF0dXMiKSwgMywgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX3N0YXR1cyB9LAorICAgIHsgbmd4X3N0cmluZygibGVuZ3RoIiksIE5HWF9PRkZfVF9MRU4sIE5VTEwsIE5VTEwsIG5neF9odHRwX2xvZ19sZW5ndGggfSwKKyAgICB7IG5neF9zdHJpbmcoImFwYWNoZV9sZW5ndGgiKSwgTkdYX09GRl9UX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX2FwYWNoZV9sZW5ndGggfSwKICAgICB7IG5neF9zdHJpbmcoInJlcXVlc3RfbGVuZ3RoIiksIE5HWF9TSVpFX1RfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX3JlcXVlc3RfbGVuZ3RoIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJpIiksIE5HWF9IVFRQX0xPR19BUkcsIG5neF9odHRwX2xvZ19oZWFkZXJfaW4gfSwKLSAgICB7IG5neF9zdHJpbmcoIm8iKSwgTkdYX0hUVFBfTE9HX0FSRywgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXQgfSwKLSAgICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBuZ3hfaHR0cF9sb2dfcmVxdWVzdF9sZW5ndGggfSwKKworICAgIHsgbmd4X3N0cmluZygicmVxdWVzdCIpLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfcmVxdWVzdF9nZXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19yZXF1ZXN0IH0sCisKKyAgICB7IG5neF9zdHJpbmcoImkiKSwgMCwgbmd4X2h0dHBfbG9nX2hlYWRlcl9pbl9jb21waWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luX2dldGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX2hlYWRlcl9pbiB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJvIiksIDAsIG5neF9odHRwX2xvZ19oZWFkZXJfb3V0X2NvbXBpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19oZWFkZXJfb3V0X2dldGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXQgfSwKKworICAgIHsgbmd4X251bGxfc3RyaW5nLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH0KIH07CiAKIAogbmd4X2ludF90IG5neF9odHRwX2xvZ19oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgIGksIGw7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICBkYXRhOwogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAqbGluZSwgKnA7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBsZW47CiAgICAgbmd4X2h0dHBfbG9nX3QgICAgICAgICAgICpsb2c7CkBAIC0xNTcsNyArMTkxLDcgQEAKICAgICAgICAgb3AgPSBsb2dbbF0ub3BzLT5lbHRzOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbG9nW2xdLm9wcy0+bmVsdHM7IGkrKykgewogICAgICAgICAgICAgaWYgKG9wW2ldLmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGVuICs9IChzaXplX3QpIG9wW2ldLm9wKHIsIE5VTEwsIG9wW2ldLmRhdGEpOworICAgICAgICAgICAgICAgIGxlbiArPSBvcFtpXS5nZXRsZW4ociwgb3BbaV0uZGF0YSk7CiAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGVuICs9IG9wW2ldLmxlbjsKQEAgLTE3NywyMCArMjExLDcgQEAKICAgICAgICAgcCA9IGxpbmU7CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxvZ1tsXS5vcHMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChvcFtpXS5vcCA9PSBOR1hfSFRUUF9MT0dfQ09QWV9TSE9SVCkgewotICAgICAgICAgICAgICAgIGxlbiA9IG9wW2ldLmxlbjsKLSAgICAgICAgICAgICAgICBkYXRhID0gb3BbaV0uZGF0YTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobGVuLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKSAoZGF0YSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICBkYXRhID4+PSA4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmIChvcFtpXS5vcCA9PSBOR1hfSFRUUF9MT0dfQ09QWV9MT05HKSB7Ci0gICAgICAgICAgICAgICAgcCA9IG5neF9jcHltZW0ocCwgKHZvaWQgKikgb3BbaV0uZGF0YSwgb3BbaV0ubGVuKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwID0gb3BbaV0ub3AociwgcCwgb3BbaV0uZGF0YSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBwID0gb3BbaV0ucnVuKHIsIHAsICZvcFtpXSk7CiAgICAgICAgIH0KIAogI2lmIChOR1hfV0lOMzIpCkBAIC0yMDYsOCArMjI3LDMzIEBACiB9CiAKIAorc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2NvcHlfc2hvcnQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3sKKyAgICBzaXplX3QgICAgIGxlbjsKKyAgICB1aW50cHRyX3QgIGRhdGE7CisKKyAgICBsZW4gPSBvcC0+bGVuOworICAgIGRhdGEgPSBvcC0+ZGF0YTsKKworICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAqYnVmKysgPSAodV9jaGFyKSAoZGF0YSAmIDB4ZmYpOworICAgICAgICBkYXRhID4+PSA4OworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKKworc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2NvcHlfbG9uZyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCit7CisgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCAodV9jaGFyICopIG9wLT5kYXRhLCBvcC0+bGVuKTsKK30KKworCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfYWRkcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQubGVuKTsKQEAgLTIxNSwxNCArMjYxLDE0IEBACiAKIAogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKIHsKICAgICByZXR1cm4gbmd4X3NwcmludGYoYnVmLCAiJXVpIiwgci0+Y29ubmVjdGlvbi0+bnVtYmVyKTsKIH0KIAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfcGlwZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgaWYgKHItPnBpcGVsaW5lKSB7CiAgICAgICAgICpidWYgPSAncCc7CkBAIC0yMzUsNyArMjgxLDcgQEAKIAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdGltZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCBuZ3hfY2FjaGVkX2h0dHBfbG9nX3RpbWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2FjaGVkX2h0dHBfbG9nX3RpbWUubGVuKTsKQEAgLTI0Myw3ICsyODksNyBAQAogCiAKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19tc2VjKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKIHsKICAgICBzdHJ1Y3QgdGltZXZhbCAgdHY7CiAKQEAgLTI1MywyMCArMjk5LDIyIEBACiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIHNpemVfdCBuZ3hfaHR0cF9sb2dfcmVxdWVzdF9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCiB7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIGZpbmQgdGhlIHJlcXVlc3QgbGluZSBsZW5ndGggKi8KLSAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgci0+cmVxdWVzdF9saW5lLmxlbjsKLSAgICB9CisgICAgcmV0dXJuIHItPnJlcXVlc3RfbGluZS5sZW47Cit9CiAKKworc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3sKICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIHItPnJlcXVlc3RfbGluZS5kYXRhLCByLT5yZXF1ZXN0X2xpbmUubGVuKTsKIH0KIAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfc3RhdHVzKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiV1aSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHItPmVycl9zdGF0dXMgPyByLT5lcnJfc3RhdHVzIDogci0+aGVhZGVyc19vdXQuc3RhdHVzKTsKQEAgLTI3NCw5NSArMzIyLDMyMCBAQAogCiAKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKIHsKICAgICByZXR1cm4gbmd4X3NwcmludGYoYnVmLCAiJU8iLCByLT5jb25uZWN0aW9uLT5zZW50KTsKIH0KIAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfYXBhY2hlX2xlbmd0aChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiVPIiwgci0+Y29ubmVjdGlvbi0+c2VudCAtIHItPmhlYWRlcl9zaXplKTsKIH0KIAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfcmVxdWVzdF9sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiV6Iiwgci0+cmVxdWVzdF9sZW5ndGgpOwogfQogCiAKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19oZWFkZXJfaW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19oZWFkZXJfaW5fY29tcGlsZShuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3RyX3QgKnZhbHVlKQogewotICAgIG5neF91aW50X3QgICAgICAgICAgaTsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgKnM7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICpoOwotICAgIG5neF9odHRwX2xvZ19vcF90ICAqb3A7Ci0KLSAgICBpZiAocikgewotICAgICAgICBoID0gKihuZ3hfdGFibGVfZWx0X3QgKiopICgoY2hhciAqKSAmci0+aGVhZGVyc19pbiArIGRhdGEpOwotCi0gICAgICAgIGlmIChoID09IE5VTEwpIHsKLQotICAgICAgICAgICAgLyogbm8gaGVhZGVyICovCi0KLSAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAqYnVmID0gJy0nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVmICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICAgICAgLyogZmluZCB0aGUgaGVhZGVyIGxlbmd0aCAqLwotICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgaC0+dmFsdWUubGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCBoLT52YWx1ZS5kYXRhLCBoLT52YWx1ZS5sZW4pOwotICAgIH0KLQotICAgIC8qIGZpbmQgYW4gb2Zmc2V0IHdoaWxlIGEgZm9ybWF0IHN0cmluZyBjb21waWxhdGlvbiAqLwotCi0gICAgb3AgPSAobmd4X2h0dHBfbG9nX29wX3QgKikgYnVmOwotICAgIHMgPSAobmd4X3N0cl90ICopIGRhdGE7CisgICAgbmd4X3VpbnRfdCAgaTsKIAogICAgIG9wLT5sZW4gPSAwOwogCiAgICAgZm9yIChpID0gMDsgbmd4X2h0dHBfaGVhZGVyc19pbltpXS5uYW1lLmxlbiAhPSAwOyBpKyspIHsKLSAgICAgICAgaWYgKG5neF9odHRwX2hlYWRlcnNfaW5baV0ubmFtZS5sZW4gIT0gcy0+bGVuKSB7CisKKyAgICAgICAgaWYgKG5neF9odHRwX2hlYWRlcnNfaW5baV0ubmFtZS5sZW4gIT0gdmFsdWUtPmxlbikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobmd4X3N0cm5jYXNlY21wKG5neF9odHRwX2hlYWRlcnNfaW5baV0ubmFtZS5kYXRhLCBzLT5kYXRhLCBzLT5sZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IDApCisgICAgICAgIGlmIChuZ3hfc3RybmNhc2VjbXAobmd4X2h0dHBfaGVhZGVyc19pbltpXS5uYW1lLmRhdGEsIHZhbHVlLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+bGVuKSA9PSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBvcC0+b3AgPSBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luOworICAgICAgICAgICAgb3AtPmdldGxlbiA9IG5neF9odHRwX2xvZ19oZWFkZXJfaW5fZ2V0bGVuOworICAgICAgICAgICAgb3AtPnJ1biA9IG5neF9odHRwX2xvZ19oZWFkZXJfaW47CiAgICAgICAgICAgICBvcC0+ZGF0YSA9IG5neF9odHRwX2hlYWRlcnNfaW5baV0ub2Zmc2V0OwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBvcC0+b3AgPSBuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfaW47Ci0gICAgb3AtPmRhdGEgPSAodWludHB0cl90KSBzOworICAgIG9wLT5nZXRsZW4gPSBuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfaW5fZ2V0bGVuOworICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfaW47CisgICAgb3AtPmRhdGEgPSAodWludHB0cl90KSB2YWx1ZTsKIAotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIHNpemVfdCBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luX2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQoreworICAgIG5neF90YWJsZV9lbHRfdCAgKmg7CisKKyAgICBoID0gKihuZ3hfdGFibGVfZWx0X3QgKiopICgoY2hhciAqKSAmci0+aGVhZGVyc19pbiArIGRhdGEpOworCisgICAgaWYgKGgpIHsKKyAgICAgICAgcmV0dXJuIGgtPnZhbHVlLmxlbjsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfaGVhZGVyX2luKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3sKKyAgICBuZ3hfdGFibGVfZWx0X3QgICpoOworCisgICAgaCA9ICoobmd4X3RhYmxlX2VsdF90ICoqKSAoKGNoYXIgKikgJnItPmhlYWRlcnNfaW4gKyBvcC0+ZGF0YSk7CisKKyAgICBpZiAoaCkgeworICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIGgtPnZhbHVlLmRhdGEsIGgtPnZhbHVlLmxlbik7CisgICAgfQorCisgICAgKmJ1ZiA9ICctJzsKKworICAgIHJldHVybiBidWYgKyAxOworfQorCisKK3N0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX2luX2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCit7CisgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKKworICAgIGggPSBuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXIoJnItPmhlYWRlcnNfaW4uaGVhZGVycywgKG5neF9zdHJfdCAqKSBkYXRhKTsKKworICAgIGlmIChoKSB7CisgICAgICAgIHJldHVybiBoLT52YWx1ZS5sZW47CisgICAgfQorCisgICAgcmV0dXJuIDE7CiB9CiAKIAogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX2luKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1ZiwgdWludHB0cl90IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQoreworICAgIG5neF90YWJsZV9lbHRfdCAgKmg7CisKKyAgICBoID0gbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyKCZyLT5oZWFkZXJzX2luLmhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmd4X3N0cl90ICopIG9wLT5kYXRhKTsKKworICAgIGlmIChoKSB7CisgICAgICAgIHJldHVybiBuZ3hfY3B5bWVtKGJ1ZiwgaC0+dmFsdWUuZGF0YSwgaC0+dmFsdWUubGVuKTsKKyAgICB9CisKKyAgICAqYnVmID0gJy0nOworCisgICAgcmV0dXJuIGJ1ZiArIDE7Cit9CisKKworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9sb2dfaGVhZGVyX291dF9jb21waWxlKG5neF9odHRwX2xvZ19vcF90ICpvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3RyX3QgKnZhbHVlKQoreworICAgIG5neF91aW50X3QgIGk7CisKKyAgICBvcC0+bGVuID0gMDsKKworICAgIGZvciAoaSA9IDA7IG5neF9odHRwX2hlYWRlcnNfb3V0W2ldLm5hbWUubGVuICE9IDA7IGkrKykgeworCisgICAgICAgIGlmIChuZ3hfaHR0cF9oZWFkZXJzX291dFtpXS5uYW1lLmxlbiAhPSB2YWx1ZS0+bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZ3hfc3RybmNhc2VjbXAobmd4X2h0dHBfaGVhZGVyc19vdXRbaV0ubmFtZS5kYXRhLCB2YWx1ZS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPmxlbikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgb3AtPmdldGxlbiA9IG5neF9odHRwX2xvZ19oZWFkZXJfb3V0X2dldGxlbjsKKyAgICAgICAgICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfaGVhZGVyX291dDsKKyAgICAgICAgICAgIG9wLT5kYXRhID0gbmd4X2h0dHBfaGVhZGVyc19vdXRbaV0ub2Zmc2V0OworCisgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZhbHVlLT5sZW4gPT0gc2l6ZW9mKCJDb25uZWN0aW9uIikgLSAxCisgICAgICAgICYmIG5neF9zdHJuY2FzZWNtcCh2YWx1ZS0+ZGF0YSwgIkNvbm5lY3Rpb24iLCB2YWx1ZS0+bGVuKSA9PSAwKQorICAgIHsKKyAgICAgICAgb3AtPmxlbiA9IHNpemVvZigia2VlcC1hbGl2ZSIpIC0gMTsKKyAgICAgICAgb3AtPmdldGxlbiA9IE5VTEw7CisgICAgICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfY29ubmVjdGlvbl9oZWFkZXJfb3V0OworICAgICAgICBvcC0+ZGF0YSA9IDA7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgaWYgKHZhbHVlLT5sZW4gPT0gc2l6ZW9mKCJUcmFuc2Zlci1FbmNvZGluZyIpIC0gMQorICAgICAgICAmJiBuZ3hfc3RybmNhc2VjbXAodmFsdWUtPmRhdGEsICJUcmFuc2Zlci1FbmNvZGluZyIsIHZhbHVlLT5sZW4pID09IDApCisgICAgeworICAgICAgICBvcC0+bGVuID0gc2l6ZW9mKCJjaHVua2VkIikgLSAxOworICAgICAgICBvcC0+Z2V0bGVuID0gTlVMTDsKKyAgICAgICAgb3AtPnJ1biA9IG5neF9odHRwX2xvZ190cmFuc2Zlcl9lbmNvZGluZ19oZWFkZXJfb3V0OworICAgICAgICBvcC0+ZGF0YSA9IDA7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgb3AtPmdldGxlbiA9IG5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9vdXRfZ2V0bGVuOworICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfb3V0OworICAgIG9wLT5kYXRhID0gKHVpbnRwdHJfdCkgdmFsdWU7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXRfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQoreworICAgIG5neF90YWJsZV9lbHRfdCAgKmg7CisKKyAgICBoID0gKihuZ3hfdGFibGVfZWx0X3QgKiopICgoY2hhciAqKSAmci0+aGVhZGVyc19vdXQgKyBkYXRhKTsKKworICAgIGlmIChoKSB7CisgICAgICAgIHJldHVybiBoLT52YWx1ZS5sZW47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBObyBoZWFkZXIgcG9pbnRlciB3YXMgZm91bmQuCisgICAgICogSG93ZXZlciwgc29tZSBoZWFkZXJzOiAiRGF0ZSIsICJTZXJ2ZXIiLCAiQ29udGVudC1MZW5ndGgiLAorICAgICAqIGFuZCAiTGFzdC1Nb2RpZmllZCIgaGF2ZSBhIHNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIGhlYWRlciBmaWx0ZXIKKyAgICAgKiBidXQgd2UgZG8gbm90IHNldCB1cCB0aGVpciBwb2ludGVycyBpbiB0aGUgZmlsdGVyIGJlY2F1c2UKKyAgICAgKiB0aGV5IGFyZSB0b28gc2VsZG9tIG5lZWRlZCB0byBiZSBsb2dnZWQuCisgICAgICovCisKKyAgICBpZiAoZGF0YSA9PSBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX291dF90LCBkYXRlKSkgeworICAgICAgICByZXR1cm4gbmd4X2NhY2hlZF9odHRwX3RpbWUubGVuOworICAgIH0KKworICAgIGlmIChkYXRhID09IG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIHNlcnZlcikpIHsKKyAgICAgICAgcmV0dXJuIChzaXplb2YoTkdJTlhfVkVSKSAtIDEpOworICAgIH0KKworICAgIGlmIChkYXRhID09IG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIGNvbnRlbnRfbGVuZ3RoKSkgeworICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTkdYX09GRl9UX0xFTjsKKyAgICB9CisKKyAgICBpZiAoZGF0YSA9PSBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX291dF90LCBsYXN0X21vZGlmaWVkKSkgeworICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZF90aW1lID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzaXplb2YoIk1vbiwgMjggU2VwIDE5NzAgMDY6MDA6MDAgR01UIikgLSAxOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19oZWFkZXJfb3V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCit7CisgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKKworICAgIGggPSAqKG5neF90YWJsZV9lbHRfdCAqKikgKChjaGFyICopICZyLT5oZWFkZXJzX291dCArIG9wLT5kYXRhKTsKKworICAgIGlmIChoKSB7CisgICAgICAgIHJldHVybiBuZ3hfY3B5bWVtKGJ1ZiwgaC0+dmFsdWUuZGF0YSwgaC0+dmFsdWUubGVuKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vIGhlYWRlciBwb2ludGVyIHdhcyBmb3VuZC4KKyAgICAgKiBIb3dldmVyLCBzb21lIGhlYWRlcnM6ICJEYXRlIiwgIlNlcnZlciIsICJDb250ZW50LUxlbmd0aCIsCisgICAgICogYW5kICJMYXN0LU1vZGlmaWVkIiBoYXZlIGEgc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgaGVhZGVyIGZpbHRlcgorICAgICAqIGJ1dCB3ZSBkbyBub3Qgc2V0IHVwIHRoZWlyIHBvaW50ZXJzIGluIHRoZSBmaWx0ZXIgYmVjYXVzZQorICAgICAqIHRoZXkgYXJlIHRvbyBzZWxkb20gbmVlZGVkIHRvIGJlIGxvZ2dlZC4KKyAgICAgKi8KKworICAgIGlmIChvcC0+ZGF0YSA9PSBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX291dF90LCBkYXRlKSkgeworICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIG5neF9jYWNoZWRfaHR0cF90aW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jYWNoZWRfaHR0cF90aW1lLmxlbik7CisgICAgfQorCisgICAgaWYgKG9wLT5kYXRhID09IG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIHNlcnZlcikpIHsKKyAgICAgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCBOR0lOWF9WRVIsIHNpemVvZihOR0lOWF9WRVIpIC0gMSk7CisgICAgfQorCisgICAgaWYgKG9wLT5kYXRhID09IG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIGNvbnRlbnRfbGVuZ3RoKSkgeworICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9PSAtMSkgeworICAgICAgICAgICAgKmJ1ZiA9ICctJzsKKworICAgICAgICAgICAgcmV0dXJuIGJ1ZiArIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmd4X3NwcmludGYoYnVmLCAiJU8iLCByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uKTsKKyAgICB9CisKKyAgICBpZiAob3AtPmRhdGEgPT0gb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19vdXRfdCwgbGFzdF9tb2RpZmllZCkpIHsKKyAgICAgICAgaWYgKHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWRfdGltZSA9PSAtMSkgeworICAgICAgICAgICAgKmJ1ZiA9ICctJzsKKworICAgICAgICAgICAgcmV0dXJuIGJ1ZiArIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmd4X2h0dHBfdGltZShidWYsIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWRfdGltZSk7CisgICAgfQorCisgICAgKmJ1ZiA9ICctJzsKKworICAgIHJldHVybiBidWYgKyAxOworfQorCisKK3N0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX291dF9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICBuZ3hfdGFibGVfZWx0X3QgICpoOworCisgICAgaCA9IG5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcigmci0+aGVhZGVyc19vdXQuaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ3hfc3RyX3QgKikgZGF0YSk7CisKKyAgICBpZiAoaCkgeworICAgICAgICByZXR1cm4gaC0+dmFsdWUubGVuOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9vdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQoreworICAgIG5neF90YWJsZV9lbHRfdCAgKmg7CisKKyAgICBoID0gbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5neF9zdHJfdCAqKSBvcC0+ZGF0YSk7CisKKyAgICBpZiAoaCkgeworICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIGgtPnZhbHVlLmRhdGEsIGgtPnZhbHVlLmxlbik7CisgICAgfQorCisgICAgKmJ1ZiA9ICctJzsKKworICAgIHJldHVybiBidWYgKyAxOworfQorCisKK3N0YXRpYyBuZ3hfdGFibGVfZWx0X3QgKm5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcihuZ3hfbGlzdF90ICpoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9zdHJfdCAqdmFsdWUpCiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgaTsKLSAgICBuZ3hfc3RyX3QgICAgICAgICpzOwogICAgIG5neF9saXN0X3BhcnRfdCAgKnBhcnQ7CiAgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKIAotICAgIHMgPSAobmd4X3N0cl90ICopIGRhdGE7Ci0KLSAgICBwYXJ0ID0gJnItPmhlYWRlcnNfaW4uaGVhZGVycy5wYXJ0OworICAgIHBhcnQgPSAmaGVhZGVycy0+cGFydDsKICAgICBoID0gcGFydC0+ZWx0czsKIAogICAgIGZvciAoaSA9IDA7IC8qIHZvaWQgKi87IGkrKykgewpAQCAtMzc3LDE3MiArNjUwLDIzIEBACiAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChoW2ldLmtleS5sZW4gIT0gcy0+bGVuKSB7CisgICAgICAgIGlmIChoW2ldLmtleS5sZW4gIT0gdmFsdWUtPmxlbikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobmd4X3N0cm5jYXNlY21wKGhbaV0ua2V5LmRhdGEsIHMtPmRhdGEsIHMtPmxlbikgPT0gMCkgewotICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogZmluZCB0aGUgaGVhZGVyIGxlbmd0aCAqLwotICAgICAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopIGhbaV0udmFsdWUubGVuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIGhbaV0udmFsdWUuZGF0YSwgaFtpXS52YWx1ZS5sZW4pOworICAgICAgICBpZiAobmd4X3N0cm5jYXNlY21wKGhbaV0ua2V5LmRhdGEsIHZhbHVlLT5kYXRhLCB2YWx1ZS0+bGVuKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gJmhbaV07CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBubyBoZWFkZXIgKi8KLQotICAgIGlmIChidWYpIHsKLSAgICAgICAgKmJ1ZiA9ICctJzsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmICsgMTsKLX0KLQotCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfaGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCi17Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICBpOwotICAgIG5neF9zdHJfdCAgICAgICAgICAqczsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgKmg7Ci0gICAgbmd4X2h0dHBfbG9nX29wX3QgICpvcDsKLQotICAgIGlmIChyKSB7Ci0KLSAgICAgICAgLyogcnVuLXRpbWUgZXhlY3V0aW9uICovCi0KLSAgICAgICAgaWYgKHItPmh0dHBfdmVyc2lvbiA8IE5HWF9IVFRQX1ZFUlNJT05fMTApIHsKLSAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAqYnVmID0gJy0nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVmICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIGggPSAqKG5neF90YWJsZV9lbHRfdCAqKikgKChjaGFyICopICZyLT5oZWFkZXJzX291dCArIGRhdGEpOwotCi0gICAgICAgIGlmIChoID09IE5VTEwpIHsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE5vIGhlYWRlciBwb2ludGVyIHdhcyBmb3VuZC4KLSAgICAgICAgICAgICAqIEhvd2V2ZXIsIHNvbWUgaGVhZGVyczogIkRhdGUiLCAiU2VydmVyIiwgIkNvbnRlbnQtTGVuZ3RoIiwKLSAgICAgICAgICAgICAqIGFuZCAiTGFzdC1Nb2RpZmllZCIgaGF2ZSBhIHNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIGhlYWRlciBmaWx0ZXIKLSAgICAgICAgICAgICAqIGJ1dCB3ZSBkbyBub3Qgc2V0IHVwIHRoZWlyIHBvaW50ZXJzIGluIHRoZSBmaWx0ZXIgYmVjYXVzZQotICAgICAgICAgICAgICogdGhleSBhcmUgdG9vIHNlbGRvbSBuZWVkZWQgdG8gYmUgbG9nZ2VkLgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIGlmIChkYXRhID09IG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIGRhdGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopIG5neF9jYWNoZWRfaHR0cF90aW1lLmxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCBuZ3hfY2FjaGVkX2h0dHBfdGltZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jYWNoZWRfaHR0cF90aW1lLmxlbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkYXRhID09IG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIHNlcnZlcikpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgKHNpemVvZihOR0lOWF9WRVIpIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZ3hfY3B5bWVtKGJ1ZiwgTkdJTlhfVkVSLCBzaXplb2YoTkdJTlhfVkVSKSAtIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGF0YSA9PSBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX291dF90LCBjb250ZW50X2xlbmd0aCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqYnVmID0gJy0nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWYgKyAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBOR1hfT0ZGX1RfTEVOOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmd4X3NwcmludGYoYnVmLCAiJU8iLCByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRhdGEgPT0gb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19vdXRfdCwgbGFzdF9tb2RpZmllZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZF90aW1lID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpidWYgPSAnLSc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZiArIDE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiTW9uLCAyOCBTZXAgMTk3MCAwNjowMDowMCBHTVQiKSAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF90aW1lKGJ1Ziwgci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZF90aW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICpidWYgPSAnLSc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWYgKyAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvKiBmaW5kIHRoZSBoZWFkZXIgbGVuZ3RoICovCi0gICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBoLT52YWx1ZS5sZW47Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIGgtPnZhbHVlLmRhdGEsIGgtPnZhbHVlLmxlbik7Ci0gICAgfQotCi0gICAgLyogZmluZCBhbiBvZmZzZXQgd2hpbGUgYSBmb3JtYXQgc3RyaW5nIGNvbXBpbGF0aW9uICovCi0KLSAgICBvcCA9IChuZ3hfaHR0cF9sb2dfb3BfdCAqKSBidWY7Ci0gICAgcyA9IChuZ3hfc3RyX3QgKikgZGF0YTsKLQotICAgIG9wLT5sZW4gPSAwOwotCi0gICAgZm9yIChpID0gMDsgbmd4X2h0dHBfaGVhZGVyc19vdXRbaV0ubmFtZS5sZW4gIT0gMDsgaSsrKSB7Ci0gICAgICAgIGlmIChuZ3hfaHR0cF9oZWFkZXJzX291dFtpXS5uYW1lLmxlbiAhPSBzLT5sZW4pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5neF9zdHJuY2FzZWNtcChuZ3hfaHR0cF9oZWFkZXJzX291dFtpXS5uYW1lLmRhdGEsIHMtPmRhdGEsIHMtPmxlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgb3AtPm9wID0gbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXQ7Ci0gICAgICAgICAgICBvcC0+ZGF0YSA9IG5neF9odHRwX2hlYWRlcnNfb3V0W2ldLm9mZnNldDsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHMtPmxlbiA9PSBzaXplb2YoIkNvbm5lY3Rpb24iKSAtIDEKLSAgICAgICAgJiYgbmd4X3N0cm5jYXNlY21wKHMtPmRhdGEsICJDb25uZWN0aW9uIiwgcy0+bGVuKSA9PSAwKQotICAgIHsKLSAgICAgICAgb3AtPm9wID0gbmd4X2h0dHBfbG9nX2Nvbm5lY3Rpb25faGVhZGVyX291dDsKLSAgICAgICAgb3AtPmRhdGEgPSAodWludHB0cl90KSBOVUxMOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAocy0+bGVuID09IHNpemVvZigiVHJhbnNmZXItRW5jb2RpbmciKSAtIDEKLSAgICAgICAgJiYgbmd4X3N0cm5jYXNlY21wKHMtPmRhdGEsICJUcmFuc2Zlci1FbmNvZGluZyIsIHMtPmxlbikgPT0gMCkgewotICAgICAgICBvcC0+b3AgPSBuZ3hfaHR0cF9sb2dfdHJhbnNmZXJfZW5jb2RpbmdfaGVhZGVyX291dDsKLSAgICAgICAgb3AtPmRhdGEgPSAodWludHB0cl90KSBOVUxMOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBvcC0+b3AgPSBuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfb3V0OwotICAgIG9wLT5kYXRhID0gKHVpbnRwdHJfdCkgczsKLQogICAgIHJldHVybiBOVUxMOwogfQogCiAKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19jb25uZWN0aW9uX2hlYWRlcl9vdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1ZiwgdWludHB0cl90IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAodV9jaGFyICopICgoci0+a2VlcGFsaXZlKSA/IHNpemVvZigia2VlcC1hbGl2ZSIpIC0gMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJjbG9zZSIpIC0gMSk7Ci0gICAgfQotCiAgICAgaWYgKHItPmtlZXBhbGl2ZSkgewogICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsICJrZWVwLWFsaXZlIiwgc2l6ZW9mKCJrZWVwLWFsaXZlIikgLSAxKTsKIApAQCAtNTU0LDEyICs2NzgsOCBAQAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdHJhbnNmZXJfZW5jb2RpbmdfaGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQogewotICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAoKHItPmNodW5rZWQpID8gc2l6ZW9mKCJjaHVua2VkIikgLSAxIDogMSk7Ci0gICAgfQotCiAgICAgaWYgKHItPmNodW5rZWQpIHsKICAgICAgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCAiY2h1bmtlZCIsIHNpemVvZigiY2h1bmtlZCIpIC0gMSk7CiAgICAgfQpAQCAtNTcwLDYyICs2OTAsMTIgQEAKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfb3V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQotewotICAgIG5neF91aW50X3QgICAgICAgIGk7Ci0gICAgbmd4X3N0cl90ICAgICAgICAqczsKLSAgICBuZ3hfbGlzdF9wYXJ0X3QgICpwYXJ0OwotICAgIG5neF90YWJsZV9lbHRfdCAgKmg7Ci0KLSAgICBzID0gKG5neF9zdHJfdCAqKSBkYXRhOwotCi0gICAgcGFydCA9ICZyLT5oZWFkZXJzX291dC5oZWFkZXJzLnBhcnQ7Ci0gICAgaCA9IHBhcnQtPmVsdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyAvKiB2b2lkICovOyBpKyspIHsKLQotICAgICAgICBpZiAoaSA+PSBwYXJ0LT5uZWx0cykgewotICAgICAgICAgICAgaWYgKHBhcnQtPm5leHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYXJ0ID0gcGFydC0+bmV4dDsKLSAgICAgICAgICAgIGggPSBwYXJ0LT5lbHRzOwotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaFtpXS5rZXkubGVuICE9IHMtPmxlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmd4X3N0cm5jYXNlY21wKGhbaV0ua2V5LmRhdGEsIHMtPmRhdGEsIHMtPmxlbikgPT0gMCkgewotICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogZmluZCB0aGUgaGVhZGVyIGxlbmd0aCAqLwotICAgICAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopIGhbaV0udmFsdWUubGVuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIGhbaV0udmFsdWUuZGF0YSwgaFtpXS52YWx1ZS5sZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbm8gaGVhZGVyICovCi0KLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgICpidWYgPSAnLSc7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1ZiArIDE7Ci19Ci0KLQotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9sb2dfcHJlX2NvbmYobmd4X2NvbmZfdCAqY2YpCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19zZXRfZm9ybWF0cyhuZ3hfY29uZl90ICpjZikKIHsKICAgICBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICAqb3A7CiAKICAgICBmb3IgKG9wID0gbmd4X2h0dHBfbG9nX2ZtdF9vcHM7IG9wLT5uYW1lLmxlbjsgb3ArKykgeyAvKiB2b2lkICovIH0KLSAgICBvcC0+b3AgPSBOVUxMOworICAgIG9wLT5ydW4gPSBOVUxMOwogCiAgICAgcmV0dXJuIE5HWF9PSzsKIH0KQEAgLTg4OSwxNSArOTU5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZvciAobmFtZSA9IG5neF9odHRwX2xvZ19mbXRfb3BzOyBuYW1lLT5vcDsgbmFtZSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChuYW1lID0gbmd4X2h0dHBfbG9nX2ZtdF9vcHM7IG5hbWUtPnJ1bjsgbmFtZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLT5uYW1lLmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gKG5neF9odHRwX2xvZ19vcF9uYW1lX3QgKikgbmFtZS0+b3A7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gKG5neF9odHRwX2xvZ19vcF9uYW1lX3QgKikgbmFtZS0+cnVuOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUtPm5hbWUubGVuID09IGZuYW1lX2xlbgogICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmd4X3N0cm5jbXAobmFtZS0+bmFtZS5kYXRhLCBmbmFtZSwgZm5hbWVfbGVuKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS0+bGVuICE9IE5HWF9IVFRQX0xPR19BUkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLT5jb21waWxlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmxlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZVtmbmFtZV9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLApAQCAtOTA3LDcgKzk3Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmxlbiA9IG5hbWUtPmxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+b3AgPSBuYW1lLT5vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+Z2V0bGVuID0gbmFtZS0+Z2V0bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5ydW4gPSBuYW1lLT5ydW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEgPSAwOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC05MjYsNyArOTk3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgKmEgPSBhcmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5vcChOVUxMLCAodV9jaGFyICopIG9wLCAodWludHB0cl90KSBhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLT5jb21waWxlKG9wLCBhKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05NDksOSArMTAyMiwxMCBAQAogICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKIAogICAgICAgICAgICAgICAgICAgICBvcC0+bGVuID0gbGVuOworICAgICAgICAgICAgICAgICAgICBvcC0+Z2V0bGVuID0gTlVMTDsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IHNpemVvZih1aW50cHRyX3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcC0+b3AgPSBOR1hfSFRUUF9MT0dfQ09QWV9TSE9SVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfY29weV9zaG9ydDsKICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhID0gMDsKIAogICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbi0tKSB7CkBAIC05NjAsNyArMTAzNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5vcCA9IE5HWF9IVFRQX0xPR19DT1BZX0xPTkc7CisgICAgICAgICAgICAgICAgICAgICAgICBvcC0+cnVuID0gbmd4X2h0dHBfbG9nX2NvcHlfbG9uZzsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocCA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIGxlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuaCBiL3NyYy9odHRwL25neF9odHRwX2xvZ19oYW5kbGVyLmgKaW5kZXggOGViNzRiYS4uNDQ3MmVkOSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5oCkBAIC0xMyw0OSArMTMsNTQgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKLXR5cGVkZWYgdV9jaGFyICooKm5neF9odHRwX2xvZ19vcF9wdCkgKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7Cit0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9sb2dfb3BfcyAgbmd4X2h0dHBfbG9nX29wX3Q7CiAKLSNkZWZpbmUgTkdYX0hUVFBfTE9HX0NPUFlfU0hPUlQgIChuZ3hfaHR0cF9sb2dfb3BfcHQpIDAKLSNkZWZpbmUgTkdYX0hUVFBfTE9HX0NPUFlfTE9ORyAgIChuZ3hfaHR0cF9sb2dfb3BfcHQpIC0xCit0eXBlZGVmIHVfY2hhciAqKCpuZ3hfaHR0cF9sb2dfb3BfcnVuX3B0KSAobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCi0jZGVmaW5lIE5HWF9IVFRQX0xPR19BUkcgICAgICAgICAodV9pbnQpIC0xCit0eXBlZGVmIHNpemVfdCAoKm5neF9odHRwX2xvZ19vcF9nZXRsZW5fcHQpIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisKK3R5cGVkZWYgbmd4X2ludF90ICgqbmd4X2h0dHBfbG9nX29wX2NvbXBpbGVfcHQpIChuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3N0cl90ICp2YWx1ZSk7CisKK3N0cnVjdCBuZ3hfaHR0cF9sb2dfb3BfcyB7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfaHR0cF9sb2dfb3BfZ2V0bGVuX3B0ICAgZ2V0bGVuOworICAgIG5neF9odHRwX2xvZ19vcF9ydW5fcHQgICAgICBydW47CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgIGRhdGE7Cit9OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBzaXplX3QgICAgICAgICAgICAgICBsZW47Ci0gICAgbmd4X2h0dHBfbG9nX29wX3B0ICAgb3A7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgZGF0YTsKLX0gbmd4X2h0dHBfbG9nX29wX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9zdHJfdCAgICAgICAgICAgIG5hbWU7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAqb3BzOyAgICAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfbG9nX29wX3QgKi8KKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAqb3BzOyAgICAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfbG9nX29wX3QgKi8KIH0gbmd4X2h0dHBfbG9nX2ZtdF90OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICBuYW1lOwotICAgIHNpemVfdCAgICAgICAgICAgICAgIGxlbjsKLSAgICBuZ3hfaHR0cF9sb2dfb3BfcHQgICBvcDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIG5neF9odHRwX2xvZ19vcF9jb21waWxlX3B0ICBjb21waWxlOworICAgIG5neF9odHRwX2xvZ19vcF9nZXRsZW5fcHQgICBnZXRsZW47CisgICAgbmd4X2h0dHBfbG9nX29wX3J1bl9wdCAgICAgIHJ1bjsKIH0gbmd4X2h0dHBfbG9nX29wX25hbWVfdDsKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgZm9ybWF0czsgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfbG9nX2ZtdF90ICovCisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgIGZvcm1hdHM7ICAgIC8qIGFycmF5IG9mIG5neF9odHRwX2xvZ19mbXRfdCAqLwogfSBuZ3hfaHR0cF9sb2dfbWFpbl9jb25mX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9vcGVuX2ZpbGVfdCAgICAgKmZpbGU7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAqb3BzOyAgICAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfbG9nX29wX3QgKi8KKyAgICBuZ3hfb3Blbl9maWxlX3QgICAgICAgICAgICAqZmlsZTsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAqb3BzOyAgICAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfbG9nX29wX3QgKi8KIH0gbmd4X2h0dHBfbG9nX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9hcnJheV90ICAgICAgICAgKmxvZ3M7ICAgICAgIC8qIGFycmF5IG9mIG5neF9odHRwX2xvZ190ICovCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgb2ZmOyAgICAgICAgLyogdW5zaWduZWQgIG9mZjoxICovCisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgKmxvZ3M7ICAgICAgIC8qIGFycmF5IG9mIG5neF9odHRwX2xvZ190ICovCisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIG9mZjsgICAgICAgIC8qIHVuc2lnbmVkICBvZmY6MSAqLwogfSBuZ3hfaHR0cF9sb2dfbG9jX2NvbmZfdDsKIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYwppbmRleCA3N2RiODEzLi5iMTdjMjAwIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMKQEAgLTM0LDE1ICszNCwxMyBAQAogICAgICAgICBzd19tYWpvcl9kaWdpdCwKICAgICAgICAgc3dfZmlyc3RfbWlub3JfZGlnaXQsCiAgICAgICAgIHN3X21pbm9yX2RpZ2l0LAotICAgICAgICBzd19hbG1vc3RfZG9uZSwKLSAgICAgICAgc3dfZG9uZQorICAgICAgICBzd19hbG1vc3RfZG9uZQogICAgIH0gc3RhdGU7CiAKICAgICBzdGF0ZSA9IHItPnN0YXRlOwotICAgIHAgPSBiLT5wb3M7CiAKLSAgICB3aGlsZSAocCA8IGItPmxhc3QgJiYgc3RhdGUgPCBzd19kb25lKSB7Ci0gICAgICAgIGNoID0gKnArKzsKKyAgICBmb3IgKHAgPSBiLT5wb3M7IHAgPCBiLT5sYXN0OyBwKyspIHsKKyAgICAgICAgY2ggPSAqcDsKIAogICAgICAgICAvKiBnY2MgMi45NS4yIGFuZCBtc3ZjIDYuMCBjb21waWxlIHRoaXMgc3dpdGNoIGFzIGFuIGp1bXAgdGFibGUgKi8KIApAQCAtNTAsNyArNDgsNyBAQAogCiAgICAgICAgIC8qIEhUVFAgbWV0aG9kczogR0VULCBIRUFELCBQT1NUICovCiAgICAgICAgIGNhc2Ugc3dfc3RhcnQ6Ci0gICAgICAgICAgICByLT5yZXF1ZXN0X3N0YXJ0ID0gcCAtIDE7CisgICAgICAgICAgICByLT5yZXF1ZXN0X3N0YXJ0ID0gcDsKIAogICAgICAgICAgICAgaWYgKGNoID09IENSIHx8IGNoID09IExGKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02NSwxOSArNjMsMTkgQEAKIAogICAgICAgICBjYXNlIHN3X21ldGhvZDoKICAgICAgICAgICAgIGlmIChjaCA9PSAnICcpIHsKLSAgICAgICAgICAgICAgICByLT5tZXRob2RfZW5kID0gcCAtIDE7CisgICAgICAgICAgICAgICAgci0+bWV0aG9kX2VuZCA9IHA7CiAgICAgICAgICAgICAgICAgbSA9IHItPnJlcXVlc3Rfc3RhcnQ7CiAKLSAgICAgICAgICAgICAgICBpZiAoci0+bWV0aG9kX2VuZCAtIG0gPT0gMykgeworICAgICAgICAgICAgICAgIGlmIChwIC0gbSA9PSAzKSB7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1bMF0gPT0gJ0cnICYmIG1bMV0gPT0gJ0UnICYmIG1bMl0gPT0gJ1QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByLT5tZXRob2QgPSBOR1hfSFRUUF9HRVQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci0+bWV0aG9kX2VuZCAtIG0gPT0gNCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocCAtIG0gPT0gNCkgewogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtWzBdID09ICdQJyAmJiBtWzFdID09ICdPJwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVsyXSA9PSAnVCcgJiYgbVszXSA9PSAnVCcpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtWzJdID09ICdTJyAmJiBtWzNdID09ICdUJykKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgci0+bWV0aG9kID0gTkdYX0hUVFBfUE9TVDsKIApAQCAtMTEzLDE0ICsxMTEsMTQgQEAKICAgICAgICAgY2FzZSBzd19zcGFjZXNfYmVmb3JlX3VyaToKICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgJy8nOgotICAgICAgICAgICAgICAgIHItPnVyaV9zdGFydCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHItPnVyaV9zdGFydCA9IHA7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hZnRlcl9zbGFzaF9pbl91cmk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykpIHsKLSAgICAgICAgICAgICAgICAgICAgci0+c2NoZW1hX3N0YXJ0ID0gcCAtIDE7CisgICAgICAgICAgICAgICAgICAgIHItPnNjaGVtYV9zdGFydCA9IHA7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc2NoZW1hOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xMzEsNyArMTI5LDcgQEAKICAgICAgICAgY2FzZSBzd19zY2hlbWE6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlICc6JzoKLSAgICAgICAgICAgICAgICByLT5zY2hlbWFfZW5kID0gcCAtIDE7CisgICAgICAgICAgICAgICAgci0+c2NoZW1hX2VuZCA9IHA7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zY2hlbWFfc2xhc2g7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMTU1LDcgKzE1Myw3IEBACiAgICAgICAgIGNhc2Ugc3dfc2NoZW1hX3NsYXNoX3NsYXNoOgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnLyc6Ci0gICAgICAgICAgICAgICAgci0+aG9zdF9zdGFydCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHItPmhvc3Rfc3RhcnQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfaG9zdDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNjYsMTIgKzE2NCwxMiBAQAogICAgICAgICBjYXNlIHN3X2hvc3Q6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlICc6JzoKLSAgICAgICAgICAgICAgICByLT5ob3N0X2VuZCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHItPmhvc3RfZW5kID0gcDsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3BvcnQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICcvJzoKLSAgICAgICAgICAgICAgICByLT5ob3N0X2VuZCA9IHAgLSAxOwotICAgICAgICAgICAgICAgIHItPnVyaV9zdGFydCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHItPmhvc3RfZW5kID0gcDsKKyAgICAgICAgICAgICAgICByLT51cmlfc3RhcnQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYWZ0ZXJfc2xhc2hfaW5fdXJpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTE4Nyw4ICsxODUsOCBAQAogICAgICAgICBjYXNlIHN3X3BvcnQ6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlICcvJzoKLSAgICAgICAgICAgICAgICByLT5wb3J0X2VuZCA9IHAgLSAxOwotICAgICAgICAgICAgICAgIHItPnVyaV9zdGFydCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHItPnBvcnRfZW5kID0gcDsKKyAgICAgICAgICAgICAgICByLT51cmlfc3RhcnQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYWZ0ZXJfc2xhc2hfaW5fdXJpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTIwMywxNyArMjAxLDE2IEBACiAgICAgICAgIGNhc2Ugc3dfYWZ0ZXJfc2xhc2hfaW5fdXJpOgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSBDUjoKLSAgICAgICAgICAgICAgICByLT51cmlfZW5kID0gcCAtIDE7CisgICAgICAgICAgICAgICAgci0+dXJpX2VuZCA9IHA7CiAgICAgICAgICAgICAgICAgci0+aHR0cF9taW5vciA9IDk7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTEY6Ci0gICAgICAgICAgICAgICAgci0+dXJpX2VuZCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHItPnVyaV9lbmQgPSBwOwogICAgICAgICAgICAgICAgIHItPmh0dHBfbWlub3IgPSA5OwotICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgICAgICByLT51cmlfZW5kID0gcCAtIDE7CisgICAgICAgICAgICAgICAgci0+dXJpX2VuZCA9IHA7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19odHRwXzA5OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnLic6CkBAIC0yMzMsNyArMjMwLDcgQEAKICAgICAgICAgICAgICAgICByLT5jb21wbGV4X3VyaSA9IDE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICAgICAgICByLT5hcmdzX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICByLT5hcmdzX3N0YXJ0ID0gcCArIDE7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd191cmk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMjQ2LDIxICsyNDMsMjAgQEAKICAgICAgICAgY2FzZSBzd19jaGVja191cmk6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgICAgIHItPnVyaV9lbmQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICByLT51cmlfZW5kID0gcDsKICAgICAgICAgICAgICAgICByLT5odHRwX21pbm9yID0gOTsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICByLT51cmlfZW5kID0gcCAtIDE7CisgICAgICAgICAgICAgICAgci0+dXJpX2VuZCA9IHA7CiAgICAgICAgICAgICAgICAgci0+aHR0cF9taW5vciA9IDk7Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgICAgIHItPnVyaV9lbmQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICByLT51cmlfZW5kID0gcDsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2h0dHBfMDk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICcuJzoKLSAgICAgICAgICAgICAgICByLT51cmlfZXh0ID0gcDsKKyAgICAgICAgICAgICAgICByLT51cmlfZXh0ID0gcCArIDE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAjaWYgKE5HWF9XSU4zMikKICAgICAgICAgICAgIGNhc2UgJ1xcJzoKQEAgLTI3Nyw3ICsyNzMsNyBAQAogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdXJpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgICAgICAgci0+YXJnc19zdGFydCA9IHA7CisgICAgICAgICAgICAgICAgci0+YXJnc19zdGFydCA9IHAgKyAxOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdXJpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjg3LDE3ICsyODMsMTYgQEAKICAgICAgICAgY2FzZSBzd191cmk6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgICAgIHItPnVyaV9lbmQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICByLT51cmlfZW5kID0gcDsKICAgICAgICAgICAgICAgICByLT5odHRwX21pbm9yID0gOTsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICByLT51cmlfZW5kID0gcCAtIDE7CisgICAgICAgICAgICAgICAgci0+dXJpX2VuZCA9IHA7CiAgICAgICAgICAgICAgICAgci0+aHR0cF9taW5vciA9IDk7Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgICAgIHItPnVyaV9lbmQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICByLT51cmlfZW5kID0gcDsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2h0dHBfMDk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0zMTQsOSArMzA5LDkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTEY6CiAgICAgICAgICAgICAgICAgci0+aHR0cF9taW5vciA9IDk7Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgICAgIHItPmh0dHBfcHJvdG9jb2wuZGF0YSA9IHA7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19odHRwX0g7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNDA2LDggKzQwMSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjaCA9PSBMRikgewotICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgewpAQCAtNDE5LDQyICs0MTMsMzggQEAKIAogICAgICAgICAvKiBlbmQgb2YgcmVxdWVzdCBsaW5lICovCiAgICAgICAgIGNhc2Ugc3dfYWxtb3N0X2RvbmU6Ci0gICAgICAgICAgICByLT5yZXF1ZXN0X2VuZCA9IHAgLSAyOworICAgICAgICAgICAgci0+cmVxdWVzdF9lbmQgPSBwIC0gMTsKICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgTEY6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BBUlNFX0lOVkFMSURfUkVRVUVTVDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIHN1cHByZXNzIHdhcm5pbmcgKi8KLSAgICAgICAgY2FzZSBzd19kb25lOgotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBiLT5wb3MgPSBwOworICAgIHItPnN0YXRlID0gc3RhdGU7CiAKLSAgICBpZiAoc3RhdGUgPT0gc3dfZG9uZSkgewotICAgICAgICBpZiAoci0+cmVxdWVzdF9lbmQgPT0gTlVMTCkgewotICAgICAgICAgICAgci0+cmVxdWVzdF9lbmQgPSBwIC0gMTsKLSAgICAgICAgfQorICAgIHJldHVybiBOR1hfQUdBSU47CiAKLSAgICAgICAgci0+aHR0cF92ZXJzaW9uID0gci0+aHR0cF9tYWpvciAqIDEwMDAgKyByLT5odHRwX21pbm9yOwotICAgICAgICByLT5zdGF0ZSA9IHN3X3N0YXJ0OworZG9uZToKIAotICAgICAgICBpZiAoci0+aHR0cF92ZXJzaW9uID09IDkgJiYgci0+bWV0aG9kICE9IE5HWF9IVFRQX0dFVCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BBUlNFX0lOVkFMSURfMDlfTUVUSE9EOwotICAgICAgICB9CisgICAgYi0+cG9zID0gcCArIDE7CiAKLSAgICAgICAgcmV0dXJuIE5HWF9PSzsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHItPnN0YXRlID0gc3RhdGU7Ci0gICAgICAgIHJldHVybiBOR1hfQUdBSU47CisgICAgaWYgKHItPnJlcXVlc3RfZW5kID09IE5VTEwpIHsKKyAgICAgICAgci0+cmVxdWVzdF9lbmQgPSBwOwogICAgIH0KKworICAgIHItPmh0dHBfdmVyc2lvbiA9IHItPmh0dHBfbWFqb3IgKiAxMDAwICsgci0+aHR0cF9taW5vcjsKKyAgICByLT5zdGF0ZSA9IHN3X3N0YXJ0OworCisgICAgaWYgKHItPmh0dHBfdmVyc2lvbiA9PSA5ICYmIHItPm1ldGhvZCAhPSBOR1hfSFRUUF9HRVQpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BBUlNFX0lOVkFMSURfMDlfTUVUSE9EOworICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIApAQCAtNDY5LDE2ICs0NTksMTMgQEAKICAgICAgICAgc3dfc3BhY2VfYWZ0ZXJfdmFsdWUsCiAgICAgICAgIHN3X2FsbW9zdF9kb25lLAogICAgICAgICBzd19oZWFkZXJfYWxtb3N0X2RvbmUsCi0gICAgICAgIHN3X2lnbm9yZV9saW5lLAotICAgICAgICBzd19kb25lLAotICAgICAgICBzd19oZWFkZXJfZG9uZQorICAgICAgICBzd19pZ25vcmVfbGluZQogICAgIH0gc3RhdGU7CiAKICAgICBzdGF0ZSA9IHItPnN0YXRlOwotICAgIHAgPSBiLT5wb3M7CiAKLSAgICB3aGlsZSAocCA8IGItPmxhc3QgJiYgc3RhdGUgPCBzd19kb25lKSB7Ci0gICAgICAgIGNoID0gKnArKzsKKyAgICBmb3IgKHAgPSBiLT5wb3M7IHAgPCBiLT5sYXN0OyBwKyspIHsKKyAgICAgICAgY2ggPSAqcDsKIAogICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CiAKQEAgLTQ4NiwxNiArNDczLDE1IEBACiAgICAgICAgIGNhc2Ugc3dfc3RhcnQ6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgICAgIHItPmhlYWRlcl9lbmQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICByLT5oZWFkZXJfZW5kID0gcDsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2hlYWRlcl9hbG1vc3RfZG9uZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTEY6Ci0gICAgICAgICAgICAgICAgci0+aGVhZGVyX2VuZCA9IHAgLSAxOwotICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfaGVhZGVyX2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgci0+aGVhZGVyX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgZ290byBoZWFkZXJfZG9uZTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19uYW1lOwotICAgICAgICAgICAgICAgIHItPmhlYWRlcl9uYW1lX3N0YXJ0ID0gcCAtIDE7CisgICAgICAgICAgICAgICAgci0+aGVhZGVyX25hbWVfc3RhcnQgPSBwOwogCiAgICAgICAgICAgICAgICAgYyA9ICh1X2NoYXIpIChjaCB8IDB4MjApOwogICAgICAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgewpAQCAtNTIzLDcgKzUwOSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjaCA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICByLT5oZWFkZXJfbmFtZV9lbmQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICByLT5oZWFkZXJfbmFtZV9lbmQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc3BhY2VfYmVmb3JlX3ZhbHVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNTM5LDcgKzUyNSw3IEBACiAgICAgICAgICAgICAvKiBJSVMgbWF5IHNlbmQgdGhlIGR1cGxpY2F0ZSAiSFRUUC8xLjEgLi4uIiBsaW5lcyAqLwogICAgICAgICAgICAgaWYgKGNoID09ICcvJwogICAgICAgICAgICAgICAgICYmIHItPnByb3h5Ci0gICAgICAgICAgICAgICAgJiYgcCAtIHItPmhlYWRlcl9zdGFydCA9PSA1CisgICAgICAgICAgICAgICAgJiYgcCAtIHItPmhlYWRlcl9zdGFydCA9PSA0CiAgICAgICAgICAgICAgICAgJiYgbmd4X3N0cm5jbXAoci0+aGVhZGVyX3N0YXJ0LCAiSFRUUCIsIDQpID09IDApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19pZ25vcmVfbGluZTsKQEAgLTU1NCwxNSArNTQwLDE0IEBACiAgICAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQ1I6Ci0gICAgICAgICAgICAgICAgci0+aGVhZGVyX3N0YXJ0ID0gci0+aGVhZGVyX2VuZCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHItPmhlYWRlcl9zdGFydCA9IHItPmhlYWRlcl9lbmQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYWxtb3N0X2RvbmU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIExGOgotICAgICAgICAgICAgICAgIHItPmhlYWRlcl9zdGFydCA9IHItPmhlYWRlcl9lbmQgPSBwIC0gMTsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgci0+aGVhZGVyX3N0YXJ0ID0gci0+aGVhZGVyX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByLT5oZWFkZXJfc3RhcnQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICByLT5oZWFkZXJfc3RhcnQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdmFsdWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC01NzIsMTcgKzU1NywxNiBAQAogICAgICAgICBjYXNlIHN3X3ZhbHVlOgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICAgICAgci0+aGVhZGVyX2VuZCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHItPmhlYWRlcl9lbmQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc3BhY2VfYWZ0ZXJfdmFsdWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgICAgIHItPmhlYWRlcl9lbmQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICByLT5oZWFkZXJfZW5kID0gcDsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICByLT5oZWFkZXJfZW5kID0gcCAtIDE7Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHItPmhlYWRlcl9lbmQgPSBwOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCkBAIC01OTUsOCArNTc5LDcgQEAKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3ZhbHVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjE4LDggKzYwMSw3IEBACiAgICAgICAgIGNhc2Ugc3dfYWxtb3N0X2RvbmU6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlIExGOgotICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QQVJTRV9JTlZBTElEX0hFQURFUjsKICAgICAgICAgICAgIH0KQEAgLTYyOSwzNCArNjExLDMyIEBACiAgICAgICAgIGNhc2Ugc3dfaGVhZGVyX2FsbW9zdF9kb25lOgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2hlYWRlcl9kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGdvdG8gaGVhZGVyX2RvbmU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QQVJTRV9JTlZBTElEX0hFQURFUjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIHN1cHByZXNzIHdhcm5pbmcgKi8KLSAgICAgICAgY2FzZSBzd19kb25lOgotICAgICAgICBjYXNlIHN3X2hlYWRlcl9kb25lOgotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBiLT5wb3MgPSBwOworICAgIHItPnN0YXRlID0gc3RhdGU7CiAKLSAgICBpZiAoc3RhdGUgPT0gc3dfZG9uZSkgewotICAgICAgICByLT5zdGF0ZSA9IHN3X3N0YXJ0OwotICAgICAgICByZXR1cm4gTkdYX09LOworICAgIHJldHVybiBOR1hfQUdBSU47CiAKLSAgICB9IGVsc2UgaWYgKHN0YXRlID09IHN3X2hlYWRlcl9kb25lKSB7Ci0gICAgICAgIHItPnN0YXRlID0gc3dfc3RhcnQ7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9QQVJTRV9IRUFERVJfRE9ORTsKK2RvbmU6CiAKLSAgICB9IGVsc2UgewotICAgICAgICByLT5zdGF0ZSA9IHN0YXRlOwotICAgICAgICByZXR1cm4gTkdYX0FHQUlOOwotICAgIH0KKyAgICBiLT5wb3MgPSBwICsgMTsKKyAgICByLT5zdGF0ZSA9IHN3X3N0YXJ0OworCisgICAgcmV0dXJuIE5HWF9PSzsKKworaGVhZGVyX2RvbmU6CisKKyAgICBiLT5wb3MgPSBwICsgMTsKKyAgICByLT5zdGF0ZSA9IHN3X3N0YXJ0OworCisgICAgcmV0dXJuIE5HWF9IVFRQX1BBUlNFX0hFQURFUl9ET05FOwogfQogCiAKQEAgLTY3Nyw4ICs2NTcsMTAgQEAKICAgICAgICAgc3dfcXVvdGVkX3NlY29uZAogICAgIH0gc3RhdGUsIHF1b3RlZF9zdGF0ZTsKIAorI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKICAgICBkZWNvZGVkID0gJ1wwJzsKICAgICBxdW90ZWRfc3RhdGUgPSBzd191c3VhbDsKKyNlbmRpZgogCiAgICAgc3RhdGUgPSBzd191c3VhbDsKICAgICBwID0gci0+dXJpX3N0YXJ0OwpAQCAtNjg4LDEwICs2NzAsMTAgQEAKIAogICAgIGNoID0gKnArKzsKIAotICAgIHdoaWxlIChwIDw9IHItPnVyaV9lbmQgJiYgci0+YXJnc19zdGFydCA9PSBOVUxMKSB7CisgICAgd2hpbGUgKHAgPD0gci0+dXJpX2VuZCkgewogCiAgICAgICAgIC8qCi0gICAgICAgICAqIHdlIHVzZSAiY2ggPSAqcCsrIiBpbnNpZGUgdGhlIGN5Y2xlIGJ1dCB0aGlzIG9wZXJhdGlvbiBpcyBzYWZlCisgICAgICAgICAqIHdlIHVzZSAiY2ggPSAqcCsrIiBpbnNpZGUgdGhlIGN5Y2xlLCBidXQgdGhpcyBvcGVyYXRpb24gaXMgc2FmZSwKICAgICAgICAgICogYmVjYXVzZSBhZnRlciB0aGUgVVJJIHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUgY2hhcmN0ZXI6CiAgICAgICAgICAqIHRoZSBsaW5lIGZlZWQKICAgICAgICAgICovCkBAIC03MzEsNyArNzEzLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgICAgICAgIHItPmFyZ3Nfc3RhcnQgPSBwOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIGNhc2UgJzonOgogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfY29sb247CiAgICAgICAgICAgICAgICAgKnUrKyA9IGNoOwpAQCAtNzY2LDYgKzc0OCw5IEBACiAgICAgICAgICAgICAgICAgcXVvdGVkX3N0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19xdW90ZWQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICByLT5hcmdzX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdXN1YWw7CiAgICAgICAgICAgICAgICAgKnUrKyA9IGNoOwpAQCAtNzk0LDYgKzc3OSw5IEBACiAgICAgICAgICAgICAgICAgcXVvdGVkX3N0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19xdW90ZWQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICByLT5hcmdzX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdXN1YWw7CiAgICAgICAgICAgICAgICAgKnUrKyA9IGNoOwpAQCAtODE4LDYgKzgwNiw5IEBACiAgICAgICAgICAgICAgICAgcXVvdGVkX3N0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19xdW90ZWQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICByLT5hcmdzX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdXN1YWw7CiAgICAgICAgICAgICAgICAgKnUrKyA9IGNoOwpAQCAtODQ0LDYgKzgzNSw5IEBACiAgICAgICAgICAgICAgICAgcXVvdGVkX3N0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19xdW90ZWQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICByLT5hcmdzX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdXN1YWw7CiAgICAgICAgICAgICAgICAgKnUrKyA9IGNoOwpAQCAtODcyLDYgKzg2Niw5IEBACiAgICAgICAgICAgICAgICAgcXVvdGVkX3N0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19xdW90ZWQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICByLT5hcmdzX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAjaWYgKE5HWF9XSU4zMikKICAgICAgICAgICAgIGNhc2UgJy4nOgogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZG90X2RvdF9kb3Q7CkBAIC05NTMsMTEgKzk1MCw5IEBACiAgICAgICAgICAgICBjID0gKHVfY2hhcikgKGNoIHwgMHgyMCk7CiAgICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKICAgICAgICAgICAgICAgICBjaCA9ICh1X2NoYXIpICgoZGVjb2RlZCA8PCA0KSArIGMgLSAnYScgKyAxMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICclJykgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3VzdWFsOworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPycpIHsKICAgICAgICAgICAgICAgICAgICAgKnUrKyA9IGNoOwogICAgICAgICAgICAgICAgICAgICBjaCA9ICpwKys7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdGF0ZSA9IHF1b3RlZF9zdGF0ZTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTk2Nyw2ICs5NjIsOCBAQAogICAgICAgICB9CiAgICAgfQogCitkb25lOgorCiAgICAgci0+dXJpLmxlbiA9IHUgLSByLT51cmkuZGF0YTsKICAgICByLT51cmkuZGF0YVtyLT51cmkubGVuXSA9ICdcMCc7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3BhcnNlX3RpbWUuYyBiL3NyYy9odHRwL25neF9odHRwX3BhcnNlX3RpbWUuYwppbmRleCAzOGJiZTJlLi5kYTk3OTcxIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZV90aW1lLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2VfdGltZS5jCkBAIC0yMTYsMTAgKzIxNiw2IEBACiAgICAgICAgICAgICAgICArICgqKHAgKyAyKSAtICcwJykgKiAxMCArICoocCArIDMpIC0gJzAnOwogICAgIH0KIAotI2lmIDAKLSAgICBwcmludGYoIiVkLiVkLiVkICVkOiVkOiVkXG4iLCBkYXksIG1vbnRoICsgMSwgeWVhciwgaG91ciwgbWluLCBzZWMpOwotI2VuZGlmCi0KICAgICBpZiAoaG91ciA+IDIzIHx8IG1pbiA+IDU5IHx8IHNlYyA+IDU5KSB7CiAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KQEAgLTIzOSw3ICsyMzUsNyBAQAogCiAgICAgLyoKICAgICAgKiBzaGlmdCBuZXcgeWVhciB0byBNYXJjaCAxIGFuZCBzdGFydCBtb250aHMgZnJvbSAxIChub3QgMCksCi0gICAgICogaXQncyBuZWVkZWQgZm9yIEdhdXNzJ3MgZm9ybXVsYQorICAgICAqIGl0IGlzIG5lZWRlZCBmb3IgR2F1c3MncyBmb3JtdWxhCiAgICAgICovCiAKICAgICBpZiAoLS1tb250aCA8PSAwKSB7CkBAIC0yNDcsNDEgKzI0MywxNiBAQAogICAgICAgIHllYXIgLT0gMTsKICAgICB9CiAKLSAgICAgICAgICAgLyogR2F1c3MncyBmb3JtdWxhIGZvciBHcmlnb3JpYW4gZGF5cyBmcm9tIDEgTWFyY2ggMSBCQyAqLworICAgIC8qIEdhdXNzJ3MgZm9ybXVsYSBmb3IgR3JpZ29yaWFuIGRheXMgZnJvbSAxIE1hcmNoIDEgQkMgKi8KIAogICAgIHJldHVybiAoMzY1ICogeWVhciArIHllYXIgLyA0IC0geWVhciAvIDEwMCArIHllYXIgLyA0MDAKICAgICAgICAgICAgICsgMzY3ICogbW9udGggLyAxMiAtIDMxCiAgICAgICAgICAgICArIGRheQogCi0gICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIDcxOTUyNyBkYXlzIHdlcmUgYmV0d2VlbiBNYXJjaCAxLCAxIEJDIGFuZCBNYXJjaCAxLCAxOTcwLAotICAgICAgICAgICAgKiAzMSBhbmQgMjggZGF5cyBpbiBKYW51YXJ5IGFuZCBGZWJydWFyeSAxOTcwCi0gICAgICAgICAgICAqLworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIDcxOTUyNyBkYXlzIHdlcmUgYmV0d2VlbiBNYXJjaCAxLCAxIEJDIGFuZCBNYXJjaCAxLCAxOTcwLAorICAgICAgICAgICAgICogMzEgYW5kIDI4IGRheXMgaW4gSmFudWFyeSBhbmQgRmVicnVhcnkgMTk3MAorICAgICAgICAgICAgICovCiAKICAgICAgICAgICAgIC0gNzE5NTI3ICsgMzEgKyAyOCkgKiA4NjQwMCArIGhvdXIgKiAzNjAwICsgbWluICogNjAgKyBzZWM7CiB9Ci0KLSNpZiAwCi1jaGFyIHplcm9bXSA9ICJTdW4sIDAxIEphbiAxOTcwIDA4OjQ5OjMwIjsKLWNoYXIgb25lW10gID0gIlN1bmRheSwgMTEtRGVjLTAyIDA4OjQ5OjMwIjsKLWNoYXIgdHdvW10gID0gIlN1biBNYXIgMSAwODo0OTozNyAyMDAwIjsKLWNoYXIgdGhyW10gID0gIlN1biBEZWMgMTEgMDg6NDk6MzcgMjAwMiI7Ci0KLW1haW4oKQotewotICAgIGludCByYzsKLQotICAgIHJjID0gbmd4X2h0dHBfcGFyc2VfdGltZSh6ZXJvLCBzaXplb2YoemVybykgLSAxKTsKLSAgICBwcmludGYoInJjOiAlZFxuIiwgcmMpOwotCi0gICAgcmMgPSBuZ3hfaHR0cF9wYXJzZV90aW1lKG9uZSwgc2l6ZW9mKG9uZSkgLSAxKTsKLSAgICBwcmludGYoInJjOiAlZFxuIiwgcmMpOwotCi0gICAgcmMgPSBuZ3hfaHR0cF9wYXJzZV90aW1lKHR3bywgc2l6ZW9mKHR3bykgLSAxKTsKLSAgICBwcmludGYoInJjOiAlZFxuIiwgcmMpOwotCi0gICAgcmMgPSBuZ3hfaHR0cF9wYXJzZV90aW1lKHRociwgc2l6ZW9mKHRocikgLSAxKTsKLSAgICBwcmludGYoInJjOiAlZFxuIiwgcmMpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwppbmRleCBiMWI4NGZlLi44MTEwMzEyIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCkBAIC02Myw2ICs2Myw4IEBACiAgICAgeyBuZ3hfc3RyaW5nKCJSZWZlcmVyIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgcmVmZXJlcikgfSwKICAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCBjb250ZW50X2xlbmd0aCkgfSwKKyAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtVHlwZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCBjb250ZW50X3R5cGUpIH0sCiAKICAgICB7IG5neF9zdHJpbmcoIlJhbmdlIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgcmFuZ2UpIH0sCiAjaWYgMApAQCAtODYsNyArODgsNyBAQAogICAgIHsgbmd4X3N0cmluZygiWC1SZWFsLUlQIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgeF9yZWFsX2lwKSB9LAogICAgIHsgbmd4X3N0cmluZygiWC1VUkwiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCB4X3VybCkgfSwKICNlbmRpZgotICAgIAorCiAgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAgfQogfTsKIApAQCAtMTc1LDcgKzE3Nyw3IEBACiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgaTsKICAgICBzb2NrbGVuX3QgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgYWRkcl9pbjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgICAgICBzaW47CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYzsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICpyOwogICAgIG5neF9odHRwX2luX3BvcnRfdCAgICAgICAgKmluX3BvcnQ7CkBAIC0yODMsMjEgKzI4NSwxOSBAQAogICAgICAgICAgICAgci0+aW5fYWRkciA9CiAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgYy0+bG9jYWxfc29ja2FkZHIpLT5zaW5fYWRkci5zX2FkZHI7CiAKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlCiAjZW5kaWYKKyAgICAgICAgewogICAgICAgICAgICAgbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7Ci0gICAgICAgICAgICBpZiAoZ2V0c29ja25hbWUoYy0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJfaW4sICZsZW4pID09IC0xKSB7CisgICAgICAgICAgICBpZiAoZ2V0c29ja25hbWUoYy0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgJmxlbikgPT0gLTEpIHsKICAgICAgICAgICAgICAgICBuZ3hfY29ubmVjdGlvbl9lcnJvcihjLCBuZ3hfc29ja2V0X2Vycm5vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRzb2NrbmFtZSgpIGZhaWxlZCIpOwogICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByLT5pbl9hZGRyID0gYWRkcl9pbi5zaW5fYWRkci5zX2FkZHI7Ci0KLSNpZiAoTkdYX1dJTjMyKQorICAgICAgICAgICAgci0+aW5fYWRkciA9IHNpbi5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgIH0KLSNlbmRpZgogCiAgICAgICAgIC8qIHRoZSBsYXN0IGluX3BvcnQtPmFkZHJzIGFkZHJlc3MgaXMgIioiICovCiAKQEAgLTU3Myw2ICs1NzMsMTEgQEAKICAgICAgICAgICAgIH0KIAogCisgICAgICAgICAgICBpZiAoci0+aHR0cF9wcm90b2NvbC5kYXRhKSB7CisgICAgICAgICAgICAgICAgci0+aHR0cF9wcm90b2NvbC5sZW4gPSByLT5yZXF1ZXN0X2VuZCAtIHItPmh0dHBfcHJvdG9jb2wuZGF0YTsKKyAgICAgICAgICAgIH0KKworCiAgICAgICAgICAgICBpZiAoci0+dXJpX2V4dCkgewogICAgICAgICAgICAgICAgIGlmIChyLT5hcmdzX3N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgIHItPmV4dGVuLmxlbiA9IHItPmFyZ3Nfc3RhcnQgLSAxIC0gci0+dXJpX2V4dDsKQEAgLTIxNzMsNiArMjE3OCw4IEBACiAKIHZvaWQgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKQogeworICAgIG5neF9wb29sX3QgICpwb29sOworCiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBjLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImNsb3NlIGh0dHAgY29ubmVjdGlvbjogJWQiLCBjLT5mZCk7CiAKQEAgLTIxOTIsNyArMjE5OSwxMSBAQAogICAgICgqbmd4X3N0YXRfYWN0aXZlKS0tOwogI2VuZGlmCiAKKyAgICBwb29sID0gYy0+cG9vbDsKKwogICAgIG5neF9jbG9zZV9jb25uZWN0aW9uKGMpOworCisgICAgbmd4X2Rlc3Ryb3lfcG9vbChjLT5wb29sKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKaW5kZXggZWVmOTI5Mi4uMTQxMjFkMSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaApAQCAtMTMzLDYgKzEzMyw3IEBACiAgICAgbmd4X3RhYmxlX2VsdF90ICAqdXNlcl9hZ2VudDsKICAgICBuZ3hfdGFibGVfZWx0X3QgICpyZWZlcmVyOwogICAgIG5neF90YWJsZV9lbHRfdCAgKmNvbnRlbnRfbGVuZ3RoOworICAgIG5neF90YWJsZV9lbHRfdCAgKmNvbnRlbnRfdHlwZTsKIAogICAgIG5neF90YWJsZV9lbHRfdCAgKnJhbmdlOwogCkBAIC0yMDEsMTMgKzIwMiwxNCBAQAogfSBuZ3hfaHR0cF9oZWFkZXJzX291dF90OwogCiAKK3R5cGVkZWYgdm9pZCAoKm5neF9odHRwX2NsaWVudF9ib2R5X2hhbmRsZXJfcHQpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CisKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfdGVtcF9maWxlX3QgICAqdGVtcF9maWxlOwotICAgIG5neF9jaGFpbl90ICAgICAgICpidWZzOwotICAgIG5neF9idWZfdCAgICAgICAgICpidWY7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgIHJlc3Q7Ci0gICAgdm9pZCAgICAgICAgICAgICAoKmhhbmRsZXIpICh2b2lkICpkYXRhKTsgCi0gICAgdm9pZCAgICAgICAgICAgICAgKmRhdGE7CisgICAgbmd4X3RlbXBfZmlsZV90ICAgICAgICAgICAgICAgICAgKnRlbXBfZmlsZTsKKyAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgICAgICAqYnVmczsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICAgICAqYnVmOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0OworICAgIG5neF9odHRwX2NsaWVudF9ib2R5X2hhbmRsZXJfcHQgICBwb3N0X2hhbmRsZXI7CiB9IG5neF9odHRwX3JlcXVlc3RfYm9keV90OwogCiAKQEAgLTI1Niw2ICsyNTgsOCBAQAogCiAgICAgbmd4X2h0dHBfY2FjaGVfdCAgICAgICAgICpjYWNoZTsKIAorICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICAgICAqdXBzdHJlYW07CisKICAgICBuZ3hfZmlsZV90ICAgICAgICAgICAgICAgIGZpbGU7CiAKICAgICBuZ3hfcG9vbF90ICAgICAgICAgICAgICAgKnBvb2w7CkBAIC0yODAsNiArMjg0LDcgQEAKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICB1bnBhcnNlZF91cmk7CiAKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICBtZXRob2RfbmFtZTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICBodHRwX3Byb3RvY29sOwogCiAgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAqbWFpbjsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdF9ib2R5LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0X2JvZHkuYwppbmRleCBlYjZhZWJmLi41OWY3MjIwIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0X2JvZHkuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0X2JvZHkuYwpAQCAtMTEsMzEgKzExLDY3IEBACiAKIAogc3RhdGljIHZvaWQgbmd4X2h0dHBfcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5X2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldik7Ci1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2RvX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9kb19yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiAKKy8qCisgKiBvbiBjb21wbGV0aW9uIG5neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keSgpIGFkZHMgdG8KKyAqIHItPnJlcXVlc3RfYm9keS0+YnVmcyBvbmUgb3IgdHdvIGJ1ZnM6CisgKiAgICAqKSBvbmUgbWVtb3J5IGJ1ZiB0aGF0IHdhcyBwcmVyZWFkIGluIHItPmhlYWRlcl9pbjsKKyAqICAgICopIG9uZSBtZW1vcnkgb3IgZmlsZSBidWYgdGhhdCBjb250YWlucyB0aGUgcmVzdCBvZiB0aGUgYm9keQorICovCiAKLW5neF9pbnRfdCBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorbmd4X2ludF90IG5neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xpZW50X2JvZHlfaGFuZGxlcl9wdCBwb3N0X2hhbmRsZXIpCisKIHsKICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICBzaXplOwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgKmI7CiAgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAqY2w7CisgICAgbmd4X2h0dHBfcmVxdWVzdF9ib2R5X3QgICAqcmI7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKIAorICAgIGlmICghKHJiID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3JlcXVlc3RfYm9keV90KSkpKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgfQorCisgICAgci0+cmVxdWVzdF9ib2R5ID0gcmI7CisKKyAgICBpZiAoci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aF9uIDw9IDApIHsKKyAgICAgICAgcG9zdF9oYW5kbGVyKHIpOworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKworICAgIHJiLT5wb3N0X2hhbmRsZXIgPSBwb3N0X2hhbmRsZXI7CisKKyAgICAvKgorICAgICAqIHNldCBieSBuZ3hfcGNhbGxvYygpOgorICAgICAqCisgICAgICogICAgIHJiLT5idWZzID0gTlVMTDsKKyAgICAgKiAgICAgcmItPmJ1ZiA9IE5VTEw7CisgICAgICogICAgIHJiLT5yZXN0ID0gMDsKKyAgICAgKi8KKwogICAgIHNpemUgPSByLT5oZWFkZXJfaW4tPmxhc3QgLSByLT5oZWFkZXJfaW4tPnBvczsKIAogICAgIGlmIChzaXplKSB7CiAKICAgICAgICAgLyogdGhlcmUgaXMgdGhlIHByZS1yZWFkIHBhcnQgb2YgdGhlIHJlcXVlc3QgYm9keSAqLwogCi0gICAgICAgIG5neF90ZXN0X251bGwoYiwgbmd4X2NhbGxvY19idWYoci0+cG9vbCksCi0gICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgfQogCiAgICAgICAgIGItPnRlbXBvcmFyeSA9IDE7CiAgICAgICAgIGItPnN0YXJ0ID0gYi0+cG9zID0gci0+aGVhZGVyX2luLT5wb3M7CiAgICAgICAgIGItPmVuZCA9IGItPmxhc3QgPSByLT5oZWFkZXJfaW4tPmxhc3Q7CiAKLSAgICAgICAgbmd4X2FsbG9jX2xpbmtfYW5kX3NldF9idWYoci0+cmVxdWVzdF9ib2R5LT5idWZzLCBiLCByLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgaWYgKCEocmItPmJ1ZnMgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByYi0+YnVmcy0+YnVmID0gYjsKKyAgICAgICAgcmItPmJ1ZnMtPm5leHQgPSBOVUxMOwogCiAgICAgICAgIGlmIChzaXplID49IHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGhfbikgewogCkBAIC00NCw3ICs4MCw3IEBACiAgICAgICAgICAgICByLT5oZWFkZXJfaW4tPnBvcyArPSByLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX247CiAgICAgICAgICAgICByLT5yZXF1ZXN0X2xlbmd0aCArPSByLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX247CiAKLSAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+aGFuZGxlcihyLT5yZXF1ZXN0X2JvZHktPmRhdGEpOworICAgICAgICAgICAgcG9zdF9oYW5kbGVyKHIpOwogCiAgICAgICAgICAgICByZXR1cm4gTkdYX09LOwogICAgICAgICB9CkBAIC01NiwzNSArOTIsMzkgQEAKIAogICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAotICAgIHItPnJlcXVlc3RfYm9keS0+cmVzdCA9IHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGhfbiAtIHNpemU7CisgICAgcmItPnJlc3QgPSByLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX24gLSBzaXplOwogCi0gICAgaWYgKHItPnJlcXVlc3RfYm9keS0+cmVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IGNsY2YtPmNsaWVudF9ib2R5X2J1ZmZlcl9zaXplCisgICAgaWYgKHJiLT5yZXN0IDwgY2xjZi0+Y2xpZW50X2JvZHlfYnVmZmVyX3NpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChjbGNmLT5jbGllbnRfYm9keV9idWZmZXJfc2l6ZSA+PiAyKSkKICAgICB7Ci0gICAgICAgIHNpemUgPSByLT5yZXF1ZXN0X2JvZHktPnJlc3Q7CisgICAgICAgIHNpemUgPSByYi0+cmVzdDsKIAogICAgIH0gZWxzZSB7CiAgICAgICAgIHNpemUgPSBjbGNmLT5jbGllbnRfYm9keV9idWZmZXJfc2l6ZTsKICAgICB9CiAKLSAgICBuZ3hfdGVzdF9udWxsKHItPnJlcXVlc3RfYm9keS0+YnVmLCBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIHNpemUpLAotICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICBpZiAoIShyYi0+YnVmID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLCBzaXplKSkpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICB9CiAKLSAgICBuZ3hfYWxsb2NfbGlua19hbmRfc2V0X2J1ZihjbCwgci0+cmVxdWVzdF9ib2R5LT5idWYsIHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICBpZiAoIShjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgIH0KIAotICAgIGlmIChyLT5yZXF1ZXN0X2JvZHktPmJ1ZnMpIHsKLSAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWZzLT5uZXh0ID0gY2w7CisgICAgY2wtPmJ1ZiA9IHJiLT5idWY7CisgICAgY2wtPm5leHQgPSBOVUxMOworCisgICAgaWYgKHJiLT5idWZzKSB7CisgICAgICAgIHJiLT5idWZzLT5uZXh0ID0gY2w7CiAKICAgICB9IGVsc2UgewotICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1ZnMgPSBjbDsKKyAgICAgICAgcmItPmJ1ZnMgPSBjbDsKICAgICB9CiAKICAgICByLT5jb25uZWN0aW9uLT5yZWFkLT5ldmVudF9oYW5kbGVyID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHlfaGFuZGxlcjsKIAotICAgIHJldHVybiBuZ3hfaHR0cF9kb19yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkocik7CisgICAgcmV0dXJuIG5neF9odHRwX2RvX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keShyLCByLT5jb25uZWN0aW9uKTsKIH0KIAogCkBAIC0xMDIsNyArMTQyLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHJjID0gbmd4X2h0dHBfZG9fcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KHIpOworICAgIHJjID0gbmd4X2h0dHBfZG9fcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KHIsIGMpOwogCiAgICAgaWYgKHJjID49IE5HWF9IVFRQX1NQRUNJQUxfUkVTUE9OU0UpIHsKICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCByYyk7CkBAIC0xMTAsMjQgKzE1MCw0NSBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZG9fcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZG9fcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jb25uZWN0aW9uX3QgKmMpCiB7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICBuOwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgKmI7Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYzsKKyAgICBuZ3hfdGVtcF9maWxlX3QgICAgICAgICAgICp0ZjsKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X2JvZHlfdCAgICpyYjsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOwogCi0gICAgYyA9IHItPmNvbm5lY3Rpb247CisgICAgcmIgPSByLT5yZXF1ZXN0X2JvZHk7CiAKICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGMtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAiaHR0cCByZWFkIGNsaWVudCByZXF1ZXN0IGJvZHkiKTsKIAogICAgIGZvciAoIDs7ICkgewotICAgICAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT5idWYtPmxhc3QgPT0gci0+cmVxdWVzdF9ib2R5LT5idWYtPmVuZCkgewotICAgICAgICAgICAgbiA9IG5neF93cml0ZV9jaGFpbl90b190ZW1wX2ZpbGUoci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1ZnMtPm5leHQgPyByLT5yZXF1ZXN0X2JvZHktPmJ1ZnMtPm5leHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1ZnMpOworICAgICAgICBpZiAocmItPmJ1Zi0+bGFzdCA9PSByYi0+YnVmLT5lbmQpIHsKKworICAgICAgICAgICAgaWYgKHJiLT50ZW1wX2ZpbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICghKHRmID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF90ZW1wX2ZpbGVfdCkpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgICAgICAgICAgICAgIHRmLT5maWxlLmZkID0gTkdYX0lOVkFMSURfRklMRTsKKyAgICAgICAgICAgICAgICB0Zi0+ZmlsZS5sb2cgPSByLT5jb25uZWN0aW9uLT5sb2c7CisgICAgICAgICAgICAgICAgdGYtPnBhdGggPSBjbGNmLT5jbGllbnRfYm9keV90ZW1wX3BhdGg7CisgICAgICAgICAgICAgICAgdGYtPnBvb2wgPSByLT5wb29sOworICAgICAgICAgICAgICAgIHRmLT53YXJuID0gImEgY2xpZW50IHJlcXVlc3QgYm9keSBpcyBidWZmZXJlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gYSB0ZW1wb3JhcnkgZmlsZSI7CisKKyAgICAgICAgICAgICAgICByYi0+dGVtcF9maWxlID0gdGY7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbiA9IG5neF93cml0ZV9jaGFpbl90b190ZW1wX2ZpbGUocmItPnRlbXBfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiLT5idWZzLT5uZXh0ID8gcmItPmJ1ZnMtPm5leHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiLT5idWZzKTsKIAogICAgICAgICAgICAgLyogVE9ETzogbiA9PSAwIG9yIG5vdCBjb21wbGV0ZSBhbmQgbGV2ZWwgZXZlbnQgKi8KIApAQCAtMTM1LDE5ICsxOTYsMTkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPnRlbXBfZmlsZS0+b2Zmc2V0ICs9IG47CisgICAgICAgICAgICByYi0+dGVtcF9maWxlLT5vZmZzZXQgKz0gbjsKIAotICAgICAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWYtPnBvcyA9IHItPnJlcXVlc3RfYm9keS0+YnVmLT5zdGFydDsKLSAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT5sYXN0ID0gci0+cmVxdWVzdF9ib2R5LT5idWYtPnN0YXJ0OworICAgICAgICAgICAgcmItPmJ1Zi0+cG9zID0gcmItPmJ1Zi0+c3RhcnQ7CisgICAgICAgICAgICByYi0+YnVmLT5sYXN0ID0gcmItPmJ1Zi0+c3RhcnQ7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplID0gci0+cmVxdWVzdF9ib2R5LT5idWYtPmVuZCAtIHItPnJlcXVlc3RfYm9keS0+YnVmLT5sYXN0OworICAgICAgICBzaXplID0gcmItPmJ1Zi0+ZW5kIC0gcmItPmJ1Zi0+bGFzdDsKIAotICAgICAgICBpZiAoc2l6ZSA+IHItPnJlcXVlc3RfYm9keS0+cmVzdCkgewotICAgICAgICAgICAgc2l6ZSA9IHItPnJlcXVlc3RfYm9keS0+cmVzdDsKKyAgICAgICAgaWYgKHNpemUgPiByYi0+cmVzdCkgeworICAgICAgICAgICAgc2l6ZSA9IHJiLT5yZXN0OwogICAgICAgICB9CiAKLSAgICAgICAgbiA9IGMtPnJlY3YoYywgci0+cmVxdWVzdF9ib2R5LT5idWYtPmxhc3QsIHNpemUpOworICAgICAgICBuID0gYy0+cmVjdihjLCByYi0+YnVmLT5sYXN0LCBzaXplKTsKIAogICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGMtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgY2xpZW50IHJlcXVlc3QgYm9keSByZWN2ICV6Iiwgbik7CkBAIC0xNzMsMzMgKzIzNCwzMyBAQAogICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0JBRF9SRVFVRVNUOwogICAgICAgICB9CiAKLSAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWYtPmxhc3QgKz0gbjsKLSAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5yZXN0IC09IG47CisgICAgICAgIHJiLT5idWYtPmxhc3QgKz0gbjsKKyAgICAgICAgcmItPnJlc3QgLT0gbjsKICAgICAgICAgci0+cmVxdWVzdF9sZW5ndGggKz0gbjsKIAotICAgICAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT5yZXN0ID09IDApIHsKKyAgICAgICAgaWYgKHJiLT5yZXN0ID09IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHItPnJlcXVlc3RfYm9keS0+YnVmLT5sYXN0IDwgci0+cmVxdWVzdF9ib2R5LT5idWYtPmVuZCkgeworICAgICAgICBpZiAocmItPmJ1Zi0+bGFzdCA8IHJiLT5idWYtPmVuZCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGMtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCBjbGllbnQgcmVxdWVzdCBib2R5IHJlc3QgJXV6IiwKLSAgICAgICAgICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPnJlc3QpOworICAgICAgICAgICAgICAgICAgICJodHRwIGNsaWVudCByZXF1ZXN0IGJvZHkgcmVzdCAldXoiLCByYi0+cmVzdCk7CiAKLSAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT5yZXN0KSB7CisgICAgaWYgKHJiLT5yZXN0KSB7CiAgICAgICAgIHJldHVybiBOR1hfQUdBSU47CiAgICAgfQogCi0gICAgaWYgKHItPnJlcXVlc3RfYm9keS0+dGVtcF9maWxlLT5maWxlLmZkICE9IE5HWF9JTlZBTElEX0ZJTEUpIHsKKyAgICBpZiAocmItPnRlbXBfZmlsZSkgewogCiAgICAgICAgIC8qIHNhdmUgdGhlIGxhc3QgcGFydCAqLwotICAgICAgICBuID0gbmd4X3dyaXRlX2NoYWluX3RvX3RlbXBfZmlsZShyLT5yZXF1ZXN0X2JvZHktPnRlbXBfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmcy0+bmV4dCA/IHItPnJlcXVlc3RfYm9keS0+YnVmcy0+bmV4dDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmcyk7CisKKyAgICAgICAgbiA9IG5neF93cml0ZV9jaGFpbl90b190ZW1wX2ZpbGUocmItPnRlbXBfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmItPmJ1ZnMtPm5leHQgPyByYi0+YnVmcy0+bmV4dDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYi0+YnVmcyk7CiAKICAgICAgICAgLyogVE9ETzogbiA9PSAwIG9yIG5vdCBjb21wbGV0ZSBhbmQgbGV2ZWwgZXZlbnQgKi8KIApAQCAtMjEzLDE4ICsyNzQsMTggQEAKIAogICAgICAgICBiLT5pbl9maWxlID0gMTsKICAgICAgICAgYi0+ZmlsZV9wb3MgPSAwOwotICAgICAgICBiLT5maWxlX2xhc3QgPSByLT5yZXF1ZXN0X2JvZHktPnRlbXBfZmlsZS0+ZmlsZS5vZmZzZXQ7Ci0gICAgICAgIGItPmZpbGUgPSAmci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUtPmZpbGU7CisgICAgICAgIGItPmZpbGVfbGFzdCA9IHJiLT50ZW1wX2ZpbGUtPmZpbGUub2Zmc2V0OworICAgICAgICBiLT5maWxlID0gJnJiLT50ZW1wX2ZpbGUtPmZpbGU7CiAKLSAgICAgICAgaWYgKHItPnJlcXVlc3RfYm9keS0+YnVmcy0+bmV4dCkgewotICAgICAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWZzLT5uZXh0LT5idWYgPSBiOworICAgICAgICBpZiAocmItPmJ1ZnMtPm5leHQpIHsKKyAgICAgICAgICAgIHJiLT5idWZzLT5uZXh0LT5idWYgPSBiOwogCiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1ZnMtPmJ1ZiA9IGI7CisgICAgICAgICAgICByYi0+YnVmcy0+YnVmID0gYjsKICAgICAgICAgfQogICAgIH0KIAotICAgIHItPnJlcXVlc3RfYm9keS0+aGFuZGxlcihyLT5yZXF1ZXN0X2JvZHktPmRhdGEpOworICAgIHJiLT5wb3N0X2hhbmRsZXIocik7CiAKICAgICByZXR1cm4gTkdYX09LOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYwppbmRleCA1MWExYjQ3Li5lODA4MjRiIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYwpAQCAtOSw0MiArOSw0NiBAQAogI2luY2x1ZGUgPG5neF9odHRwLmg+CiAKIAotY2hhciAqbmd4X2h0dHBfc2NyaXB0X2NvcHkobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfdCAqY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnAsIHNpemVfdCBsZW4pCit1X2NoYXIgKm5neF9odHRwX3NjcmlwdF9jb3B5KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgcmV0dXJuIG5neF9jcHltZW0ocCwgY29kZS0+b2Zmc2V0LCBjb2RlLT5sZW4gPCBsZW4gPyBjb2RlLT5sZW4gOiBsZW4pOworICAgIHVfY2hhciAgKipwID0gZGF0YTsKKworICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3QgICpjb2RlOworCisgICAgY29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29kZV90ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIgKikgZGF0YSAtIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29kZV90KSk7CisKKyAgICByZXR1cm4gbmd4X2NweW1lbShidWYsICpwLCBjb2RlLT5kYXRhX2xlbik7CiB9CiAKIAotY2hhciAqbmd4X2h0dHBfc2NyaXB0X2hlYWRlcl9pbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3QgKmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnAsIHNpemVfdCBsZW4pCit1X2NoYXIgKm5neF9odHRwX3NjcmlwdF9oZWFkZXJfaW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLCB2b2lkICpkYXRhKQogewotICAgIG5neF9zdHJfdCAqczsKKyAgICBzaXplX3QgICpvZmZzZXQgPSBkYXRhOwogCi0gICAgcyA9IChuZ3hfc3RyX3QgKikgKCgoY2hhciAqKSByLT5oZWFkZXJzX2luKSArIGNvZGUtPm9mZnNldCk7CisgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKIAotICAgIHJldHVybiBuZ3hfY3B5bWVtKHAsIHMtPmRhdGEsIHMtPmxlbiA8IGxlbiA/IHMtPmxlbiA6IGxlbik7CisgICAgaCA9ICoobmd4X3RhYmxlX2VsdF90ICoqKSAoKChjaGFyICopIHItPmhlYWRlcnNfaW4pICsgKm9mZnNldCk7CisKKyAgICByZXR1cm4gbmd4X2NweW1lbShwLCBoLT52YWx1ZS5kYXRhLCBoLT52YWx1ZS5sZW4pOwogfQogCiAKLS8qIHRoZSBsb2cgc2NyaXB0IGNvZGVzICovCi0KLWNoYXIgKm5neF9odHRwX3NjcmlwdF9yZXF1ZXN0X2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBjaGFyICpwLCBzaXplX3QgbGVuKQordV9jaGFyICpuZ3hfaHR0cF9zY3JpcHRfcmVxdWVzdF9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1Ziwgdm9pZCAqZGF0YSkKIHsKLSAgICByZXR1cm4gbmd4X2NweW1lbShwLCByLT5yZXF1ZXN0X2xpbmUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICByLT5yZXF1ZXN0X2xpbmUubGVuIDwgbGVuID8gci0+cmVxdWVzdF9saW5lLmxlbiA6IGxlbik7CisgICAgcmV0dXJuIG5neF9jcHltZW0ocCwgci0+cmVxdWVzdF9saW5lLmRhdGEsIHItPnJlcXVlc3RfbGluZS5sZW4pOwogfQogCiAKLWNoYXIgKm5neF9odHRwX3NjcmlwdF9zdGF0dXMobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBjaGFyICpwLCBzaXplX3QgbGVuKQordV9jaGFyICpuZ3hfaHR0cF9zY3JpcHRfc3RhdHVzKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgcmV0dXJuIG5neF9zbnByaW50ZihwLCBsZW4sICIlZCIsIHItPmhlYWRlcnNfb3V0LnN0YXR1cyk7CisgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiV1aSIsIHItPmhlYWRlcnNfb3V0LnN0YXR1cyk7CiB9CiAKIAotY2hhciAqbmd4X2h0dHBfc2NyaXB0X3NlbnQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBjaGFyICpwLCBzaXplX3QgbGVuKQordV9jaGFyICpuZ3hfaHR0cF9zY3JpcHRfc2VudChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLCB2b2lkICpkYXRhKQogewotICAgIHJldHVybiBuZ3hfc3ByaW50ZihwLCAiJU8iLCByLT5jb25uZWN0aW9uLT5zZW50KTsKKyAgICByZXR1cm4gbmd4X3NwcmludGYoYnVmLCAiJU8iLCByLT5jb25uZWN0aW9uLT5zZW50KTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKaW5kZXggNGE3NDUxMi4uNjU4ZmFhYSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKQEAgLTgsMTAgKzgsMTggQEAKICNkZWZpbmUgX05HWF9IVFRQX1NDUklQVF9IX0lOQ0xVREVEXwogCiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBoYW5kbGVyOwotICAgIG9mZnNldCAvIGRhdGE7Ci0gICAgc2l6ZTsKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cC5oPgorCisKK3R5cGVkZWYgdV9jaGFyICooKm5neF9odHRwX3NjcmlwdF9jb2RlX3B0KSAobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1Ziwgdm9pZCAqZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IG5neF9odHRwX3NjcmlwdF9jb2RlX3MgeworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICBkYXRhX2xlbjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgY29kZV9sZW47CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgIGNvZGU7CiB9IG5neF9odHRwX3NjcmlwdF9jb2RlX3Q7CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhZjliZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKQEAgLTAsMCArMSwxMjA0IEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisgKi8KKworCisjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgorI2luY2x1ZGUgPG5neF9jb3JlLmg+CisjaW5jbHVkZSA8bmd4X2h0dHAuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnRfY29ubmVjdC5oPgorCisKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9ldmVudF90ICpldik7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9jb25uZWN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAqdSk7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9yZWluaXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fc2VuZF9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1KTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX3NlbmRfcmVxdWVzdF9oYW5kbGVyKG5neF9ldmVudF90ICp3ZXYpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19oZWFkZXIobmd4X2V2ZW50X3QgKnJldik7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3Jlc3BvbnNlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAqdSk7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHkobmd4X2V2ZW50X3QgKmV2KTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKndldik7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9uZXh0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAqdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3VpbnRfdCBmdF90eXBlKTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaW50X3QgcmMpOworCitzdGF0aWMgc2l6ZV90IG5neF9odHRwX3Vwc3RyZWFtX2xvZ19zdGF0dXNfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3N0YXR1cyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworCisKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1fYWRkX2xvZ19mb3JtYXRzKG5neF9jb25mX3QgKmNmKTsKKworCituZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfdXBzdHJlYW1fbW9kdWxlX2N0eCA9IHsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9hZGRfbG9nX2Zvcm1hdHMsICAgICAvKiBwcmUgY29uZiAqLworICAgIAorICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLworCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBsb2NhdGlvbiBjb25maWd1cmF0aW9uICovCisgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgbG9jYXRpb24gY29uZmlndXJhdGlvbiAqLworfTsKKyAgICAKKworbmd4X21vZHVsZV90ICBuZ3hfaHR0cF91cHN0cmVhbV9tb2R1bGUgPSB7CisgICAgTkdYX01PRFVMRSwKKyAgICAmbmd4X2h0dHBfdXBzdHJlYW1fbW9kdWxlX2N0eCwgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCisgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1vZHVsZSAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgcHJvY2VzcyAqLworfTsKKworCitzdGF0aWMgbmd4X2h0dHBfbG9nX29wX25hbWVfdCBuZ3hfaHR0cF91cHN0cmVhbV9sb2dfZm10X29wc1tdID0geworICAgIHsgbmd4X3N0cmluZygidXBzdHJlYW1fc3RhdHVzIiksIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3N0YXR1c19nZXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3N0YXR1cyB9LAorICAgIHsgbmd4X251bGxfc3RyaW5nLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKworY2hhciAqbmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyX2Vycm9yc1tdID0geworICAgICJ1cHN0cmVhbSBzZW50IGludmFsaWQgaGVhZGVyIiwKKyAgICAidXBzdHJlYW0gc2VudCB0b28gbG9uZyBoZWFkZXIgbGluZSIKK307CisKKwordm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9pbml0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAqYzsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAqdTsKKworICAgIGMgPSByLT5jb25uZWN0aW9uOworCisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBjLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgaW5pdCB1cHN0cmVhbSwgY2xpZW50IHRpbWVyOiAlZCIsIGMtPnJlYWQtPnRpbWVyX3NldCk7CisKKyAgICBpZiAoYy0+cmVhZC0+dGltZXJfc2V0KSB7CisgICAgICAgIG5neF9kZWxfdGltZXIoYy0+cmVhZCk7CisgICAgfQorCisgICAgYy0+cmVhZC0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uOworICAgIAorICAgIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0NMRUFSX0VWRU5UKSB7CisgICAgCisgICAgICAgIGMtPndyaXRlLT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb247CisKKyAgICAgICAgaWYgKCFjLT53cml0ZS0+YWN0aXZlKSB7CisgICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudChjLT53cml0ZSwgTkdYX1dSSVRFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NMRUFSX0VWRU5UKSA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHUgPSByLT51cHN0cmVhbTsKKworICAgIHUtPm1ldGhvZCA9IHItPm1ldGhvZDsKKworICAgIGlmICh1LT5jcmVhdGVfcmVxdWVzdChyKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdS0+cGVlci5sb2cgPSByLT5jb25uZWN0aW9uLT5sb2c7CisgICAgdS0+c2F2ZWRfY3R4ID0gci0+Y29ubmVjdGlvbi0+bG9nLT5kYXRhOworICAgIHUtPnNhdmVkX2hhbmRsZXIgPSByLT5jb25uZWN0aW9uLT5sb2ctPmhhbmRsZXI7CisgICAgci0+Y29ubmVjdGlvbi0+bG9nLT5kYXRhID0gdS0+bG9nX2N0eDsKKyAgICByLT5jb25uZWN0aW9uLT5sb2ctPmhhbmRsZXIgPSB1LT5sb2dfaGFuZGxlcjsKKworICAgIHUtPm91dHB1dC5zZW5kZmlsZSA9IHItPmNvbm5lY3Rpb24tPnNlbmRmaWxlOworICAgIHUtPm91dHB1dC5wb29sID0gci0+cG9vbDsKKyAgICB1LT5vdXRwdXQuYnVmcy5udW0gPSAxOworICAgIHUtPm91dHB1dC5vdXRwdXRfZmlsdGVyID0gbmd4X2NoYWluX3dyaXRlcjsKKyAgICB1LT5vdXRwdXQuZmlsdGVyX2N0eCA9ICZ1LT53cml0ZXI7CisKKyAgICB1LT53cml0ZXIucG9vbCA9IHItPnBvb2w7CisKKyAgICBpZiAobmd4X2FycmF5X2luaXQoJnUtPnN0YXRlcywgci0+cG9vbCwgdS0+cGVlci5wZWVycy0+bnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF91cHN0cmVhbV9zdGF0ZV90KSkgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCEodS0+c3RhdGUgPSBuZ3hfcHVzaF9hcnJheSgmdS0+c3RhdGVzKSkpIHsKKyAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmd4X21lbXplcm8odS0+c3RhdGUsIHNpemVvZihuZ3hfaHR0cF91cHN0cmVhbV9zdGF0ZV90KSk7CisKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb25uZWN0KHIsIHUpOworfQorCisKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9ldmVudF90ICpldikKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICBuOworICAgIGNoYXIgICAgICAgICAgICAgICAgIGJ1ZlsxXTsKKyAgICBuZ3hfZXJyX3QgICAgICAgICAgICBlcnI7IAorICAgIG5neF9jb25uZWN0aW9uX3QgICAgICpjOworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICpyOworICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICp1OworCisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHVwc3RyZWFtIGNoZWNrIGNsaWVudCwgd3JpdGUgZXZlbnQ6JWQiLCBldi0+d3JpdGUpOworCisjaWYgKE5HWF9IQVZFX0tRVUVVRSkKKworICAgIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0tRVUVVRV9FVkVOVCkgeworCisgICAgICAgIGlmICghZXYtPnBlbmRpbmdfZW9mKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBldi0+ZW9mID0gMTsKKworICAgICAgICBpZiAoZXYtPmtxX2Vycm5vKSB7CisgICAgICAgICAgICBldi0+ZXJyb3IgPSAxOworICAgICAgICB9CisKKyAgICAgICAgYyA9IGV2LT5kYXRhOworICAgICAgICByID0gYy0+ZGF0YTsKKyAgICAgICAgdSA9IHItPnVwc3RyZWFtOworCisgICAgICAgIGlmICghdS0+Y2FjaGFibGUgJiYgdS0+cGVlci5jb25uZWN0aW9uKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgZXYtPmxvZywgZXYtPmtxX2Vycm5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAia2V2ZW50KCkgcmVwb3J0ZWQgdGhhdCBjbGllbnQgY2xvc2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInByZW1hdHVyZWx5IGNvbm5lY3Rpb24sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNvIHVwc3RyZWFtIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHRvbyIpOworICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9DTElFTlRfQ0xPU0VEX1JFUVVFU1QpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGV2LT5sb2csIGV2LT5rcV9lcnJubywKKyAgICAgICAgICAgICAgICAgICAgICAia2V2ZW50KCkgcmVwb3J0ZWQgdGhhdCBjbGllbnQgY2xvc2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAicHJlbWF0dXJlbHkgY29ubmVjdGlvbiIpOworCisgICAgICAgIGlmICh1LT5wZWVyLmNvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9DTElFTlRfQ0xPU0VEX1JFUVVFU1QpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2VuZGlmCisKKyAgICBjID0gZXYtPmRhdGE7CisKKyAgICBuID0gcmVjdihjLT5mZCwgYnVmLCAxLCBNU0dfUEVFSyk7CisKKyAgICBlcnIgPSBuZ3hfc29ja2V0X2Vycm5vOworCisgICAgLyoKKyAgICAgKiB3ZSBkbyBub3QgbmVlZCB0byBkaXNhYmxlIHRoZSB3cml0ZSBldmVudCBiZWNhdXNlCisgICAgICogdGhhdCBldmVudCBoYXMgTkdYX1VTRV9DTEVBUl9FVkVOVCB0eXBlCisgICAgICovCisKKyAgICBpZiAoZXYtPndyaXRlICYmIChuID49IDAgfHwgZXJyID09IE5HWF9FQUdBSU4pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByID0gYy0+ZGF0YTsKKyAgICB1ID0gci0+dXBzdHJlYW07CisKKyAgICBpZiAoKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfTEVWRUxfRVZFTlQpICYmIGV2LT5hY3RpdmUpIHsKKyAgICAgICAgaWYgKG5neF9kZWxfZXZlbnQoZXYsIE5HWF9SRUFEX0VWRU5ULCAwKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuID4gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZXYtPmVvZiA9IDE7CisKKyAgICBpZiAobiA9PSAtMSkgeworICAgICAgICBpZiAoZXJyID09IE5HWF9FQUdBSU4pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV2LT5lcnJvciA9IDE7CisKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBuID09IDAgKi8KKyAgICAgICAgZXJyID0gMDsKKyAgICB9CisKKyAgICBpZiAoIXUtPmNhY2hhYmxlICYmIHUtPnBlZXIuY29ubmVjdGlvbikgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgZXYtPmxvZywgZXJyLAorICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgY2xvc2VkIHByZW1hdHVyZWx5IGNvbm5lY3Rpb24sICIKKyAgICAgICAgICAgICAgICAgICAgICAic28gdXBzdHJlYW0gY29ubmVjdGlvbiBpcyBjbG9zZWQgdG9vIik7CisgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9DTElFTlRfQ0xPU0VEX1JFUVVFU1QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGV2LT5sb2csIGVyciwKKyAgICAgICAgICAgICAgICAgICJjbGllbnQgY2xvc2VkIHByZW1hdHVyZWx5IGNvbm5lY3Rpb24iKTsKKworICAgIGlmICh1LT5wZWVyLmNvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfQ0xJRU5UX0NMT1NFRF9SRVFVRVNUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9jb25uZWN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAqdSkKK3sKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICByYzsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOworICAgIG5neF9odHRwX2xvZ19jdHhfdCAgKmN0eDsKKworICAgIGN0eCA9IHItPmNvbm5lY3Rpb24tPmxvZy0+ZGF0YTsKKyAgICBjdHgtPmFjdGlvbiA9ICJjb25uZWN0aW5nIHRvIHVwc3RyZWFtIjsKKworICAgIHItPmNvbm5lY3Rpb24tPnNpbmdsZV9jb25uZWN0aW9uID0gMDsKKworICAgIHJjID0gbmd4X2V2ZW50X2Nvbm5lY3RfcGVlcigmdS0+cGVlcik7CisKKyAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCB1cHN0cmVhbSBjb25uZWN0OiAlaSIsIHJjKTsKKworICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1LT5zdGF0ZS0+cGVlciA9ICZ1LT5wZWVyLnBlZXJzLT5wZWVyW3UtPnBlZXIuY3VyX3BlZXJdLm5hbWU7CisKKyAgICBpZiAocmMgPT0gTkdYX0NPTk5FQ1RfRVJST1IpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbmV4dChyLCB1LCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjID0gdS0+cGVlci5jb25uZWN0aW9uOworCisgICAgYy0+ZGF0YSA9IHI7CisgICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3JlcXVlc3RfaGFuZGxlcjsKKyAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19oZWFkZXI7CisKKyAgICBjLT5zZW5kZmlsZSA9IHItPmNvbm5lY3Rpb24tPnNlbmRmaWxlOworCisgICAgYy0+cG9vbCA9IHItPnBvb2w7CisgICAgYy0+cmVhZC0+bG9nID0gYy0+d3JpdGUtPmxvZyA9IGMtPmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKKworICAgIC8qIGluaXQgb3IgcmVpbml0IHRoZSBuZ3hfb3V0cHV0X2NoYWluKCkgYW5kIG5neF9jaGFpbl93cml0ZXIoKSBjb250ZXh0cyAqLworCisgICAgdS0+d3JpdGVyLm91dCA9IE5VTEw7CisgICAgdS0+d3JpdGVyLmxhc3QgPSAmdS0+d3JpdGVyLm91dDsKKyAgICB1LT53cml0ZXIuY29ubmVjdGlvbiA9IGM7CisgICAgdS0+d3JpdGVyLmxpbWl0ID0gMDsKKworICAgIGlmICh1LT5yZXF1ZXN0X3NlbnQpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fcmVpbml0KHIsIHUpOworICAgIH0KKworICAgIGlmIChyLT5yZXF1ZXN0X2JvZHktPmJ1ZikgeworICAgICAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUpIHsKKworICAgICAgICAgICAgaWYgKCEodS0+b3V0cHV0LmZyZWUgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdS0+b3V0cHV0LmZyZWUtPmJ1ZiA9IHItPnJlcXVlc3RfYm9keS0+YnVmOworICAgICAgICAgICAgdS0+b3V0cHV0LmZyZWUtPm5leHQgPSBOVUxMOworICAgICAgICAgICAgdS0+b3V0cHV0LmFsbG9jYXRlZCA9IDE7CisKKyAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT5wb3MgPSByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+c3RhcnQ7CisgICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+bGFzdCA9IHItPnJlcXVlc3RfYm9keS0+YnVmLT5zdGFydDsKKyAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT50YWcgPSB1LT5vdXRwdXQudGFnOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+cG9zID0gci0+cmVxdWVzdF9ib2R5LT5idWYtPnN0YXJ0OworICAgICAgICB9CisgICAgfQorCisgICAgdS0+cmVxdWVzdF9zZW50ID0gMDsKKworICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKKyAgICAgICAgbmd4X2FkZF90aW1lcihjLT53cml0ZSwgdS0+Y29uZi0+Y29ubmVjdF90aW1lb3V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHJjID09IE5HWF9PSyAqLworCisgICAgbmd4X2h0dHBfdXBzdHJlYW1fc2VuZF9yZXF1ZXN0KHIsIHUpOworfQorCisKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX3JlaW5pdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAqdSkKK3sKKyAgICBuZ3hfY2hhaW5fdCAgKmNsOworCisgICAgaWYgKHUtPnJlaW5pdF9yZXF1ZXN0KHIpID09IE5HWF9FUlJPUikgeworICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHJlaW5pdCB0aGUgcmVxdWVzdCBjaGFpbiAqLworICAgIAorICAgIGZvciAoY2wgPSByLT5yZXF1ZXN0X2JvZHktPmJ1ZnM7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CisgICAgICAgIGNsLT5idWYtPnBvcyA9IGNsLT5idWYtPnN0YXJ0OworICAgICAgICBjbC0+YnVmLT5maWxlX3BvcyA9IDA7CisgICAgfQorCisgICAgLyogcmVpbml0IHRoZSBuZ3hfb3V0cHV0X2NoYWluKCkgY29udGV4dCAqLworCisgICAgdS0+b3V0cHV0LmJ1ZiA9IE5VTEw7CisgICAgdS0+b3V0cHV0LmluID0gTlVMTDsKKyAgICB1LT5vdXRwdXQuZnJlZSA9IE5VTEw7CisgICAgdS0+b3V0cHV0LmJ1c3kgPSBOVUxMOworICAgIAorICAgIC8qIHJlaW5pdCB1LT5oZWFkZXJfaW4gYnVmZmVyICovCisgICAgCisjaWYgMAorICAgIGlmICh1LT5jYWNoZSkgeworICAgICAgICB1LT5oZWFkZXJfaW4ucG9zID0gdS0+aGVhZGVyX2luLnN0YXJ0ICsgdS0+Y2FjaGUtPmN0eC5oZWFkZXJfc2l6ZTsKKyAgICAgICAgdS0+aGVhZGVyX2luLmxhc3QgPSB1LT5oZWFkZXJfaW4ucG9zOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgdS0+aGVhZGVyX2luLnBvcyA9IHUtPmhlYWRlcl9pbi5zdGFydDsKKyAgICAgICAgdS0+aGVhZGVyX2luLmxhc3QgPSB1LT5oZWFkZXJfaW4uc3RhcnQ7CisgICAgfQorI2Vsc2UKKyAgICAgICAgdS0+aGVhZGVyX2luLnBvcyA9IHUtPmhlYWRlcl9pbi5zdGFydDsKKyAgICAgICAgdS0+aGVhZGVyX2luLmxhc3QgPSB1LT5oZWFkZXJfaW4uc3RhcnQ7CisjZW5kaWYKKworICAgIC8qIGFkZCBvbmUgbW9yZSBzdGF0ZSAqLworCisgICAgaWYgKCEodS0+c3RhdGUgPSBuZ3hfcHVzaF9hcnJheSgmdS0+c3RhdGVzKSkpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuZ3hfbWVtemVybyh1LT5zdGF0ZSwgc2l6ZW9mKG5neF9odHRwX3Vwc3RyZWFtX3N0YXRlX3QpKTsKKworICAgIHUtPnN0YXR1cyA9IDA7CisgICAgdS0+c3RhdHVzX2NvdW50ID0gMDsKK30KKworCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAqYzsKKyAgICBuZ3hfaHR0cF9sb2dfY3R4X3QgICpjdHg7CisgICAgCisgICAgYyA9IHUtPnBlZXIuY29ubmVjdGlvbjsKKworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgYy0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHVwc3RyZWFtIHNlbmQgcmVxdWVzdCIpOworCisjaWYgKE5HWF9IQVZFX0tRVUVVRSkKKworICAgIGlmICgobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9LUVVFVUVfRVZFTlQpCisgICAgICAgICYmICF1LT5yZXF1ZXN0X3NlbnQKKyAgICAgICAgJiYgYy0+d3JpdGUtPnBlbmRpbmdfZW9mKQorICAgIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgYy0+bG9nLCBjLT53cml0ZS0+a3FfZXJybm8sCisgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3QoKSBmYWlsZWQiKTsKKworICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9uZXh0KHIsIHUsIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2VuZGlmCisKKyAgICBjdHggPSBjLT5sb2ctPmRhdGE7CisgICAgY3R4LT5hY3Rpb24gPSAic2VuZGluZyByZXF1ZXN0IHRvIHVwc3RyZWFtIjsKKworICAgIHJjID0gbmd4X291dHB1dF9jaGFpbigmdS0+b3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1LT5yZXF1ZXN0X3NlbnQgPyBOVUxMIDogci0+cmVxdWVzdF9ib2R5LT5idWZzKTsKKworICAgIHUtPnJlcXVlc3Rfc2VudCA9IDE7CisKKyAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX25leHQociwgdSwgTkdYX0hUVFBfVVBTVFJFQU1fRlRfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGMtPndyaXRlLT50aW1lcl9zZXQpIHsKKyAgICAgICAgbmd4X2RlbF90aW1lcihjLT53cml0ZSk7CisgICAgfQorCisgICAgaWYgKHJjID09IE5HWF9BR0FJTikgeworICAgICAgICBuZ3hfYWRkX3RpbWVyKGMtPndyaXRlLCB1LT5jb25mLT5zZW5kX3RpbWVvdXQpOworCisgICAgICAgIGlmIChuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KGMtPndyaXRlLCB1LT5jb25mLT5zZW5kX2xvd2F0KSA9PSBOR1hfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiByYyA9PSBOR1hfT0sgKi8KKworICAgIGlmIChjLT50Y3Bfbm9wdXNoID09IE5HWF9UQ1BfTk9QVVNIX1NFVCkgeworICAgICAgICBpZiAobmd4X3RjcF9wdXNoKGMtPmZkKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCBjLT5sb2csIG5neF9zb2NrZXRfZXJybm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF90Y3BfcHVzaF9uICIgZmFpbGVkIik7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47IAorICAgICAgICB9CisKKyAgICAgICAgYy0+dGNwX25vcHVzaCA9IE5HWF9UQ1BfTk9QVVNIX1VOU0VUOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIG5neF9hZGRfdGltZXIoYy0+cmVhZCwgdS0+Y29uZi0+cmVhZF90aW1lb3V0KTsKKworI2lmIDEKKyAgICBpZiAoYy0+cmVhZC0+cmVhZHkpIHsKKyAgICAKKyAgICAgICAgLyogcG9zdCBhaW8gb3BlcmF0aW9uICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVE9ETyBjb21tZW50CisgICAgICAgICAqIGFsdGhvdWdoIHdlIGNhbiBwb3N0IGFpbyBvcGVyYXRpb24ganVzdCBpbiB0aGUgZW5kCisgICAgICAgICAqIG9mIG5neF9odHRwX3Vwc3RyZWFtX2Nvbm5lY3QoKSBDSEVDSyBJVCAhISEKKyAgICAgICAgICogaXQncyBiZXR0ZXIgdG8gZG8gaGVyZSBiZWNhdXNlIHdlIHBvc3Rwb25lIGhlYWRlciBidWZmZXIgYWxsb2NhdGlvbgorICAgICAgICAgKi8KKworICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2hlYWRlcihjLT5yZWFkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9kdW1teV9oYW5kbGVyOworCisgICAgaWYgKG5neF9oYW5kbGVfbGV2ZWxfd3JpdGVfZXZlbnQoYy0+d3JpdGUpID09IE5HWF9FUlJPUikgeworICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3JlcXVlc3RfaGFuZGxlcihuZ3hfZXZlbnRfdCAqd2V2KQoreworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICpjOworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICpyOworICAgIG5neF9odHRwX2xvZ19jdHhfdCAgICpjdHg7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgKnU7CisKKyAgICBjID0gd2V2LT5kYXRhOworICAgIHIgPSBjLT5kYXRhOworICAgIHUgPSByLT51cHN0cmVhbTsKKworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgd2V2LT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgdXBzdHJlYW0gc2VuZCByZXF1ZXN0IGhhbmRsZXIiKTsKKworICAgIGlmICh3ZXYtPnRpbWVkb3V0KSB7CisgICAgICAgIGN0eCA9IGMtPmxvZy0+ZGF0YTsKKyAgICAgICAgY3R4LT5hY3Rpb24gPSAic2VuZGluZyByZXF1ZXN0IHRvIHVwc3RyZWFtIjsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbmV4dChyLCB1LCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9USU1FT1VUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyLT5jb25uZWN0aW9uLT53cml0ZS0+ZW9mICYmICghdS0+Y2FjaGFibGUgfHwgIXUtPnJlcXVlc3Rfc2VudCkpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3JlcXVlc3QociwgdSk7Cit9CisKKworc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19oZWFkZXIobmd4X2V2ZW50X3QgKnJldikKK3sKKyAgICBzc2l6ZV90ICAgICAgICAgICAgICAgbjsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgcmM7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgKmM7CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgKnI7CisgICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgKmN0eDsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAqdTsKKworICAgIGMgPSByZXYtPmRhdGE7CisgICAgciA9IGMtPmRhdGE7CisgICAgdSA9IHItPnVwc3RyZWFtOworCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCB1cHN0cmVhbSBwcm9jZXNzIGhhbmRsZXIiKTsKKworICAgIGN0eCA9IGMtPmxvZy0+ZGF0YTsKKyAgICBjdHgtPmFjdGlvbiA9ICJyZWFkaW5nIHJlc3BvbnNlIGhlYWRlciBmcm9tIHVwc3RyZWFtIjsKKworICAgIGlmIChyZXYtPnRpbWVkb3V0KSB7CisgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX25leHQociwgdSwgTkdYX0hUVFBfVVBTVFJFQU1fRlRfVElNRU9VVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgaWYgKHUtPmhlYWRlcl9pbi5zdGFydCA9PSBOVUxMKSB7CisgICAgICAgIHUtPmhlYWRlcl9pbi5zdGFydCA9IG5neF9wYWxsb2Moci0+cG9vbCwgdS0+Y29uZi0+aGVhZGVyX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgaWYgKHUtPmhlYWRlcl9pbi5zdGFydCA9PSBOVUxMKSB7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1LT5oZWFkZXJfaW4ucG9zID0gdS0+aGVhZGVyX2luLnN0YXJ0OworICAgICAgICB1LT5oZWFkZXJfaW4ubGFzdCA9IHUtPmhlYWRlcl9pbi5zdGFydDsKKyAgICAgICAgdS0+aGVhZGVyX2luLmVuZCA9IHUtPmhlYWRlcl9pbi5sYXN0ICsgdS0+Y29uZi0+aGVhZGVyX2J1ZmZlcl9zaXplOworICAgICAgICB1LT5oZWFkZXJfaW4udGVtcG9yYXJ5ID0gMTsKKworICAgICAgICB1LT5oZWFkZXJfaW4udGFnID0gdS0+b3V0cHV0LnRhZzsKKworI2lmIDAKKyAgICAgICAgaWYgKHUtPmNhY2hlKSB7CisgICAgICAgICAgICB1LT5oZWFkZXJfaW4ucG9zICs9IHUtPmNhY2hlLT5jdHguaGVhZGVyX3NpemU7CisgICAgICAgICAgICB1LT5oZWFkZXJfaW4ubGFzdCA9IHUtPmhlYWRlcl9pbi5wb3M7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIG4gPSBuZ3hfcmVjdih1LT5wZWVyLmNvbm5lY3Rpb24sIHUtPmhlYWRlcl9pbi5sYXN0LAorICAgICAgICAgICAgICAgICB1LT5oZWFkZXJfaW4uZW5kIC0gdS0+aGVhZGVyX2luLmxhc3QpOworCisgICAgaWYgKG4gPT0gTkdYX0FHQUlOKSB7CisjaWYgMAorICAgICAgICBuZ3hfYWRkX3RpbWVyKHJldiwgdS0+cmVhZF90aW1lb3V0KTsKKyNlbmRpZgorCisgICAgICAgIGlmIChuZ3hfaGFuZGxlX3JlYWRfZXZlbnQocmV2LCAwKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHJldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSBwcmVtYXR1cmVseSBjbG9zZWQgY29ubmVjdGlvbiIpOworICAgIH0KKworICAgIGlmIChuID09IE5HWF9FUlJPUiB8fCBuID09IDApIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbmV4dChyLCB1LCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobiA9PSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1LT5oZWFkZXJfaW4ubGFzdCArPSBuOworCisjaWYgMAorICAgIHUtPnZhbGlkX2hlYWRlcl9pbiA9IDA7CisKKyAgICB1LT5wZWVyLmNhY2hlZCA9IDA7CisjZW5kaWYKKworICAgIHJjID0gdS0+cHJvY2Vzc19oZWFkZXIocik7CisKKyAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7CisjaWYgMAorICAgICAgICBuZ3hfYWRkX3RpbWVyKHJldiwgdS0+cmVhZF90aW1lb3V0KTsKKyNlbmRpZgorCisgICAgICAgIGlmICh1LT5oZWFkZXJfaW4ubGFzdCA9PSB1LT5oZWFkZXJfaW4uZW5kKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIHNlbnQgdG9vIGJpZyBoZWFkZXIiKTsKKworICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbmV4dChyLCB1LCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9JTlZBTElEX0hFQURFUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KHJldiwgMCkgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJjID09IE5HWF9IVFRQX1VQU1RSRUFNX0lOVkFMSURfSEVBREVSKSB7CisgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX25leHQociwgdSwgTkdYX0hUVFBfVVBTVFJFQU1fRlRfSU5WQUxJRF9IRUFERVIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJjID09IE5HWF9FUlJPUiB8fCByYyA9PSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiByYyA9PSBOR1hfT0sgKi8KKworICAgIG5neF9odHRwX3Vwc3RyZWFtX3NlbmRfcmVzcG9uc2UociwgdSk7Cit9CisKKworc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fc2VuZF9yZXNwb25zZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUpCit7CisgICAgbmd4X2V2ZW50X3BpcGVfdCAgICAgICAgICAqcDsKKyAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOworCisKKyAgICBpZiAodS0+c2VuZF9oZWFkZXIocikgPT0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSB7CisgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdS0+aGVhZGVyX3NlbnQgPSAxOworCisgICAgLyogVE9ETzogcHJlYWxsb2NhdGUgZXZlbnRfcGlwZSBidWZzLCBsb29rICJDb250ZW50LUxlbmd0aCIgKi8KKworI2lmIDAKKworICAgIGlmICh1LT5jYWNoZSAmJiB1LT5jYWNoZS0+Y3R4LmZpbGUuZmQgIT0gTkdYX0lOVkFMSURfRklMRSkgeworICAgICAgICBpZiAobmd4X2Nsb3NlX2ZpbGUodS0+Y2FjaGUtPmN0eC5maWxlLmZkKSA9PSBOR1hfRklMRV9FUlJPUikgeworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIG5neF9lcnJubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2Nsb3NlX2ZpbGVfbiAiIFwiJXNcIiBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1LT5jYWNoZS0+Y3R4LmZpbGUubmFtZS5kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh1LT5jYWNoYWJsZSkgeworICAgICAgICBoZWFkZXIgPSAobmd4X2h0dHBfY2FjaGVfaGVhZGVyX3QgKikgdS0+aGVhZGVyX2luLT5zdGFydDsKKworICAgICAgICBoZWFkZXItPmV4cGlyZXMgPSB1LT5jYWNoZS0+Y3R4LmV4cGlyZXM7CisgICAgICAgIGhlYWRlci0+bGFzdF9tb2RpZmllZCA9IHUtPmNhY2hlLT5jdHgubGFzdF9tb2RpZmllZDsKKyAgICAgICAgaGVhZGVyLT5kYXRlID0gdS0+Y2FjaGUtPmN0eC5kYXRlOworICAgICAgICBoZWFkZXItPmxlbmd0aCA9IHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoX247CisgICAgICAgIHUtPmNhY2hlLT5jdHgubGVuZ3RoID0gci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbjsKKworICAgICAgICBoZWFkZXItPmtleV9sZW4gPSB1LT5jYWNoZS0+Y3R4LmtleTAubGVuOworICAgICAgICBuZ3hfbWVtY3B5KCZoZWFkZXItPmtleSwgdS0+Y2FjaGUtPmN0eC5rZXkwLmRhdGEsIGhlYWRlci0+a2V5X2xlbik7CisgICAgICAgIGhlYWRlci0+a2V5W2hlYWRlci0+a2V5X2xlbl0gPSBMRjsKKyAgICB9CisKKyNlbmRpZgorCisgICAgcCA9ICZ1LT5waXBlOworCisgICAgcC0+b3V0cHV0X2ZpbHRlciA9IChuZ3hfZXZlbnRfcGlwZV9vdXRwdXRfZmlsdGVyX3B0KSBuZ3hfaHR0cF9vdXRwdXRfZmlsdGVyOworICAgIHAtPm91dHB1dF9jdHggPSByOworICAgIHAtPnRhZyA9IHUtPm91dHB1dC50YWc7CisgICAgcC0+YnVmcyA9IHUtPmNvbmYtPmJ1ZnM7ICAgICAKKyAgICBwLT5idXN5X3NpemUgPSB1LT5jb25mLT5idXN5X2J1ZmZlcnNfc2l6ZTsKKyAgICBwLT51cHN0cmVhbSA9IHUtPnBlZXIuY29ubmVjdGlvbjsKKyAgICBwLT5kb3duc3RyZWFtID0gci0+Y29ubmVjdGlvbjsKKyAgICBwLT5wb29sID0gci0+cG9vbDsKKyAgICBwLT5sb2cgPSByLT5jb25uZWN0aW9uLT5sb2c7CisgICAgCisgICAgcC0+Y2FjaGFibGUgPSB1LT5jYWNoYWJsZTsKKworICAgIGlmICghKHAtPnRlbXBfZmlsZSA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfdGVtcF9maWxlX3QpKSkpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHAtPnRlbXBfZmlsZS0+ZmlsZS5mZCA9IE5HWF9JTlZBTElEX0ZJTEU7CisgICAgcC0+dGVtcF9maWxlLT5maWxlLmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKKyAgICBwLT50ZW1wX2ZpbGUtPnBhdGggPSB1LT5jb25mLT50ZW1wX3BhdGg7CisgICAgcC0+dGVtcF9maWxlLT5wb29sID0gci0+cG9vbDsKKyAgICAKKyAgICBpZiAodS0+Y2FjaGFibGUpIHsKKyAgICAgICAgcC0+dGVtcF9maWxlLT5wZXJzaXN0ZW50ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBwLT50ZW1wX2ZpbGUtPndhcm4gPSAiYW4gdXBzdHJlYW0gcmVzcG9uc2UgaXMgYnVmZmVyZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gYSB0ZW1wb3JhcnkgZmlsZSI7CisgICAgfQorCisgICAgcC0+bWF4X3RlbXBfZmlsZV9zaXplID0gdS0+Y29uZi0+bWF4X3RlbXBfZmlsZV9zaXplOworICAgIHAtPnRlbXBfZmlsZV93cml0ZV9zaXplID0gdS0+Y29uZi0+dGVtcF9maWxlX3dyaXRlX3NpemU7CisKKyAgICBpZiAoIShwLT5wcmVyZWFkX2J1ZnMgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwLT5wcmVyZWFkX2J1ZnMtPmJ1ZiA9ICZ1LT5oZWFkZXJfaW47CisgICAgcC0+cHJlcmVhZF9idWZzLT5uZXh0ID0gTlVMTDsKKyAgICB1LT5oZWFkZXJfaW4ucmVjeWNsZWQgPSAxOworCisgICAgcC0+cHJlcmVhZF9zaXplID0gdS0+aGVhZGVyX2luLmxhc3QgLSB1LT5oZWFkZXJfaW4ucG9zOworCisgICAgaWYgKHUtPmNhY2hhYmxlKSB7CisgICAgICAgIHAtPmJ1Zl90b19maWxlID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgIGlmIChwLT5idWZfdG9fZmlsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHAtPmJ1Zl90b19maWxlLT5wb3MgPSB1LT5oZWFkZXJfaW4uc3RhcnQ7CisgICAgICAgIHAtPmJ1Zl90b19maWxlLT5sYXN0ID0gdS0+aGVhZGVyX2luLnBvczsKKyAgICAgICAgcC0+YnVmX3RvX2ZpbGUtPnRlbXBvcmFyeSA9IDE7CisgICAgfQorCisgICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfQUlPX0VWRU5UKSB7CisgICAgICAgIC8qIHRoZSBwb3N0ZWQgYWlvIG9wZXJhdGlvbiBtYXkgY3VycnVwdCBhIHNoYWRvdyBidWZmZXIgKi8KKyAgICAgICAgcC0+c2luZ2xlX2J1ZiA9IDE7CisgICAgfQorCisgICAgLyogVE9ETzogcC0+ZnJlZV9idWZzID0gMCBpZiB1c2Ugbmd4X2NyZWF0ZV9jaGFpbl9vZl9idWZzKCkgKi8KKyAgICBwLT5mcmVlX2J1ZnMgPSAxOworCisgICAgLyoKKyAgICAgKiBldmVudF9waXBlIHdvdWxkIGRvIHUtPmhlYWRlcl9pbi5sYXN0ICs9IHAtPnByZXJlYWRfc2l6ZQorICAgICAqIGFzIHRob3VnaCB0aGVzZSBieXRlcyB3ZXJlIHJlYWQKKyAgICAgKi8KKyAgICB1LT5oZWFkZXJfaW4ubGFzdCA9IHUtPmhlYWRlcl9pbi5wb3M7CisKKyAgICBpZiAodS0+Y29uZi0+Y3ljbGljX3RlbXBfZmlsZSkgeworCisgICAgICAgIC8qCisgICAgICAgICAqIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIHNlbmRmaWxlKCkgaWYgd2UgdXNlIGN5Y2xpYyB0ZW1wIGZpbGUKKyAgICAgICAgICogYmVjYXVzZSB0aGUgd3JpdGluZyBhIG5ldyBkYXRhIG1heSBpbnRlcmZlcmUgd2l0aCBzZW5kZmlsZSgpCisgICAgICAgICAqIHRoYXQgdXNlcyB0aGUgc2FtZSBrZXJuZWwgZmlsZSBwYWdlcyAoYXQgbGVhc3Qgb24gRnJlZUJTRCkKKyAgICAgICAgICovCisKKyAgICAgICAgcC0+Y3ljbGljX3RlbXBfZmlsZSA9IDE7CisgICAgICAgIHItPmNvbm5lY3Rpb24tPnNlbmRmaWxlID0gMDsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHAtPmN5Y2xpY190ZW1wX2ZpbGUgPSAwOworICAgIH0KKworICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIHAtPnJlYWRfdGltZW91dCA9IHUtPmNvbmYtPnJlYWRfdGltZW91dDsKKyAgICBwLT5zZW5kX3RpbWVvdXQgPSBjbGNmLT5zZW5kX3RpbWVvdXQ7CisgICAgcC0+c2VuZF9sb3dhdCA9IGNsY2YtPnNlbmRfbG93YXQ7CisKKyAgICB1LT5wZWVyLmNvbm5lY3Rpb24tPnJlYWQtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHk7CisgICAgci0+Y29ubmVjdGlvbi0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHk7CisKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHkodS0+cGVlci5jb25uZWN0aW9uLT5yZWFkKTsKK30KKworCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHkobmd4X2V2ZW50X3QgKmV2KQoreworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICpjOworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICpyOworICAgIG5neF9odHRwX2xvZ19jdHhfdCAgICpjdHg7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgKnU7CisgICAgbmd4X2V2ZW50X3BpcGVfdCAgICAgKnA7CisKKyAgICBjID0gZXYtPmRhdGE7CisgICAgciA9IGMtPmRhdGE7CisgICAgdSA9IHItPnVwc3RyZWFtOworCisgICAgY3R4ID0gZXYtPmxvZy0+ZGF0YTsKKworICAgIGlmIChldi0+d3JpdGUpIHsKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCBldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBwcm9jZXNzIGRvd25zdHJlYW0iKTsKKyAgICAgICAgY3R4LT5hY3Rpb24gPSAic2VuZGluZyB0byBjbGllbnQiOworICAgIAorICAgIH0gZWxzZSB7CisgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgcHJvY2VzcyB1cHN0cmVhbSIpOworICAgICAgICBjdHgtPmFjdGlvbiA9ICJyZWFkaW5nIHVwc3RyZWFtIGJvZHkiOworICAgIH0KKyAgICAKKyAgICBwID0gJnUtPnBpcGU7CisKKyAgICBpZiAoZXYtPnRpbWVkb3V0KSB7CisgICAgICAgIGlmIChldi0+d3JpdGUpIHsKKyAgICAgICAgICAgIHAtPmRvd25zdHJlYW1fZXJyb3IgPSAxOworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgYy0+bG9nLCBOR1hfRVRJTUVET1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHRpbWVkIG91dCIpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwLT51cHN0cmVhbV9lcnJvciA9IDE7IAorICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgYy0+bG9nLCBOR1hfRVRJTUVET1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gdGltZWQgb3V0Iik7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChuZ3hfZXZlbnRfcGlwZShwLCBldi0+d3JpdGUpID09IE5HWF9BQk9SVCkgeworICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAodS0+cGVlci5jb25uZWN0aW9uKSB7CisKKyNpZiAoTkdYX0hUVFBfRklMRV9DQUNIRSkKKworICAgICAgICBpZiAocC0+dXBzdHJlYW1fZG9uZSAmJiB1LT5jYWNoYWJsZSkgeworICAgICAgICAgICAgaWYgKG5neF9odHRwX2NhY2hlX3VwZGF0ZShyKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgICAgICBuZ3hfaHR0cF9idXN5X3VubG9jayh1LT5jb25mLT5idXN5X2xvY2ssICZ1LT5idXN5X2xvY2spOworICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAocC0+dXBzdHJlYW1fZW9mICYmIHUtPmNhY2hhYmxlKSB7CisKKyAgICAgICAgICAgIC8qIFRPRE86IGNoZWNrIGxlbmd0aCAmIHVwZGF0ZSBjYWNoZSAqLworCisgICAgICAgICAgICBpZiAobmd4X2h0dHBfY2FjaGVfdXBkYXRlKHIpID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgICAgIG5neF9odHRwX2J1c3lfdW5sb2NrKHUtPmNvbmYtPmJ1c3lfbG9jaywgJnUtPmJ1c3lfbG9jayk7CisgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2VuZGlmCisKKyAgICAgICAgaWYgKHAtPnVwc3RyZWFtX2RvbmUgfHwgcC0+dXBzdHJlYW1fZW9mIHx8IHAtPnVwc3RyZWFtX2Vycm9yKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGV2LT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSB1cHN0cmVhbSBleGl0OiAlcCIsIHAtPm91dCk7CisjaWYgMAorICAgICAgICAgICAgbmd4X2h0dHBfYnVzeV91bmxvY2sodS0+Y29uZi0+YnVzeV9sb2NrLCAmdS0+YnVzeV9sb2NrKTsKKyNlbmRpZgorICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwLT5kb3duc3RyZWFtX2Vycm9yKSB7CisgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgZG93bnN0cmVhbSBlcnJvciIpOworCisgICAgICAgIGlmICghdS0+Y2FjaGFibGUgJiYgdS0+cGVlci5jb25uZWN0aW9uKSB7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsIDApOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKndldikKK3sKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHdldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHVwc3RyZWFtIGR1bW15IGhhbmRsZXIiKTsKK30KKworCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9uZXh0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAqdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3VpbnRfdCBmdF90eXBlKQoreworICAgIG5neF91aW50X3QgIHN0YXR1czsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIG5leHQgdXBzdHJlYW0sICV4RCIsIGZ0X3R5cGUpOworCisjaWYgMAorICAgIG5neF9odHRwX2J1c3lfdW5sb2NrKHUtPmNvbmYtPmJ1c3lfbG9jaywgJnUtPmJ1c3lfbG9jayk7CisjZW5kaWYKKworICAgIGlmIChmdF90eXBlICE9IE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0hUVFBfNDA0KSB7CisgICAgICAgIG5neF9ldmVudF9jb25uZWN0X3BlZXJfZmFpbGVkKCZ1LT5wZWVyKTsKKyAgICB9CisgICAgCisgICAgaWYgKGZ0X3R5cGUgPT0gTkdYX0hUVFBfVVBTVFJFQU1fRlRfVElNRU9VVCkgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIE5HWF9FVElNRURPVVQsCisgICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIHRpbWVkIG91dCIpOworICAgIH0KKyAgICAKKyAgICBpZiAodS0+cGVlci5jYWNoZWQgJiYgZnRfdHlwZSA9PSBOR1hfSFRUUF9VUFNUUkVBTV9GVF9FUlJPUikgeworICAgICAgICBzdGF0dXMgPSAwOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoKGZ0X3R5cGUpIHsKKworICAgICAgICBjYXNlIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX1RJTUVPVVQ6CisgICAgICAgICAgICBzdGF0dXMgPSBOR1hfSFRUUF9HQVRFV0FZX1RJTUVfT1VUOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBOR1hfSFRUUF9VUFNUUkVBTV9GVF9IVFRQXzUwMDoKKyAgICAgICAgICAgIHN0YXR1cyA9IE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTkdYX0hUVFBfVVBTVFJFQU1fRlRfSFRUUF80MDQ6CisgICAgICAgICAgICBzdGF0dXMgPSBOR1hfSFRUUF9OT1RfRk9VTkQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKgorICAgICAgICAgKiBOR1hfSFRUUF9VUFNUUkVBTV9GVF9CVVNZX0xPQ0sgYW5kIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX01BWF9XQUlUSU5HCisgICAgICAgICAqIG5ldmVyIHJlYWNoIGhlcmUKKyAgICAgICAgICovCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IE5HWF9IVFRQX0JBRF9HQVRFV0FZOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHItPmNvbm5lY3Rpb24tPndyaXRlLT5lb2YpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIHUtPnN0YXRlLT5zdGF0dXMgPSBzdGF0dXM7CisKKyAgICAgICAgaWYgKHUtPnBlZXIudHJpZXMgPT0gMCB8fCAhKHUtPmNvbmYtPm5leHRfdXBzdHJlYW0gJiBmdF90eXBlKSkKKyAgICAgICAgeworCisjaWYgKE5HWF9IVFRQX0NBQ0hFKQorCisgICAgICAgICAgICBpZiAodS0+c3RhbGUgJiYgKHUtPmNvbmYtPnVzZV9zdGFsZSAmIGZ0X3R5cGUpKSB7CisgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfc2VuZF9jYWNoZWRfcmVzcG9uc2UocikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworI2VuZGlmCisKKyAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh1LT5wZWVyLmNvbm5lY3Rpb24pIHsKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJjbG9zZSBodHRwIHVwc3RyZWFtIGNvbm5lY3Rpb246ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdS0+cGVlci5jb25uZWN0aW9uLT5mZCk7CisKKyAgICAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24odS0+cGVlci5jb25uZWN0aW9uKTsKKyAgICB9CisKKyNpZiAwCisgICAgaWYgKHUtPmNvbmYtPmJ1c3lfbG9jayAmJiAhdS0+YnVzeV9sb2NrZWQpIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fYnVzeV9sb2NrKHApOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb25uZWN0KHIsIHUpOworfQorCisKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaW50X3QgcmMpCit7CisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImZpbmFsaXplIGh0dHAgdXBzdHJlYW0gcmVxdWVzdCIpOworCisgICAgdS0+ZmluYWxpemVfcmVxdWVzdChyLCByYyk7CisKKyAgICBpZiAodS0+cGVlci5jb25uZWN0aW9uKSB7CisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiY2xvc2UgaHR0cCB1cHN0cmVhbSBjb25uZWN0aW9uOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHUtPnBlZXIuY29ubmVjdGlvbi0+ZmQpOworCisgICAgICAgIG5neF9jbG9zZV9jb25uZWN0aW9uKHUtPnBlZXIuY29ubmVjdGlvbik7CisgICAgfQorCisgICAgaWYgKHUtPmhlYWRlcl9zZW50CisgICAgICAgICYmIChyYyA9PSBOR1hfRVJST1IgfHwgcmMgPj0gTkdYX0hUVFBfU1BFQ0lBTF9SRVNQT05TRSkpCisgICAgeworICAgICAgICByYyA9IDA7CisgICAgfQorCisgICAgaWYgKHUtPnNhdmVkX2N0eCkgeworICAgICAgICByLT5jb25uZWN0aW9uLT5sb2ctPmRhdGEgPSB1LT5zYXZlZF9jdHg7CisgICAgICAgIHItPmNvbm5lY3Rpb24tPmxvZy0+aGFuZGxlciA9IHUtPnNhdmVkX2hhbmRsZXI7CisgICAgfQorCisgICAgaWYgKHUtPnBpcGUudGVtcF9maWxlLT5maWxlLmZkKSB7CisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCB1cHN0cmVhbSB0ZW1wIGZkOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHUtPnBpcGUudGVtcF9maWxlLT5maWxlLmZkKTsKKyAgICB9CisKKyNpZiAwCisgICAgaWYgKHUtPmNhY2hlKSB7CisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBjYWNoZSBmZDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICB1LT5jYWNoZS0+Y3R4LmZpbGUuZmQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHUtPnBpcGUudGVtcF9maWxlLT5maWxlLmZkKSB7CisgICAgICAgIHItPmZpbGUuZmQgPSB1LT5waXBlLnRlbXBfZmlsZS0+ZmlsZS5mZDsKKworI2lmIDAKKyAgICB9IGVsc2UgaWYgKHUtPmNhY2hlKSB7CisgICAgICAgIHItPmZpbGUuZmQgPSB1LT5jYWNoZS0+Y3R4LmZpbGUuZmQ7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAocmMgPT0gMCAmJiByLT5tYWluID09IE5VTEwpIHsKKyAgICAgICAgcmMgPSBuZ3hfaHR0cF9zZW5kX2xhc3Qocik7CisgICAgfQorCisgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCByYyk7Cit9CisKKworc3RhdGljIHNpemVfdCBuZ3hfaHR0cF91cHN0cmVhbV9sb2dfc3RhdHVzX2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQoreworICAgIGlmIChyLT51cHN0cmVhbSkgeworICAgICAgICByZXR1cm4gci0+dXBzdHJlYW0tPnN0YXRlcy5uZWx0cyAqICgzICsgMik7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3N0YXR1cyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCit7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGk7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICAgICAgKnU7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fc3RhdGVfdCAgKnN0YXRlOworCisgICAgdSA9IHItPnVwc3RyZWFtOworCisgICAgaWYgKHUgPT0gTlVMTCkgeworICAgICAgICAqYnVmID0gJy0nOworICAgICAgICByZXR1cm4gYnVmICsgMTsKKyAgICB9CisKKyAgICBpID0gMDsKKyAgICBzdGF0ZSA9IHUtPnN0YXRlcy5lbHRzOworCisgICAgZm9yICggOzsgKSB7CisgICAgICAgIGlmIChzdGF0ZVtpXS5zdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgKmJ1ZisrID0gJy0nOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYgPSBuZ3hfc3ByaW50ZihidWYsICIldWkiLCBzdGF0ZVtpXS5zdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCsraSA9PSB1LT5zdGF0ZXMubmVsdHMpIHsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICAqYnVmKysgPSAnLCc7CisgICAgICAgICpidWYrKyA9ICcgJzsKKyAgICB9Cit9CisKKwordV9jaGFyICpuZ3hfaHR0cF91cHN0cmVhbV9sb2dfZXJyb3Iodm9pZCAqZGF0YSwgdV9jaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgbmd4X2h0dHBfbG9nX2N0eF90ICpjdHggPSBkYXRhOworICAgIAorICAgIHVfY2hhciAgICAgICAgICAgICAgICAgKnA7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgZXNjYXBlOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgIHVyaTsKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICpyOworICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICAgKnU7CisgICAgbmd4X3BlZXJfY29ubmVjdGlvbl90ICAqcGVlcjsKKworICAgIHIgPSBjdHgtPnJlcXVlc3Q7CisgICAgdSA9IHItPnVwc3RyZWFtOworICAgIHBlZXIgPSAmdS0+cGVlcjsKKworICAgIHAgPSBuZ3hfc25wcmludGYoYnVmLCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAiIHdoaWxlICVzLCBjbGllbnQ6ICVWLCBVUkw6ICVWLCB1cHN0cmVhbTogJVYlViVzJVYiLAorICAgICAgICAgICAgICAgICAgICAgY3R4LT5hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAmci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgJnItPnVucGFyc2VkX3VyaSwKKyAgICAgICAgICAgICAgICAgICAgICZ1LT5zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICAmcGVlci0+cGVlcnMtPnBlZXJbcGVlci0+Y3VyX3BlZXJdLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBwZWVyLT5wZWVycy0+cGVlcltwZWVyLT5jdXJfcGVlcl0udXJpX3NlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICZ1LT51cmkpOworICAgIGxlbiAtPSBwIC0gYnVmOworICAgIGJ1ZiA9IHA7CisKKyAgICBpZiAoci0+cXVvdGVkX3VyaSkgeworICAgICAgICBlc2NhcGUgPSAyICogbmd4X2VzY2FwZV91cmkoTlVMTCwgci0+dXJpLmRhdGEgKyB1LT5sb2NhdGlvbi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfRVNDQVBFX1VSSSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXNjYXBlID0gMDsKKyAgICB9CisKKyAgICBpZiAoZXNjYXBlKSB7CisgICAgICAgIGlmIChsZW4gPj0gci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGUpIHsKKworICAgICAgICAgICAgbmd4X2VzY2FwZV91cmkoYnVmLCByLT51cmkuZGF0YSArIHUtPmxvY2F0aW9uLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbiwgTkdYX0VTQ0FQRV9VUkkpOworCisgICAgICAgICAgICBidWYgKz0gci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGU7CisKKyAgICAgICAgICAgIGlmIChyLT5hcmdzLmxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuIC09IHItPnVyaS5sZW4gLSB1LT5sb2NhdGlvbi0+bGVuICsgZXNjYXBlOworCisgICAgICAgICAgICByZXR1cm4gbmd4X3NucHJpbnRmKGJ1ZiwgbGVuLCAiPyVWIiwgJnItPmFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgcCA9IG5neF9wYWxsb2Moci0+cG9vbCwgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGUpOworICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2VzY2FwZV91cmkocCwgci0+dXJpLmRhdGEgKyB1LT5sb2NhdGlvbi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbiwgTkdYX0VTQ0FQRV9VUkkpOworCisgICAgICAgIHVyaS5sZW4gPSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbiArIGVzY2FwZTsKKyAgICAgICAgdXJpLmRhdGEgPSBwOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgdXJpLmxlbiA9IHItPnVyaS5sZW4gLSB1LT5sb2NhdGlvbi0+bGVuOworICAgICAgICB1cmkuZGF0YSA9IHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24tPmxlbjsKKworICAgIH0KKworICAgIHJldHVybiBuZ3hfc25wcmludGYoYnVmLCBsZW4sICIlViVzJVYiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICZ1cmksIHItPmFyZ3MubGVuID8gIj8iIDogIiIsICZyLT5hcmdzKTsKK30KKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Vwc3RyZWFtX2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZikKK3sKKyAgICBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICAqb3A7CisKKyAgICBmb3IgKG9wID0gbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2ZtdF9vcHM7IG9wLT5uYW1lLmxlbjsgb3ArKykgeyAvKiB2b2lkICovIH0KKyAgICBvcC0+cnVuID0gTlVMTDsKKworICAgIGZvciAob3AgPSBuZ3hfaHR0cF9sb2dfZm10X29wczsgb3AtPnJ1bjsgb3ArKykgeworICAgICAgICBpZiAob3AtPm5hbWUubGVuID09IDApIHsKKyAgICAgICAgICAgIG9wID0gKG5neF9odHRwX2xvZ19vcF9uYW1lX3QgKikgb3AtPnJ1bjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9wLT5ydW4gPSAobmd4X2h0dHBfbG9nX29wX3J1bl9wdCkgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2ZtdF9vcHM7CisKKyAgICByZXR1cm4gTkdYX09LOworfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaCBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxNDIxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKQEAgLTAsMCArMSwxMjIgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpZm5kZWYgX05HWF9IVFRQX1VQU1RSRUFNX0hfSU5DTFVERURfCisjZGVmaW5lIF9OR1hfSFRUUF9VUFNUUkVBTV9IX0lOQ0xVREVEXworCisKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnRfY29ubmVjdC5oPgorI2luY2x1ZGUgPG5neF9ldmVudF9waXBlLmg+CisjaW5jbHVkZSA8bmd4X2h0dHAuaD4KKworCisjZGVmaW5lIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0VSUk9SICAgICAgICAgICAweDAyCisjZGVmaW5lIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX1RJTUVPVVQgICAgICAgICAweDA0CisjZGVmaW5lIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0lOVkFMSURfSEVBREVSICAweDA4CisjZGVmaW5lIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0hUVFBfNTAwICAgICAgICAweDEwCisjZGVmaW5lIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0hUVFBfNDA0ICAgICAgICAweDIwCisjZGVmaW5lIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0JVU1lfTE9DSyAgICAgICAweDQwCisjZGVmaW5lIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX01BWF9XQUlUSU5HICAgICAweDgwCisKKworI2RlZmluZSBOR1hfSFRUUF9VUFNUUkVBTV9JTlZBTElEX0hFQURFUiAgICAgNDAKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdGltZV90ICAgICAgICAgICAgICAgICAgICAgIGJsX3RpbWU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGJsX3N0YXRlOworCisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgICAgdGltZTsKKyAgICAKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqcGVlcjsKK30gbmd4X2h0dHBfdXBzdHJlYW1fc3RhdGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dDsKKyAgICBuZ3hfbXNlY190ICAgICAgICAgICAgICAgICAgc2VuZF90aW1lb3V0OworICAgIG5neF9tc2VjX3QgICAgICAgICAgICAgICAgICByZWFkX3RpbWVvdXQ7CisKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgc2VuZF9sb3dhdDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2J1ZmZlcl9zaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICBidXN5X2J1ZmZlcnNfc2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXBfZmlsZV9zaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfd3JpdGVfc2l6ZTsKKworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBuZXh0X3Vwc3RyZWFtOworCisgICAgbmd4X2J1ZnNfdCAgICAgICAgICAgICAgICAgIGJ1ZnM7CisKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgeF9wb3dlcmVkX2J5OworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICBjeWNsaWNfdGVtcF9maWxlOworCisgICAgbmd4X3BhdGhfdCAgICAgICAgICAgICAgICAgKnRlbXBfcGF0aDsKK30gbmd4X2h0dHBfdXBzdHJlYW1fY29uZl90OworCisKK3R5cGVkZWYgc3RydWN0IG5neF9odHRwX3Vwc3RyZWFtX3MgIG5neF9odHRwX3Vwc3RyZWFtX3Q7CisKK3N0cnVjdCBuZ3hfaHR0cF91cHN0cmVhbV9zIHsKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAqcmVxdWVzdDsKKworICAgIG5neF9wZWVyX2Nvbm5lY3Rpb25fdCAgICAgICBwZWVyOworCisgICAgbmd4X2V2ZW50X3BpcGVfdCAgICAgICAgICAgIHBpcGU7CisKKyAgICBuZ3hfb3V0cHV0X2NoYWluX2N0eF90ICAgICAgb3V0cHV0OworICAgIG5neF9jaGFpbl93cml0ZXJfY3R4X3QgICAgICB3cml0ZXI7CisKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb25mX3QgICAqY29uZjsKKworICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgICBoZWFkZXJfaW47CisKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICgqY3JlYXRlX3JlcXVlc3QpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAoKnJlaW5pdF9yZXF1ZXN0KShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgKCpwcm9jZXNzX2hlYWRlcikobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICgqc2VuZF9oZWFkZXIpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmFib3J0X3JlcXVlc3QpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmZpbmFsaXplX3JlcXVlc3QpKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2ludF90IHJjKTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgbWV0aG9kOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgIHNjaGVtYTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgdXJpOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICpsb2NhdGlvbjsKKworICAgIG5neF9odHRwX2xvZ19jdHhfdCAgICAgICAgICpsb2dfY3R4OworICAgIG5neF9sb2dfaGFuZGxlcl9wdCAgICAgICAgICBsb2dfaGFuZGxlcjsKKyAgICBuZ3hfaHR0cF9sb2dfY3R4X3QgICAgICAgICAqc2F2ZWRfY3R4OworICAgIG5neF9sb2dfaGFuZGxlcl9wdCAgICAgICAgICBzYXZlZF9oYW5kbGVyOworCisgICAgLyogdXNlZCB0byBwYXJzZSBhbiB1cHN0cmVhbSBIVFRQIGhlYWRlciAqLworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgKnN0YXR1c19zdGFydDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzX2VuZDsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgc3RhdHVzX2NvdW50OworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBwYXJzZV9zdGF0ZTsKKworICAgIG5neF9odHRwX3Vwc3RyZWFtX3N0YXRlX3QgICpzdGF0ZTsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgc3RhdGVzOyAgICAvKiBvZiBuZ3hfaHR0cF91cHN0cmVhbV9zdGF0ZV90ICovCisKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgY2FjaGFibGU6MTsKKworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3NlbnQ6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3NlbnQ6MTsKK307CisKKwordm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9pbml0KG5neF9odHRwX3JlcXVlc3RfdCAqcik7Cit1X2NoYXIgKm5neF9odHRwX3Vwc3RyZWFtX2xvZ19lcnJvcih2b2lkICpkYXRhLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKworZXh0ZXJuIGNoYXIgKm5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcl9lcnJvcnNbXTsKKworCisjZW5kaWYgLyogX05HWF9IVFRQX1VQU1RSRUFNX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF93cml0ZV9maWx0ZXIuYyBiL3NyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlci5jCmluZGV4IDUwZThiYzIuLjYzMmM2YmYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlci5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlci5jCkBAIC02OSw4ICs2OSwxOSBAQAogICAgIGZvciAoY2wgPSBjdHgtPm91dDsgY2w7IGNsID0gY2wtPm5leHQpIHsKICAgICAgICAgbGwgPSAmY2wtPm5leHQ7CiAKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzcoTkdYX0xPR19ERUJVR19FVkVOVCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgb2xkIGJ1ZiB0OiVkIGY6JWQgJXAsIHBvcyAlcCwgc2l6ZTogJXogIgorICAgICAgICAgICAgICAgICAgICAgICAiZmlsZTogJU8sIHNpemU6ICV6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2wtPmJ1Zi0+dGVtcG9yYXJ5LCBjbC0+YnVmLT5pbl9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICBjbC0+YnVmLT5zdGFydCwgY2wtPmJ1Zi0+cG9zLAorICAgICAgICAgICAgICAgICAgICAgICBjbC0+YnVmLT5sYXN0IC0gY2wtPmJ1Zi0+cG9zLAorICAgICAgICAgICAgICAgICAgICAgICBjbC0+YnVmLT5maWxlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgY2wtPmJ1Zi0+ZmlsZV9sYXN0IC0gY2wtPmJ1Zi0+ZmlsZV9wb3MpOworCiAjaWYgMQogICAgICAgICBpZiAobmd4X2J1Zl9zaXplKGNsLT5idWYpID09IDAgJiYgIW5neF9idWZfc3BlY2lhbChjbC0+YnVmKSkgeworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemVybyBzaXplIGJ1ZiBpbiB3cml0ZXIiKTsKICAgICAgICAgICAgIG5neF9kZWJ1Z19wb2ludCgpOwogICAgICAgICB9CiAjZW5kaWYKQEAgLTk3LDggKzEwOCwxOSBAQAogICAgICAgICAqbGwgPSBjbDsKICAgICAgICAgbGwgPSAmY2wtPm5leHQ7CiAKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzcoTkdYX0xPR19ERUJVR19FVkVOVCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgbmV3IGJ1ZiB0OiVkIGY6JWQgJXAsIHBvcyAlcCwgc2l6ZTogJXogIgorICAgICAgICAgICAgICAgICAgICAgICAiZmlsZTogJU8sIHNpemU6ICV6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2wtPmJ1Zi0+dGVtcG9yYXJ5LCBjbC0+YnVmLT5pbl9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICBjbC0+YnVmLT5zdGFydCwgY2wtPmJ1Zi0+cG9zLAorICAgICAgICAgICAgICAgICAgICAgICBjbC0+YnVmLT5sYXN0IC0gY2wtPmJ1Zi0+cG9zLAorICAgICAgICAgICAgICAgICAgICAgICBjbC0+YnVmLT5maWxlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgY2wtPmJ1Zi0+ZmlsZV9sYXN0IC0gY2wtPmJ1Zi0+ZmlsZV9wb3MpOworCiAjaWYgMQogICAgICAgICBpZiAobmd4X2J1Zl9zaXplKGNsLT5idWYpID09IDAgJiYgIW5neF9idWZfc3BlY2lhbChjbC0+YnVmKSkgeworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemVybyBzaXplIGJ1ZiBpbiB3cml0ZXIiKTsKICAgICAgICAgICAgIG5neF9kZWJ1Z19wb2ludCgpOwogICAgICAgICB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYyBiL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYwppbmRleCA0MTljNWExLi40ZDllOTNhIDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jCkBAIC0yOTgsOCArMjk4LDE0IEBACiAKIHZvaWQgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKQogeworICAgIG5neF9wb29sX3QgICpwb29sOworCiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19JTUFQLCBjLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImNsb3NlIGltYXAgY29ubmVjdGlvbjogJWQiLCBjLT5mZCk7CiAKKyAgICBwb29sID0gYy0+cG9vbDsKKwogICAgIG5neF9jbG9zZV9jb25uZWN0aW9uKGMpOworCisgICAgbmd4X2Rlc3Ryb3lfcG9vbChjLT5wb29sKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5LmMgYi9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eS5jCmluZGV4IGQ4NDZiMGIuLmRkZTM0OTUgMTAwNjQ0Ci0tLSBhL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5LmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHkuYwpAQCAtMjQsNiArMjQsNyBAQAogewogICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgcmM7CiAgICAgbmd4X3BlZXJzX3QgICAgICAgICAgICpwZWVyczsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgKnNpbjsKICAgICBuZ3hfaW1hcF9wcm94eV9jdHhfdCAgKnA7CiAKICAgICBpZiAoIShwID0gbmd4X3BjYWxsb2Mocy0+Y29ubmVjdGlvbi0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX3Byb3h5X2N0eF90KSkpKSB7CkBAIC00NCwyMCArNDUsMzEgQEAKICAgICBwLT51cHN0cmVhbS5sb2cgPSBzLT5jb25uZWN0aW9uLT5sb2c7CiAgICAgcC0+dXBzdHJlYW0ubG9nX2Vycm9yID0gTkdYX0VSUk9SX0VSUjsKIAotICAgIHBlZXJzLT5udW1iZXIgPSAxOwotICAgIHBlZXJzLT5tYXhfZmFpbHMgPSAxOwotI2lmIDAKLSAgICBwZWVycy0+cGVlcnNbMF0uYWRkciA9IGluZXRfYWRkcigiODEuMTkuNjkuNzAiKTsKLSAgICBwZWVycy0+cGVlcnNbMF0uYWRkcl9wb3J0X3RleHQubGVuID0gc2l6ZW9mKCI4MS4xOS42OS43MDoxMTAiKSAtIDE7Ci0gICAgcGVlcnMtPnBlZXJzWzBdLmFkZHJfcG9ydF90ZXh0LmRhdGEgPSAodV9jaGFyICopICI4MS4xOS42OS43MDoxMTAiOwotICAgIHBlZXJzLT5wZWVyc1swXS5wb3J0ID0gaHRvbnMoMTEwKTsKKyAgICBpZiAoIShzaW4gPSBuZ3hfcGNhbGxvYyhzLT5jb25uZWN0aW9uLT5wb29sLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkpKSB7CisgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24ocy0+Y29ubmVjdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwZWVycy0+cGVlclswXS5zb2NrYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luOworICAgIHBlZXJzLT5wZWVyWzBdLnNvY2tsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKworICAgIHNpbi0+c2luX3BvcnQgPSBodG9ucygxMTApOworI2lmIDEKKyAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiODEuMTkuNjQuMTAxIik7CisgICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5sZW4gPSBzaXplb2YoIjgxLjE5LjY0LjEwMToxMTAiKSAtIDE7CisgICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhID0gKHVfY2hhciAqKSAiODEuMTkuNjQuMTAxOjExMCI7CiAjZWxzZQotICAgIHBlZXJzLT5wZWVyc1swXS5hZGRyID0gaW5ldF9hZGRyKCI4MS4xOS42NC4xMDEiKTsKLSAgICBwZWVycy0+cGVlcnNbMF0uYWRkcl9wb3J0X3RleHQubGVuID0gc2l6ZW9mKCI4MS4xOS42NC4xMDE6MTEwIikgLSAxOwotICAgIHBlZXJzLT5wZWVyc1swXS5hZGRyX3BvcnRfdGV4dC5kYXRhID0gKHVfY2hhciAqKSAiODEuMTkuNjQuMTAxOjExMCI7Ci0gICAgcGVlcnMtPnBlZXJzWzBdLnBvcnQgPSBodG9ucygxMTApOworICAgIHNpbi0+c2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCI4MS4xOS42OS43MCIpOworICAgIHBlZXJzLT5wZWVyWzBdLm5hbWUubGVuID0gc2l6ZW9mKCI4MS4xOS42OS43MDoxMTAiKSAtIDE7CisgICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhID0gKHVfY2hhciAqKSAiODEuMTkuNjkuNzA6MTEwIjsKICNlbmRpZgogCisgICAgcGVlcnMtPm51bWJlciA9IDE7CisKKyAgICBwZWVycy0+cGVlclswXS5tYXhfZmFpbHMgPSAxOworICAgIHBlZXJzLT5wZWVyWzBdLmZhaWxfdGltZW91dCA9IDYwOworICAgIHBlZXJzLT5wZWVyWzBdLndlaWdodCA9IDE7CisKICAgICByYyA9IG5neF9ldmVudF9jb25uZWN0X3BlZXIoJnAtPnVwc3RyZWFtKTsKIAogICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9mcmVlYnNkX2NvbmZpZy5oIGIvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfY29uZmlnLmgKaW5kZXggMzViZjFmNS4uYTYxZWVlZCAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfY29uZmlnLmgKKysrIGIvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfY29uZmlnLmgKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPiAgICAgICAgLyogVENQX05PREVMQVksIFRDUF9OT1BVU0ggKi8KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgogCiAjaW5jbHVkZSA8bGlidXRpbC5oPiAgICAgICAgICAgIC8qIHNldHByb2N0aXRsZSgpIGJlZm9yZSA0LjEgKi8KICNpbmNsdWRlIDxvc3JlbGRhdGUuaD4KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9mcmVlYnNkX3NlbmRmaWxlX2NoYWluLmMgYi9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9zZW5kZmlsZV9jaGFpbi5jCmluZGV4IDUyMWQwNTAuLjBiNGRmYzAgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9mcmVlYnNkX3NlbmRmaWxlX2NoYWluLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2Rfc2VuZGZpbGVfY2hhaW4uYwpAQCAtMTAsMTYgKzEwLDE2IEBACiAKIAogLyoKLSAqIEFsdGhvdWdoIEZyZWVCU0Qgc2VuZGZpbGUoKSBhbGxvd3MgdG8gcGFzcyBhIGhlYWRlciBhbmQgYSB0cmFpbGVyCisgKiBBbHRob3VnaCBGcmVlQlNEIHNlbmRmaWxlKCkgYWxsb3dzIHRvIHBhc3MgYSBoZWFkZXIgYW5kIGEgdHJhaWxlciwKICAqIGl0IGNhbiBub3Qgc2VuZCBhIGhlYWRlciB3aXRoIGEgcGFydCBvZiB0aGUgZmlsZSBpbiBvbmUgcGFja2V0IHVudGlsCi0gKiBGcmVlQlNEIDUuMy4gIEJlc2lkZXMgb3ZlciB0aGUgZmFzdCBldGhlcm5ldCBjb25uZWN0aW9uIHNlbmRmaWxlKCkKKyAqIEZyZWVCU0QgNS4zLiAgQmVzaWRlcywgb3ZlciB0aGUgZmFzdCBldGhlcm5ldCBjb25uZWN0aW9uIHNlbmRmaWxlKCkKICAqIG1heSBzZW5kIHRoZSBwYXJ0aWFsbHkgZmlsbGVkIHBhY2tldHMsIGkuZS4gdGhlIDggZmlsZSBwYWdlcyBtYXkgYmUgc2VudAogICogYXMgdGhlIDExIGZ1bGwgMTQ2MC1ieXRlcyBwYWNrZXRzLCB0aGVuIG9uZSBpbmNvbXBsZXRlIDMyNC1ieXRlcyBwYWNrZXQsCiAgKiBhbmQgdGhlbiBhZ2FpbiB0aGUgMTEgZnVsbCAxNDYwLWJ5dGVzIHBhY2tldHMuCiAgKgotICogU28gd2UgdXNlIHRoZSBUQ1BfTk9QVVNIIG9wdGlvbiAoc2ltaWxhciB0byBMaW51eCdzIFRDUF9DT1JLKQotICogdG8gcG9zdHBvbmUgdGhlIHNlbmRpbmcgLSBpdCBub3Qgb25seSBzZW5kcyBhIGhlYWRlciBhbmQgdGhlIGZpcnN0IHBhcnQKLSAqIG9mIHRoZSBmaWxlIGluIG9uZSBwYWNrZXQgYnV0IGFsc28gc2VuZHMgdGhlIGZpbGUgcGFnZXMgaW4gdGhlIGZ1bGwgcGFja2V0cy4KKyAqIFRocmVmb3JlIHdlIHVzZSB0aGUgVENQX05PUFVTSCBvcHRpb24gKHNpbWlsYXIgdG8gTGludXgncyBUQ1BfQ09SSykKKyAqIHRvIHBvc3Rwb25lIHRoZSBzZW5kaW5nIC0gaXQgbm90IG9ubHkgc2VuZHMgYSBoZWFkZXIgYW5kIHRoZSBmaXJzdCBwYXJ0IG9mCisgKiB0aGUgZmlsZSBpbiBvbmUgcGFja2V0LCBidXQgYWxzbyBzZW5kcyB0aGUgZmlsZSBwYWdlcyBpbiB0aGUgZnVsbCBwYWNrZXRzLgogICoKICAqIEJ1dCB1bnRpbCBGcmVlQlNEIDQuNSB0aGUgdHVybmluZyBUQ1BfTk9QVVNIIG9mZiBkb2VzIG5vdCBmbHVzaCBhIHBlbmRpbmcKICAqIGRhdGEgdGhhdCBsZXNzIHRoYW4gTVNTIHNvIHRoYXQgZGF0YSBtYXkgYmUgc2VudCB3aXRoIDUgc2Vjb25kIGRlbGF5LgpAQCAtMjIwLDcgKzIyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVyciA9IG5neF9lcnJubzsKIAogICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiB0aGVyZSBpcyBhIHRpbnkgY2hhbmNlIHRvIGJlIGludGVycnVwdGVkLCBob3dldmVyCisgICAgICAgICAgICAgICAgICAgICAqIHRoZXJlIGlzIGEgdGlueSBjaGFuY2UgdG8gYmUgaW50ZXJydXB0ZWQsIGhvd2V2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAqIHdlIGNvbnRpbnVlIGEgcHJvY2Vzc2luZyB3aXRob3V0IHRoZSBUQ1BfTk9QVVNICiAgICAgICAgICAgICAgICAgICAgICAqLwogCkBAIC0yNDksNyArMjQ5LDcgQEAKICAgICAgICAgICAgICAqIGh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL3F1ZXJ5LXByLmNnaT9wcj0zMzc3MQogICAgICAgICAgICAgICovCiAKLSAgICAgICAgICAgIGlmIChuZ3hfZnJlZWJzZF9zZW5kZmlsZV9uYnl0ZXNfYnVnID09IDApIHsKKyAgICAgICAgICAgIGlmICghbmd4X2ZyZWVic2Rfc2VuZGZpbGVfbmJ5dGVzX2J1ZykgewogICAgICAgICAgICAgICAgIGhlYWRlcl9zaXplID0gMDsKICAgICAgICAgICAgIH0KIApAQCAtMjgyLDcgKzI4Miw3IEBACiAgICAgICAgICAgICBpZiAocmMgPT0gMCAmJiBzZW50ID09IDApIHsKIAogICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogcmMgYW5kIHNlbnQgYXJlIGVxdWFscyB0byB6ZXJvIHdoZW4gc29tZW9uZSBoYXMgdHJ1bmNhdGVkCisgICAgICAgICAgICAgICAgICogcmMgYW5kIHNlbnQgZXF1YWwgdG8gemVybyB3aGVuIHNvbWVvbmUgaGFzIHRydW5jYXRlZAogICAgICAgICAgICAgICAgICAqIHRoZSBmaWxlLCBzbyB0aGUgb2Zmc2V0IGJlY2FtZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZQogICAgICAgICAgICAgICAgICAqLwogCkBAIC0zNzAsOCArMzcwLDggQEAKICAgICAgICAgaWYgKGVhZ2FpbikgewogCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICogc2VuZGZpbGUoKSBjYW4gcmV0dXJuIEVBR0FJTiBldmVuIGlmIGl0IGhhcyBzZW50Ci0gICAgICAgICAgICAgKiBhIHdob2xlIGZpbGUgcGFydCBidXQgdGhlIHN1Y2Nlc3NpdmUgc2VuZGZpbGUoKSBjYWxsIHdvdWxkCisgICAgICAgICAgICAgKiBzZW5kZmlsZSgpIG1heSByZXR1cm4gRUFHQUlOLCBldmVuIGlmIGl0IGhhcyBzZW50IGEgd2hvbGUgZmlsZQorICAgICAgICAgICAgICogcGFydCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHN1Y2Nlc3NpdmUgc2VuZGZpbGUoKSBjYWxsIHdvdWxkCiAgICAgICAgICAgICAgKiByZXR1cm4gRUFHQUlOIHJpZ2h0IGF3YXkgYW5kIHdvdWxkIG5vdCBzZW5kIGFueXRoaW5nLgogICAgICAgICAgICAgICogV2UgdXNlIGl0IGFzIGEgaGludC4KICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2xpbnV4X2NvbmZpZy5oIGIvc3JjL29zL3VuaXgvbmd4X2xpbnV4X2NvbmZpZy5oCmluZGV4IGJiMDhmNDEuLjM1ZTNiOGIgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9saW51eF9jb25maWcuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfbGludXhfY29uZmlnLmgKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPiAgICAgICAgLyogVENQX05PREVMQVksIFRDUF9DT1JLICovCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KIAogI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgICAgICAgICAvKiB0enNldCgpICovCiAjaW5jbHVkZSA8bWFsbG9jLmg+ICAgICAgICAgICAgIC8qIG1lbWFsaWduKCkgKi8KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9saW51eF9zZW5kZmlsZV9jaGFpbi5jIGIvc3JjL29zL3VuaXgvbmd4X2xpbnV4X3NlbmRmaWxlX2NoYWluLmMKaW5kZXggOTk1OTllMi4uNTliYzU5YyAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2xpbnV4X3NlbmRmaWxlX2NoYWluLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2xpbnV4X3NlbmRmaWxlX2NoYWluLmMKQEAgLTExLDkgKzExLDEwIEBACiAKIC8qCiAgKiBPbiBMaW51eCB1cCB0byAyLjQuMjEgc2VuZGZpbGUoKSAoc3lzY2FsbCAjMTg3KSB3b3JrcyB3aXRoIDMyLWJpdAotICogb2Zmc2V0cyBvbmx5IGFuZCB0aGUgaW5jbHVkaW5nIDxzeXMvc2VuZGZpbGUuaD4gYnJlYWtzIHRoZSBjb21waWxpbmcKLSAqIGlmIG9mZl90IGlzIDY0IGJpdCB3aWRlLiAgU28gd2UgdXNlIG93biBzZW5kZmlsZSgpIGRlZmluaXRpb24gd2hlcmUgb2Zmc2V0Ci0gKiBwYXJhbWV0ZXIgaXMgaW50MzJfdCBhbmQgdXNlIHNlbmRmaWxlKCkgZm9yIHRoZSBmaWxlIHBhcnRzIGJlbG93IDJHIG9ubHkuCisgKiBvZmZzZXRzIG9ubHksIGFuZCB0aGUgaW5jbHVkaW5nIDxzeXMvc2VuZGZpbGUuaD4gYnJlYWtzIHRoZSBjb21waWxpbmcsCisgKiBpZiBvZmZfdCBpcyA2NCBiaXQgd2lkZS4gIFNvIHdlIHVzZSBvd24gc2VuZGZpbGUoKSBkZWZpbml0aW9uLCB3aGVyZSBvZmZzZXQKKyAqIHBhcmFtZXRlciBpcyBpbnQzMl90LCBhbmQgdXNlIHNlbmRmaWxlKCkgZm9yIHRoZSBmaWxlIHBhcnRzIGJlbG93IDJHIG9ubHksCisgKiBzZWUgc3JjL29zL3VuaXgvbmd4X2xpbnV4X2NvbmZpZy5oCiAgKgogICogTGludXggMi40LjIxIGhhcyBhIG5ldyBzZW5kZmlsZTY0KCkgc3lzY2FsbCAjMjM5LgogICovCkBAIC04NSw2ICs4NiwxNCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisjaWYgMQorICAgICAgICAgICAgaWYgKCFuZ3hfYnVmX2luX21lbW9yeShjbC0+YnVmKSAmJiAhY2wtPmJ1Zi0+aW5fZmlsZSkgeworICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgYy0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInplcm8gc2l6ZSBidWYgaW4gc2VuZGZpbGUiKTsKKyAgICAgICAgICAgICAgICBuZ3hfZGVidWdfcG9pbnQoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCiAgICAgICAgICAgICBpZiAoIW5neF9idWZfaW5fbWVtb3J5X29ubHkoY2wtPmJ1ZikpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTExOCw3ICsxMjcsNiBAQAogICAgICAgICAgICAgJiYgY2wKICAgICAgICAgICAgICYmIGNsLT5idWYtPmluX2ZpbGUpCiAgICAgICAgIHsKLQogICAgICAgICAgICAgLyogdGhlIFRDUF9DT1JLIGFuZCBUQ1BfTk9ERUxBWSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCiAKICAgICAgICAgICAgIGlmIChjLT50Y3Bfbm9kZWxheSkgewpAQCAtMTMxLDcgKzEzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVyciA9IG5neF9lcnJubzsKIAogICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiB0aGVyZSBpcyBhIHRpbnkgY2hhbmNlIHRvIGJlIGludGVycnVwdGVkLCBob3dldmVyCisgICAgICAgICAgICAgICAgICAgICAqIHRoZXJlIGlzIGEgdGlueSBjaGFuY2UgdG8gYmUgaW50ZXJydXB0ZWQsIGhvd2V2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAqIHdlIGNvbnRpbnVlIGEgcHJvY2Vzc2luZyB3aXRoIHRoZSBUQ1BfTk9ERUxBWQogICAgICAgICAgICAgICAgICAgICAgKiBhbmQgd2l0aG91dCB0aGUgVENQX0NPUksKICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNTcsNyArMTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gbmd4X2Vycm5vOwogCiAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZXJlIGlzIGEgdGlueSBjaGFuY2UgdG8gYmUgaW50ZXJydXB0ZWQsIGhvd2V2ZXIKKyAgICAgICAgICAgICAgICAgICAgICogdGhlcmUgaXMgYSB0aW55IGNoYW5jZSB0byBiZSBpbnRlcnJ1cHRlZCwgaG93ZXZlciwKICAgICAgICAgICAgICAgICAgICAgICogd2UgY29udGludWUgYSBwcm9jZXNzaW5nIHdpdGhvdXQgdGhlIFRDUF9DT1JLCiAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfcG9zaXhfY29uZmlnLmggYi9zcmMvb3MvdW5peC9uZ3hfcG9zaXhfY29uZmlnLmgKaW5kZXggZjljOTFhNC4uOTA0MDYwZSAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X3Bvc2l4X2NvbmZpZy5oCisrKyBiL3NyYy9vcy91bml4L25neF9wb3NpeF9jb25maWcuaApAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+ICAgICAgICAvKiBUQ1BfTk9ERUxBWSAqLwogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CiAKICNpZiAoTkdYX0hBVkVfTElNSVRTX0gpCiAjaW5jbHVkZSA8bGltaXRzLmg+ICAgICAgICAgICAgIC8qIElPVl9NQVggKi8KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMgYi9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jCmluZGV4IGQxYmU2ZjQuLmE0ODg4MDkgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3NfY3ljbGUuYwpAQCAtMTExMyw3ICsxMTEzLDcgQEAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN5Y2xlLT5wYXRoZXMubmVsdHM7IGkrKykgewogICAgICAgICAgICAgY3R4LnBhdGggPSBwYXRoW2ldOwogICAgICAgICAgICAgY3R4LmxvZyA9IGN5Y2xlLT5sb2c7Ci0gICAgICAgICAgICBjdHguaGFuZGxlciA9IHBhdGhbaV0tPmdjX2hhbmRsZXI7CisgICAgICAgICAgICBjdHguaGFuZGxlciA9IHBhdGhbaV0tPmNsZWFuZXI7CiAKICAgICAgICAgICAgIG5neF9jb2xsZWN0X2dhcmJhZ2UoJmN0eCwgJnBhdGhbaV0tPm5hbWUsIDApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfc29sYXJpc19jb25maWcuaCBiL3NyYy9vcy91bml4L25neF9zb2xhcmlzX2NvbmZpZy5oCmluZGV4IGUzODcwMDYuLmQ2MjllMDQgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9zb2xhcmlzX2NvbmZpZy5oCisrKyBiL3NyYy9vcy91bml4L25neF9zb2xhcmlzX2NvbmZpZy5oCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4gICAgICAgIC8qIFRDUF9OT0RFTEFZICovCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KIAogI2luY2x1ZGUgPHN5cy9zeXN0ZW1pbmZvLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+ICAgICAgICAgICAgIC8qIElPVl9NQVggKi8KZGlmZiAtLWdpdCBhL3NyYy9vcy93aW4zMi9uZ3hfd2luMzJfY29uZmlnLmggYi9zcmMvb3Mvd2luMzIvbmd4X3dpbjMyX2NvbmZpZy5oCmluZGV4IDRkMGEyMjEuLjdjM2JjZDUgMTAwNjQ0Ci0tLSBhL3NyYy9vcy93aW4zMi9uZ3hfd2luMzJfY29uZmlnLmgKKysrIGIvc3JjL29zL3dpbjMyL25neF93aW4zMl9jb25maWcuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAjZGVmaW5lIE5HWF9TSUdfQVRPTUlDX1RfU0laRSAgIDQKIAogI2RlZmluZSBOR1hfSEFWRV9MSVRUTEVfRU5ESUFOICAxCisjZGVmaW5lIE5HWF9IQVZFX05PTkFMSUdORUQgICAgIDEKIAogI2RlZmluZSBOR1hfVEhSRUFEUyAgICAgICAxCiAK