ZGlmZiAtLWdpdCBhL2F1dG8vbW9kdWxlcyBiL2F1dG8vbW9kdWxlcwppbmRleCBlZjNhMzVkLi41NmRhZDU2IDEwMDY0NAotLS0gYS9hdXRvL21vZHVsZXMKKysrIGIvYXV0by9tb2R1bGVzCkBAIC03OCw2ICs3OCw3IEBACiAjICAgICBuZ3hfaHR0cF9wb3N0cG9uZV9maWx0ZXIKICMgICAgIG5neF9odHRwX2NoYXJzZXRfZmlsdGVyCiAjICAgICBuZ3hfaHR0cF9zc2lfZmlsdGVyCisjICAgICAgICAgbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyCiAjICAgICAgICAgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcgogIyAgICAgICAgIG5neF9odHRwX2hlYWRlcnNfZmlsdGVyCiAjICAgICBuZ3hfaHR0cF9jb3B5X2ZpbHRlcgpAQCAtMTE0LDYgKzExNSwxMSBAQAogICAgIEhUVFBfU1JDUz0iJEhUVFBfU1JDUyAkSFRUUF9TU0lfU1JDUyIKIGZpCiAKK2lmIFsgJEhUVFBfQURESVRJT04gPSBZRVMgXTsgdGhlbgorICAgIEhUVFBfRklMVEVSX01PRFVMRVM9IiRIVFRQX0ZJTFRFUl9NT0RVTEVTICRIVFRQX0FERElUSU9OX0ZJTFRFUl9NT0RVTEUiCisgICAgSFRUUF9TUkNTPSIkSFRUUF9TUkNTICRIVFRQX0FERElUSU9OX1NSQ1MiCitmaQorCiBpZiBbICRIVFRQX1VTRVJJRCA9IFlFUyBdOyB0aGVuCiAgICAgSFRUUF9GSUxURVJfTU9EVUxFUz0iJEhUVFBfRklMVEVSX01PRFVMRVMgJEhUVFBfVVNFUklEX0ZJTFRFUl9NT0RVTEUiCiAgICAgSFRUUF9TUkNTPSIkSFRUUF9TUkNTICRIVFRQX1VTRVJJRF9TUkNTIgpkaWZmIC0tZ2l0IGEvYXV0by9vcHRpb25zIGIvYXV0by9vcHRpb25zCmluZGV4IDRmZjExMDAuLmY4MGI1ZmMgMTAwNjQ0Ci0tLSBhL2F1dG8vb3B0aW9ucworKysgYi9hdXRvL29wdGlvbnMKQEAgLTUyLDYgKzUyLDcgQEAKIEhUVFBfU1NJPVlFUwogSFRUUF9QT1NUUE9ORT1OTwogSFRUUF9SRUFMSVA9Tk8KK0hUVFBfQURESVRJT049Tk8KIEhUVFBfQUNDRVNTPVlFUwogSFRUUF9BVVRIX0JBU0lDPVlFUwogSFRUUF9VU0VSSUQ9WUVTCkBAIC0xMzksNiArMTQwLDcgQEAKIAogICAgICAgICAtLXdpdGgtaHR0cF9zc2xfbW9kdWxlKSAgICAgICAgICBIVFRQX1NTTD1ZRVMgICAgICAgICAgICAgICA7OwogICAgICAgICAtLXdpdGgtaHR0cF9yZWFsaXBfbW9kdWxlKSAgICAgICBIVFRQX1JFQUxJUD1ZRVMgICAgICAgICAgICA7OworICAgICAgICAtLXdpdGgtaHR0cF9hZGRpdGlvbl9tb2R1bGUpICAgICBIVFRQX0FERElUSU9OPVlFUyAgICAgICAgICA7OwogICAgICAgICAtLXdpdGhvdXQtaHR0cF9jaGFyc2V0X21vZHVsZSkgICBIVFRQX0NIQVJTRVQ9Tk8gICAgICAgICAgICA7OwogICAgICAgICAtLXdpdGhvdXQtaHR0cF9nemlwX21vZHVsZSkgICAgICBIVFRQX0daSVA9Tk8gICAgICAgICAgICAgICA7OwogICAgICAgICAtLXdpdGhvdXQtaHR0cF9zc2lfbW9kdWxlKSAgICAgICBIVFRQX1NTST1OTyAgICAgICAgICAgICAgICA7OwpkaWZmIC0tZ2l0IGEvYXV0by9vcy9saW51eCBiL2F1dG8vb3MvbGludXgKaW5kZXggYTdhOGQ3MS4uNDEzNjQ4NiAxMDA2NDQKLS0tIGEvYXV0by9vcy9saW51eAorKysgYi9hdXRvL29zL2xpbnV4CkBAIC01OSw3ICs1OSw3IEBACiAKICMgc2VuZGZpbGUoKQogCi1DQ19BVVhfRkxBR1M9Ii1EX0dOVV9TT1VSQ0UiCitDQ19BVVhfRkxBR1M9IiRDQ19BVVhfRkxBR1MgLURfR05VX1NPVVJDRSIKIG5neF9mZWF0dXJlPSJzZW5kZmlsZSgpIgogbmd4X2ZlYXR1cmVfbmFtZT0iTkdYX0hBVkVfU0VOREZJTEUiCiBuZ3hfZmVhdHVyZV9ydW49eWVzCkBAIC03OSw3ICs3OSw3IEBACiAKICMgc2VuZGZpbGU2NCgpCiAKLUNDX0FVWF9GTEFHUz0iLURfR05VX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IgorQ0NfQVVYX0ZMQUdTPSIkQ0NfQVVYX0ZMQUdTIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiCiBuZ3hfZmVhdHVyZT0ic2VuZGZpbGU2NCgpIgogbmd4X2ZlYXR1cmVfbmFtZT0iTkdYX0hBVkVfU0VOREZJTEU2NCIKIG5neF9mZWF0dXJlX3J1bj15ZXMKZGlmZiAtLWdpdCBhL2F1dG8vc291cmNlcyBiL2F1dG8vc291cmNlcwppbmRleCAyMDg2NmY2Li40NzMxZjQ4IDEwMDY0NAotLS0gYS9hdXRvL3NvdXJjZXMKKysrIGIvYXV0by9zb3VyY2VzCkBAIC0zMTksNiArMzE5LDEwIEBACiBIVFRQX1JFQUxJUF9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmVhbGlwX21vZHVsZS5jCiAKIAorSFRUUF9BRERJVElPTl9GSUxURVJfTU9EVUxFPW5neF9odHRwX2FkZGl0aW9uX2ZpbHRlcl9tb2R1bGUKK0hUVFBfQURESVRJT05fU1JDUz1zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FkZGl0aW9uX2ZpbHRlcl9tb2R1bGUuYworCisKIEhUVFBfQUNDRVNTX01PRFVMRT1uZ3hfaHR0cF9hY2Nlc3NfbW9kdWxlCiBIVFRQX0FDQ0VTU19TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX21vZHVsZS5jCiAKZGlmZiAtLWdpdCBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKaW5kZXggYTExMGIzNy4uZjRjODVlNCAxMDA2NDQKLS0tIGEvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKKysrIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKQEAgLTksNiArOSwxMDIgQEAKIDx0aXRsZSBsYW5nPSJlbiI+bmdpbnggY2hhbmdlbG9nPC90aXRsZT4KIAogCis8Y2hhbmdlcyB2ZXI9IjAuMy4zNiIgZGF0ZT0iMDUuMDQuMjAwNiI+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivNz8TVzNggbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX21vZHVsZS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBuZ3hfaHR0cF9hZGRpdGlvbl9maWx0ZXJfbW9kdWxlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ19kgcHJveHlfcGFzcyDJIGZhc3RjZ2lfcGFzcyDNz9bOzyDJ09DPzNjaz9fB1Ngg187V1NLJIMLMz8vBIGlmLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJwcm94eV9wYXNzIiBhbmQgImZhc3RjZ2lfcGFzcyIgZGlyZWN0aXZlcyBtYXkgYmUgdXNlZCBpbnNpZGUKK3RoZSAiaWYiIGJsb2NrLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ19kgcHJveHlfaWdub3JlX2NsaWVudF9hYm9ydCDJIGZhc3RjZ2lfaWdub3JlX2NsaWVudF9hYm9ydC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAicHJveHlfaWdub3JlX2NsaWVudF9hYm9ydCIgYW5kICJmYXN0Y2dpX2lnbm9yZV9jbGllbnRfYWJvcnQiIGRpcmVjdGl2ZXMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK9DF0sXNxc7OwdEgJHJlcXVlc3RfY29tcGxldGlvbi4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAiJHJlcXVlc3RfY29tcGxldGlvbiIgdmFyaWFibGUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK83PxNXM2CBuZ3hfaHR0cF9wZXJsX21vZHVsZSDQz8TExdLWydfBxdQgzcXUz8TZICRyLT5yZXF1ZXN0X21ldGhvZCDJCiskci0+cmVtb3RlX2FkZHIuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgbmd4X2h0dHBfcGVybF9tb2R1bGUgc3VwcG9ydHMgdGhlICRyLT5yZXF1ZXN0X21ldGhvZCBhbmQgJHItPnJlbW90ZV9hZGRyLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivNz8TVzNggbmd4X2h0dHBfc3NpX21vZHVsZSDQz8TExdLWydfBxdQgy8/Nwc7E1SBlbGlmLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX3NzaV9tb2R1bGUgc3VwcG9ydHMgdGhlICJlbGlmIiBjb21tYW5kLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK9PU0s/LwSAiXC8iINcgzsHewczFINfZ0sHWxc7J0SDLz83BzsTZIGlmIM3PxNXM0SBuZ3hfaHR0cF9zc2lfbW9kdWxlCivXz9PQ0snOyc3BzMHT2CDOxdfF0s7PLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJcLyIgc3RyaW5nIGluIHRoZSBleHByZXNzaW9uIG9mIHRoZSAiaWYiIGNvbW1hbmQgb2YgdGhlCituZ3hfaHR0cF9zc2lfbW9kdWxlIHdhcyB0cmVhdGVkIGluY29ycmVjdGx5LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK9cgydPQz8zY2s/Xwc7JySDSxcfVzNHSztnIINfZ0sHWxc7J0cgg1yDLz83BzsTFIGlmIM3PxNXM0SBuZ3hfaHR0cF9zc2lfbW9kdWxlLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgoraW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gdGhlICJpZiIgY29tbWFuZCBvZiB0aGUgbmd4X2h0dHBfc3NpX21vZHVsZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivQ0skg2sHEwc7JySDP1M7P08nUxczYzs/HzyDQ1dTJINcgxMnSxcvUydfByAorY2xpZW50X2JvZHlfdGVtcF9wYXRoLCBwcm94eV90ZW1wX3BhdGgsIGZhc3RjZ2lfdGVtcF9wYXRoIMkgcGVybF9tb2R1bGVzCivJ09DPzNjaz9fBzNPRIMvB1MHMz8cgz9TOz9PJ1MXM2M7PINTFy9XdxcfPIMvB1MHMz8fBLCDBIM7FIM/Uzs/TydTFzNjOzwor0NLFxsnL08Eg08XS18XSwS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK2lmIHRoZSByZWxhdGl2ZSBwYXRoIHdhcyBzcGVjaWZpZWQgaW4gdGhlICJjbGllbnRfYm9keV90ZW1wX3BhdGgiLAorInByb3h5X3RlbXBfcGF0aCIsICJmYXN0Y2dpX3RlbXBfcGF0aCIsIGFuZCAicGVybF9tb2R1bGVzIiBkaXJlY3RpdmVzLAordGhlbiB0aGUgZGlyZWN0b3J5IHdhcyB1c2VkIHJlbGF0aXZlbHkgdG8gYSBjdXJyZW50IHBhdGggYnV0IG5vdAordG8gYSBzZXJ2ZXIgcHJlZml4LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzwvY2hhbmdlcz4KKworCiA8Y2hhbmdlcyB2ZXI9IjAuMy4zNSIgZGF0ZT0iMjIuMDMuMjAwNiI+CiAKIDxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KQEAgLTY0LDcgKzE2MCw3IEBACiAKIDxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KIDxwYXJhIGxhbmc9InJ1Ij4KLW5neF9odHRwX3BlcmxfbW9kdWxlIM7FINLBws/Uwcwg088g19PU0s/Fzs7ZzSDXIMvPzsbJx9XSwcPJzs7ZyiDGwcrMIMvPxM/NLAorbmd4X2h0dHBfcGVybF9tb2R1bGUgzsUg0sHCz9TBzCDTzyDX09TSz8XOztnNINcgy8/OxsnH1dLBw8nPzs7ZyiDGwcrMIMvPxM/NLAogxdPMySDPziDOxSDOwd7JzsHM09Eg09LB2tUg1sUg0yAic3ViIi4KIDwvcGFyYT4KIDxwYXJhIGxhbmc9ImVuIj4KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25naW54LmggYi9zcmMvY29yZS9uZ2lueC5oCmluZGV4IDQ2ZDBhM2QuLjNmOTEwY2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25naW54LmgKKysrIGIvc3JjL2NvcmUvbmdpbnguaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgX05HSU5YX0hfSU5DTFVERURfCiAKIAotI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMy4zNSIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuMzYiCiAKICNkZWZpbmUgTkdJTlhfVkFSICAgICAgICAgICJOR0lOWCIKICNkZWZpbmUgTkdYX09MRFBJRF9FWFQgICAgICIub2xkYmluIgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jCmluZGV4IGFiMDk3YzAuLjdjMjI5NDggMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYworKysgYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmMKQEAgLTYzLDYgKzYzLDcgQEAKICAgICBjaGFyICAgICAgICAgICAgICpydjsKICAgICBuZ3hfZmRfdCAgICAgICAgICBmZDsKICAgICBuZ3hfaW50X3QgICAgICAgICByYzsKKyAgICBuZ3hfYnVmX3QgICAgICAgICpiOwogICAgIG5neF91aW50X3QgICAgICAgIGJsb2NrOwogICAgIG5neF9jb25mX2ZpbGVfdCAgKnByZXY7CiAKQEAgLTk1LDExICs5NiwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZmRfaW5mb19uICIgXCIlc1wiIGZhaWxlZCIsIGZpbGVuYW1lLT5kYXRhKTsKICAgICAgICAgfQogCi0gICAgICAgIGNmLT5jb25mX2ZpbGUtPmJ1ZmZlciA9IG5neF9jcmVhdGVfdGVtcF9idWYoY2YtPnBvb2wsIG5neF9wYWdlc2l6ZSk7Ci0gICAgICAgIGlmIChjZi0+Y29uZl9maWxlLT5idWZmZXIgPT0gTlVMTCkgeworICAgICAgICBiID0gbmd4X2NhbGxvY19idWYoY2YtPnBvb2wpOworICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjZi0+Y29uZl9maWxlLT5idWZmZXIgPSBiOworCisgICAgICAgIGItPnN0YXJ0ID0gbmd4X2FsbG9jKG5neF9wYWdlc2l6ZSwgY2YtPmxvZyk7CisgICAgICAgIGlmIChiLT5zdGFydCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBiLT5wb3MgPSBiLT5zdGFydDsKKyAgICAgICAgYi0+bGFzdCA9IGItPnN0YXJ0OworICAgICAgICBiLT5lbmQgPSBiLT5sYXN0ICsgbmd4X3BhZ2VzaXplOworICAgICAgICBiLT50ZW1wb3JhcnkgPSAxOworCiAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmZpbGUuZmQgPSBmZDsKICAgICAgICAgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmxlbiA9IGZpbGVuYW1lLT5sZW47CiAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhID0gZmlsZW5hbWUtPmRhdGE7CkBAIC0xODMsNyArMTk2LDcgQEAKIAogCiAgICAgaWYgKGZpbGVuYW1lKSB7Ci0gICAgICAgIG5neF9wZnJlZShjZi0+cG9vbCwgY2YtPmNvbmZfZmlsZS0+YnVmZmVyLT5zdGFydCk7CisgICAgICAgIG5neF9mcmVlKGNmLT5jb25mX2ZpbGUtPmJ1ZmZlci0+c3RhcnQpOwogCiAgICAgICAgIGNmLT5jb25mX2ZpbGUgPSBwcmV2OwogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfZmlsZS5jIGIvc3JjL2NvcmUvbmd4X2ZpbGUuYwppbmRleCAwYzY1NzYwLi5lM2U3MTkwIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfZmlsZS5jCisrKyBiL3NyYy9jb3JlL25neF9maWxlLmMKQEAgLTIxMSw4ICsyMTEsOCBAQAogICAgIGNoYXIgICpwID0gY29uZjsKIAogICAgIHNzaXplX3QgICAgICBsZXZlbDsKLSAgICBuZ3hfdWludF90ICAgaSwgbjsKICAgICBuZ3hfc3RyX3QgICAqdmFsdWU7CisgICAgbmd4X3VpbnRfdCAgIGksIG47CiAgICAgbmd4X3BhdGhfdCAgKnBhdGgsICoqc2xvdDsKIAogICAgIHNsb3QgPSAobmd4X3BhdGhfdCAqKikgKHAgKyBjbWQtPm9mZnNldCk7CkBAIC0yMjksNiArMjI5LDExIEBACiAgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKIAogICAgIHBhdGgtPm5hbWUgPSB2YWx1ZVsxXTsKKworICAgIGlmIChuZ3hfY29uZl9mdWxsX25hbWUoY2YtPmN5Y2xlLCAmcGF0aC0+bmFtZSkgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIHBhdGgtPmxlbiA9IDA7CiAgICAgcGF0aC0+Y2xlYW5lciA9IChuZ3hfZ2NfaGFuZGxlcl9wdCkgY21kLT5wb3N0OwogICAgIHBhdGgtPmNvbmZfZmlsZSA9IGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhOwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3BhbGxvYy5jIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5jCmluZGV4IGViMGU4NmQuLjE3OTdlOTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9wYWxsb2MuYworKysgYi9zcmMvY29yZS9uZ3hfcGFsbG9jLmMKQEAgLTg2LDcgKzg2LDcgQEAKIHsKICAgICB1X2NoYXIgICAgICAgICAgICAqbTsKICAgICBuZ3hfcG9vbF90ICAgICAgICAqcCwgKm47Ci0gICAgbmd4X3Bvb2xfbGFyZ2VfdCAgKmxhcmdlLCAqbGFzdDsKKyAgICBuZ3hfcG9vbF9sYXJnZV90ICAqbGFyZ2U7CiAKICAgICBpZiAoc2l6ZSA8PSAoc2l6ZV90KSBOR1hfTUFYX0FMTE9DX0ZST01fUE9PTAogICAgICAgICAmJiBzaXplIDw9IChzaXplX3QpIChwb29sLT5lbmQgLSAodV9jaGFyICopIHBvb2wpCkBAIC0xMzQsMzQgKzEzNCw2IEBACiAgICAgICAgIHJldHVybiBtOwogICAgIH0KIAotICAgIC8qIGFsbG9jYXRlIGEgbGFyZ2UgYmxvY2sgKi8KLQotICAgIGxhcmdlID0gTlVMTDsKLSAgICBsYXN0ID0gTlVMTDsKLQotICAgIGlmIChwb29sLT5sYXJnZSkgewotICAgICAgICBmb3IgKGxhc3QgPSBwb29sLT5sYXJnZTsgLyogdm9pZCAqLyA7IGxhc3QgPSBsYXN0LT5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAobGFzdC0+YWxsb2MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxhcmdlID0gbGFzdDsKLSAgICAgICAgICAgICAgICBsYXN0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxhc3QtPm5leHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGxhcmdlID09IE5VTEwpIHsKLSAgICAgICAgbGFyZ2UgPSBuZ3hfcGFsbG9jKHBvb2wsIHNpemVvZihuZ3hfcG9vbF9sYXJnZV90KSk7Ci0gICAgICAgIGlmIChsYXJnZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGxhcmdlLT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KICNpZiAwCiAgICAgcCA9IG5neF9tZW1hbGlnbihuZ3hfcGFnZXNpemUsIHNpemUsIHBvb2wtPmxvZyk7CiAgICAgaWYgKHAgPT0gTlVMTCkgewpAQCAtMTc0LDE0ICsxNDYsMTQgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIGlmIChwb29sLT5sYXJnZSA9PSBOVUxMKSB7Ci0gICAgICAgIHBvb2wtPmxhcmdlID0gbGFyZ2U7Ci0KLSAgICB9IGVsc2UgaWYgKGxhc3QpIHsKLSAgICAgICAgbGFzdC0+bmV4dCA9IGxhcmdlOworICAgIGxhcmdlID0gbmd4X3BhbGxvYyhwb29sLCBzaXplb2Yobmd4X3Bvb2xfbGFyZ2VfdCkpOworICAgIGlmIChsYXJnZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGxhcmdlLT5hbGxvYyA9IHA7CisgICAgbGFyZ2UtPm5leHQgPSBwb29sLT5sYXJnZTsKKyAgICBwb29sLT5sYXJnZSA9IGxhcmdlOwogCiAgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FkZGl0aW9uX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDYyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FkZGl0aW9uX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMCwwICsxLDIyOCBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgorICovCisKKworI2luY2x1ZGUgPG5neF9jb25maWcuaD4KKyNpbmNsdWRlIDxuZ3hfY29yZS5oPgorI2luY2x1ZGUgPG5neF9odHRwLmg+CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9zdHJfdCAgIGJlZm9yZV9ib2R5OworICAgIG5neF9zdHJfdCAgIGFmdGVyX2JvZHk7Cit9IG5neF9odHRwX2FkZGl0aW9uX2NvbmZfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgICAgYmVmb3JlX2JvZHlfc2VudDoxOworICAgIHVuc2lnbmVkICAgIGFmdGVyX2JvZHlfc2VudDoxOworfSBuZ3hfaHR0cF9hZGRpdGlvbl9jdHhfdDsKKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2FkZGl0aW9uX2ZpbHRlcl9pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CitzdGF0aWMgdm9pZCAqbmd4X2h0dHBfYWRkaXRpb25fY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpOworc3RhdGljIGNoYXIgKm5neF9odHRwX2FkZGl0aW9uX21lcmdlX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwKKyAgICB2b2lkICpjaGlsZCk7CisKKworc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX2FkZGl0aW9uX2NvbW1hbmRzW10gPSB7CisKKyAgICB7IG5neF9zdHJpbmcoImFkZF9iZWZvcmVfYm9keSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X3N0cl9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfYWRkaXRpb25fY29uZl90LCBiZWZvcmVfYm9keSksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImFkZF9hZnRlcl9ib2R5IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc3RyX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9hZGRpdGlvbl9jb25mX3QsIGFmdGVyX2JvZHkpLAorICAgICAgTlVMTCB9LAorCisgICAgICBuZ3hfbnVsbF9jb21tYW5kCit9OworCisKK3N0YXRpYyBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX21vZHVsZV9jdHggPSB7CisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCisKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisKKyAgICBuZ3hfaHR0cF9hZGRpdGlvbl9jcmVhdGVfY29uZiwgICAgICAgICAvKiBjcmVhdGUgbG9jYXRpb24gY29uZmlndXJhdGlvbiAqLworICAgIG5neF9odHRwX2FkZGl0aW9uX21lcmdlX2NvbmYgICAgICAgICAgIC8qIG1lcmdlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gKi8KK307CisKKworbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9hZGRpdGlvbl9maWx0ZXJfbW9kdWxlID0geworICAgIE5HWF9NT0RVTEVfVjEsCisgICAgJm5neF9odHRwX2FkZGl0aW9uX2ZpbHRlcl9tb2R1bGVfY3R4LCAgLyogbW9kdWxlIGNvbnRleHQgKi8KKyAgICBuZ3hfaHR0cF9hZGRpdGlvbl9jb21tYW5kcywgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLworICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYXN0ZXIgKi8KKyAgICBuZ3hfaHR0cF9hZGRpdGlvbl9maWx0ZXJfaW5pdCwgICAgICAgICAvKiBpbml0IG1vZHVsZSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgcHJvY2VzcyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgdGhyZWFkICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhpdCB0aHJlYWQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGl0IHByb2Nlc3MgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGl0IG1hc3RlciAqLworICAgIE5HWF9NT0RVTEVfVjFfUEFERElORworfTsKKworCitzdGF0aWMgbmd4X2h0dHBfb3V0cHV0X2hlYWRlcl9maWx0ZXJfcHQgIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcjsKK3N0YXRpYyBuZ3hfaHR0cF9vdXRwdXRfYm9keV9maWx0ZXJfcHQgICAgbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcjsKKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9hZGRpdGlvbl9oZWFkZXJfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBuZ3hfaHR0cF9hZGRpdGlvbl9jdHhfdCAgICpjdHg7CisgICAgbmd4X2h0dHBfYWRkaXRpb25fY29uZl90ICAqY29uZjsKKworICAgIGlmIChyLT5oZWFkZXJzX291dC5zdGF0dXMgIT0gTkdYX0hUVFBfT0sgfHwgciAhPSByLT5tYWluKSB7CisgICAgICAgIHJldHVybiBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIocik7CisgICAgfQorCisgICAgaWYgKG5neF9zdHJuY2FzZWNtcChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSwgInRleHQvaHRtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoInRleHQvaHRtbCIpIC0gMSkKKyAgICAgICAgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIocik7CisgICAgfQorCisgICAgY29uZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX21vZHVsZSk7CisKKyAgICBpZiAoY29uZi0+YmVmb3JlX2JvZHkubGVuID09IDAgJiYgY29uZi0+YWZ0ZXJfYm9keS5sZW4gPT0gMCkgeworICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOworICAgIH0KKworICAgIGN0eCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9hZGRpdGlvbl9jdHhfdCkpOworICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIG5neF9odHRwX3NldF9jdHgociwgY3R4LCBuZ3hfaHR0cF9hZGRpdGlvbl9maWx0ZXJfbW9kdWxlKTsKKworICAgIG5neF9odHRwX2NsZWFyX2NvbnRlbnRfbGVuZ3RoKHIpOworICAgIG5neF9odHRwX2NsZWFyX2FjY2VwdF9yYW5nZXMocik7CisKKyAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2FkZGl0aW9uX2JvZHlfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2NoYWluX3QgKmluKQoreworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgIHJjOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAqY2w7CisgICAgbmd4X2h0dHBfYWRkaXRpb25fY3R4X3QgICAqY3R4OworICAgIG5neF9odHRwX2FkZGl0aW9uX2NvbmZfdCAgKmNvbmY7CisKKyAgICBpZiAoaW4gPT0gTlVMTCB8fCByLT5oZWFkZXJfb25seSkgeworICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcihyLCBpbik7CisgICAgfQorCisgICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX21vZHVsZSk7CisKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG5neF9odHRwX25leHRfYm9keV9maWx0ZXIociwgaW4pOworICAgIH0KKworICAgIGNvbmYgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2FkZGl0aW9uX2ZpbHRlcl9tb2R1bGUpOworCisgICAgaWYgKCFjdHgtPmJlZm9yZV9ib2R5X3NlbnQpIHsKKyAgICAgICAgY3R4LT5iZWZvcmVfYm9keV9zZW50ID0gMTsKKworICAgICAgICBpZiAoY29uZi0+YmVmb3JlX2JvZHkubGVuKSB7CisgICAgICAgICAgICBpZiAobmd4X2h0dHBfc3VicmVxdWVzdChyLCAmY29uZi0+YmVmb3JlX2JvZHksIE5VTEwsIDApICE9IE5HWF9PSykgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsYXN0ID0gMDsKKworICAgIGZvciAoY2wgPSBpbjsgY2w7IGNsID0gY2wtPm5leHQpIHsKKyAgICAgICAgaWYgKGNsLT5idWYtPmxhc3RfYnVmKSB7CisgICAgICAgICAgICBjbC0+YnVmLT5sYXN0X2J1ZiA9IDA7CisgICAgICAgICAgICBsYXN0ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJjID0gbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcihyLCBpbik7CisKKyAgICBpZiAocmMgPT0gTkdYX0VSUk9SCisgICAgICAgIHx8ICFsYXN0CisgICAgICAgIHx8IGN0eC0+YWZ0ZXJfYm9keV9zZW50CisgICAgICAgIHx8IGNvbmYtPmFmdGVyX2JvZHkubGVuID09IDApCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKG5neF9odHRwX3N1YnJlcXVlc3QociwgJmNvbmYtPmFmdGVyX2JvZHksIE5VTEwsIDApICE9IE5HWF9PSykgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGN0eC0+YWZ0ZXJfYm9keV9zZW50ID0gMTsKKworICAgIHJldHVybiBuZ3hfaHR0cF9zZW5kX3NwZWNpYWwociwgTkdYX0hUVFBfTEFTVCk7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQoreworICAgIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlciA9IG5neF9odHRwX3RvcF9oZWFkZXJfZmlsdGVyOworICAgIG5neF9odHRwX3RvcF9oZWFkZXJfZmlsdGVyID0gbmd4X2h0dHBfYWRkaXRpb25faGVhZGVyX2ZpbHRlcjsKKworICAgIG5neF9odHRwX25leHRfYm9keV9maWx0ZXIgPSBuZ3hfaHR0cF90b3BfYm9keV9maWx0ZXI7CisgICAgbmd4X2h0dHBfdG9wX2JvZHlfZmlsdGVyID0gbmd4X2h0dHBfYWRkaXRpb25fYm9keV9maWx0ZXI7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX2FkZGl0aW9uX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKQoreworICAgIG5neF9odHRwX2FkZGl0aW9uX2NvbmZfdCAgKmNvbmY7CisKKyAgICBjb25mID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9hZGRpdGlvbl9jb25mX3QpKTsKKyAgICBpZiAoY29uZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHNldCBieSBuZ3hfcGNhbGxvYygpOgorICAgICAqCisgICAgICogICAgIGNvbmYtPmJlZm9yZV9ib2R5LmxlbiA9IDA7CisgICAgICogICAgIGNvbmYtPmJlZm9yZV9ib2R5LmRhdGUgPSBOVUxMOworICAgICAqICAgICBjb25mLT5hZnRlcl9ib2R5LmxlbiA9IDA7CisgICAgICogICAgIGNvbmYtPmFmdGVyX2JvZHkuZGF0ZSA9IE5VTEw7CisgICAgICovCisKKyAgICByZXR1cm4gY29uZjsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9hZGRpdGlvbl9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQoreworICAgIG5neF9odHRwX2FkZGl0aW9uX2NvbmZfdCAqcHJldiA9IHBhcmVudDsKKyAgICBuZ3hfaHR0cF9hZGRpdGlvbl9jb25mX3QgKmNvbmYgPSBjaGlsZDsKKworICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5iZWZvcmVfYm9keSwgcHJldi0+YmVmb3JlX2JvZHksICIiKTsKKyAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+YWZ0ZXJfYm9keSwgcHJldi0+YWZ0ZXJfYm9keSwgIiIpOworCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaHVua2VkX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfY2h1bmtlZF9maWx0ZXJfbW9kdWxlLmMKaW5kZXggZDhkMTIwOC4uNDUxMTBjNSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaHVua2VkX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NodW5rZWRfZmlsdGVyX21vZHVsZS5jCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBsb2NhdGlvbiBjb25maWd1cmF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgbG9jYXRpb24gY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gKi8KIH07CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZS5jCmluZGV4IDY2ZTIyMWYuLmVlNjAzZDEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfbW9kdWxlLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX2Zhc3RjZ2lfY29tbWFuZHNbXSA9IHsKIAogICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9wYXNzIiksCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GfE5HWF9DT05GX1RBS0UxLAogICAgICAgbmd4X2h0dHBfZmFzdGNnaV9wYXNzLAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgMCwKQEAgLTE4Myw2ICsxODMsMTMgQEAKICAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgaW5kZXgpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX2lnbm9yZV9jbGllbnRfYWJvcnQiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAorICAgICAgbmd4X2NvbmZfc2V0X2ZsYWdfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgdXBzdHJlYW0uaWdub3JlX2NsaWVudF9hYm9ydCksCisgICAgICBOVUxMIH0sCisKICAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfY29ubmVjdF90aW1lb3V0IiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCiAgICAgICBuZ3hfY29uZl9zZXRfbXNlY19zbG90LApAQCAtMTQ3MCw2ICsxNDc3LDcgQEAKICAgICAgKi8KIAogICAgIGNvbmYtPnVwc3RyZWFtLmJ1ZmZlcmluZyA9IE5HWF9DT05GX1VOU0VUOworICAgIGNvbmYtPnVwc3RyZWFtLmlnbm9yZV9jbGllbnRfYWJvcnQgPSBOR1hfQ09ORl9VTlNFVDsKIAogICAgIGNvbmYtPnVwc3RyZWFtLmNvbm5lY3RfdGltZW91dCA9IE5HWF9DT05GX1VOU0VUX01TRUM7CiAgICAgY29uZi0+dXBzdHJlYW0uc2VuZF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKQEAgLTE1MjAsNiArMTUyOCw5IEBACiAgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+dXBzdHJlYW0uYnVmZmVyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0uYnVmZmVyaW5nLCAxKTsKIAorICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLmlnbm9yZV9jbGllbnRfYWJvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5pZ25vcmVfY2xpZW50X2Fib3J0LCAwKTsKKwogICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0LCA2MDAwMCk7CiAKQEAgLTE2NzAsNiArMTY4MSw3IEBACiAKICAgICBpZiAoY29uZi0+cGVlcnMgPT0gTlVMTCkgewogICAgICAgICBjb25mLT5wZWVycyA9IHByZXYtPnBlZXJzOworICAgICAgICBjb25mLT51cHN0cmVhbS5zY2hlbWEgPSBwcmV2LT51cHN0cmVhbS5zY2hlbWE7CiAgICAgfQogCiAgICAgaWYgKGNvbmYtPnBhcmFtc19zb3VyY2UgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tZW1jYWNoZWRfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21lbWNhY2hlZF9tb2R1bGUuYwppbmRleCA4OWE1NjhkLi43M2MwMThlIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21lbWNhY2hlZF9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21lbWNhY2hlZF9tb2R1bGUuYwpAQCAtNTE3LDYgKzUxNyw4IEBACiAgICAgY29uZi0+dXBzdHJlYW0uY3ljbGljX3RlbXBfZmlsZSA9IDA7CiAKICAgICAvKiB0aGUgaGFyZGNvZGVkIHZhbHVlcyAqLworICAgIGNvbmYtPnVwc3RyZWFtLmJ1ZmZlcmluZyA9IDA7CisgICAgY29uZi0+dXBzdHJlYW0uaWdub3JlX2NsaWVudF9hYm9ydCA9IDA7CiAgICAgY29uZi0+dXBzdHJlYW0uc2VuZF9sb3dhdCA9IDA7CiAgICAgY29uZi0+dXBzdHJlYW0uYnVmcy5udW0gPSAwOwogICAgIGNvbmYtPnVwc3RyZWFtLmJ1c3lfYnVmZmVyc19zaXplID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCmluZGV4IGY4ZGZkYzQuLmU5NmJhMDQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2h0dHBfcHJveHlfY29tbWFuZHNbXSA9IHsKIAogICAgIHsgbmd4X3N0cmluZygicHJveHlfcGFzcyIpLAotICAgICAgTkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORnxOR1hfSFRUUF9MSUZfQ09ORnxOR1hfQ09ORl9UQUtFMSwKICAgICAgIG5neF9odHRwX3Byb3h5X3Bhc3MsCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCiAgICAgICAwLApAQCAtMTUwLDYgKzE1MCwxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0uYnVmZmVyaW5nKSwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygicHJveHlfaWdub3JlX2NsaWVudF9hYm9ydCIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0uaWdub3JlX2NsaWVudF9hYm9ydCksCisgICAgICBOVUxMIH0sCisKICAgICB7IG5neF9zdHJpbmcoInByb3h5X2Nvbm5lY3RfdGltZW91dCIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAogICAgICAgbmd4X2NvbmZfc2V0X21zZWNfc2xvdCwKQEAgLTE0MTUsNiArMTQyMiw3IEBACiAgICAgICovCiAKICAgICBjb25mLT51cHN0cmVhbS5idWZmZXJpbmcgPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBjb25mLT51cHN0cmVhbS5pZ25vcmVfY2xpZW50X2Fib3J0ID0gTkdYX0NPTkZfVU5TRVQ7CiAKICAgICBjb25mLT51cHN0cmVhbS5jb25uZWN0X3RpbWVvdXQgPSBOR1hfQ09ORl9VTlNFVF9NU0VDOwogICAgIGNvbmYtPnVwc3RyZWFtLnNlbmRfdGltZW91dCA9IE5HWF9DT05GX1VOU0VUX01TRUM7CkBAIC0xNDY4LDYgKzE0NzYsOSBAQAogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLmJ1ZmZlcmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLmJ1ZmZlcmluZywgMSk7CiAKKyAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT51cHN0cmVhbS5pZ25vcmVfY2xpZW50X2Fib3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0uaWdub3JlX2NsaWVudF9hYm9ydCwgMCk7CisKICAgICBuZ3hfY29uZl9tZXJnZV9tc2VjX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLmNvbm5lY3RfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLmNvbm5lY3RfdGltZW91dCwgNjAwMDApOwogCkBAIC0xNjU0LDYgKzE2NjUsMTAgQEAKIAogICAgIGlmIChjb25mLT5wZWVycyA9PSBOVUxMKSB7CiAgICAgICAgIGNvbmYtPnBlZXJzID0gcHJldi0+cGVlcnM7CisKKyAgICAgICAgY29uZi0+aG9zdF9oZWFkZXIgPSBwcmV2LT5ob3N0X2hlYWRlcjsKKyAgICAgICAgY29uZi0+cG9ydF90ZXh0ID0gcHJldi0+cG9ydF90ZXh0OworICAgICAgICBjb25mLT51cHN0cmVhbS5zY2hlbWEgPSBwcmV2LT51cHN0cmVhbS5zY2hlbWE7CiAgICAgfQogCiAKQEAgLTIwNTcsMTEgKzIwNzIsMTIgQEAKIAogI2lmIChOR1hfUENSRSkKIAotICAgIGlmIChjbGNmLT5yZWdleCkgeworICAgIGlmIChjbGNmLT5yZWdleCB8fCBjbGNmLT5ub25hbWUpIHsKICAgICAgICAgaWYgKHBsY2YtPnVwc3RyZWFtLnVyaS5sZW4pIHsKICAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJwcm94eV9wYXNzXCIgbWF5IG5vdCBoYXZlIFVSSSBwYXJ0IGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24gZ2l2ZW4gYnkgcmVndWxhciBleHByZXNzaW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2F0aW9uIGdpdmVuIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbiBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2lkZSB0aGUgXCJpZlwiIHN0YXRlbWVudCIpOwogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwppbmRleCAxYjUyOGY3Li5mMTE2NjM0IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjZGVmaW5lIE5HWF9IVFRQX1NTSV9EQVRFX0xFTiAgICAgICAyMDQ4CiAKICNkZWZpbmUgTkdYX0hUVFBfU1NJX0FERF9QUkVGSVggICAgIDEKKyNkZWZpbmUgTkdYX0hUVFBfU1NJX0FERF9aRVJPICAgICAgIDIKIAogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0yNDcsOCArMjQ4LDEyIEBACiAgICAgeyBuZ3hfc3RyaW5nKCJzZXQiKSwgbmd4X2h0dHBfc3NpX3NldCwgbmd4X2h0dHBfc3NpX3NldF9wYXJhbXMsIDAsIDAgfSwKIAogICAgIHsgbmd4X3N0cmluZygiaWYiKSwgbmd4X2h0dHBfc3NpX2lmLCBuZ3hfaHR0cF9zc2lfaWZfcGFyYW1zLCAwLCAwIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJlbHNlIiksIG5neF9odHRwX3NzaV9lbHNlLCBuZ3hfaHR0cF9zc2lfbm9fcGFyYW1zLCAxLCAwIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJlbmRpZiIpLCBuZ3hfaHR0cF9zc2lfZW5kaWYsIG5neF9odHRwX3NzaV9ub19wYXJhbXMsIDEsIDAgfSwKKyAgICB7IG5neF9zdHJpbmcoImVsaWYiKSwgbmd4X2h0dHBfc3NpX2lmLCBuZ3hfaHR0cF9zc2lfaWZfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9TU0lfQ09ORF9JRiwgMCB9LAorICAgIHsgbmd4X3N0cmluZygiZWxzZSIpLCBuZ3hfaHR0cF9zc2lfZWxzZSwgbmd4X2h0dHBfc3NpX25vX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfU1NJX0NPTkRfSUYsIDAgfSwKKyAgICB7IG5neF9zdHJpbmcoImVuZGlmIiksIG5neF9odHRwX3NzaV9lbmRpZiwgbmd4X2h0dHBfc3NpX25vX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfU1NJX0NPTkRfRUxTRSwgMCB9LAogCiAgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIE5VTEwsIE5VTEwsIDAsIDAgfQogfTsKQEAgLTUyMyw3ICs1MjgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKCFjdHgtPm91dHB1dCAmJiAhY21kLT5jb25kaXRpb25hbCkgeworICAgICAgICAgICAgICAgIGlmIChjbWQtPmNvbmRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICYmIChjdHgtPmNvbmRpdGlvbmFsID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGN0eC0+Y29uZGl0aW9uYWwgPiBjbWQtPmNvbmRpdGlvbmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBjb250ZXh0IG9mIFNTSSBjb21tYW5kOiBcIiVWXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmNvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIHNzaV9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWN0eC0+b3V0cHV0ICYmIGNtZC0+Y29uZGl0aW9uYWwgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTkyNiw2ICs5NDEsNyBAQAogICAgICAgICAgICAgICAgIGN0eC0+a2V5ID0gbmd4X2hhc2goY3R4LT5rZXksIGNoKTsKIAogICAgICAgICAgICAgICAgIGN0eC0+cGFyYW1zLm5lbHRzID0gMDsKKwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX2NvbW1hbmRfc3RhdGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNTY1LDcgKzE1ODEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcCA9IG5neF9wYWxsb2Moci0+cG9vbCwgbGVuKTsKKyAgICBwID0gbmd4X3BhbGxvYyhyLT5wb29sLCBsZW4gKyAoKGZsYWdzICYgTkdYX0hUVFBfU1NJX0FERF9aRVJPKSA/IDEgOiAwKSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KQEAgLTE4MDksMTMgKzE4MjUsMjYgQEAKICAgICB1X2NoYXIgICAgICAgKnAsICpsYXN0OwogICAgIG5neF9zdHJfdCAgICAqZXhwciwgbGVmdCwgcmlnaHQ7CiAgICAgbmd4X2ludF90ICAgICByYzsKLSAgICBuZ3hfdWludF90ICAgIG5lZ2F0aXZlLCBub3JlZ2V4OworICAgIG5neF91aW50X3QgICAgbmVnYXRpdmUsIG5vcmVnZXgsIGZsYWdzOwogI2lmIChOR1hfUENSRSkKICAgICBuZ3hfc3RyX3QgICAgIGVycjsKICAgICBuZ3hfcmVnZXhfdCAgKnJlZ2V4OwogICAgIHVfY2hhciAgICAgICAgZXJyc3RyW05HWF9NQVhfQ09ORl9FUlJTVFJdOwogI2VuZGlmCiAKKyAgICBpZiAoY3R4LT5jb21tYW5kLmxlbiA9PSAyKSB7CisgICAgICAgIGlmIChjdHgtPmNvbmRpdGlvbmFsKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgXCJpZlwiIGNvbW1hbmQgaW5zaWRlIHRoZSBcImlmXCIgY29tbWFuZCIpOworICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdHgtPm91dHB1dF9jaG9zZW4pIHsKKyAgICAgICAgY3R4LT5vdXRwdXQgPSAwOworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKwogICAgIGV4cHIgPSBwYXJhbXNbTkdYX0hUVFBfU1NJX0lGX0VYUFJdOwogCiAgICAgbGVmdC5kYXRhID0gZXhwci0+ZGF0YTsKQEAgLTE4NTcsMTEgKzE4ODYsMTQgQEAKICAgICBpZiAocCA9PSBsYXN0KSB7CiAgICAgICAgIGlmIChsZWZ0LmxlbikgewogICAgICAgICAgICAgY3R4LT5vdXRwdXQgPSAxOworICAgICAgICAgICAgY3R4LT5vdXRwdXRfY2hvc2VuID0gMTsKIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY3R4LT5vdXRwdXQgPSAwOwogICAgICAgICB9CiAKKyAgICAgICAgY3R4LT5jb25kaXRpb25hbCA9IE5HWF9IVFRQX1NTSV9DT05EX0lGOworCiAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgfQogCkBAIC0xODg3LDExICsxOTE5LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICBub3JlZ2V4ID0gMDsKKyAgICAgICAgZmxhZ3MgPSBOR1hfSFRUUF9TU0lfQUREX1pFUk87CiAgICAgICAgIGxhc3QtLTsKIAlwKys7CiAKICAgICB9IGVsc2UgewogICAgICAgICBub3JlZ2V4ID0gMTsKKyAgICAgICAgZmxhZ3MgPSAwOworCisgICAgICAgIGlmIChwIDwgbGFzdCAtIDEgJiYgcFswXSA9PSAnXFwnICYmIHBbMV0gPT0gJy8nKSB7CisJICAgIHArKzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJpZ2h0LmxlbiA9IGxhc3QgLSBwOwpAQCAtMTkwMCw3ICsxOTM4LDcgQEAKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAicmlnaHQ6IFwiJVZcIiIsICZyaWdodCk7CiAKLSAgICBpZiAobmd4X2h0dHBfc3NpX2V2YWx1YXRlX3N0cmluZyhyLCBjdHgsICZyaWdodCwgMCkgIT0gTkdYX09LKSB7CisgICAgaWYgKG5neF9odHRwX3NzaV9ldmFsdWF0ZV9zdHJpbmcociwgY3R4LCAmcmlnaHQsIGZsYWdzKSAhPSBOR1hfT0spIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9FUlJPUjsKICAgICB9CiAKQEAgLTE5NDgsMTEgKzE5ODYsMTQgQEAKIAogICAgIGlmICgocmMgPT0gMCAmJiAhbmVnYXRpdmUpIHx8IChyYyAhPSAwICYmIG5lZ2F0aXZlKSkgewogICAgICAgICBjdHgtPm91dHB1dCA9IDE7CisgICAgICAgIGN0eC0+b3V0cHV0X2Nob3NlbiA9IDE7CiAKICAgICB9IGVsc2UgewogICAgICAgICBjdHgtPm91dHB1dCA9IDA7CiAgICAgfQogCisgICAgY3R4LT5jb25kaXRpb25hbCA9IE5HWF9IVFRQX1NTSV9DT05EX0lGOworCiAgICAgcmV0dXJuIE5HWF9PSzsKIAogaW52YWxpZF9leHByZXNzaW9uOgpAQCAtMTk2OCw3ICsyMDA5LDEzIEBACiBuZ3hfaHR0cF9zc2lfZWxzZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LAogICAgIG5neF9zdHJfdCAqKnBhcmFtcykKIHsKLSAgICBjdHgtPm91dHB1dCA9ICFjdHgtPm91dHB1dDsKKyAgICBpZiAoY3R4LT5vdXRwdXRfY2hvc2VuKSB7CisgICAgICAgIGN0eC0+b3V0cHV0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPm91dHB1dCA9IDE7CisgICAgfQorCisgICAgY3R4LT5jb25kaXRpb25hbCA9IE5HWF9IVFRQX1NTSV9DT05EX0VMU0U7CiAKICAgICByZXR1cm4gTkdYX09LOwogfQpAQCAtMTk3OSw2ICsyMDI2LDggQEAKICAgICBuZ3hfc3RyX3QgKipwYXJhbXMpCiB7CiAgICAgY3R4LT5vdXRwdXQgPSAxOworICAgIGN0eC0+b3V0cHV0X2Nob3NlbiA9IDA7CisgICAgY3R4LT5jb25kaXRpb25hbCA9IDA7CiAKICAgICByZXR1cm4gTkdYX09LOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5oIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5oCmluZGV4IDUzMzdlOTQuLmVmZjIzNjAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuaAorKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmgKQEAgLTIwLDYgKzIwLDEwIEBACiAjZGVmaW5lIE5HWF9IVFRQX1NTSV9QQVJBTVNfTiAgICAgICA0CiAKIAorI2RlZmluZSBOR1hfSFRUUF9TU0lfQ09ORF9JRiAgICAgICAgMQorI2RlZmluZSBOR1hfSFRUUF9TU0lfQ09ORF9FTFNFICAgICAgMgorCisKIHR5cGVkZWYgc3RydWN0IHsKICAgICBuZ3hfaGFzaF90ICAgICAgICAgICAgICAgIGhhc2g7CiAgICAgbmd4X2hhc2hfa2V5c19hcnJheXNfdCAgICBjb21tYW5kczsKQEAgLTU0LDcgKzU4LDkgQEAKIAogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgdmFyaWFibGVzOwogCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICBvdXRwdXQ7ICAgICAgICAvKiB1bnNpZ25lZCAgb3V0cHV0OjE7ICovCisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbDoyOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgb3V0cHV0OjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICBvdXRwdXRfY2hvc2VuOjE7CiAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgKnZhbHVlX2J1ZjsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgIHRpbWVmbXQ7CkBAIC04MCw3ICs4Niw3IEBACiAgICAgbmd4X2h0dHBfc3NpX2NvbW1hbmRfcHQgICBoYW5kbGVyOwogICAgIG5neF9odHRwX3NzaV9wYXJhbV90ICAgICAqcGFyYW1zOwogCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbDoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWw6MjsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgIGZsdXNoOjE7CiB9IG5neF9odHRwX3NzaV9jb21tYW5kX3Q7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC54cyBiL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC54cwppbmRleCA0ZDU3YmI2Li5kMDQ1M2VhIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvbmdpbngueHMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL25naW54LnhzCkBAIC0xNzgsNiArMTc4LDM1IEBACiAKIAogY2hhciAqCityZXF1ZXN0X21ldGhvZChyKQorICAgIG5naW54ICByCisKKyAgICBDT0RFOgorCisgICAgUkVUVkFMID0gbmd4X3BhbGxvYyhyLT5wb29sLCByLT5tZXRob2RfbmFtZS5sZW4gKyAxKTsKKyAgICBpZiAoUkVUVkFMID09IE5VTEwpIHsKKyAgICAgICAgWFNSRVRVUk5fVU5ERUY7CisgICAgfQorCisgICAgbmd4X2NweXN0cm4oKHVfY2hhciAqKSBSRVRWQUwsIHItPm1ldGhvZF9uYW1lLmRhdGEsIHItPm1ldGhvZF9uYW1lLmxlbiArIDEpOworCisgICAgT1VUUFVUOgorICAgIFJFVFZBTAorCisKK2NoYXIgKgorcmVtb3RlX2FkZHIocikKKyAgICBuZ2lueCAgcgorCisgICAgQ09ERToKKworICAgIFJFVFZBTCA9IChjaGFyICopIHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5kYXRhOworCisgICAgT1VUUFVUOgorICAgIFJFVFZBTAorCisKK2NoYXIgKgogaGVhZGVyX2luKHIsIGtleSkKICAgICBuZ2lueCAgICAgICAgICAgICByCiAgICAgU1YgICAgICAgICAgICAgICAqa2V5CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL3Blcmwvbmd4X2h0dHBfcGVybF9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ3hfaHR0cF9wZXJsX21vZHVsZS5jCmluZGV4IDBiY2FkNWMuLmU0NTNkYzMgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ3hfaHR0cF9wZXJsX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ3hfaHR0cF9wZXJsX21vZHVsZS5jCkBAIC0zOSw2ICszOSw3IEBACiAgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpzc2lfY3R4LCBuZ3hfc3RyX3QgKipwYXJhbXMpOwogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIG5neF9odHRwX3BlcmxfaGFuZGxlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIHN0YXRpYyBuZ3hfaW50X3QKICAgICBuZ3hfaHR0cF9wZXJsX2dldF9pbnRlcnByZXRlcihuZ3hfaHR0cF9wZXJsX21haW5fY29uZl90ICpwbWNmLAogICAgIFBlcmxJbnRlcnByZXRlciAqKnBlcmwsIG5neF9sb2dfdCAqbG9nKTsKQEAgLTE3NCwyMyArMTc1LDM5IEBACiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9wZXJsX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICByYzsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgdXJpLCBhcmdzOwotICAgIG5neF9odHRwX3BlcmxfY3R4X3QgICAgICAgICpjdHg7Ci0gICAgbmd4X2h0dHBfcGVybF9sb2NfY29uZl90ICAgKnBsY2Y7Ci0gICAgbmd4X2h0dHBfcGVybF9tYWluX2NvbmZfdCAgKnBtY2Y7CisgICAgbmd4X2ludF90ICByYzsKIAogICAgIC8qIFRPRE86IFdpbjMyICovCiAgICAgaWYgKHItPnplcm9faW5fdXJpKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9OT1RfRk9VTkQ7CiAgICAgfQogCisgICAgcmMgPSBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkociwgbmd4X2h0dHBfcGVybF9oYW5kbGVfcmVxdWVzdCk7CisKKyAgICBpZiAocmMgPj0gTkdYX0hUVFBfU1BFQ0lBTF9SRVNQT05TRSkgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9ET05FOworfQorCisKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9wZXJsX2hhbmRsZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgIHVyaSwgYXJnczsKKyAgICBuZ3hfaHR0cF9wZXJsX2N0eF90ICAgICAgICAqY3R4OworICAgIG5neF9odHRwX3BlcmxfbG9jX2NvbmZfdCAgICpwbGNmOworICAgIG5neF9odHRwX3BlcmxfbWFpbl9jb25mX3QgICpwbWNmOworCiAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsICJwZXJsIGhhbmRsZXIiKTsKIAogICAgIC8qIG1vZF9wZXJsJ3MgY29udGVudCBoYW5kbGVyIGFzc3VtZXMgdGhhdCBjb250ZW50IHR5cGUgd2FzIGFscmVhZHkgc2V0ICovCiAKICAgICBpZiAobmd4X2h0dHBfc2V0X2NvbnRlbnRfdHlwZShyKSAhPSBOR1hfT0spIHsKLSAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcGVybF9tb2R1bGUpOwpAQCAtMTk4LDcgKzIxNSw4IEBACiAgICAgaWYgKGN0eCA9PSBOVUxMKSB7CiAgICAgICAgIGN0eCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wZXJsX2N0eF90KSk7CiAgICAgICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3QociwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKwkgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgbmd4X2h0dHBfc2V0X2N0eChyLCBjdHgsIG5neF9odHRwX3BlcmxfbW9kdWxlKTsKQEAgLTIwOSw3ICsyMjcsOCBAQAogICAgIHJjID0gbmd4X2h0dHBfcGVybF9nZXRfaW50ZXJwcmV0ZXIocG1jZiwgJmN0eC0+cGVybCwgci0+Y29ubmVjdGlvbi0+bG9nKTsKIAogICAgIGlmIChyYyAhPSBOR1hfT0spIHsKLSAgICAgICAgcmV0dXJuIHJjOworICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIHJjKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHsKQEAgLTIzNSwyMCArMjU0LDI0IEBACiAgICAgaWYgKGN0eC0+cmVkaXJlY3RfdXJpLmxlbikgewogICAgICAgICB1cmkgPSBjdHgtPnJlZGlyZWN0X3VyaTsKICAgICAgICAgYXJncyA9IGN0eC0+cmVkaXJlY3RfYXJnczsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHVyaS5sZW4gPSAwOwogICAgIH0KIAogICAgIGN0eC0+ZmlsZW5hbWUgPSBOVUxMOwogICAgIGN0eC0+cmVkaXJlY3RfdXJpLmxlbiA9IDA7CiAKICAgICBpZiAodXJpLmxlbikgewotICAgICAgICByZXR1cm4gbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3QociwgJnVyaSwgJmFyZ3MpOworICAgICAgICBuZ3hfaHR0cF9pbnRlcm5hbF9yZWRpcmVjdChyLCAmdXJpLCAmYXJncyk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAocmMgPT0gTkdYX09LIHx8IHJjID09IE5HWF9IVFRQX09LKSB7Ci0gICAgICAgIHJldHVybiBuZ3hfaHR0cF9zZW5kX3NwZWNpYWwociwgTkdYX0hUVFBfTEFTVCk7CisgICAgICAgIG5neF9odHRwX3NlbmRfc3BlY2lhbChyLCBOR1hfSFRUUF9MQVNUKTsKICAgICB9CiAKLSAgICByZXR1cm4gcmM7CisgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCByYyk7CiB9CiAKIApAQCAtNDQ4LDYgKzQ3MSwxMCBAQAogICAgIH0KICNlbmRpZgogCisgICAgaWYgKG5neF9jb25mX2Z1bGxfbmFtZShjZi0+Y3ljbGUsICZwbWNmLT5tb2R1bGVzKSAhPSBOR1hfT0spIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKwogICAgIFBFUkxfU1lTX0lOSVQoJm5neF9hcmdjLCAmbmd4X2FyZ3YpOwogCiAgICAgcG1jZi0+cGVybCA9IG5neF9odHRwX3BlcmxfY3JlYXRlX2ludGVycHJldGVyKHBtY2YsIGNmLT5sb2cpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9jYWNoZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9jYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI4NDI0Li4wMDAwMDAwCi0tLSBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2Ci0gKi8KLQotCi0jaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgotI2luY2x1ZGUgPG5neF9jb3JlLmg+Ci0jaW5jbHVkZSA8bmd4X2h0dHAuaD4KLSNpbmNsdWRlIDxuZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmg+Ci0KLQotc3RhdGljIGludCBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2NhY2hlZF9yZXNwb25zZShuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJjKTsKLXN0YXRpYyBpbnQgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19jYWNoZWRfaGVhZGVyKG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X2NhY2hlX2xvb2tfY29tcGxldGVfcmVxdWVzdChuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7Ci0KLQotaW50IG5neF9odHRwX3Byb3h5X2dldF9jYWNoZWRfcmVzcG9uc2Uobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCi17Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGFzdDsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAgICAgICpyOwotICAgIG5neF9odHRwX3Byb3h5X2NhY2hlX3QgICAgICAgICAgKmM7Ci0gICAgbmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fY29uZl90ICAqdTsKLQotICAgIHIgPSBwLT5yZXF1ZXN0OwotCi0gICAgaWYgKCEoYyA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wcm94eV9jYWNoZV90KSkpKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgcC0+Y2FjaGUgPSBjOwotCi0gICAgYy0+Y3R4LmZpbGUuZmQgPSBOR1hfSU5WQUxJRF9GSUxFOwotICAgIGMtPmN0eC5maWxlLmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKLSAgICBjLT5jdHgucGF0aCA9IHAtPmxjZi0+Y2FjaGVfcGF0aDsKLQotICAgIHUgPSBwLT5sY2YtPnVwc3RyZWFtOwotCi0gICAgYy0+Y3R4LmtleS5sZW4gPSB1LT51cmwubGVuICsgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4gKyByLT5hcmdzLmxlbjsKLSAgICBpZiAoIShjLT5jdHgua2V5LmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGMtPmN0eC5rZXkubGVuICsgMSkpKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgbGFzdCA9IG5neF9jcHltZW0oYy0+Y3R4LmtleS5kYXRhLCB1LT51cmwuZGF0YSwgdS0+dXJsLmxlbik7Ci0KLSAgICBsYXN0ID0gbmd4X2NweW1lbShsYXN0LCByLT51cmkuZGF0YSArIHUtPmxvY2F0aW9uLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4pOwotCi0gICAgaWYgKHItPmFyZ3MubGVuID4gMCkgewotICAgICAgICAqKGxhc3QrKykgPSAnPyc7Ci0gICAgICAgIGxhc3QgPSBuZ3hfY3B5bWVtKGxhc3QsIHItPmFyZ3MuZGF0YSwgci0+YXJncy5sZW4pOwotICAgIH0KLSAgICAqbGFzdCA9ICdcMCc7Ci0KLSAgICBwLT5oZWFkZXJfaW4gPSBuZ3hfY3JlYXRlX3RlbXBfaHVuayhyLT5wb29sLCBwLT5sY2YtPmhlYWRlcl9idWZmZXJfc2l6ZSk7Ci0gICAgaWYgKHAtPmhlYWRlcl9pbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotICAgIHAtPmhlYWRlcl9pbi0+dGFnID0gKG5neF9odW5rX3RhZ190KSAmbmd4X2h0dHBfcHJveHlfbW9kdWxlOwotCi0gICAgYy0+Y3R4LmJ1ZiA9IHAtPmhlYWRlcl9pbjsgCi0gICAgYy0+Y3R4LmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKLQotICAgIHJldHVybiBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2NhY2hlZF9yZXNwb25zZShwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2FjaGVfZ2V0X2ZpbGUociwgJmMtPmN0eCkpOwotfQotCi0KLXN0YXRpYyBpbnQgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19jYWNoZWRfcmVzcG9uc2Uobmd4X2h0dHBfcHJveHlfY3R4X3QgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYykKLXsKLSAgICBpZiAocmMgPT0gTkdYX09LKSB7Ci0gICAgICAgIHAtPnN0YXRlLT5jYWNoZV9zdGF0ZSA9IE5HWF9IVFRQX1BST1hZX0NBQ0hFX0hJVDsKLSAgICAgICAgcC0+aGVhZGVyX2luLT5wb3MgPSBwLT5oZWFkZXJfaW4tPnN0YXJ0ICsgcC0+Y2FjaGUtPmN0eC5oZWFkZXJfc2l6ZTsKLQotICAgICAgICBpZiAobmd4X2h0dHBfcHJveHlfcHJvY2Vzc19jYWNoZWRfaGVhZGVyKHApID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHAtPnZhbGlkX2hlYWRlcl9pbiA9IDE7Ci0KLSAgICAgICAgcmV0dXJuIG5neF9odHRwX3Byb3h5X3NlbmRfY2FjaGVkX3Jlc3BvbnNlKHApOwotICAgIH0KLQotICAgIGlmIChyYyA9PSBOR1hfSFRUUF9DQUNIRV9TVEFMRSkgewotICAgICAgICBwLT5zdGF0ZS0+Y2FjaGVfc3RhdGUgPSBOR1hfSFRUUF9QUk9YWV9DQUNIRV9FWFBSOwotCi0gICAgfSBlbHNlIGlmIChyYyA9PSBOR1hfSFRUUF9DQUNIRV9BR0VEKSB7Ci0gICAgICAgIHAtPnN0YXRlLT5jYWNoZV9zdGF0ZSA9IE5HWF9IVFRQX1BST1hZX0NBQ0hFX0FHRUQ7Ci0gICAgfQotCi0gICAgaWYgKHJjID09IE5HWF9IVFRQX0NBQ0hFX1NUQUxFIHx8IHJjID09IE5HWF9IVFRQX0NBQ0hFX0FHRUQpIHsKLSAgICAgICAgcC0+c3RhdGUtPmV4cGlyZWQgPSBuZ3hfdGltZSgpIC0gcC0+Y2FjaGUtPmN0eC5leHBpcmVzOwotICAgICAgICBwLT5oZWFkZXJfaW4tPnBvcyA9IHAtPmhlYWRlcl9pbi0+c3RhcnQgKyBwLT5jYWNoZS0+Y3R4LmhlYWRlcl9zaXplOwotCi0gICAgICAgIGlmIChuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2NhY2hlZF9oZWFkZXIocCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgcC0+aGVhZGVyX2luLT5wb3MgPSBwLT5oZWFkZXJfaW4tPnN0YXJ0ICsgcC0+Y2FjaGUtPmN0eC5oZWFkZXJfc2l6ZTsKLSAgICAgICAgcC0+aGVhZGVyX2luLT5sYXN0ID0gcC0+aGVhZGVyX2luLT5wb3M7Ci0KLSAgICAgICAgcC0+c3RhbGUgPSAxOwotICAgICAgICBwLT52YWxpZF9oZWFkZXJfaW4gPSAxOwotCi0gICAgfSBlbHNlIGlmIChyYyA9PSBOR1hfREVDTElORUQpIHsKLSAgICAgICAgcC0+c3RhdGUtPmNhY2hlX3N0YXRlID0gTkdYX0hUVFBfUFJPWFlfQ0FDSEVfTUlTUzsKLSAgICAgICAgcC0+aGVhZGVyX2luLT5wb3MgPSBwLT5oZWFkZXJfaW4tPnN0YXJ0ICsgcC0+Y2FjaGUtPmN0eC5oZWFkZXJfc2l6ZTsKLSAgICAgICAgcC0+aGVhZGVyX2luLT5sYXN0ID0gcC0+aGVhZGVyX2luLT5wb3M7Ci0gICAgfQotCi0gICAgaWYgKHAtPmxjZi0+YnVzeV9sb2NrKSB7Ci0gICAgICAgIHAtPnRyeV9idXN5X2xvY2sgPSAxOwotCi0gICAgICAgIHAtPmhlYWRlcl9pbi0+cG9zID0gcC0+aGVhZGVyX2luLT5zdGFydDsKLSAgICAgICAgcC0+aGVhZGVyX2luLT5sYXN0ID0gcC0+aGVhZGVyX2luLT5zdGFydDsKLQotICAgICAgICBwLT5idXN5X2xvY2sudGltZSA9IDA7Ci0gICAgICAgIHAtPmJ1c3lfbG9jay5ldmVudCA9IHAtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPnJlYWQ7Ci0gICAgICAgIHAtPmJ1c3lfbG9jay5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfYnVzeV9sb2NrX2hhbmRsZXI7Ci0gICAgICAgIHAtPmJ1c3lfbG9jay5tZDUgPSBwLT5jYWNoZS0+Y3R4Lm1kNTsKLQotICAgICAgICBuZ3hfaHR0cF9wcm94eV9jYWNoZV9idXN5X2xvY2socCk7Ci0gICAgICAgIHJldHVybiBOR1hfRE9ORTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmd4X2h0dHBfcHJveHlfcmVxdWVzdF91cHN0cmVhbShwKTsKLX0KLQotCi1zdGF0aWMgaW50IG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfY2FjaGVkX2hlYWRlcihuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcmMsIGk7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgKmg7Ci0gICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgKnI7Ci0gICAgbmd4X2h0dHBfcHJveHlfY2FjaGVfdCAgKmM7Ci0KLSAgICByYyA9IG5neF9odHRwX3Byb3h5X3BhcnNlX3N0YXR1c19saW5lKHApOwotCi0gICAgYyA9IHAtPmNhY2hlOwotICAgIHIgPSBwLT5yZXF1ZXN0OwotCi0gICAgaWYgKHJjID09IE5HWF9BR0FJTikgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIlwicHJveHlfaGVhZGVyX2J1ZmZlcl9zaXplXCIgIgotICAgICAgICAgICAgICAgICAgICAgICJpcyB0b28gc21hbGwgdG8gcmVhZCBoZWFkZXIgZnJvbSBcIiVzXCIiLAotICAgICAgICAgICAgICAgICAgICAgIGMtPmN0eC5maWxlLm5hbWUuZGF0YSk7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKHJjID09IE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUikgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIm5vIHZhbGlkIEhUVFAvMS4wIGhlYWRlciBpbiBcIiVzXCIiLAotICAgICAgICAgICAgICAgICAgICAgIGMtPmN0eC5maWxlLm5hbWUuZGF0YSk7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgfQotCi0gICAgLyogcmMgPT0gTkdYX09LICovCi0KLSAgICBjLT5zdGF0dXMgPSBwLT5zdGF0dXM7Ci0gICAgYy0+c3RhdHVzX2xpbmUubGVuID0gcC0+c3RhdHVzX2VuZCAtIHAtPnN0YXR1c19zdGFydDsKLSAgICBjLT5zdGF0dXNfbGluZS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBjLT5zdGF0dXNfbGluZS5sZW4gKyAxKTsKLSAgICBpZiAoYy0+c3RhdHVzX2xpbmUuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgfQotCi0gICAgLyogcmVzZXQgZm9yIHRoZSBwb3NzaWJsZSBwYXJzaW5nIHRoZSB1cHN0cmVhbSBoZWFkZXIgKi8KLQotICAgIHAtPnN0YXR1cyA9IDA7Ci0gICAgcC0+c3RhdHVzX2NvdW50ID0gMDsKLQotICAgIG5neF9jcHlzdHJuKGMtPnN0YXR1c19saW5lLmRhdGEsIHAtPnN0YXR1c19zdGFydCwgYy0+c3RhdHVzX2xpbmUubGVuICsgMSk7Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCBjYWNoZSBzdGF0dXMgJXVpIFwiJVZcIiIsIAotICAgICAgICAgICAgICAgICAgIGMtPnN0YXR1cywgJmMtPnN0YXR1c19saW5lKTsKLQotICAgIC8qIFRPRE86IG5neF9pbml0X3RhYmxlICovCi0gICAgYy0+aGVhZGVyc19pbi5oZWFkZXJzID0gbmd4X2NyZWF0ZV90YWJsZShyLT5wb29sLCAyMCk7Ci0KLSAgICBmb3IgKCA7OyApIHsKLSAgICAgICAgcmMgPSBuZ3hfaHR0cF9wYXJzZV9oZWFkZXJfbGluZShyLCBwLT5oZWFkZXJfaW4pOwotCi0gICAgICAgIGlmIChyYyA9PSBOR1hfT0spIHsKLQotICAgICAgICAgICAgLyogYSBoZWFkZXIgbGluZSBoYXMgYmVlbiBwYXJzZWQgc3VjY2Vzc2Z1bGx5ICovCi0KLSAgICAgICAgICAgIGggPSBuZ3hfaHR0cF9hZGRfaGVhZGVyKCZjLT5oZWFkZXJzX2luLCBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luKTsKLSAgICAgICAgICAgIGlmIChoID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoLT5rZXkubGVuID0gci0+aGVhZGVyX25hbWVfZW5kIC0gci0+aGVhZGVyX25hbWVfc3RhcnQ7Ci0gICAgICAgICAgICBoLT52YWx1ZS5sZW4gPSByLT5oZWFkZXJfZW5kIC0gci0+aGVhZGVyX3N0YXJ0OwotCi0gICAgICAgICAgICBoLT5rZXkuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5rZXkubGVuICsgMSArIGgtPnZhbHVlLmxlbiArIDEpOwotICAgICAgICAgICAgaWYgKGgtPmtleS5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoLT52YWx1ZS5kYXRhID0gaC0+a2V5LmRhdGEgKyBoLT5rZXkubGVuICsgMTsKLSAgICAgICAgICAgIG5neF9jcHlzdHJuKGgtPmtleS5kYXRhLCByLT5oZWFkZXJfbmFtZV9zdGFydCwgaC0+a2V5LmxlbiArIDEpOwotICAgICAgICAgICAgbmd4X2NweXN0cm4oaC0+dmFsdWUuZGF0YSwgci0+aGVhZGVyX3N0YXJ0LCBoLT52YWx1ZS5sZW4gKyAxKTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgbmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbltpXS5uYW1lLmxlbiAhPSAwOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbltpXS5uYW1lLmxlbiAhPSBoLT5rZXkubGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RyY2FzZWNtcChuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luW2ldLm5hbWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5rZXkuZGF0YSkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICooKG5neF90YWJsZV9lbHRfdCAqKikgKChjaGFyICopICZjLT5oZWFkZXJzX2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbltpXS5vZmZzZXQpKSA9IGg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBjYWNoZSBoZWFkZXI6IFwiJVY6ICVWXCIiLCAmaC0+a2V5LCAmaC0+dmFsdWUpOwotCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICB9IGVsc2UgaWYgKHJjID09IE5HWF9IVFRQX1BBUlNFX0hFQURFUl9ET05FKSB7Ci0KLSAgICAgICAgICAgIC8qIGEgd2hvbGUgaGVhZGVyIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgKi8KLQotICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBjYWNoZSBoZWFkZXIgZG9uZSIpOwotCi0gICAgICAgICAgICBjLT5jdHguZmlsZV9zdGFydCA9IHAtPmhlYWRlcl9pbi0+cG9zIC0gcC0+aGVhZGVyX2luLT5zdGFydDsKLQotICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKLQotICAgICAgICB9IGVsc2UgaWYgKHJjID09IE5HWF9IVFRQX1BBUlNFX0lOVkFMSURfSEVBREVSKSB7Ci0KLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgaGVhZGVyIGluIFwiJXNcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmN0eC5maWxlLm5hbWUuZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcmMgPT0gTkdYX0FHQUlOIHx8IHJjID09IE5HWF9IVFRQX1BBUlNFX1RPT19MT05HX0hFQURFUiAqLwotCi0gICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAiXCJwcm94eV9oZWFkZXJfYnVmZmVyX3NpemVcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgImlzIHRvbyBzbWFsbCB0byByZWFkIGhlYWRlciBmcm9tIFwiJXNcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgYy0+Y3R4LmZpbGUubmFtZS5kYXRhKTsKLSAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICB9Ci19Ci0KLQotdm9pZCBuZ3hfaHR0cF9wcm94eV9jYWNoZV9idXN5X2xvY2sobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCi17Ci0gICAgaW50ICByYywgZnRfdHlwZTsKLQotICAgIHJjID0gbmd4X2h0dHBfYnVzeV9sb2NrX2NhY2hhYmxlKHAtPmxjZi0+YnVzeV9sb2NrLCAmcC0+YnVzeV9sb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnRyeV9idXN5X2xvY2spOwotCi0gICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBwLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgY2FjaGUgYnVzeSBsb2NrIGNhY2hhYmxlOiAlZCIsIHJjKTsKLQotICAgIGlmIChyYyA9PSBOR1hfT0spIHsKLSAgICAgICAgaWYgKHAtPnRyeV9idXN5X2xvY2spIHsKLSAgICAgICAgICAgIHAtPmJ1c3lfbG9ja2VkID0gMTsKLSAgICAgICAgICAgIHAtPmhlYWRlcl9pbi0+cG9zID0gcC0+aGVhZGVyX2luLT5zdGFydCArIHAtPmNhY2hlLT5jdHguaGVhZGVyX3NpemU7Ci0gICAgICAgICAgICBwLT5oZWFkZXJfaW4tPmxhc3QgPSBwLT5oZWFkZXJfaW4tPnBvczsKLQotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfcmVxdWVzdF91cHN0cmVhbShwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG5neF9odHRwX3Byb3h5X2NhY2hlX2xvb2tfY29tcGxldGVfcmVxdWVzdChwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHAtPnRyeV9idXN5X2xvY2sgPSAwOwotCi0gICAgaWYgKHAtPmNhY2hlLT5jdHguZmlsZS5mZCAhPSBOR1hfSU5WQUxJRF9GSUxFCi0gICAgICAgICYmICFwLT5jYWNoZS0+Y3R4LmZpbGUuaW5mb192YWxpZCkKLSAgICB7Ci0gICAgICAgIGlmIChuZ3hfZmRfaW5mbyhwLT5jYWNoZS0+Y3R4LmZpbGUuZmQsICZwLT5jYWNoZS0+Y3R4LmZpbGUuaW5mbykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRklMRV9FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0NSSVQsIHAtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgbmd4X2Vycm5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZmRfaW5mb19uICIgXCIlc1wiIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmNhY2hlLT5jdHguZmlsZS5uYW1lLmRhdGEpOwotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcC0+Y2FjaGUtPmN0eC5maWxlLmluZm9fdmFsaWQgPSAxOwotICAgIH0KLQotICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKLQotICAgICAgICBpZiAoKG5neF9ldmVudF9mbGFncyAmIChOR1hfVVNFX0NMRUFSX0VWRU5UfE5HWF9VU0VfS1FVRVVFX0VWRU5UKSkKLSAgICAgICAgICAgICYmICFwLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT53cml0ZS0+YWN0aXZlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICoga3F1ZXVlIGFsbG93cyB0byBkZXRlY3Qgd2hlbiBjbGllbnQgY2xvc2VzIHByZW1hdHVyZWx5Ci0gICAgICAgICAgICAgKiBjb25uZWN0aW9uCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgcC0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uOwotCi0gICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudChwLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT53cml0ZSwgTkdYX1dSSVRFX0VWRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NMRUFSX0VWRU5UKSA9PSBOR1hfRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbmd4X2h0dHBfYnVzeV91bmxvY2socC0+bGNmLT5idXN5X2xvY2ssICZwLT5idXN5X2xvY2spOwotCi0gICAgaWYgKHJjID09IE5HWF9ET05FKSB7Ci0gICAgICAgIGZ0X3R5cGUgPSBOR1hfSFRUUF9QUk9YWV9GVF9CVVNZX0xPQ0s7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiByYyA9PSBOR1hfRVJST1IgKi8KLSAgICAgICAgZnRfdHlwZSA9IE5HWF9IVFRQX1BST1hZX0ZUX01BWF9XQUlUSU5HOwotICAgIH0KLSAgICAKLSAgICBpZiAocC0+c3RhbGUgJiYgKHAtPmxjZi0+dXNlX3N0YWxlICYgZnRfdHlwZSkpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X3NlbmRfY2FjaGVkX3Jlc3BvbnNlKHApKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBwLT5zdGF0ZS0+c3RhdHVzID0gTkdYX0hUVFBfU0VSVklDRV9VTkFWQUlMQUJMRTsKLSAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEUpOwotfQotCi0KLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X2NhY2hlX2xvb2tfY29tcGxldGVfcmVxdWVzdChuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgIHJjOwotICAgIG5neF9odHRwX2NhY2hlX2N0eF90ICAqY3R4OwotCi0gICAgaWYgKCEoY3R4ID0gbmd4X3BjYWxsb2MocC0+cmVxdWVzdC0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2NhY2hlX2N0eF90KSkpKSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgICpjdHggPSBwLT5jYWNoZS0+Y3R4OwotCi0gICAgcmMgPSBuZ3hfaHR0cF9jYWNoZV9vcGVuX2ZpbGUoY3R4LCBuZ3hfZmlsZV91bmlxKCZwLT5jYWNoZS0+Y3R4LmZpbGUuaW5mbykpOwotCi0gICAgaWYgKHJjID09IE5HWF9ERUNMSU5FRCB8fCByYyA9PSBOR1hfSFRUUF9DQUNIRV9USEVfU0FNRSkgewotICAgICAgICBwLT50cnlfYnVzeV9sb2NrID0gMTsKLSAgICAgICAgcC0+YnVzeV9sb2NrLnRpbWUgPSAwOwotICAgICAgICBuZ3hfaHR0cF9wcm94eV9jYWNoZV9idXN5X2xvY2socCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHAtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCBjYWNoZSBvbGQgZmQ6JWQsIG5ldyBmZDolZCIsCi0gICAgICAgICAgICAgICAgICAgcC0+Y2FjaGUtPmN0eC5maWxlLmZkLCBjdHgtPmZpbGUuZmQpOwotCi0gICAgaWYgKHAtPmNhY2hlLT5jdHguZmlsZS5mZCAhPSBOR1hfSU5WQUxJRF9GSUxFKSB7Ci0gICAgICAgIGlmIChuZ3hfY2xvc2VfZmlsZShwLT5jYWNoZS0+Y3R4LmZpbGUuZmQpID09IE5HWF9GSUxFX0VSUk9SKSB7Ci0gICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIHAtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgbmd4X2Vycm5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2xvc2VfZmlsZV9uICIgXCIlc1wiIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmNhY2hlLT5jdHguZmlsZS5uYW1lLmRhdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcC0+Y2FjaGUtPmN0eCA9ICpjdHg7Ci0KLSAgICBwLT5zdGF0dXMgPSAwOwotICAgIHAtPnN0YXR1c19jb3VudCA9IDA7Ci0KLSAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfY2FjaGVkX3Jlc3BvbnNlKHAsIHJjKSk7Ci19Ci0KLQotaW50IG5neF9odHRwX3Byb3h5X3NlbmRfY2FjaGVkX3Jlc3BvbnNlKG5neF9odHRwX3Byb3h5X2N0eF90ICpwKQotewotICAgIGludCAgICAgICAgICAgICAgICAgIHJjLCBsZW4sIGk7Ci0gICAgb2ZmX3QgICAgICAgICAgICAgICAgcmVzdDsKLSAgICBuZ3hfaHVua190ICAgICAgICAgICpoMCwgKmgxOwotICAgIG5neF9jaGFpbl90ICAgICAgICAgIG91dFsyXTsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICpyOwotCi0gICAgciA9IHAtPnJlcXVlc3Q7Ci0KLSAgICByLT5oZWFkZXJzX291dC5zdGF0dXMgPSBwLT5jYWNoZS0+c3RhdHVzOwotCi0jaWYgMAotICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoX24gPSAtMTsKLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aCA9IE5VTEw7Ci0jZW5kaWYKLQotICAgIC8qIGNvcHkgYW4gY2FjaGVkIGhlYWRlciB0byByLT5oZWFkZXJzX291dCAqLwotICAgIAotICAgIGlmIChuZ3hfaHR0cF9wcm94eV9jb3B5X2hlYWRlcihwLCAmcC0+Y2FjaGUtPmhlYWRlcnNfaW4pID09IE5HWF9FUlJPUikgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIC8qIHdlIG5lZWQgdG8gYWxsb2NhdGUgYWxsIGJlZm9yZSB0aGUgaGVhZGVyIHdvdWxkIGJlIHNlbnQgKi8KLQotICAgIGxlbiA9IHAtPmhlYWRlcl9pbi0+ZW5kIC0gKHAtPmhlYWRlcl9pbi0+c3RhcnQgKyBwLT5jYWNoZS0+Y3R4LmZpbGVfc3RhcnQpOwotCi0gICAgaDAgPSBOVUxMOwotICAgIGgxID0gTlVMTDsKLQotICAgIGlmIChsZW4pIHsKLSAgICAgICAgaWYgKCEoKGgwID0gbmd4X2NhbGxvY19odW5rKHItPnBvb2wpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISgoaDAtPmZpbGUgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2ZpbGVfdCkpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobGVuIDwgcC0+Y2FjaGUtPmN0eC5sZW5ndGgpIHsKLSAgICAgICAgaWYgKCEoKGgxID0gbmd4X2NhbGxvY19odW5rKHItPnBvb2wpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISgoaDEtPmZpbGUgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2ZpbGVfdCkpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByYyA9IG5neF9odHRwX3NlbmRfaGVhZGVyKHIpOwotCi0gICAgLyogTkVFREVEID8/PyAqLyBwLT5oZWFkZXJfc2VudCA9IDE7Ci0KLSAgICBpZiAocmMgPT0gTkdYX0VSUk9SIHx8IHJjID4gTkdYX09LIHx8IHItPmhlYWRlcl9vbmx5KSB7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByZXN0ID0gcC0+Y2FjaGUtPmN0eC5sZW5ndGg7Ci0KLSAgICBpZiAobGVuKSB7Ci0gICAgICAgIGlmIChwLT52YWxpZF9oZWFkZXJfaW4pIHsKLSAgICAgICAgICAgIGgwLT5wb3MgPSBwLT5oZWFkZXJfaW4tPnN0YXJ0ICsgcC0+Y2FjaGUtPmN0eC5maWxlX3N0YXJ0OwotCi0gICAgICAgICAgICBpZiAobGVuID4gcC0+Y2FjaGUtPmN0eC5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBoMC0+bGFzdCA9IGgwLT5wb3MgKyBwLT5jYWNoZS0+Y3R4Lmxlbmd0aDsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoMC0+bGFzdCA9IHAtPmhlYWRlcl9pbi0+ZW5kOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoMC0+dHlwZSA9IE5HWF9IVU5LX0lOX01FTU9SWXxOR1hfSFVOS19URU1QOwotICAgICAgICB9Ci0KLSAgICAgICAgaDAtPnR5cGUgfD0gTkdYX0hVTktfRklMRTsKLSAgICAgICAgaDAtPmZpbGVfcG9zID0gcC0+Y2FjaGUtPmN0eC5maWxlX3N0YXJ0OwotCi0gICAgICAgIGgwLT5maWxlLT5mZCA9IHAtPmNhY2hlLT5jdHguZmlsZS5mZDsKLSAgICAgICAgaDAtPmZpbGUtPmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKLQotICAgICAgICBpZiAobGVuID4gcC0+Y2FjaGUtPmN0eC5sZW5ndGgpIHsKLSAgICAgICAgICAgIGgwLT5maWxlX2xhc3QgPSBoMC0+ZmlsZV9wb3MgKyBwLT5jYWNoZS0+Y3R4Lmxlbmd0aDsKLSAgICAgICAgICAgIHJlc3QgPSAwOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoMC0+ZmlsZV9sYXN0ID0gaDAtPmZpbGVfcG9zICsgbGVuOwotICAgICAgICAgICAgcmVzdCAtPSBsZW47Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRbMF0uaHVuayA9IGgwOwotICAgICAgICBvdXRbMF0ubmV4dCA9ICZvdXRbMV07Ci0gICAgICAgIGkgPSAwOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaSA9IC0xOwotICAgIH0KLQotICAgIGlmIChyZXN0KSB7Ci0gICAgICAgIGgxLT5maWxlX3BvcyA9IHAtPmNhY2hlLT5jdHguZmlsZV9zdGFydCArIGxlbjsKLSAgICAgICAgaDEtPmZpbGVfbGFzdCA9IGgxLT5maWxlX3BvcyArIHJlc3Q7Ci0gICAgICAgIGgxLT50eXBlID0gTkdYX0hVTktfRklMRTsKLQotICAgICAgICBoMS0+ZmlsZS0+ZmQgPSBwLT5jYWNoZS0+Y3R4LmZpbGUuZmQ7Ci0gICAgICAgIGgxLT5maWxlLT5sb2cgPSByLT5jb25uZWN0aW9uLT5sb2c7Ci0KLSAgICAgICAgb3V0WysraV0uaHVuayA9IGgxOwotICAgIH0KLQotICAgIG91dFtpXS5uZXh0ID0gTlVMTDsKLSAgICBpZiAoIXItPm1haW4pIHsKLSAgICAgICAgb3V0W2ldLmh1bmstPnR5cGUgfD0gTkdYX0hVTktfTEFTVDsKLSAgICB9Ci0KLSAgICByLT5maWxlLmZkID0gcC0+Y2FjaGUtPmN0eC5maWxlLmZkOwotCi0gICAgcmV0dXJuIG5neF9odHRwX291dHB1dF9maWx0ZXIociwgb3V0KTsKLX0KLQotCi1pbnQgbmd4X2h0dHBfcHJveHlfaXNfY2FjaGFibGUobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCi17Ci0gICAgdGltZV90ICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSwgbGFzdF9tb2RpZmllZCwgZXhwaXJlcywgdDsKLSAgICBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QgICpoOwotCi0gICAgc3dpdGNoIChwLT51cHN0cmVhbS0+c3RhdHVzKSB7Ci0gICAgY2FzZSBOR1hfSFRUUF9PSzoKLSAgICBjYXNlIE5HWF9IVFRQX01PVkVEX1BFUk1BTkVOVExZOgotICAgIGNhc2UgTkdYX0hUVFBfTU9WRURfVEVNUE9SQVJJTFk6Ci0gICAgICAgIGJyZWFrOwotCi0jaWYgMAotICAgIGNhc2UgTkdYX0hUVFBfTk9UX01PRElGSUVEOgotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaCA9ICZwLT51cHN0cmVhbS0+aGVhZGVyc19pbjsKLQotICAgIGRhdGUgPSBOR1hfRVJST1I7Ci0gICAgaWYgKGgtPmRhdGUpIHsKLSAgICAgICAgZGF0ZSA9IG5neF9odHRwX3BhcnNlX3RpbWUoaC0+ZGF0ZS0+dmFsdWUuZGF0YSwgaC0+ZGF0ZS0+dmFsdWUubGVuKTsKLSAgICB9Ci0gICAgaWYgKGRhdGUgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgIGRhdGUgPSBuZ3hfdGltZSgpOwotICAgIH0KLSAgICBwLT5jYWNoZS0+Y3R4LmRhdGUgPSBkYXRlOwotCi0gICAgbGFzdF9tb2RpZmllZCA9IE5HWF9FUlJPUjsKLSAgICBpZiAoaC0+bGFzdF9tb2RpZmllZCkgewotICAgICAgICBsYXN0X21vZGlmaWVkID0gbmd4X2h0dHBfcGFyc2VfdGltZShoLT5sYXN0X21vZGlmaWVkLT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5sYXN0X21vZGlmaWVkLT52YWx1ZS5sZW4pOwotICAgICAgICBwLT5jYWNoZS0+Y3R4Lmxhc3RfbW9kaWZpZWQgPSBsYXN0X21vZGlmaWVkOwotICAgIH0KLQotICAgIGlmIChoLT54X2FjY2VsX2V4cGlyZXMpIHsKLSAgICAgICAgZXhwaXJlcyA9IG5neF9hdG9pKGgtPnhfYWNjZWxfZXhwaXJlcy0+dmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnhfYWNjZWxfZXhwaXJlcy0+dmFsdWUubGVuKTsKLSAgICAgICAgaWYgKGV4cGlyZXMgIT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICBwLT5zdGF0ZS0+cmVhc29uID0gTkdYX0hUVFBfUFJPWFlfQ0FDSEVfWEFFOwotICAgICAgICAgICAgcC0+c3RhdGUtPmV4cGlyZXMgPSBleHBpcmVzOwotICAgICAgICAgICAgcC0+Y2FjaGUtPmN0eC5leHBpcmVzID0gZGF0ZSArIGV4cGlyZXM7Ci0gICAgICAgICAgICByZXR1cm4gKGV4cGlyZXMgPiAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghcC0+bGNmLT5pZ25vcmVfZXhwaXJlcykgewotCi0gICAgICAgIC8qIFRPRE86IENhY2hlLUNvbnRyb2w6IG5vLWNhY2hlLCBtYXgtYWdlPSAqLwotCi0gICAgICAgIGlmIChoLT5leHBpcmVzKSB7Ci0gICAgICAgICAgICBleHBpcmVzID0gbmd4X2h0dHBfcGFyc2VfdGltZShoLT5leHBpcmVzLT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZXhwaXJlcy0+dmFsdWUubGVuKTsKLSAgICAgICAgICAgIGlmIChleHBpcmVzICE9IE5HWF9FUlJPUikgewotICAgICAgICAgICAgICAgIHAtPnN0YXRlLT5yZWFzb24gPSBOR1hfSFRUUF9QUk9YWV9DQUNIRV9FWFA7Ci0gICAgICAgICAgICAgICAgcC0+c3RhdGUtPmV4cGlyZXMgPSBleHBpcmVzIC0gZGF0ZTsKLSAgICAgICAgICAgICAgICBwLT5jYWNoZS0+Y3R4LmV4cGlyZXMgPSBleHBpcmVzOwotICAgICAgICAgICAgICAgIHJldHVybiAoZGF0ZSA8IGV4cGlyZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHAtPnVwc3RyZWFtLT5zdGF0dXMgPT0gTkdYX0hUVFBfTU9WRURfUEVSTUFORU5UTFkpIHsKLSAgICAgICAgcC0+c3RhdGUtPnJlYXNvbiA9IE5HWF9IVFRQX1BST1hZX0NBQ0hFX01WRDsKLSAgICAgICAgcC0+c3RhdGUtPmV4cGlyZXMgPSAvKiBTVFVCOiAxIGhvdXIgKi8gNjAgKiA2MDsKLSAgICAgICAgcC0+Y2FjaGUtPmN0eC5leHBpcmVzID0gLyogU1RVQjogMSBob3VyICovIDYwICogNjA7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmIChwLT51cHN0cmVhbS0+c3RhdHVzID09IE5HWF9IVFRQX01PVkVEX1RFTVBPUkFSSUxZKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmIChsYXN0X21vZGlmaWVkICE9IE5HWF9FUlJPUiAmJiBwLT5sY2YtPmxtX2ZhY3RvciA+IDApIHsKLQotICAgICAgICAvKiBGSVhNRTogdGltZV90ID09IGludF82NF90LCB3ZSBjYW4gdXNlIGZwdSAqLyAKLQotICAgICAgICBwLT5zdGF0ZS0+cmVhc29uID0gTkdYX0hUVFBfUFJPWFlfQ0FDSEVfTE1GOwotICAgICAgICB0ID0gKHRpbWVfdCkKLSAgICAgICAgICAgICAgKCgoKGludDY0X3QpIChkYXRlIC0gbGFzdF9tb2RpZmllZCkpICogcC0+bGNmLT5sbV9mYWN0b3IpIC8gMTAwKTsKLSAgICAgICAgcC0+c3RhdGUtPmV4cGlyZXMgPSB0OwotICAgICAgICBwLT5jYWNoZS0+Y3R4LmV4cGlyZXMgPSBuZ3hfdGltZSgpICsgdDsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKHAtPmxjZi0+ZGVmYXVsdF9leHBpcmVzID4gMCkgewotICAgICAgICBwLT5zdGF0ZS0+cmVhc29uID0gTkdYX0hUVFBfUFJPWFlfQ0FDSEVfUERFOwotICAgICAgICBwLT5zdGF0ZS0+ZXhwaXJlcyA9IHAtPmxjZi0+ZGVmYXVsdF9leHBpcmVzOwotICAgICAgICBwLT5jYWNoZS0+Y3R4LmV4cGlyZXMgPSBuZ3hfdGltZSgpICsgcC0+bGNmLT5kZWZhdWx0X2V4cGlyZXM7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0KLWludCBuZ3hfaHR0cF9wcm94eV91cGRhdGVfY2FjaGUobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCi17Ci0gICAgbmd4X2V2ZW50X3BpcGVfdCAgKmVwOwotCi0gICAgaWYgKHAtPmNhY2hlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9PSzsKLSAgICB9Ci0KLSAgICBlcCA9IHAtPnVwc3RyZWFtLT5ldmVudF9waXBlOwotCi0gICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCBwLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgY2FjaGUgdXBkYXRlIGxlbjogJU86JU8iLAotICAgICAgICAgICAgICAgICAgIHAtPmNhY2hlLT5jdHgubGVuZ3RoLCBlcC0+cmVhZF9sZW5ndGgpOwotCi0gICAgaWYgKHAtPmNhY2hlLT5jdHgubGVuZ3RoID09IC0xKSB7Ci0gICAgICAgIC8qIFRPRE86IHRlc3QgcmMgKi8KLSAgICAgICAgbmd4X3dyaXRlX2ZpbGUoJmVwLT50ZW1wX2ZpbGUtPmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICZlcC0+cmVhZF9sZW5ndGgsIHNpemVvZihvZmZfdCksCi0gICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2NhY2hlX2hlYWRlcl90LCBsZW5ndGgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmd4X2h0dHBfY2FjaGVfdXBkYXRlX2ZpbGUocC0+cmVxdWVzdCwgJnAtPmNhY2hlLT5jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcC0+dGVtcF9maWxlLT5maWxlLm5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5MWRmOS4uMDAwMDAwMAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MTIgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgotICovCi0KLQotI2luY2x1ZGUgPG5neF9jb25maWcuaD4KLSNpbmNsdWRlIDxuZ3hfY29yZS5oPgotI2luY2x1ZGUgPG5neF9odHRwLmg+Ci0jaW5jbHVkZSA8bmd4X2h0dHBfcHJveHlfaGFuZGxlci5oPgotCi0KLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwotI2lmIDAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfY2FjaGVfZ2V0KG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKLSNlbmRpZgotCi1zdGF0aWMgc2l6ZV90IG5neF9odHRwX3Byb3h5X2xvZ19wcm94eV9zdGF0ZV9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Byb3h5X2xvZ19wcm94eV9zdGF0ZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKLQotI2lmIDAKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Byb3h5X2xvZ19jYWNoZV9zdGF0ZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Byb3h5X2xvZ19yZWFzb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOwotI2VuZGlmCi0KLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfYWRkX2xvZ19mb3JtYXRzKG5neF9jb25mX3QgKmNmKTsKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9wcm94eV9jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpOwotc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X21lcmdlX2xvY19jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpOwotCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfcHJveHlfc2V0X3Bhc3Mobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKLQotc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3NldF94X3ZhcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9sb3dhdF9jaGVjayhuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSk7Ci0KLXN0YXRpYyBuZ3hfY29uZl9wb3N0X3QgIG5neF9odHRwX3Byb3h5X2xvd2F0X3Bvc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5neF9odHRwX3Byb3h5X2xvd2F0X2NoZWNrIH0gOwotCi0KLXN0YXRpYyBuZ3hfY29uZl9iaXRtYXNrX3QgIG5leHRfdXBzdHJlYW1fbWFza3NbXSA9IHsKLSAgICB7IG5neF9zdHJpbmcoImVycm9yIiksIE5HWF9IVFRQX1BST1hZX0ZUX0VSUk9SIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJ0aW1lb3V0IiksIE5HWF9IVFRQX1BST1hZX0ZUX1RJTUVPVVQgfSwKLSAgICB7IG5neF9zdHJpbmcoImludmFsaWRfaGVhZGVyIiksIE5HWF9IVFRQX1BST1hZX0ZUX0lOVkFMSURfSEVBREVSIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJodHRwXzUwMCIpLCBOR1hfSFRUUF9QUk9YWV9GVF9IVFRQXzUwMCB9LAotICAgIHsgbmd4X3N0cmluZygiaHR0cF80MDQiKSwgTkdYX0hUVFBfUFJPWFlfRlRfSFRUUF80MDQgfSwKLSAgICB7IG5neF9udWxsX3N0cmluZywgMCB9Ci19OwotCi0KLXN0YXRpYyBuZ3hfY29uZl9iaXRtYXNrX3QgIHVzZV9zdGFsZV9tYXNrc1tdID0gewotICAgIHsgbmd4X3N0cmluZygiZXJyb3IiKSwgTkdYX0hUVFBfUFJPWFlfRlRfRVJST1IgfSwKLSAgICB7IG5neF9zdHJpbmcoInRpbWVvdXQiKSwgTkdYX0hUVFBfUFJPWFlfRlRfVElNRU9VVCB9LAotICAgIHsgbmd4X3N0cmluZygiaW52YWxpZF9oZWFkZXIiKSwgTkdYX0hUVFBfUFJPWFlfRlRfSU5WQUxJRF9IRUFERVIgfSwKLSAgICB7IG5neF9zdHJpbmcoImh0dHBfNTAwIiksIE5HWF9IVFRQX1BST1hZX0ZUX0hUVFBfNTAwIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJidXN5X2xvY2siKSwgTkdYX0hUVFBfUFJPWFlfRlRfQlVTWV9MT0NLIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJtYXhfd2FpdGluZyIpLCBOR1hfSFRUUF9QUk9YWV9GVF9NQVhfV0FJVElORyB9LAotICAgIHsgbmd4X251bGxfc3RyaW5nLCAwIH0KLX07Ci0KLQotc3RhdGljIG5neF9jb25mX251bV9ib3VuZHNfdCAgbmd4X2h0dHBfcHJveHlfbG1fZmFjdG9yX2JvdW5kcyA9IHsKLSAgICBuZ3hfY29uZl9jaGVja19udW1fYm91bmRzLCAwLCAxMDAKLX07Ci0KLQotc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX3Byb3h5X2NvbW1hbmRzW10gPSB7Ci0KLSAgICB7IG5neF9zdHJpbmcoInByb3h5X3Bhc3MiKSwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAotICAgICAgbmd4X2h0dHBfcHJveHlfc2V0X3Bhc3MsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICAwLAotICAgICAgTlVMTCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9jb25uZWN0X3RpbWVvdXQiKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKLSAgICAgIG5neF9jb25mX3NldF9tc2VjX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBjb25uZWN0X3RpbWVvdXQpLAotICAgICAgTlVMTCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9zZW5kX3RpbWVvdXQiKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKLSAgICAgIG5neF9jb25mX3NldF9tc2VjX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBzZW5kX3RpbWVvdXQpLAotICAgICAgTlVMTCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9zZW5kX2xvd2F0IiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCi0gICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAotICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgc2VuZF9sb3dhdCksCi0gICAgICAmbmd4X2h0dHBfcHJveHlfbG93YXRfcG9zdCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wcmVzZXJ2ZV9ob3N0IiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBwcmVzZXJ2ZV9ob3N0KSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfcGFzc191bnBhcnNlZF91cmkiKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAotICAgICAgbmd4X2NvbmZfc2V0X2ZsYWdfc2xvdCwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIHBhc3NfdW5wYXJzZWRfdXJpKSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfc2V0X3hfdXJsIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBzZXRfeF91cmwpLAotICAgICAgTlVMTCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9zZXRfeF9yZWFsX2lwIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBzZXRfeF9yZWFsX2lwKSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfc2V0X3hfdmFyIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCi0gICAgICBuZ3hfaHR0cF9wcm94eV9zZXRfeF92YXIsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICAwLAotICAgICAgTlVMTCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBhZGRfeF9mb3J3YXJkZWRfZm9yKSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfaGVhZGVyX2J1ZmZlcl9zaXplIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCi0gICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAotICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgaGVhZGVyX2J1ZmZlcl9zaXplKSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfcmVhZF90aW1lb3V0IiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCi0gICAgICBuZ3hfY29uZl9zZXRfbXNlY19zbG90LAotICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgcmVhZF90aW1lb3V0KSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfYnVmZmVycyIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UyLAotICAgICAgbmd4X2NvbmZfc2V0X2J1ZnNfc2xvdCwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIGJ1ZnMpLAotICAgICAgTlVMTCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9idXN5X2J1ZmZlcnNfc2l6ZSIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAotICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIGJ1c3lfYnVmZmVyc19zaXplKSwKLSAgICAgIE5VTEwgfSwKLQotI2lmIDAKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfY2FjaGVfcGF0aCIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxMjM0LAotICAgICAgbmd4X2NvbmZfc2V0X3BhdGhfc2xvdCwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIGNhY2hlX3BhdGgpLAotICAgICAgKHZvaWQgKikgbmd4X2h0dHBfY2FjaGVfY2xlYW5lcl9oYW5kbGVyIH0sCi0KLSNlbmRpZgotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV90ZW1wX3BhdGgiKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMTIzNCwKLSAgICAgIG5neF9jb25mX3NldF9wYXRoX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCB0ZW1wX3BhdGgpLAotICAgICAgKHZvaWQgKikgbmd4X2dhcmJhZ2VfY29sbGVjdG9yX3RlbXBfaGFuZGxlciB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9tYXhfdGVtcF9maWxlX3NpemUiKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKLSAgICAgIG5neF9jb25mX3NldF9zaXplX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBtYXhfdGVtcF9maWxlX3NpemUpLAotICAgICAgTlVMTCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV90ZW1wX2ZpbGVfd3JpdGVfc2l6ZSIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAotICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIHRlbXBfZmlsZV93cml0ZV9zaXplKSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfY2FjaGUiKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAotICAgICAgbmd4X2NvbmZfc2V0X2ZsYWdfc2xvdCwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIGNhY2hlKSwKLSAgICAgIE5VTEwgfSwKLQotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9idXN5X2xvY2siKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMTMsCi0gICAgICBuZ3hfaHR0cF9zZXRfYnVzeV9sb2NrX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBidXN5X2xvY2spLAotICAgICAgTlVMTCB9LAotCi0KLSAgICB7IG5neF9zdHJpbmcoInByb3h5X3Bhc3Nfc2VydmVyIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBwYXNzX3NlcnZlciksCi0gICAgICBOVUxMIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoInByb3h5X3Bhc3NfeF9hY2NlbF9leHBpcmVzIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBwYXNzX3hfYWNjZWxfZXhwaXJlcyksCi0gICAgICBOVUxMIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoInByb3h5X2lnbm9yZV9leHBpcmVzIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBpZ25vcmVfZXhwaXJlcyksCi0gICAgICBOVUxMIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoInByb3h5X2xtX2ZhY3RvciIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAotICAgICAgbmd4X2NvbmZfc2V0X251bV9zbG90LAotICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgbG1fZmFjdG9yKSwKLSAgICAgICZuZ3hfaHR0cF9wcm94eV9sbV9mYWN0b3JfYm91bmRzIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoInByb3h5X2RlZmF1bHRfZXhwaXJlcyIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAotICAgICAgbmd4X2NvbmZfc2V0X3NlY19zbG90LAotICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgZGVmYXVsdF9leHBpcmVzKSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfbmV4dF91cHN0cmVhbSIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0FOWSwKLSAgICAgIG5neF9jb25mX3NldF9iaXRtYXNrX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBuZXh0X3Vwc3RyZWFtKSwKLSAgICAgICZuZXh0X3Vwc3RyZWFtX21hc2tzIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoInByb3h5X3VzZV9zdGFsZSIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0FOWSwKLSAgICAgIG5neF9jb25mX3NldF9iaXRtYXNrX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCB1c2Vfc3RhbGUpLAotICAgICAgJnVzZV9zdGFsZV9tYXNrcyB9LAotCi0gICAgICBuZ3hfbnVsbF9jb21tYW5kCi19OwotCi0KLW5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9wcm94eV9tb2R1bGVfY3R4ID0gewotICAgIG5neF9odHRwX3Byb3h5X2FkZF9sb2dfZm9ybWF0cywgICAgICAgIC8qIHByZSBjb25mICovCi0KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KLQotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWd1cmF0aW9uICovCi0KLSAgICBuZ3hfaHR0cF9wcm94eV9jcmVhdGVfbG9jX2NvbmYsICAgICAgICAvKiBjcmVhdGUgbG9jYXRpb24gY29uZmlncmF0aW9uICovCi0gICAgbmd4X2h0dHBfcHJveHlfbWVyZ2VfbG9jX2NvbmYgICAgICAgICAgLyogbWVyZ2UgbG9jYXRpb24gY29uZmlncmF0aW9uICovCi19OwotCi0KLW5neF9tb2R1bGVfdCAgbmd4X2h0dHBfcHJveHlfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCi0gICAgJm5neF9odHRwX3Byb3h5X21vZHVsZV9jdHgsICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KLSAgICBuZ3hfaHR0cF9wcm94eV9jb21tYW5kcywgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwotICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHByb2Nlc3MgKi8KLX07Ci0KLQotCi1zdGF0aWMgbmd4X2h0dHBfbG9nX29wX25hbWVfdCBuZ3hfaHR0cF9wcm94eV9sb2dfZm10X29wc1tdID0gewotICAgIHsgbmd4X3N0cmluZygicHJveHkiKSwgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2xvZ19wcm94eV9zdGF0ZV9nZXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9sb2dfcHJveHlfc3RhdGUgfSwKLQotI2lmIDAKLSAgICB7IG5neF9zdHJpbmcoInByb3h5X2NhY2hlX3N0YXRlIiksIDAsIG5neF9odHRwX3Byb3h5X2xvZ19jYWNoZV9zdGF0ZSB9LAotICAgIHsgbmd4X3N0cmluZygicHJveHlfcmVhc29uIiksIDAsIG5neF9odHRwX3Byb3h5X2xvZ19yZWFzb24gfSwKLSNlbmRpZgotCi0gICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfQotfTsKLQotCi0KLW5neF9odHRwX2hlYWRlcjBfdCBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luW10gPSB7Ci0gICAgeyBuZ3hfc3RyaW5nKCJEYXRlIiksIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgZGF0ZSkgfSwKLSAgICB7IG5neF9zdHJpbmcoIlNlcnZlciIpLCBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIHNlcnZlcikgfSwKLQotICAgIHsgbmd4X3N0cmluZygiRXhwaXJlcyIpLCBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGV4cGlyZXMpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJDYWNoZS1Db250cm9sIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGNhY2hlX2NvbnRyb2wpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJFVGFnIiksIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgZXRhZykgfSwKLSAgICB7IG5neF9zdHJpbmcoIlgtQWNjZWwtRXhwaXJlcyIpLAotICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgeF9hY2NlbF9leHBpcmVzKSB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJDb25uZWN0aW9uIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGNvbm5lY3Rpb24pIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJDb250ZW50LVR5cGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGNvbnRlbnRfdHlwZSkgfSwKLSAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIiksCi0gICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgY29udGVudF9sZW5ndGgpIH0sCi0KLSNpZiAoTkdYX0hUVFBfR1pJUCkKLSAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtRW5jb2RpbmciKSwKLSAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgY29udGVudF9lbmNvZGluZykgfSwKLSNlbmRpZgotCi0gICAgeyBuZ3hfc3RyaW5nKCJMYXN0LU1vZGlmaWVkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGxhc3RfbW9kaWZpZWQpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJMb2NhdGlvbiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGxvY2F0aW9uKSB9LAotICAgIHsgbmd4X3N0cmluZygiQWNjZXB0LVJhbmdlcyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBhY2NlcHRfcmFuZ2VzKSB9LAotICAgIHsgbmd4X3N0cmluZygiWC1QYWQiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCB4X3BhZCkgfSwKLQotICAgIHsgbmd4X251bGxfc3RyaW5nLCAwIH0KLX07Ci0KLQotc3RhdGljIG5neF9zdHJfdCBjYWNoZV9zdGF0ZXNbXSA9IHsKLSAgICBuZ3hfc3RyaW5nKCJQQVNTIiksCi0gICAgbmd4X3N0cmluZygiQllQQVNTIiksCi0gICAgbmd4X3N0cmluZygiQVVUSCIpLAotICAgIG5neF9zdHJpbmcoIlBHTkMiKSwKLSAgICBuZ3hfc3RyaW5nKCJNSVNTIiksCi0gICAgbmd4X3N0cmluZygiRVhQUiIpLAotICAgIG5neF9zdHJpbmcoIkFHRUQiKSwKLSAgICBuZ3hfc3RyaW5nKCJISVQiKQotfTsKLQotCi1zdGF0aWMgbmd4X3N0cl90IGNhY2hlX3JlYXNvbnNbXSA9IHsKLSAgICBuZ3hfc3RyaW5nKCJCUFMiKSwKLSAgICBuZ3hfc3RyaW5nKCJYQUUiKSwKLSAgICBuZ3hfc3RyaW5nKCJDVEwiKSwKLSAgICBuZ3hfc3RyaW5nKCJFWFAiKSwKLSAgICBuZ3hfc3RyaW5nKCJNVkQiKSwKLSAgICBuZ3hfc3RyaW5nKCJMTUYiKSwKLSAgICBuZ3hfc3RyaW5nKCJQREUiKQotfTsKLQotCi0jaWYgKE5HWF9QQ1JFKQotc3RhdGljIG5neF9zdHJfdCBuZ3hfaHR0cF9wcm94eV91cmkgPSBuZ3hfc3RyaW5nKCIvIik7Ci0jZW5kaWYKLQotCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Byb3h5X2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQotewotICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICAqcDsKLQotICAgIHAgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcHJveHlfY3R4X3QpKTsKLSAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgbmd4X2h0dHBfc2V0X2N0eChyLCBwLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwotCi0KLSAgICBwLT5sY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3Byb3h5X21vZHVsZSk7Ci0gICAgcC0+cmVxdWVzdCA9IHI7Ci0KLSAgICAvKiBUT0RPOiB3ZSBjdXJyZW50bHkgc3VwcG9ydCByZXZlcnNlIHByb3h5IG9ubHkgKi8KLSAgICBwLT5hY2NlbCA9IDE7Ci0KLSAgICBpZiAobmd4X2FycmF5X2luaXQoJnAtPnN0YXRlcywgci0+cG9vbCwgcC0+bGNmLT5wZWVycy0+bnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9wcm94eV9zdGF0ZV90KSkgPT0gTkdYX0VSUk9SKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBwLT5zdGF0ZSA9IG5neF9hcnJheV9wdXNoKCZwLT5zdGF0ZXMpOwotICAgIGlmIChwLT5zdGF0ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgbmd4X21lbXplcm8ocC0+c3RhdGUsIHNpemVvZihuZ3hfaHR0cF9wcm94eV9zdGF0ZV90KSk7Ci0KLSNpZiAwCi0KLSAgICBpZiAoIXAtPmxjZi0+Y2FjaGUKLSAgICAgICAgfHwgKHItPm1ldGhvZCAhPSBOR1hfSFRUUF9HRVQgJiYgci0+bWV0aG9kICE9IE5HWF9IVFRQX0hFQUQpKQotICAgIHsKLSAgICAgICAgcC0+c3RhdGUtPmNhY2hlX3N0YXRlID0gTkdYX0hUVFBfUFJPWFlfQ0FDSEVfUEFTUzsKLQotICAgIH0gZWxzZSBpZiAoci0+YnlwYXNzX2NhY2hlKSB7Ci0gICAgICAgIHAtPnN0YXRlLT5jYWNoZV9zdGF0ZSA9IE5HWF9IVFRQX1BST1hZX0NBQ0hFX0JZUEFTUzsKLQotICAgIH0gZWxzZSBpZiAoci0+aGVhZGVyc19pbi5hdXRob3JpemF0aW9uKSB7Ci0gICAgICAgIHAtPnN0YXRlLT5jYWNoZV9zdGF0ZSA9IE5HWF9IVFRQX1BST1hZX0NBQ0hFX0FVVEg7Ci0KLSAgICB9IGVsc2UgaWYgKHItPm5vX2NhY2hlKSB7Ci0gICAgICAgIHAtPnN0YXRlLT5jYWNoZV9zdGF0ZSA9IE5HWF9IVFRQX1BST1hZX0NBQ0hFX1BHTkM7Ci0gICAgICAgIHAtPmNhY2hhYmxlID0gMTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHAtPmNhY2hhYmxlID0gMTsKLSAgICB9Ci0KLQotICAgIGlmIChwLT5zdGF0ZS0+Y2FjaGVfc3RhdGUgIT0gMCkgewotICAgICAgICByZXR1cm4gbmd4X2h0dHBfcHJveHlfcmVxdWVzdF91cHN0cmVhbShwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmd4X2h0dHBfcHJveHlfY2FjaGVfZ2V0KHApOwotCi0jZWxzZQotCi0gICAgcC0+c3RhdGUtPmNhY2hlX3N0YXRlID0gTkdYX0hUVFBfUFJPWFlfQ0FDSEVfUEFTUzsKLQotICAgIHJldHVybiBuZ3hfaHR0cF9wcm94eV9yZXF1ZXN0X3Vwc3RyZWFtKHApOwotCi0jZW5kaWYKLX0KLQotCi0jaWYgMAotCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Byb3h5X2NhY2hlX2dldChuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKLXsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICpsYXN0OwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgKnI7Ci0gICAgbmd4X2h0dHBfY2FjaGVfY3R4X3QgICAgICAgICAgICAgY3R4OwotICAgIG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX2NvbmZfdCAgKnU7Ci0KLSAgICByID0gcC0+cmVxdWVzdDsKLSAgICB1ID0gcC0+bGNmLT51cHN0cmVhbTsKLQotICAgIGN0eC5rZXkubGVuID0gdS0+dXJsLmxlbiArIHItPnVyaS5sZW4gLSB1LT5sb2NhdGlvbi0+bGVuICsgci0+YXJncy5sZW47Ci0gICAgY3R4LmtleS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBjdHgua2V5Lmxlbik7Ci0gICAgaWYgKGN0eC5rZXkuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgbGFzdCA9IG5neF9jcHltZW0oY3R4LmtleS5kYXRhLCB1LT51cmwuZGF0YSwgdS0+dXJsLmxlbik7Ci0KLSAgICBsYXN0ID0gbmd4X2NweW1lbShsYXN0LCByLT51cmkuZGF0YSArIHUtPmxvY2F0aW9uLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4pOwotCi0gICAgaWYgKHItPmFyZ3MubGVuID4gMCkgewotICAgICAgICAqKGxhc3QrKykgPSAnPyc7Ci0gICAgICAgIGxhc3QgPSBuZ3hfY3B5bWVtKGxhc3QsIHItPmFyZ3MuZGF0YSwgci0+YXJncy5sZW4pOwotICAgIH0KLQotICAgIHAtPmhlYWRlcl9pbiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgcC0+bGNmLT5oZWFkZXJfYnVmZmVyX3NpemUpOwotICAgIGlmIChwLT5oZWFkZXJfaW4gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLSAgICBwLT5oZWFkZXJfaW4tPnRhZyA9IChuZ3hfYnVmX3RhZ190KSAmbmd4X2h0dHBfcHJveHlfbW9kdWxlOwotCi0gICAgY3R4LmJ1ZiA9IHAtPmhlYWRlcl9pbjsKLSAgICBjdHgucGF0aCA9IHAtPmxjZi0+Y2FjaGVfcGF0aDsKLSAgICBjdHguZmlsZSA9IDE7Ci0gICAgY3R4LnByaW1hcnkgPSAxOwotCi0gICAgbmd4X2h0dHBfY2FjaGVfZ2V0KHIsICZjdHgpOwotCi0gICAgcmV0dXJuIG5neF9odHRwX3Byb3h5X3JlcXVlc3RfdXBzdHJlYW0ocCk7Ci19Ci0KLSNlbmRpZgotCi0KLXZvaWQgbmd4X2h0dHBfcHJveHlfcmRfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyKQotewotICAgIG5neF9odHRwX3Byb3h5X2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKHIsIHItPmNvbm5lY3Rpb24tPnJlYWQpOwotfQotCi0KLXZvaWQgbmd4X2h0dHBfcHJveHlfd3JfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyKQotewotICAgIG5neF9odHRwX3Byb3h5X2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKHIsIHItPmNvbm5lY3Rpb24tPnJlYWQpOwotfQotCi0KLXZvaWQgbmd4X2h0dHBfcHJveHlfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgIG5neF9ldmVudF90ICpldikKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgIG47Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICBidWZbMV07Ci0gICAgbmd4X2Vycl90ICAgICAgICAgICAgICBlcnI7Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICpjOwotICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICAqcDsKLQotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgZXYtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBjaGVjayBjbGllbnQsIHdyaXRlIGV2ZW50OiVkIiwgZXYtPndyaXRlKTsKLQotI2lmIChOR1hfSEFWRV9LUVVFVUUpCi0KLSAgICBpZiAobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9LUVVFVUVfRVZFTlQpIHsKLQotICAgICAgICBpZiAoIWV2LT5wZW5kaW5nX2VvZikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYyA9IHItPmNvbm5lY3Rpb247Ci0gICAgICAgIHAgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwotCi0gICAgICAgIGV2LT5lb2YgPSAxOwotCi0gICAgICAgIGlmIChldi0+a3FfZXJybm8pIHsKLSAgICAgICAgICAgIGV2LT5lcnJvciA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXAtPmNhY2hhYmxlICYmIHAtPnVwc3RyZWFtLT5wZWVyLmNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19JTkZPLCBldi0+bG9nLCBldi0+a3FfZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJrZXZlbnQoKSByZXBvcnRlZCB0aGF0IGNsaWVudCBjbG9zZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlbWF0dXJlbHkgY29ubmVjdGlvbiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAic28gdXBzdHJlYW0gY29ubmVjdGlvbiBpcyBjbG9zZWQgdG9vIik7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgZXYtPmxvZywgZXYtPmtxX2Vycm5vLAotICAgICAgICAgICAgICAgICAgICAgICJrZXZlbnQoKSByZXBvcnRlZCB0aGF0IGNsaWVudCBjbG9zZWQgIgotICAgICAgICAgICAgICAgICAgICAgICJwcmVtYXR1cmVseSBjb25uZWN0aW9uIik7Ci0KLSAgICAgICAgaWYgKHAtPnVwc3RyZWFtID09IE5VTEwgfHwgcC0+dXBzdHJlYW0tPnBlZXIuY29ubmVjdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIGMgPSByLT5jb25uZWN0aW9uOwotICAgIHAgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwotCi0gICAgbiA9IHJlY3YoYy0+ZmQsIGJ1ZiwgMSwgTVNHX1BFRUspOwotCi0gICAgZXJyID0gbmd4X3NvY2tldF9lcnJubzsKLQotICAgIC8qCi0gICAgICogd2UgZG8gbm90IG5lZWQgdG8gZGlzYWJsZSB0aGUgd3JpdGUgZXZlbnQgYmVjYXVzZQotICAgICAqIHRoYXQgZXZlbnQgaGFzIE5HWF9VU0VfQ0xFQVJfRVZFTlQgdHlwZQotICAgICAqLwotCi0gICAgaWYgKGV2LT53cml0ZSAmJiAobiA+PSAwIHx8IGVyciA9PSBOR1hfRUFHQUlOKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0xFVkVMX0VWRU5UKSAmJiBldi0+YWN0aXZlKSB7Ci0gICAgICAgIGlmIChuZ3hfZGVsX2V2ZW50KGV2LCBOR1hfUkVBRF9FVkVOVCwgMCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobiA+IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV2LT5lb2YgPSAxOwotCi0gICAgaWYgKG4gPT0gLTEpIHsKLSAgICAgICAgaWYgKGVyciA9PSBOR1hfRUFHQUlOKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBldi0+ZXJyb3IgPSAxOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogbiA9PSAwICovCi0gICAgICAgIGVyciA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCFwLT5jYWNoYWJsZSAmJiBwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uKSB7Ci0gICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19JTkZPLCBldi0+bG9nLCBlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBjbG9zZWQgcHJlbWF0dXJlbHkgY29ubmVjdGlvbiwgIgotICAgICAgICAgICAgICAgICAgICAgICJzbyB1cHN0cmVhbSBjb25uZWN0aW9uIGlzIGNsb3NlZCB0b28iKTsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9DTElFTlRfQ0xPU0VEX1JFUVVFU1QpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGV2LT5sb2csIGVyciwKLSAgICAgICAgICAgICAgICAgICJjbGllbnQgY2xvc2VkIHByZW1hdHVyZWx5IGNvbm5lY3Rpb24iKTsKLQotICAgIGlmIChwLT51cHN0cmVhbSA9PSBOVUxMIHx8IHAtPnVwc3RyZWFtLT5wZWVyLmNvbm5lY3Rpb24gPT0gTlVMTCkgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7Ci0gICAgfQotfQotCi0KLXZvaWQgbmd4X2h0dHBfcHJveHlfYnVzeV9sb2NrX2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldikKLXsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgKmM7Ci0gICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICpyOwotICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICAqcDsKLQotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgcmV2LT5sb2csIDAsICJodHRwIHByb3h5IGJ1c3kgbG9jayIpOwotCi0gICAgYyA9IHJldi0+ZGF0YTsKLSAgICByID0gYy0+ZGF0YTsKLSAgICBwID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKLSAgICBwLT5hY3Rpb24gPSAid2FpdGluZyB1cHN0cmVhbSBpbiBidXN5IGxvY2siOwotCi0gICAgaWYgKHAtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPndyaXRlLT5lb2YpIHsKLSAgICAgICAgbmd4X2h0dHBfYnVzeV91bmxvY2socC0+bGNmLT5idXN5X2xvY2ssICZwLT5idXN5X2xvY2spOwotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocmV2LT50aW1lZG91dCkgewotICAgICAgICByZXYtPnRpbWVkb3V0ID0gMDsKLSAgICAgICAgcC0+YnVzeV9sb2NrLnRpbWUrKzsKLSAgICAgICAgcC0+c3RhdGUtPmJsX3RpbWUgPSBwLT5idXN5X2xvY2sudGltZTsKLQotI2lmIChOR1hfSFRUUF9GSUxFX0NBQ0hFKQotCi0gICAgICAgIGlmIChwLT5zdGF0ZS0+Y2FjaGVfc3RhdGUgPCBOR1hfSFRUUF9QUk9YWV9DQUNIRV9NSVNTKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9idXN5X2xvY2socCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2NhY2hlX2J1c3lfbG9jayhwKTsKLSAgICAgICAgfQotI2Vsc2UKLQotICAgICAgICBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9idXN5X2xvY2socCk7Ci0KLSNlbmRpZgotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHJldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5OiBjbGllbnQgc2VudCB3aGlsZSBidXN5IGxvY2siKTsKLQotICAgIC8qCi0gICAgICogVE9ETzoga2V2ZW50KCkgbm90aWZ5IGFib3V0IGVycm9yLCBvdGhlcndpc2Ugd2UgbmVlZCB0bwotICAgICAqIGNhbGwgbmd4X3BlZWsoKTogcmVjdihNU0dfUEVFSykgdG8gZ2V0IGVycm5vLiBUSElOSyBhYm91dCBhaW8uCi0gICAgICogaWYgdGhlcmUncyBubyBlcnJvciB3ZSBuZWVkIHRvIGRpc2FibGUgZXZlbnQuCi0gICAgICovCi0KLSNpZiAwCi0jaWYgKE5HWF9IQVZFX0tRVUVVRSkKLQotICAgIGlmICgobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9LUVVFVUVfRVZFTlQpICYmIHJldi0+a3FfZW9mKSB7Ci0gICAgICAgIG5neF9odHRwX2J1c3lfdW5sb2NrKHAtPmxjZi0+YnVzeV9sb2NrLCAmcC0+YnVzeV9sb2NrKTsKLQotICAgICAgICBuZ3hfZGVsX3RpbWVyKHJldik7Ci0KLSAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgYy0+bG9nLCByZXYtPmtxX2Vycm5vLAotICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQoKSBjbG9zZWQgY29ubmVjdGlvbiIpOwotCi0gICAgICAgIGlmIChuZ3hfZGVsX2V2ZW50KHJldiwgTkdYX1JFQURfRVZFTlQsIE5HWF9DTE9TRV9FVkVOVCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNlbmRpZgotI2VuZGlmCi0KLX0KLQotCi12b2lkIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcHJveHlfY3R4X3QgKnAsIGludCByYykKLXsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICpyOwotCi0gICAgciA9IHAtPnJlcXVlc3Q7Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiZmluYWxpemUgaHR0cCBwcm94eSByZXF1ZXN0Iik7Ci0KLSAgICBpZiAocC0+dXBzdHJlYW0gJiYgcC0+dXBzdHJlYW0tPnBlZXIuY29ubmVjdGlvbikgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9jbG9zZV9jb25uZWN0aW9uKHApOwotICAgIH0KLQotICAgIGlmIChwLT5oZWFkZXJfc2VudAotICAgICAgICAmJiAocmMgPT0gTkdYX0VSUk9SIHx8IHJjID49IE5HWF9IVFRQX1NQRUNJQUxfUkVTUE9OU0UpKQotICAgIHsKLSAgICAgICAgcmMgPSAwOwotICAgIH0KLQotICAgIGlmIChwLT5zYXZlZF9jdHgpIHsKLSAgICAgICAgci0+Y29ubmVjdGlvbi0+bG9nLT5kYXRhID0gcC0+c2F2ZWRfY3R4OwotICAgICAgICByLT5jb25uZWN0aW9uLT5sb2ctPmhhbmRsZXIgPSBwLT5zYXZlZF9oYW5kbGVyOwotICAgIH0KLQotICAgIGlmIChwLT51cHN0cmVhbSAmJiBwLT51cHN0cmVhbS0+ZXZlbnRfcGlwZSkgewotICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgdGVtcCBmZDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBwLT51cHN0cmVhbS0+ZXZlbnRfcGlwZS0+dGVtcF9maWxlLT5maWxlLmZkKTsKLSAgICB9Ci0KLSAgICBpZiAocC0+Y2FjaGUpIHsKLSAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IGNhY2hlIGZkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHAtPmNhY2hlLT5jdHguZmlsZS5mZCk7Ci0gICAgfQotCi0gICAgaWYgKHJjID09IDAgJiYgci0+bWFpbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJjID0gbmd4X2h0dHBfc2VuZF9sYXN0KHIpOwotICAgIH0KLQotICAgIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3QociwgcmMpOwotfQotCi0KLXZvaWQgbmd4X2h0dHBfcHJveHlfY2xvc2VfY29ubmVjdGlvbihuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKLXsKLSAgICBuZ3hfc29ja2V0X3QgICAgICAgZmQ7Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgKmM7Ci0KLSAgICBjID0gcC0+dXBzdHJlYW0tPnBlZXIuY29ubmVjdGlvbjsKLSAgICBwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uID0gTlVMTDsKLQotICAgIGlmIChwLT5sY2YtPmJ1c3lfbG9jaykgewotICAgICAgICBwLT5sY2YtPmJ1c3lfbG9jay0+YnVzeS0tOwotICAgIH0KLQotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgYy0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IGNsb3NlIGNvbm5lY3Rpb246ICVkIiwgYy0+ZmQpOwotCi0gICAgaWYgKGMtPmZkID09IC0xKSB7Ci0jaWYgMAotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGMtPmxvZywgMCwgImNvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQiKTsKLSNlbmRpZgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGMtPnJlYWQtPnRpbWVyX3NldCkgewotICAgICAgICBuZ3hfZGVsX3RpbWVyKGMtPnJlYWQpOwotICAgIH0KLQotICAgIGlmIChjLT53cml0ZS0+dGltZXJfc2V0KSB7Ci0gICAgICAgIG5neF9kZWxfdGltZXIoYy0+d3JpdGUpOwotICAgIH0KLQotICAgIC8qIFRPRE86IG1vdmUgY29ubmVjdGlvbiB0byB0aGUgY29ubmVjdGlvbiBwb29sICovCi0KLSAgICBpZiAobmd4X2RlbF9jb25uKSB7Ci0gICAgICAgIG5neF9kZWxfY29ubihjLCBOR1hfQ0xPU0VfRVZFTlQpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGMtPnJlYWQtPmFjdGl2ZSB8fCBjLT5yZWFkLT5kaXNhYmxlZCkgewotICAgICAgICAgICAgbmd4X2RlbF9ldmVudChjLT5yZWFkLCBOR1hfUkVBRF9FVkVOVCwgTkdYX0NMT1NFX0VWRU5UKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjLT53cml0ZS0+YWN0aXZlIHx8IGMtPnJlYWQtPmRpc2FibGVkKSB7Ci0gICAgICAgICAgICBuZ3hfZGVsX2V2ZW50KGMtPndyaXRlLCBOR1hfV1JJVEVfRVZFTlQsIE5HWF9DTE9TRV9FVkVOVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHdlIGhhdmUgdG8gY2xlYW4gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBjbG9zaW5nCi0gICAgICogYmVjYXVzZSBhbm90aGVyIHRocmVhZCBtYXkgcmVvcGVuIHRoZSBzYW1lIGZpbGUgZGVzY3JpcHRvcgotICAgICAqIGJlZm9yZSB3ZSBjbGVhbiB0aGUgY29ubmVjdGlvbgotICAgICAqLwotCi0gICAgaWYgKG5neF9tdXRleF9sb2NrKG5neF9wb3N0ZWRfZXZlbnRzX211dGV4KSA9PSBOR1hfT0spIHsKLQotICAgICAgICBpZiAoYy0+cmVhZC0+cHJldikgewotICAgICAgICAgICAgbmd4X2RlbGV0ZV9wb3N0ZWRfZXZlbnQoYy0+cmVhZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYy0+d3JpdGUtPnByZXYpIHsKLSAgICAgICAgICAgIG5neF9kZWxldGVfcG9zdGVkX2V2ZW50KGMtPndyaXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGMtPnJlYWQtPmNsb3NlZCA9IDE7Ci0gICAgICAgIGMtPndyaXRlLT5jbG9zZWQgPSAxOwotCi0gICAgICAgIG5neF9tdXRleF91bmxvY2sobmd4X3Bvc3RlZF9ldmVudHNfbXV0ZXgpOwotICAgIH0KLQotICAgIGZkID0gYy0+ZmQ7Ci0gICAgYy0+ZmQgPSAobmd4X3NvY2tldF90KSAtMTsKLSAgICBjLT5kYXRhID0gTlVMTDsKLQotICAgIGlmIChuZ3hfY2xvc2Vfc29ja2V0KGZkKSA9PSAtMSkgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGMtPmxvZywgbmd4X3NvY2tldF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2xvc2Vfc29ja2V0X24gIiBmYWlsZWQiKTsKLSAgICB9Ci19Ci0KLQotdV9jaGFyICpuZ3hfaHR0cF9wcm94eV9sb2dfZXJyb3Iobmd4X2xvZ190ICpsb2csIHVfY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgKnA7Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgKnI7Ci0gICAgbmd4X3BlZXJfY29ubmVjdGlvbl90ICAgICAgICAgICAqcGVlcjsKLSAgICBuZ3hfaHR0cF9wcm94eV9sb2dfY3R4X3QgICAgICAgICpjdHg7Ci0gICAgbmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fY29uZl90ICAqdWM7Ci0KLSAgICBjdHggPSBsb2ctPmRhdGE7Ci0gICAgciA9IGN0eC0+cHJveHktPnJlcXVlc3Q7Ci0gICAgdWMgPSBjdHgtPnByb3h5LT5sY2YtPnVwc3RyZWFtOwotICAgIHBlZXIgPSAmY3R4LT5wcm94eS0+dXBzdHJlYW0tPnBlZXI7Ci0KLSAgICBwID0gbmd4X3NucHJpbnRmKGJ1ZiwgbGVuLAotICAgICAgICAgICAgICAgICAgICAgIiB3aGlsZSAlcywgY2xpZW50OiAlViwgc2VydmVyOiAlViwgVVJMOiBcIiVWXCIsIgotICAgICAgICAgICAgICAgICAgICAgIiB1cHN0cmVhbTogaHR0cDovLyVWJXMlViIsCi0gICAgICAgICAgICAgICAgICAgICBjdHgtPnByb3h5LT5hY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAmci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgJnItPnNlcnZlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgJnItPnVucGFyc2VkX3VyaSwKLSAgICAgICAgICAgICAgICAgICAgICZwZWVyLT5wZWVycy0+cGVlcltwZWVyLT5jdXJfcGVlcl0ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGN0eC0+cHJveHktPmxjZi0+dXBzdHJlYW0tPnVyaV9zZXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAmY3R4LT5wcm94eS0+bGNmLT51cHN0cmVhbS0+dXJpKTsKLSAgICBsZW4gLT0gcCAtIGJ1ZjsKLSAgICBidWYgPSBwOwotCi0gICAgaWYgKGN0eC0+cHJveHktPmxjZi0+cGFzc191bnBhcnNlZF91cmkgJiYgci0+dmFsaWRfdW5wYXJzZWRfdXJpKSB7Ci0gICAgICAgIHAgPSBuZ3hfY3B5bWVtKGJ1Ziwgci0+dW5wYXJzZWRfdXJpLmRhdGEgKyAxLCByLT51bnBhcnNlZF91cmkubGVuIC0gMSk7Ci0gICAgICAgIGxlbiAtPSBwIC0gYnVmOwotCi0gICAgICAgIHJldHVybiBuZ3hfaHR0cF9sb2dfZXJyb3JfaW5mbyhyLCBwLCBsZW4pOwotICAgIH0KLQotICAgIGlmIChyLT5xdW90ZWRfdXJpKSB7Ci0gICAgICAgIGVzY2FwZSA9IDIgKiBuZ3hfZXNjYXBlX3VyaShOVUxMLCByLT51cmkuZGF0YSArIHVjLT5sb2NhdGlvbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHVjLT5sb2NhdGlvbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0VTQ0FQRV9VUkkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVzY2FwZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGVzY2FwZSkgewotICAgICAgICBpZiAobGVuID49IHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbiArIGVzY2FwZSkgewotCi0gICAgICAgICAgICBuZ3hfZXNjYXBlX3VyaShidWYsIHItPnVyaS5kYXRhICsgdWMtPmxvY2F0aW9uLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdWMtPmxvY2F0aW9uLT5sZW4sIE5HWF9FU0NBUEVfVVJJKTsKLQotICAgICAgICAgICAgYnVmICs9IHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbiArIGVzY2FwZTsKLSAgICAgICAgICAgIGxlbiAtPSByLT51cmkubGVuIC0gdWMtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGU7Ci0KLSAgICAgICAgICAgIGlmIChyLT5hcmdzLmxlbikgewotICAgICAgICAgICAgICAgIHAgPSBuZ3hfc25wcmludGYoYnVmLCBsZW4sICI/JVYiLCAmci0+YXJncyk7Ci0gICAgICAgICAgICAgICAgbGVuIC09IHAgLSBidWY7Ci0gICAgICAgICAgICAgICAgYnVmID0gcDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2xvZ19lcnJvcl9pbmZvKHIsIGJ1ZiwgbGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbiArIGVzY2FwZSk7Ci0gICAgICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBidWY7Ci0gICAgICAgIH0KLQotICAgICAgICBuZ3hfZXNjYXBlX3VyaShwLCByLT51cmkuZGF0YSArIHVjLT5sb2NhdGlvbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdWMtPmxvY2F0aW9uLT5sZW4sIE5HWF9FU0NBUEVfVVJJKTsKLQotICAgICAgICBwID0gbmd4X2NweW1lbShidWYsIHAsIHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbiArIGVzY2FwZSk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBwID0gbmd4X2NweW1lbShidWYsIHItPnVyaS5kYXRhICsgdWMtPmxvY2F0aW9uLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbik7Ci0gICAgfQotCi0gICAgbGVuIC09IHAgLSBidWY7Ci0gICAgYnVmID0gcDsKLQotICAgIGlmIChyLT5hcmdzLmxlbikgewotICAgICAgICBwID0gbmd4X3NucHJpbnRmKGJ1ZiwgbGVuLCAiPyVWIiwgJnItPmFyZ3MpOwotICAgICAgICBsZW4gLT0gcCAtIGJ1ZjsKLSAgICAgICAgYnVmID0gcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmd4X2h0dHBfbG9nX2Vycm9yX2luZm8ociwgYnVmLCBsZW4pOwotfQotCi0KLXN0YXRpYyBzaXplX3Qgbmd4X2h0dHBfcHJveHlfbG9nX3Byb3h5X3N0YXRlX2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpCi17Ci0gICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgICpwOwotCi0gICAgcCA9IG5neF9odHRwX2dldF9tb2R1bGVfZXJyX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwotCi0gICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcC0+c3RhdGVzLm5lbHRzICogLyogU1RVQiAqLyAxMDA7Ci19Ci0KLQotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfcHJveHlfbG9nX3Byb3h5X3N0YXRlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCi17Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgIGk7Ci0gICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgICAgKnA7Ci0gICAgbmd4X2h0dHBfcHJveHlfc3RhdGVfdCAgKnN0YXRlOwotCi0gICAgcCA9IG5neF9odHRwX2dldF9tb2R1bGVfZXJyX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwotCi0gICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICAqYnVmID0gJy0nOwotICAgICAgICByZXR1cm4gYnVmICsgMTsKLSAgICB9Ci0KLSAgICBpID0gMDsKLSAgICBzdGF0ZSA9IHAtPnN0YXRlcy5lbHRzOwotCi0gICAgZm9yICggOzsgKSB7Ci0gICAgICAgIGlmIChzdGF0ZVtpXS5jYWNoZV9zdGF0ZSA9PSAwKSB7Ci0gICAgICAgICAgICAqYnVmKysgPSAnLSc7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZiA9IG5neF9jcHltZW0oYnVmLCBjYWNoZV9zdGF0ZXNbc3RhdGVbaV0uY2FjaGVfc3RhdGUgLSAxXS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zdGF0ZXNbc3RhdGVbaV0uY2FjaGVfc3RhdGUgLSAxXS5sZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgKmJ1ZisrID0gJy8nOwotCi0gICAgICAgIGlmIChzdGF0ZVtpXS5leHBpcmVkID09IDApIHsKLSAgICAgICAgICAgICpidWYrKyA9ICctJzsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmID0gbmd4X3NwcmludGYoYnVmLCAiJVQiLCBzdGF0ZVtpXS5leHBpcmVkKTsKLSAgICAgICAgfQotCi0gICAgICAgICpidWYrKyA9ICcvJzsKLQotICAgICAgICBpZiAoc3RhdGVbaV0uYmxfdGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAqYnVmKysgPSAnLSc7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZiA9IG5neF9zcHJpbnRmKGJ1ZiwgIiVUIiwgc3RhdGVbaV0uYmxfdGltZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAqYnVmKysgPSAnLyc7Ci0KLSAgICAgICAgKmJ1ZisrID0gJyonOwotCi0gICAgICAgICpidWYrKyA9ICcgJzsKLQotICAgICAgICBpZiAoc3RhdGVbaV0uc3RhdHVzID09IDApIHsKLSAgICAgICAgICAgICpidWYrKyA9ICctJzsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmID0gbmd4X3NwcmludGYoYnVmLCAiJXVpIiwgc3RhdGVbaV0uc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgICpidWYrKyA9ICcvJzsKLQotICAgICAgICBpZiAoc3RhdGVbaV0ucmVhc29uID09IDApIHsKLSAgICAgICAgICAgICpidWYrKyA9ICctJzsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmID0gbmd4X2NweW1lbShidWYsIGNhY2hlX3JlYXNvbnNbc3RhdGVbaV0ucmVhc29uIC0gMV0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfcmVhc29uc1tzdGF0ZVtpXS5yZWFzb24gLSAxXS5sZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgKmJ1ZisrID0gJy8nOwotCi0gICAgICAgIGlmIChzdGF0ZVtpXS5yZWFzb24gPCBOR1hfSFRUUF9QUk9YWV9DQUNIRV9YQUUpIHsKLSAgICAgICAgICAgICpidWYrKyA9ICctJzsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmID0gbmd4X3NwcmludGYoYnVmLCAiJVQiLCBzdGF0ZVtpXS5leHBpcmVzKTsKLSAgICAgICAgfQotCi0gICAgICAgICpidWYrKyA9ICcgJzsKLSAgICAgICAgKmJ1ZisrID0gJyonOwotCi0gICAgICAgIGlmICgrK2kgPT0gcC0+c3RhdGVzLm5lbHRzKSB7Ci0gICAgICAgICAgICByZXR1cm4gYnVmOwotICAgICAgICB9Ci0KLSAgICAgICAgKmJ1ZisrID0gJywnOwotICAgICAgICAqYnVmKysgPSAnICc7Ci0gICAgfQotfQotCi0KLSNpZiAwCi0KLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Byb3h5X2xvZ19jYWNoZV9zdGF0ZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsIHVpbnRwdHJfdCBkYXRhKQotewotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICBpOwotICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICAgICpwOwotICAgIG5neF9odHRwX3Byb3h5X3N0YXRlX3QgICpzdGF0ZTsKLQotICAgIHAgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2Vycl9jdHgociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKLQotICAgIGlmIChwID09IE5VTEwgfHwgcC0+c3RhdGUtPmNhY2hlX3N0YXRlID09IDApIHsKLSAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgKmJ1ZiA9ICctJzsKLSAgICAgICAgcmV0dXJuIGJ1ZiArIDE7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIGZpbmQgdGhlIHJlcXVlc3QgbGluZSBsZW5ndGggKi8KLSAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgKHAtPnN0YXRlcy5uZWx0cyAqIHNpemVvZigiQllQQVNTIikgLSAxKTsKLSAgICB9Ci0KLSAgICBpID0gMDsKLSAgICBzdGF0ZSA9IHAtPnN0YXRlcy5lbHRzOwotCi0gICAgZm9yICggOzsgKSB7Ci0gICAgICAgIGJ1ZiA9IG5neF9jcHltZW0oYnVmLCBjYWNoZV9zdGF0ZXNbc3RhdGVbaV0uY2FjaGVfc3RhdGUgLSAxXS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3N0YXRlc1tzdGF0ZVtpXS5jYWNoZV9zdGF0ZSAtIDFdLmxlbik7Ci0KLSAgICAgICAgaWYgKCsraSA9PSBwLT5zdGF0ZXMubmVsdHMpIHsKLSAgICAgICAgICAgIHJldHVybiBidWY7Ci0gICAgICAgIH0KLQotICAgICAgICAqYnVmKysgPSAnLCc7Ci0gICAgICAgICpidWYrKyA9ICcgJzsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfcHJveHlfbG9nX3JlYXNvbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKLXsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgaTsKLSAgICBuZ3hfaHR0cF9wcm94eV9jdHhfdCAgICAqcDsKLSAgICBuZ3hfaHR0cF9wcm94eV9zdGF0ZV90ICAqc3RhdGU7Ci0KLSAgICBwID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9lcnJfY3R4KHIsIG5neF9odHRwX3Byb3h5X21vZHVsZSk7Ci0KLSAgICBpZiAocCA9PSBOVUxMIHx8IHAtPnN0YXRlLT5yZWFzb24gPT0gMCkgewotICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopIDE7Ci0gICAgICAgIH0KLQotICAgICAgICAqYnVmID0gJy0nOwotICAgICAgICByZXR1cm4gYnVmICsgMTsKLSAgICB9Ci0KLSAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgLyogZmluZCB0aGUgcmVxdWVzdCBsaW5lIGxlbmd0aCAqLwotICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAocC0+c3RhdGVzLm5lbHRzICogc2l6ZW9mKCJCUFMiKSAtIDEpOwotICAgIH0KLQotICAgIGkgPSAwOwotICAgIHN0YXRlID0gcC0+c3RhdGVzLmVsdHM7Ci0KLSAgICBmb3IgKCA7OyApIHsKLSAgICAgICAgYnVmID0gbmd4X2NweW1lbShidWYsIGNhY2hlX3JlYXNvbnNbc3RhdGVbaV0ucmVhc29uIC0gMV0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9yZWFzb25zW3N0YXRlW2ldLnJlYXNvbiAtIDFdLmxlbik7Ci0KLSAgICAgICAgaWYgKCsraSA9PSBwLT5zdGF0ZXMubmVsdHMpIHsKLSAgICAgICAgICAgIHJldHVybiBidWY7Ci0gICAgICAgIH0KLQotICAgICAgICAqYnVmKysgPSAnLCc7Ci0gICAgICAgICpidWYrKyA9ICcgJzsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0KLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfYWRkX2xvZ19mb3JtYXRzKG5neF9jb25mX3QgKmNmKQotewotICAgIG5neF9odHRwX2xvZ19vcF9uYW1lX3QgICpvcDsKLQotICAgIGZvciAob3AgPSBuZ3hfaHR0cF9wcm94eV9sb2dfZm10X29wczsgb3AtPm5hbWUubGVuOyBvcCsrKSB7IC8qIHZvaWQgKi8gfQotICAgIG9wLT5ydW4gPSBOVUxMOwotCi0gICAgZm9yIChvcCA9IG5neF9odHRwX2xvZ19mbXRfb3BzOyBvcC0+cnVuOyBvcCsrKSB7Ci0gICAgICAgIGlmIChvcC0+bmFtZS5sZW4gPT0gMCkgewotICAgICAgICAgICAgb3AgPSAobmd4X2h0dHBfbG9nX29wX25hbWVfdCAqKSBvcC0+cnVuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb3AtPnJ1biA9IChuZ3hfaHR0cF9sb2dfb3BfcnVuX3B0KSBuZ3hfaHR0cF9wcm94eV9sb2dfZm10X29wczsKLQotICAgIHJldHVybiBOR1hfT0s7Ci19Ci0KLQotc3RhdGljIHZvaWQgKm5neF9odHRwX3Byb3h5X2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZikKLXsKLSAgICBuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90ICAqY29uZjsKLQotICAgIGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QpKTsKLSAgICBpZiAoY29uZiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHNldCBieSBuZ3hfcGNhbGxvYygpOgotICAgICAqCi0gICAgICogICAgY29uZi0+YnVmcy5udW0gPSAwOwotICAgICAqICAgIGNvbmYtPnBhdGggPSBOVUxMOwotICAgICAqICAgIGNvbmYtPm5leHRfdXBzdHJlYW0gPSAwOwotICAgICAqICAgIGNvbmYtPnVzZV9zdGFsZSA9IDA7Ci0gICAgICogICAgY29uZi0+dXBzdHJlYW1zID0gTlVMTDsKLSAgICAgKiAgICBjb25mLT5wZWVycyA9IE5VTEw7Ci0gICAgICogICAgY29uZi0+Y2FjaGVfcGF0aCA9IE5VTEw7Ci0gICAgICogICAgY29uZi0+dGVtcF9wYXRoID0gTlVMTDsKLSAgICAgKiAgICBjb25mLT54X3ZhcnM7Ci0gICAgICogICAgY29uZi0+YnVzeV9sb2NrID0gTlVMTDsKLSAgICAgKi8KLQotICAgIGNvbmYtPmNvbm5lY3RfdGltZW91dCA9IE5HWF9DT05GX1VOU0VUX01TRUM7Ci0gICAgY29uZi0+c2VuZF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKLSAgICBjb25mLT5zZW5kX2xvd2F0ID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKLQotICAgIGNvbmYtPnBhc3NfdW5wYXJzZWRfdXJpID0gTkdYX0NPTkZfVU5TRVQ7Ci0gICAgY29uZi0+cHJlc2VydmVfaG9zdCA9IE5HWF9DT05GX1VOU0VUOwotICAgIGNvbmYtPnNldF94X3VybCA9IE5HWF9DT05GX1VOU0VUOwotICAgIGNvbmYtPnNldF94X3JlYWxfaXAgPSBOR1hfQ09ORl9VTlNFVDsKLSAgICBjb25mLT5hZGRfeF9mb3J3YXJkZWRfZm9yID0gTkdYX0NPTkZfVU5TRVQ7Ci0KLSAgICBjb25mLT5oZWFkZXJfYnVmZmVyX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwotICAgIGNvbmYtPnJlYWRfdGltZW91dCA9IE5HWF9DT05GX1VOU0VUX01TRUM7Ci0gICAgY29uZi0+YnVzeV9idWZmZXJzX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwotCi0gICAgY29uZi0+bWF4X3RlbXBfZmlsZV9zaXplID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKLSAgICBjb25mLT50ZW1wX2ZpbGVfd3JpdGVfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7Ci0KLSAgICAvKiAicHJveHlfY3ljbGljX3RlbXBfZmlsZSIgaXMgZGlzYWJsZWQgKi8KLSAgICBjb25mLT5jeWNsaWNfdGVtcF9maWxlID0gMDsKLQotICAgIGNvbmYtPmNhY2hlID0gTkdYX0NPTkZfVU5TRVQ7Ci0KLSAgICBjb25mLT5wYXNzX3NlcnZlciA9IE5HWF9DT05GX1VOU0VUOwotICAgIGNvbmYtPnBhc3NfeF9hY2NlbF9leHBpcmVzID0gTkdYX0NPTkZfVU5TRVQ7Ci0gICAgY29uZi0+aWdub3JlX2V4cGlyZXMgPSBOR1hfQ09ORl9VTlNFVDsKLSAgICBjb25mLT5sbV9mYWN0b3IgPSBOR1hfQ09ORl9VTlNFVDsKLSAgICBjb25mLT5kZWZhdWx0X2V4cGlyZXMgPSBOR1hfQ09ORl9VTlNFVDsKLQotICAgIHJldHVybiBjb25mOwotfQotCi0KLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQotewotICAgIG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QgKnByZXYgPSBwYXJlbnQ7Ci0gICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAqY29uZiA9IGNoaWxkOwotCi0gICAgc2l6ZV90ICAgc2l6ZTsKLQotICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+Y29ubmVjdF90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+Y29ubmVjdF90aW1lb3V0LCA2MDAwMCk7Ci0gICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT5zZW5kX3RpbWVvdXQsIHByZXYtPnNlbmRfdGltZW91dCwgNjAwMDApOwotICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+c2VuZF9sb3dhdCwgcHJldi0+c2VuZF9sb3dhdCwgMCk7Ci0KLSAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5wYXNzX3VucGFyc2VkX3VyaSwgcHJldi0+cGFzc191bnBhcnNlZF91cmksIDApOwotCi0gICAgaWYgKGNvbmYtPnBhc3NfdW5wYXJzZWRfdXJpICYmIGNvbmYtPnVwc3RyZWFtLT5sb2NhdGlvbi0+bGVuID4gMSkgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIlwicHJveHlfcGFzc191bnBhcnNlZF91cmlcIiBjYW4gYmUgc2V0IGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgImxvY2F0aW9uIFwiL1wiIG9yIGdpdmVuIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbi4iKTsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnByZXNlcnZlX2hvc3QsIHByZXYtPnByZXNlcnZlX2hvc3QsIDApOwotICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnNldF94X3VybCwgcHJldi0+c2V0X3hfdXJsLCAwKTsKLSAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5zZXRfeF9yZWFsX2lwLCBwcmV2LT5zZXRfeF9yZWFsX2lwLCAwKTsKLSAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5hZGRfeF9mb3J3YXJkZWRfZm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmFkZF94X2ZvcndhcmRlZF9mb3IsIDApOwotCi0gICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT5yZWFkX3RpbWVvdXQsIHByZXYtPnJlYWRfdGltZW91dCwgNjAwMDApOwotCi0gICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT5oZWFkZXJfYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5oZWFkZXJfYnVmZmVyX3NpemUsIChzaXplX3QpIG5neF9wYWdlc2l6ZSk7Ci0KLSAgICBuZ3hfY29uZl9tZXJnZV9idWZzX3ZhbHVlKGNvbmYtPmJ1ZnMsIHByZXYtPmJ1ZnMsIDgsIG5neF9wYWdlc2l6ZSk7Ci0KLSAgICBpZiAoY29uZi0+YnVmcy5udW0gPCAyKSB7Ci0gICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDIgXCJwcm94eV9idWZmZXJzXCIiKTsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotICAgIHNpemUgPSBjb25mLT5oZWFkZXJfYnVmZmVyX3NpemU7Ci0gICAgaWYgKHNpemUgPCBjb25mLT5idWZzLnNpemUpIHsKLSAgICAgICAgc2l6ZSA9IGNvbmYtPmJ1ZnMuc2l6ZTsKLSAgICB9Ci0KLQotICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+YnVzeV9idWZmZXJzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5idXN5X2J1ZmZlcnNfc2l6ZSwgTkdYX0NPTkZfVU5TRVRfU0laRSk7Ci0KLSAgICBpZiAoY29uZi0+YnVzeV9idWZmZXJzX3NpemUgPT0gTkdYX0NPTkZfVU5TRVRfU0laRSkgewotICAgICAgICBjb25mLT5idXN5X2J1ZmZlcnNfc2l6ZSA9IDIgKiBzaXplOwotCi0gICAgfSBlbHNlIGlmIChjb25mLT5idXN5X2J1ZmZlcnNfc2l6ZSA8IHNpemUpIHsKLSAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAotICAgICAgICAgICAgICJcInByb3h5X2J1c3lfYnVmZmVyc19zaXplXCIgbXVzdCBiZSBlcXVhbCBvciBiaWdnZXIgdGhhbiAiCi0gICAgICAgICAgICAgIm1heGltdW0gb2YgdGhlIHZhbHVlIG9mIFwicHJveHlfaGVhZGVyX2J1ZmZlcl9zaXplXCIgYW5kICIKLSAgICAgICAgICAgICAib25lIG9mIHRoZSBcInByb3h5X2J1ZmZlcnNcIiIpOwotCi0gICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLQotICAgIH0gZWxzZSBpZiAoY29uZi0+YnVzeV9idWZmZXJzX3NpemUgPiAoY29uZi0+YnVmcy5udW0gLSAxKSAqIGNvbmYtPmJ1ZnMuc2l6ZSkKLSAgICB7Ci0gICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAiXCJwcm94eV9idXN5X2J1ZmZlcnNfc2l6ZVwiIG11c3QgYmUgbGVzcyB0aGFuICIKLSAgICAgICAgICAgICAidGhlIHNpemUgb2YgYWxsIFwicHJveHlfYnVmZmVyc1wiIG1pbnVzIG9uZSBidWZmZXIiKTsKLQotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCi0KLSAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPnRlbXBfZmlsZV93cml0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dGVtcF9maWxlX3dyaXRlX3NpemUsIE5HWF9DT05GX1VOU0VUX1NJWkUpOwotCi0gICAgaWYgKGNvbmYtPnRlbXBfZmlsZV93cml0ZV9zaXplID09IE5HWF9DT05GX1VOU0VUX1NJWkUpIHsKLSAgICAgICAgY29uZi0+dGVtcF9maWxlX3dyaXRlX3NpemUgPSAyICogc2l6ZTsKLQotICAgIH0gZWxzZSBpZiAoY29uZi0+dGVtcF9maWxlX3dyaXRlX3NpemUgPCBzaXplKSB7Ci0gICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAiXCJwcm94eV90ZW1wX2ZpbGVfd3JpdGVfc2l6ZVwiIG11c3QgYmUgZXF1YWwgb3IgYmlnZ2VyIHRoYW4gIgotICAgICAgICAgICAgICJtYXhpbXVtIG9mIHRoZSB2YWx1ZSBvZiBcInByb3h5X2hlYWRlcl9idWZmZXJfc2l6ZVwiIGFuZCAiCi0gICAgICAgICAgICAgIm9uZSBvZiB0aGUgXCJwcm94eV9idWZmZXJzXCIiKTsKLQotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCi0KLSAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPm1heF90ZW1wX2ZpbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPm1heF90ZW1wX2ZpbGVfc2l6ZSwgTkdYX0NPTkZfVU5TRVRfU0laRSk7Ci0KLSAgICBpZiAoY29uZi0+bWF4X3RlbXBfZmlsZV9zaXplID09IE5HWF9DT05GX1VOU0VUX1NJWkUpIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiAicHJveHlfbWF4X3RlbXBfZmlsZV9zaXplIiBpcyBzZXQgdG8gMUcgZm9yIHJldmVyc2UgcHJveHksCi0gICAgICAgICAqIGl0IHNob3VsZCBiZSBtdWNoIGxlc3MgaW4gdGhlIGdlbmVyaWMgcHJveHkKLSAgICAgICAgICovCi0KLSAgICAgICAgY29uZi0+bWF4X3RlbXBfZmlsZV9zaXplID0gMTAyNCAqIDEwMjQgKiAxMDI0OwotCi0jaWYgMAotICAgICAgICBjb25mLT5tYXhfdGVtcF9maWxlX3NpemUgPSAyICogc2l6ZTsKLSNlbmRpZgotCi0KLSAgICB9IGVsc2UgaWYgKGNvbmYtPm1heF90ZW1wX2ZpbGVfc2l6ZSAhPSAwCi0gICAgICAgICAgICAgICAmJiBjb25mLT5tYXhfdGVtcF9maWxlX3NpemUgPCBzaXplKQotICAgIHsKLSAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAotICAgICAgICAgICAgICJcInByb3h5X21heF90ZW1wX2ZpbGVfc2l6ZVwiIG11c3QgYmUgZXF1YWwgdG8gemVybyB0byBkaXNhYmxlICIKLSAgICAgICAgICAgICAidGhlIHRlbXBvcmFyeSBmaWxlcyB1c2FnZSBvciBtdXN0IGJlIGVxdWFsIG9yIGJpZ2dlciB0aGFuICIKLSAgICAgICAgICAgICAibWF4aW11bSBvZiB0aGUgdmFsdWUgb2YgXCJwcm94eV9oZWFkZXJfYnVmZmVyX3NpemVcIiBhbmQgIgotICAgICAgICAgICAgICJvbmUgb2YgdGhlIFwicHJveHlfYnVmZmVyc1wiIik7Ci0KLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotCi0gICAgbmd4X2NvbmZfbWVyZ2VfYml0bWFza192YWx1ZShjb25mLT5uZXh0X3Vwc3RyZWFtLCBwcmV2LT5uZXh0X3Vwc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5HWF9DT05GX0JJVE1BU0tfU0VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX1BST1hZX0ZUX0VSUk9SCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX1BST1hZX0ZUX1RJTUVPVVQpKTsKLQotICAgIG5neF9jb25mX21lcmdlX2JpdG1hc2tfdmFsdWUoY29uZi0+dXNlX3N0YWxlLCBwcmV2LT51c2Vfc3RhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9CSVRNQVNLX1NFVCk7Ci0KLSNpZiAwCi0gICAgbmd4X2NvbmZfbWVyZ2VfcGF0aF92YWx1ZShjb25mLT5jYWNoZV9wYXRoLCBwcmV2LT5jYWNoZV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfUFJPWFlfQ0FDSEVfUEFUSCwgMSwgMiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9nYXJiYWdlX2NvbGxlY3Rvcl90ZW1wX2hhbmRsZXIsIGNmKTsKLSNlbmRpZgotCi0gICAgbmd4X2NvbmZfbWVyZ2VfcGF0aF92YWx1ZShjb25mLT50ZW1wX3BhdGgsIHByZXYtPnRlbXBfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX1BST1hZX1RFTVBfUEFUSCwgMSwgMiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9nYXJiYWdlX2NvbGxlY3Rvcl90ZW1wX2hhbmRsZXIsIGNmKTsKLQotICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmNhY2hlLCBwcmV2LT5jYWNoZSwgMCk7Ci0KLQotICAgIC8qIGNvbmYtPmNhY2hlIG11c3QgYmUgbWVyZ2VkICovCi0KLSAgICBpZiAoY29uZi0+YnVzeV9sb2NrID09IE5VTEwpIHsKLSAgICAgICAgY29uZi0+YnVzeV9sb2NrID0gcHJldi0+YnVzeV9sb2NrOwotICAgIH0KLQotICAgIGlmIChjb25mLT5idXN5X2xvY2sgJiYgY29uZi0+Y2FjaGUgJiYgY29uZi0+YnVzeV9sb2NrLT5tZDUgPT0gTlVMTCkgewotCi0gICAgICAgIC8qIG5neF9jYWxsb2Nfc2hhcmVkKCkgKi8KLSAgICAgICAgY29uZi0+YnVzeV9sb2NrLT5tZDVfbWFzayA9Ci0gICAgICAgICAgICAgICAgICAgICBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgKGNvbmYtPmJ1c3lfbG9jay0+bWF4X2J1c3kgKyA3KSAvIDgpOwotICAgICAgICBpZiAoY29uZi0+YnVzeV9sb2NrLT5tZDVfbWFzayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAxNiBieXRlcyBhcmUgMTI4IGJpdHMgb2YgdGhlIG1kNSAqLwotCi0gICAgICAgIC8qIG5neF9hbGxvY19zaGFyZWQoKSAqLwotICAgICAgICBjb25mLT5idXN5X2xvY2stPm1kNSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAqIGNvbmYtPmJ1c3lfbG9jay0+bWF4X2J1c3kpOwotICAgICAgICBpZiAoY29uZi0+YnVzeV9sb2NrLT5tZDUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5wYXNzX3NlcnZlciwgcHJldi0+cGFzc19zZXJ2ZXIsIDApOwotICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnBhc3NfeF9hY2NlbF9leHBpcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnBhc3NfeF9hY2NlbF9leHBpcmVzLCAwKTsKLSAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5pZ25vcmVfZXhwaXJlcywgcHJldi0+aWdub3JlX2V4cGlyZXMsIDApOwotICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmxtX2ZhY3RvciwgcHJldi0+bG1fZmFjdG9yLCAwKTsKLSAgICBuZ3hfY29uZl9tZXJnZV9zZWNfdmFsdWUoY29uZi0+ZGVmYXVsdF9leHBpcmVzLCBwcmV2LT5kZWZhdWx0X2V4cGlyZXMsIDApOwotCi0gICAgaWYgKGNvbmYtPnhfdmFycyA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbmYtPnhfdmFycyA9IHByZXYtPnhfdmFyczsKLSAgICB9Ci0KLSAgICBpZiAoY29uZi0+cGVlcnMgPT0gTlVMTCkgewotICAgICAgICBjb25mLT5wZWVycyA9IHByZXYtPnBlZXJzOwotICAgICAgICBjb25mLT51cHN0cmVhbSA9IHByZXYtPnVwc3RyZWFtOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9zZXRfcGFzcyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpCi17Ci0gICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKLQotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAqdmFsdWUsICp1cmw7Ci0gICAgbmd4X2luZXRfdXBzdHJlYW1fdCAgICAgICAgICBpbmV0X3Vwc3RyZWFtOwotICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICAqY2xjZjsKLSNpZiAoTkdYX0hBVkVfVU5JWF9ET01BSU4pCi0gICAgbmd4X3VuaXhfZG9tYWluX3Vwc3RyZWFtX3QgICB1bml4X3Vwc3RyZWFtOwotI2VuZGlmCi0KLSAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOwotCi0gICAgdXJsID0gJnZhbHVlWzFdOwotCi0gICAgaWYgKG5neF9zdHJuY2FzZWNtcCh1cmwtPmRhdGEsICJodHRwOi8vIiwgNykgIT0gMCkgewotICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsICJpbnZhbGlkIFVSTCBwcmVmaXgiKTsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotICAgIGxjZi0+dXBzdHJlYW0gPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX2NvbmZfdCkpOwotICAgIGlmIChsY2YtPnVwc3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotICAgIGxjZi0+dXBzdHJlYW0tPnVybCA9ICp1cmw7Ci0KLSAgICBpZiAobmd4X3N0cm5jYXNlY21wKHVybC0+ZGF0YSArIDcsICJ1bml4OiIsIDUpID09IDApIHsKLQotI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKLQotICAgICAgICBuZ3hfbWVtemVybygmdW5peF91cHN0cmVhbSwgc2l6ZW9mKG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90KSk7Ci0KLSAgICAgICAgdW5peF91cHN0cmVhbS5uYW1lID0gKnVybDsKLSAgICAgICAgdW5peF91cHN0cmVhbS51cmwubGVuID0gdXJsLT5sZW4gLSA3OwotICAgICAgICB1bml4X3Vwc3RyZWFtLnVybC5kYXRhID0gdXJsLT5kYXRhICsgNzsKLSAgICAgICAgdW5peF91cHN0cmVhbS51cmlfcGFydCA9IDE7Ci0KLSAgICAgICAgbGNmLT5wZWVycyA9IG5neF91bml4X3Vwc3RyZWFtX3BhcnNlKGNmLCAmdW5peF91cHN0cmVhbSk7Ci0gICAgICAgIGlmIChsY2YtPnBlZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGxjZi0+dXBzdHJlYW0tPmhvc3RfaGVhZGVyLmxlbiA9IHNpemVvZigibG9jYWxob3N0IikgLSAxOwotICAgICAgICBsY2YtPnVwc3RyZWFtLT5ob3N0X2hlYWRlci5kYXRhID0gKHVfY2hhciAqKSAibG9jYWxob3N0IjsKLSAgICAgICAgbGNmLT51cHN0cmVhbS0+dXJpID0gdW5peF91cHN0cmVhbS51cmk7Ci0gICAgICAgIGxjZi0+dXBzdHJlYW0tPnVyaV9zZXBhcmF0b3IgPSAiOiI7Ci0gICAgICAgIGxjZi0+dXBzdHJlYW0tPmRlZmF1bHRfcG9ydCA9IDE7Ci0KLSNlbHNlCi0gICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgdW5peCBkb21haW4gc29ja2V0cyBhcmUgbm90IHN1cHBvcnRlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBwbGF0Zm9ybSIpOwotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0KLSNlbmRpZgotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgbmd4X21lbXplcm8oJmluZXRfdXBzdHJlYW0sIHNpemVvZihuZ3hfaW5ldF91cHN0cmVhbV90KSk7Ci0KLSAgICAgICAgaW5ldF91cHN0cmVhbS5uYW1lID0gKnVybDsKLSAgICAgICAgaW5ldF91cHN0cmVhbS51cmwubGVuID0gdXJsLT5sZW4gLSA3OwotICAgICAgICBpbmV0X3Vwc3RyZWFtLnVybC5kYXRhID0gdXJsLT5kYXRhICsgNzsKLSAgICAgICAgaW5ldF91cHN0cmVhbS5kZWZhdWx0X3BvcnRfdmFsdWUgPSA4MDsKLSAgICAgICAgaW5ldF91cHN0cmVhbS51cmlfcGFydCA9IDE7Ci0KLSAgICAgICAgbGNmLT5wZWVycyA9IG5neF9pbmV0X3Vwc3RyZWFtX3BhcnNlKGNmLCAmaW5ldF91cHN0cmVhbSk7Ci0gICAgICAgIGlmIChsY2YtPnBlZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGxjZi0+dXBzdHJlYW0tPmhvc3RfaGVhZGVyID0gaW5ldF91cHN0cmVhbS5ob3N0X2hlYWRlcjsKLSAgICAgICAgbGNmLT51cHN0cmVhbS0+cG9ydF90ZXh0ID0gaW5ldF91cHN0cmVhbS5wb3J0X3RleHQ7Ci0gICAgICAgIGxjZi0+dXBzdHJlYW0tPnVyaSA9IGluZXRfdXBzdHJlYW0udXJpOwotICAgICAgICBsY2YtPnVwc3RyZWFtLT51cmlfc2VwYXJhdG9yID0gIiI7Ci0gICAgICAgIGxjZi0+dXBzdHJlYW0tPmRlZmF1bHRfcG9ydCA9IGluZXRfdXBzdHJlYW0uZGVmYXVsdF9wb3J0OwotICAgIH0KLQotICAgIGNsY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbG9jX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKLQotICAgIGNsY2YtPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9oYW5kbGVyOwotCi0jaWYgKE5HWF9QQ1JFKQotICAgIGxjZi0+dXBzdHJlYW0tPmxvY2F0aW9uID0gY2xjZi0+cmVnZXggPyAmbmd4X2h0dHBfcHJveHlfdXJpIDogJmNsY2YtPm5hbWU7Ci0jZWxzZQotICAgIGxjZi0+dXBzdHJlYW0tPmxvY2F0aW9uID0gJmNsY2YtPm5hbWU7Ci0jZW5kaWYKLQotICAgIGlmIChjbGNmLT5uYW1lLmRhdGFbY2xjZi0+bmFtZS5sZW4gLSAxXSA9PSAnLycpIHsKLSAgICAgICAgY2xjZi0+YXV0b19yZWRpcmVjdCA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5HWF9DT05GX09LOwotfQotCi0KLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9zZXRfeF92YXIobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZikKLXsKLSAgICBuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90ICpsY2YgPSBjb25mOwotCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGksICppbmRleDsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFsdWU7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnZhcjsKLSAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKLQotICAgIGlmIChsY2YtPnhfdmFycyA9PSBOVUxMKSB7Ci0gICAgICAgIGxjZi0+eF92YXJzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV90ICopKTsKLSAgICAgICAgaWYgKGxjZi0+eF92YXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNtY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbWFpbl9jb25mKGNmLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7Ci0KLSAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOwotCi0gICAgdmFyID0gY21jZi0+dmFyaWFibGVzLmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNtY2YtPnZhcmlhYmxlcy5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGlmIChuZ3hfc3RyY2FzZWNtcCh2YXJbaV0ubmFtZS5kYXRhLCB2YWx1ZVsxXS5kYXRhKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgIGluZGV4ID0gbmd4X2FycmF5X3B1c2gobGNmLT54X3ZhcnMpOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICppbmRleCA9IHZhcltpXS5pbmRleDsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gdmFyaWFibGUgbmFtZSBcIiVWXCIiLCAmdmFsdWVbMV0pOwotICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLX0KLQotCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfcHJveHlfbG93YXRfY2hlY2sobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpCi17Ci0jaWYgKE5HWF9GUkVFQlNEKQotICAgIHNzaXplX3QgKm5wID0gZGF0YTsKLQotICAgIGlmICgqbnAgPj0gbmd4X2ZyZWVic2RfbmV0X2luZXRfdGNwX3NlbmRzcGFjZSkgewotICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJwcm94eV9zZW5kX2xvd2F0XCIgbXVzdCBiZSBsZXNzIHRoYW4gJWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzeXNjdGwgbmV0LmluZXQudGNwLnNlbmRzcGFjZSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2ZyZWVic2RfbmV0X2luZXRfdGNwX3NlbmRzcGFjZSk7Ci0KLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotI2VsaWYgIShOR1hfSEFWRV9TT19TTkRMT1dBVCkKLSAgICBzc2l6ZV90ICpucCA9IGRhdGE7Ci0KLSAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19XQVJOLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIlwicHJveHlfc2VuZF9sb3dhdFwiIGlzIG5vdCBzdXBwb3J0ZWQsIGlnbm9yZWQiKTsKLQotICAgICpucCA9IDA7Ci0KLSNlbmRpZgotCi0gICAgcmV0dXJuIE5HWF9DT05GX09LOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmggYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjMjRiMS4uMDAwMDAwMAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2Ci0gKi8KLQotCi0jaWZuZGVmIF9OR1hfSFRUUF9QUk9YWV9IQU5ETEVSX0hfSU5DTFVERURfCi0jZGVmaW5lIF9OR1hfSFRUUF9QUk9YWV9IQU5ETEVSX0hfSU5DTFVERURfCi0KLQotI2luY2x1ZGUgPG5neF9jb25maWcuaD4KLSNpbmNsdWRlIDxuZ3hfY29yZS5oPgotI2luY2x1ZGUgPG5neF9ldmVudC5oPgotI2luY2x1ZGUgPG5neF9ldmVudF9jb25uZWN0Lmg+Ci0jaW5jbHVkZSA8bmd4X2V2ZW50X3BpcGUuaD4KLSNpbmNsdWRlIDxuZ3hfaHR0cC5oPgotCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTkdYX0hUVFBfUFJPWFlfQ0FDSEVfUEFTUyA9IDEsCi0gICAgTkdYX0hUVFBfUFJPWFlfQ0FDSEVfQllQQVNTLAotICAgIE5HWF9IVFRQX1BST1hZX0NBQ0hFX0FVVEgsCi0gICAgTkdYX0hUVFBfUFJPWFlfQ0FDSEVfUEdOQywKLSAgICBOR1hfSFRUUF9QUk9YWV9DQUNIRV9NSVNTLAotICAgIE5HWF9IVFRQX1BST1hZX0NBQ0hFX0VYUFIsCi0gICAgTkdYX0hUVFBfUFJPWFlfQ0FDSEVfQUdFRCwKLSAgICBOR1hfSFRUUF9QUk9YWV9DQUNIRV9ISVQKLX0gbmd4X2h0dHBfcHJveHlfc3RhdGVfZTsKLQotCi10eXBlZGVmIGVudW0gewotICAgIE5HWF9IVFRQX1BST1hZX0NBQ0hFX0JQUyA9IDEsCi0gICAgTkdYX0hUVFBfUFJPWFlfQ0FDSEVfWEFFLAotICAgIE5HWF9IVFRQX1BST1hZX0NBQ0hFX0NUTCwKLSAgICBOR1hfSFRUUF9QUk9YWV9DQUNIRV9FWFAsCi0gICAgTkdYX0hUVFBfUFJPWFlfQ0FDSEVfTVZELAotICAgIE5HWF9IVFRQX1BST1hZX0NBQ0hFX0xNRiwKLSAgICBOR1hfSFRUUF9QUk9YWV9DQUNIRV9QREUKLX0gbmd4X2h0dHBfcHJveHlfcmVhc29uX2U7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIHVybDsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICBob3N0OwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIHVyaTsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICBob3N0X2hlYWRlcjsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X3RleHQ7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAqbG9jYXRpb247Ci0KLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1cmlfc2VwYXJhdG9yOwotCi0gICAgaW5fcG9ydF90ICAgICAgICAgICAgICAgICAgICAgICAgcG9ydDsKLQotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcG9ydDoxOwotfSBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9jb25mX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbG93YXQ7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2J1ZmZlcl9zaXplOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c3lfYnVmZmVyc19zaXplOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wX2ZpbGVfc2l6ZTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfd3JpdGVfc2l6ZTsKLQotICAgIG5neF9tc2VjX3QgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dDsKLSAgICBuZ3hfbXNlY190ICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RpbWVvdXQ7Ci0gICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgICAgICAgcmVhZF90aW1lb3V0OwotICAgIHRpbWVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZXhwaXJlczsKLQotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICAgIGxtX2ZhY3RvcjsKLQotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdXBzdHJlYW07Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgdXNlX3N0YWxlOwotCi0gICAgbmd4X2J1ZnNfdCAgICAgICAgICAgICAgICAgICAgICAgYnVmczsKLQotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xpY190ZW1wX2ZpbGU7Ci0gICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICAgY2FjaGU7Ci0gICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVfaG9zdDsKLSAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgICAgICBzZXRfeF91cmw7Ci0gICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICAgc2V0X3hfcmVhbF9pcDsKLSAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgICAgICBhZGRfeF9mb3J3YXJkZWRfZm9yOwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfdW5wYXJzZWRfdXJpOwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgICAgIHBhc3Nfc2VydmVyOwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfeF9hY2NlbF9leHBpcmVzOwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9leHBpcmVzOwotCi0gICAgbmd4X3BhdGhfdCAgICAgICAgICAgICAgICAgICAgICAqY2FjaGVfcGF0aDsKLSAgICBuZ3hfcGF0aF90ICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3BhdGg7Ci0KLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAgICp4X3ZhcnM7Ci0KLSAgICBuZ3hfaHR0cF9idXN5X2xvY2tfdCAgICAgICAgICAgICpidXN5X2xvY2s7Ci0KLSAgICBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9jb25mX3QgICp1cHN0cmVhbTsKLSAgICBuZ3hfcGVlcnNfdCAgICAgICAgICAgICAgICAgICAgICpwZWVyczsKLX0gbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdDsKLQotCi0vKgotICogIkVYUFIvMTAvNS8tIDIwMC9FWFAvNjAgNCIKLSAqICJNSVNTLy0vLS9CIDUwMy8tLy0gLSIKLSAqICJFWFBSLzEwLzIwL1NCIEhJVC8tLy0gLSIKLSAqICJFWFBSLzEwLzE1L05CIEhJVC8tLy0gLSIKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2h0dHBfcHJveHlfc3RhdGVfZSAgICAgICAgICAgY2FjaGVfc3RhdGU7Ci0gICAgdGltZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlZDsKLSAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBibF90aW1lOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgIGJsX3N0YXRlOwotCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotICAgIG5neF9odHRwX3Byb3h5X3JlYXNvbl9lICAgICAgICAgIHJlYXNvbjsKLSAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOwotICAgIHRpbWVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM7Ci0KLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICpwZWVyOwotfSBuZ3hfaHR0cF9wcm94eV9zdGF0ZV90OwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfbGlzdF90ICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOwotI2lmIDAKLSAgICBuZ3hfdGFibGVfdCAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOyAgIC8qIGl0IG11c3QgYmUgZmlyc3QgZmllbGQgKi8KLSNlbmRpZgotCi0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAqZGF0ZTsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpzZXJ2ZXI7Ci0KLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpleHBpcmVzOwotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgKmNhY2hlX2NvbnRyb2w7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAqZXRhZzsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICp4X2FjY2VsX2V4cGlyZXM7Ci0KLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpjb25uZWN0aW9uOwotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgKmNvbnRlbnRfdHlwZTsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpjb250ZW50X2xlbmd0aDsKLQotI2lmIChOR1hfSFRUUF9HWklQKQotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgKmNvbnRlbnRfZW5jb2Rpbmc7Ci0jZW5kaWYKLQotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgKmxhc3RfbW9kaWZpZWQ7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAqbG9jYXRpb247Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAqYWNjZXB0X3JhbmdlczsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICp4X3BhZDsKLQotICAgIG9mZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoX247Ci19IG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2h0dHBfY2FjaGVfdCAgICAgICAgICAgICAgICAgY3R4OwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfbGluZTsKLQotICAgIG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCAgICAgIGhlYWRlcnNfaW47Ci19IG5neF9odHRwX3Byb3h5X2NhY2hlX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9wZWVyX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgIHBlZXI7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19saW5lOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDsKLQotICAgIG5neF9vdXRwdXRfY2hhaW5fY3R4X3QgICAgICAgICAgKm91dHB1dF9jaGFpbl9jdHg7Ci0gICAgbmd4X2V2ZW50X3BpcGVfdCAgICAgICAgICAgICAgICAqZXZlbnRfcGlwZTsKLQotICAgIG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCAgICAgIGhlYWRlcnNfaW47Ci19IG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfcHJveHlfY3R4X3MgIG5neF9odHRwX3Byb3h5X2N0eF90OwotCi1zdHJ1Y3Qgbmd4X2h0dHBfcHJveHlfY3R4X3MgewotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgKnJlcXVlc3Q7Ci0gICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgICAqbGNmOwotICAgIG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX3QgICAgKnVwc3RyZWFtOwotICAgIG5neF9odHRwX3Byb3h5X2NhY2hlX3QgICAgICAgKmNhY2hlOwotCi0gICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgICAqaGVhZGVyX2luOwotCi0gICAgbmd4X2h0dHBfYnVzeV9sb2NrX2N0eF90ICAgICAgYnVzeV9sb2NrOwotCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgYWNjZWw6MTsKLQotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgIGNhY2hhYmxlOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgc3RhbGU6MTsKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICB0cnlfYnVzeV9sb2NrOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgYnVzeV9sb2NrZWQ6MTsKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9oZWFkZXJfaW46MTsKLQotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Rfc2VudDoxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9zZW50OjE7Ci0KLQotICAgIC8qIHVzZWQgdG8gcGFyc2UgYW4gdXBzdHJlYW0gSFRUUCBoZWFkZXIgKi8KLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzX3N0YXJ0OwotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1c19lbmQ7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NvdW50OwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0YXRlOwotCi0gICAgbmd4X2h0dHBfcHJveHlfc3RhdGVfdCAgICAgICAqc3RhdGU7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAgc3RhdGVzOyAgICAvKiBvZiBuZ3hfaHR0cF9wcm94eV9zdGF0ZV90ICovCi0KLSAgICAvKgotICAgICAqIHdlIGRlY2xhcmUgImFjdGlvbiIgYXMgImNoYXIgKiIgYmVjYXVzZSB0aGUgYWN0aW9ucyBhcmUgdXN1YWxseQotICAgICAqIHRoZSBzdGF0aWMgc3RyaW5ncyBhbmQgaW4gdGhlICJ1X2NoYXIgKiIgY2FzZSB3ZSBoYXZlIHRvIG92ZXJyaWRlCi0gICAgICogYWxsIHRoZSB0aW1lIHRoZWlyIHR5cGVzCi0gICAgICovCi0KLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICphY3Rpb247Ci0gICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgICAgICAgICAqc2F2ZWRfY3R4OwotICAgIG5neF9sb2dfaGFuZGxlcl9wdCAgICAgICAgICAgIHNhdmVkX2hhbmRsZXI7Ci19OwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgIGNvbm5lY3Rpb247Ci0gICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgICpwcm94eTsKLX0gbmd4X2h0dHBfcHJveHlfbG9nX2N0eF90OwotCi0KLSNkZWZpbmUgTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSICAgICAgIDMwCi0KLQotI2RlZmluZSBOR1hfSFRUUF9QUk9YWV9GVF9FUlJPUiAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBOR1hfSFRUUF9QUk9YWV9GVF9USU1FT1VUICAgICAgICAgICAgMHgwNAotI2RlZmluZSBOR1hfSFRUUF9QUk9YWV9GVF9JTlZBTElEX0hFQURFUiAgICAgMHgwOAotI2RlZmluZSBOR1hfSFRUUF9QUk9YWV9GVF9IVFRQXzUwMCAgICAgICAgICAgMHgxMAotI2RlZmluZSBOR1hfSFRUUF9QUk9YWV9GVF9IVFRQXzQwNCAgICAgICAgICAgMHgyMAotI2RlZmluZSBOR1hfSFRUUF9QUk9YWV9GVF9CVVNZX0xPQ0sgICAgICAgICAgMHg0MAotI2RlZmluZSBOR1hfSFRUUF9QUk9YWV9GVF9NQVhfV0FJVElORyAgICAgICAgMHg4MAotCi0KLWludCBuZ3hfaHR0cF9wcm94eV9yZXF1ZXN0X3Vwc3RyZWFtKG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKLQotI2lmIChOR1hfSFRUUF9GSUxFX0NBQ0hFKQotCi1pbnQgbmd4X2h0dHBfcHJveHlfZ2V0X2NhY2hlZF9yZXNwb25zZShuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7Ci1pbnQgbmd4X2h0dHBfcHJveHlfc2VuZF9jYWNoZWRfcmVzcG9uc2Uobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApOwotaW50IG5neF9odHRwX3Byb3h5X2lzX2NhY2hhYmxlKG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKLWludCBuZ3hfaHR0cF9wcm94eV91cGRhdGVfY2FjaGUobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApOwotCi12b2lkIG5neF9odHRwX3Byb3h5X2NhY2hlX2J1c3lfbG9jayhuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7Ci0KLSNlbmRpZgotCi12b2lkIG5neF9odHRwX3Byb3h5X3JkX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci12b2lkIG5neF9odHRwX3Byb3h5X3dyX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci12b2lkIG5neF9odHRwX3Byb3h5X2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICBuZ3hfZXZlbnRfdCAqZXYpOwotCi12b2lkIG5neF9odHRwX3Byb3h5X2J1c3lfbG9ja19oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpOwotdm9pZCBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9idXN5X2xvY2sobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApOwotCi11X2NoYXIgKm5neF9odHRwX3Byb3h5X2xvZ19lcnJvcihuZ3hfbG9nX3QgKmxvZywgdV9jaGFyICpidWYsIHNpemVfdCBsZW4pOwotdm9pZCBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KG5neF9odHRwX3Byb3h5X2N0eF90ICpwLCBpbnQgcmMpOwotdm9pZCBuZ3hfaHR0cF9wcm94eV9jbG9zZV9jb25uZWN0aW9uKG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKLQotaW50IG5neF9odHRwX3Byb3h5X3BhcnNlX3N0YXR1c19saW5lKG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKLWludCBuZ3hfaHR0cF9wcm94eV9jb3B5X2hlYWRlcihuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QgKmhlYWRlcnNfaW4pOwotCi0KLQotZXh0ZXJuIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfcHJveHlfbW9kdWxlOwotZXh0ZXJuIG5neF9odHRwX2hlYWRlcjBfdCBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luW107Ci0KLQotCi0jZW5kaWYgLyogX05HWF9IVFRQX1BST1hZX0hBTkRMRVJfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGVhZGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hlYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDZmZjllLi4wMDAwMDAwCi0tLSBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgotICovCi0KLQotI2luY2x1ZGUgPG5neF9jb25maWcuaD4KLSNpbmNsdWRlIDxuZ3hfY29yZS5oPgotI2luY2x1ZGUgPG5neF9odHRwLmg+Ci0jaW5jbHVkZSA8bmd4X2h0dHBfcHJveHlfaGFuZGxlci5oPgotCi0KLXN0YXRpYyBpbnQgbmd4X2h0dHBfcHJveHlfcmV3cml0ZV9sb2NhdGlvbl9oZWFkZXIobmd4X2h0dHBfcHJveHlfY3R4X3QgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF90YWJsZV9lbHRfdCAqbG9jKTsKLQotaW50IG5neF9odHRwX3Byb3h5X2NvcHlfaGVhZGVyKG5neF9odHRwX3Byb3h5X2N0eF90ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCAqaGVhZGVyc19pbikKLXsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICBpOwotICAgIG5neF9saXN0X3BhcnRfdCAgICAgKnBhcnQ7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAqaG8sICpoOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgKnI7Ci0KLSAgICByID0gcC0+cmVxdWVzdDsKLQotICAgIHBhcnQgPSAmaGVhZGVyc19pbi0+aGVhZGVycy5wYXJ0OwotICAgIGggPSBwYXJ0LT5lbHRzOwotCi0gICAgZm9yIChpID0gMDsgLyogdm9pZCAqLzsgaSsrKSB7Ci0gIAotICAgICAgICBpZiAoaSA+PSBwYXJ0LT5uZWx0cykgewotICAgICAgICAgICAgaWYgKHBhcnQtPm5leHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAKLSAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OwotICAgICAgICAgICAgaCA9IHBhcnQtPmVsdHM7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlnbm9yZSBzb21lIGhlYWRlcnMgKi8KLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+Y29ubmVjdGlvbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+eF9wYWQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAtPmFjY2VsKSB7Ci0gICAgICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+ZGF0ZQotICAgICAgICAgICAgICAgIHx8ICZoW2ldID09IGhlYWRlcnNfaW4tPmFjY2VwdF9yYW5nZXMpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCZoW2ldID09IGhlYWRlcnNfaW4tPnhfYWNjZWxfZXhwaXJlcwotICAgICAgICAgICAgICAgICYmICFwLT5sY2YtPnBhc3NfeF9hY2NlbF9leHBpcmVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+c2VydmVyICYmICFwLT5sY2YtPnBhc3Nfc2VydmVyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgmaFtpXSA9PSBoZWFkZXJzX2luLT5sb2NhdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9wcm94eV9yZXdyaXRlX2xvY2F0aW9uX2hlYWRlcihwLCAmaFtpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qICJDb250ZW50LVR5cGUiIGlzIGhhbmRsZWQgc3BlY2lhbGx5ICovCi0KLSAgICAgICAgaWYgKCZoW2ldID09IGhlYWRlcnNfaW4tPmNvbnRlbnRfdHlwZSkgewotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlID0gJmhbaV07Ci0gICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPmtleS5sZW4gPSAwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIGNvcHkgc29tZSBoZWFkZXIgcG9pbnRlcnMgYW5kIHNldCB1cCByLT5oZWFkZXJzX291dCAqLwotCi0gICAgICAgIGhvID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7Ci0gICAgICAgIGlmIChobyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgKmhvID0gaFtpXTsKLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+ZXhwaXJlcykgewotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuZXhwaXJlcyA9IGhvOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+Y2FjaGVfY29udHJvbCkgewotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY2FjaGVfY29udHJvbCA9IGhvOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+ZXRhZykgewotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuZXRhZyA9IGhvOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotI2lmIChOR1hfSFRUUF9HWklQKQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+Y29udGVudF9lbmNvZGluZykgewotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9lbmNvZGluZyA9IGhvOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlmICgmaFtpXSA9PSBoZWFkZXJzX2luLT5sYXN0X21vZGlmaWVkKSB7Ci0gICAgICAgICAgICByLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkID0gaG87Ci0gICAgICAgICAgICAvKiBUT0RPOiB1cGRhdGUgci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZF90aW1lICovCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIG5neF9odHRwX2hlYWRlcl9maWx0ZXIoKSBwYXNzZXMgdGhlIGZvbGxvd2luZyBoZWFkZXJzIGFzIGlzCi0gICAgICAgICAqIGFuZCBkb2VzIG5vdCBoYW5kbGUgdGhlbSBzcGVjaWFsbHkgaWYgdGhleSBhcmUgc2V0OgotICAgICAgICAgKiAgICAgci0+aGVhZGVyc19vdXQuc2VydmVyLAotICAgICAgICAgKiAgICAgci0+aGVhZGVyc19vdXQuZGF0ZSwKLSAgICAgICAgICogICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICgmaFtpXSA9PSBoZWFkZXJzX2luLT5zZXJ2ZXIpIHsKLSAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LnNlcnZlciA9IGhvOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+ZGF0ZSkgewotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuZGF0ZSA9IGhvOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+Y29udGVudF9sZW5ndGgpIHsKLSAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoID0gaG87Ci0gICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uID0gbmd4X2F0b2koaG8tPnZhbHVlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG8tPnZhbHVlLmxlbik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOR1hfT0s7Ci19Ci0KLQotc3RhdGljIGludCBuZ3hfaHR0cF9wcm94eV9yZXdyaXRlX2xvY2F0aW9uX2hlYWRlcihuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3RhYmxlX2VsdF90ICpsb2MpCi17Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAqbGFzdDsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpsb2NhdGlvbjsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAgICAgICpyOwotICAgIG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX2NvbmZfdCAgKnVjOwotCi0gICAgciA9IHAtPnJlcXVlc3Q7Ci0gICAgdWMgPSBwLT5sY2YtPnVwc3RyZWFtOwotCi0gICAgbG9jYXRpb24gPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKLSAgICBpZiAobG9jYXRpb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChwLT5sY2YtPnByZXNlcnZlX2hvc3QKLSAgICAgICAgfHwgdWMtPnVybC5sZW4gPiBsb2MtPnZhbHVlLmxlbgotICAgICAgICB8fCBuZ3hfcnN0cm5jbXAobG9jLT52YWx1ZS5kYXRhLCB1Yy0+dXJsLmRhdGEsIHVjLT51cmwubGVuKSAhPSAwKQotICAgIHsKLQotICAgICAgIC8qCi0gICAgICAgICogd2UgZG8gbm90IHNldCByLT5oZWFkZXJzX291dC5sb2NhdGlvbiBoZXJlIHRvIGF2b2lkIHRoZSBoYW5kbGluZwotICAgICAgICAqIHRoZSBsb2NhbCByZWRpcmVjdHMgd2l0aG91dCBhIGhvc3QgbmFtZSBieSBuZ3hfaHR0cF9oZWFkZXJfZmlsdGVyKCkKLSAgICAgICAgKi8KLQotICAgICAgICAqbG9jYXRpb24gPSAqbG9jOwotICAgICAgICByZXR1cm4gTkdYX09LOwotICAgIH0KLQotICAgIC8qIFRPRE86IHByb3h5X3JldmVyc2UgKi8KLQotICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gbG9jYXRpb247Ci0KLSAgICBsb2NhdGlvbi0+a2V5LmxlbiA9IDA7Ci0gICAgbG9jYXRpb24tPmtleS5kYXRhID0gTlVMTDsKLQotICAgIGxvY2F0aW9uLT52YWx1ZS5sZW4gPSB1Yy0+bG9jYXRpb24tPmxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAobG9jLT52YWx1ZS5sZW4gLSB1Yy0+dXJsLmxlbikgKyAxOwotICAgIGxvY2F0aW9uLT52YWx1ZS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBsb2NhdGlvbi0+dmFsdWUubGVuKTsKLSAgICBpZiAobG9jYXRpb24tPnZhbHVlLmRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgIH0KLQotICAgIGxhc3QgPSBuZ3hfY3B5bWVtKGxvY2F0aW9uLT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgIHVjLT5sb2NhdGlvbi0+ZGF0YSwgdWMtPmxvY2F0aW9uLT5sZW4pOwotCi0gICAgbmd4X2NweXN0cm4obGFzdCwgbG9jLT52YWx1ZS5kYXRhICsgdWMtPnVybC5sZW4sCi0gICAgICAgICAgICAgICAgbG9jLT52YWx1ZS5sZW4gLSB1Yy0+dXJsLmxlbiArIDEpOwotCi0gICAgcmV0dXJuIE5HWF9PSzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfcGFyc2UuYyBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfcGFyc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwY2Y0OS4uMDAwMDAwMAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3BhcnNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgotICovCi0KLQotI2luY2x1ZGUgPG5neF9jb25maWcuaD4KLSNpbmNsdWRlIDxuZ3hfY29yZS5oPgotI2luY2x1ZGUgPG5neF9odHRwLmg+Ci0jaW5jbHVkZSA8bmd4X2h0dHBfcHJveHlfaGFuZGxlci5oPgotCi0KLWludCBuZ3hfaHR0cF9wcm94eV9wYXJzZV9zdGF0dXNfbGluZShuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKLXsKLSAgICB1X2NoYXIgICBjaDsKLSAgICB1X2NoYXIgICpwb3M7Ci0gICAgZW51bSAgewotICAgICAgICBzd19zdGFydCA9IDAsCi0gICAgICAgIHN3X0gsCi0gICAgICAgIHN3X0hULAotICAgICAgICBzd19IVFQsCi0gICAgICAgIHN3X0hUVFAsCi0gICAgICAgIHN3X2ZpcnN0X21ham9yX2RpZ2l0LAotICAgICAgICBzd19tYWpvcl9kaWdpdCwKLSAgICAgICAgc3dfZmlyc3RfbWlub3JfZGlnaXQsCi0gICAgICAgIHN3X21pbm9yX2RpZ2l0LAotICAgICAgICBzd19zdGF0dXMsCi0gICAgICAgIHN3X3NwYWNlX2FmdGVyX3N0YXR1cywKLSAgICAgICAgc3dfc3RhdHVzX3RleHQsCi0gICAgICAgIHN3X2FsbW9zdF9kb25lLAotICAgICAgICBzd19kb25lCi0gICAgfSBzdGF0ZTsKLQotICAgIHN0YXRlID0gcC0+cGFyc2Vfc3RhdGU7Ci0gICAgcG9zID0gcC0+aGVhZGVyX2luLT5wb3M7Ci0KLSAgICB3aGlsZSAocG9zIDwgcC0+aGVhZGVyX2luLT5sYXN0ICYmIHN0YXRlIDwgc3dfZG9uZSkgewotICAgICAgICBjaCA9ICpwb3MrKzsKLQotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0KLSAgICAgICAgLyogIkhUVFAvIiAqLwotICAgICAgICBjYXNlIHN3X3N0YXJ0OgotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19IOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzd19IOgotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnVCc6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19IVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3dfSFQ6Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X0hUVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3dfSFRUOgotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnUCc6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19IVFRQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzd19IVFRQOgotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnLyc6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19maXJzdF9tYWpvcl9kaWdpdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIHRoZSBmaXJzdCBkaWdpdCBvZiBtYWpvciBIVFRQIHZlcnNpb24gKi8KLSAgICAgICAgY2FzZSBzd19maXJzdF9tYWpvcl9kaWdpdDoKLSAgICAgICAgICAgIGlmIChjaCA8ICcxJyB8fCBjaCA+ICc5JykgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXRlID0gc3dfbWFqb3JfZGlnaXQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiB0aGUgbWFqb3IgSFRUUCB2ZXJzaW9uIG9yIGRvdCAqLwotICAgICAgICBjYXNlIHN3X21ham9yX2RpZ2l0OgotICAgICAgICAgICAgaWYgKGNoID09ICcuJykgewotICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZmlyc3RfbWlub3JfZGlnaXQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIHRoZSBmaXJzdCBkaWdpdCBvZiBtaW5vciBIVFRQIHZlcnNpb24gKi8KLSAgICAgICAgY2FzZSBzd19maXJzdF9taW5vcl9kaWdpdDoKLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXRlID0gc3dfbWlub3JfZGlnaXQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiB0aGUgbWlub3IgSFRUUCB2ZXJzaW9uIG9yIHRoZSBlbmQgb2YgdGhlIHJlcXVlc3QgbGluZSAqLwotICAgICAgICBjYXNlIHN3X21pbm9yX2RpZ2l0OgotICAgICAgICAgICAgaWYgKGNoID09ICcgJykgewotICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc3RhdHVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBIVFRQIHN0YXR1cyBjb2RlICovCi0gICAgICAgIGNhc2Ugc3dfc3RhdHVzOgotICAgICAgICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcC0+c3RhdHVzID0gcC0+c3RhdHVzICogMTAgKyBjaCAtICcwJzsKLQotICAgICAgICAgICAgaWYgKCsrcC0+c3RhdHVzX2NvdW50ID09IDMpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3NwYWNlX2FmdGVyX3N0YXR1czsKLSAgICAgICAgICAgICAgICBwLT5zdGF0dXNfc3RhcnQgPSBwb3MgLSAzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgLyogc3BhY2Ugb3IgZW5kIG9mIGxpbmUgKi8KLSAgICAgICAgIGNhc2Ugc3dfc3BhY2VfYWZ0ZXJfc3RhdHVzOgotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zdGF0dXNfdGV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJy4nOiAgICAgICAgICAgICAgICAgICAgLyogSUlTIG1heSBzZW5kIDQwMy4xLCA0MDMuMiwgZXRjICovCi0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zdGF0dXNfdGV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1I6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTEY6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogYW55IHRleHQgdW50aWwgZW5kIG9mIGxpbmUgKi8KLSAgICAgICAgY2FzZSBzd19zdGF0dXNfdGV4dDoKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgIGNhc2UgQ1I6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBlbmQgb2YgcmVxdWVzdCBsaW5lICovCi0gICAgICAgIGNhc2Ugc3dfYWxtb3N0X2RvbmU6Ci0gICAgICAgICAgICBwLT5zdGF0dXNfZW5kID0gcG9zIC0gMjsKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgIGNhc2UgTEY6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogc3VwcHJlc3Mgd2FybmluZyAqLwotICAgICAgICBjYXNlIHN3X2RvbmU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHAtPmhlYWRlcl9pbi0+cG9zID0gcG9zOwotCi0gICAgaWYgKHN0YXRlID09IHN3X2RvbmUpIHsKLSAgICAgICAgaWYgKHAtPnN0YXR1c19lbmQgPT0gTlVMTCkgewotICAgICAgICAgICAgcC0+c3RhdHVzX2VuZCA9IHBvcyAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBwLT5wYXJzZV9zdGF0ZSA9IHN3X3N0YXJ0OwotICAgICAgICByZXR1cm4gTkdYX09LOwotICAgIH0KLQotICAgIHAtPnBhcnNlX3N0YXRlID0gc3RhdGU7Ci0gICAgcmV0dXJuIE5HWF9BR0FJTjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYyBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxN2I5NS4uMDAwMDAwMAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3Vwc3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjU2ICswLDAgQEAKLQotLyoKLSAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKLSAqLwotCi0KLSNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+Ci0jaW5jbHVkZSA8bmd4X2NvcmUuaD4KLSNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KLSNpbmNsdWRlIDxuZ3hfZXZlbnRfY29ubmVjdC5oPgotI2luY2x1ZGUgPG5neF9ldmVudF9waXBlLmg+Ci0jaW5jbHVkZSA8bmd4X2h0dHAuaD4KLSNpbmNsdWRlIDxuZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmg+Ci0KLQotc3RhdGljIG5neF9jaGFpbl90ICpuZ3hfaHR0cF9wcm94eV9jcmVhdGVfcmVxdWVzdChuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7Ci1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9pbml0X3Vwc3RyZWFtKG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9yZWluaXRfdXBzdHJlYW0obmd4X2h0dHBfcHJveHlfY3R4X3QgKnApOwotc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfY29ubmVjdChuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7Ci1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9zZW5kX3JlcXVlc3Qobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApOwotc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfc2VuZF9yZXF1ZXN0X2hhbmRsZXIobmd4X2V2ZW50X3QgKndldik7Ci1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9kdW1teV9oYW5kbGVyKG5neF9ldmVudF90ICp3ZXYpOwotc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc191cHN0cmVhbV9zdGF0dXNfbGluZShuZ3hfZXZlbnRfdCAqcmV2KTsKLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfdXBzdHJlYW1faGVhZGVycyhuZ3hfZXZlbnRfdCAqcmV2KTsKLXN0YXRpYyBzc2l6ZV90IG5neF9odHRwX3Byb3h5X3JlYWRfdXBzdHJlYW1faGVhZGVyKG5neF9odHRwX3Byb3h5X2N0eF90ICopOwotc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfc2VuZF9yZXNwb25zZShuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7Ci1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2Rvd25zdHJlYW0obmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfYm9keShuZ3hfZXZlbnRfdCAqZXYpOwotc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3VpbnRfdCBmdF90eXBlKTsKLQotCi1zdGF0aWMgbmd4X3N0cl90IGh0dHBfbWV0aG9kc1tdID0gewotICAgIG5neF9zdHJpbmcoIkdFVCAiKSwKLSAgICBuZ3hfc3RyaW5nKCJIRUFEICIpLAotICAgIG5neF9zdHJpbmcoIlBPU1QgIikKLX07Ci0KLQotc3RhdGljIGNoYXIgKnVwc3RyZWFtX2hlYWRlcl9lcnJvcnNbXSA9IHsKLSAgICAidXBzdHJlYW0gc2VudCBpbnZhbGlkIGhlYWRlciIsCi0gICAgInVwc3RyZWFtIHNlbnQgdG9vIGxvbmcgaGVhZGVyIGxpbmUiCi19OwotCi0KLXN0YXRpYyBjaGFyICBodHRwX3ZlcnNpb25bXSA9ICIgSFRUUC8xLjAiIENSTEY7Ci1zdGF0aWMgY2hhciAgaG9zdF9oZWFkZXJbXSA9ICJIb3N0OiAiOwotc3RhdGljIGNoYXIgIHhfdXJsX2hlYWRlcltdID0gIlgtVVJMOiBodHRwIjsKLXN0YXRpYyBjaGFyICB4X3JlYWxfaXBfaGVhZGVyW10gPSAiWC1SZWFsLUlQOiAiOwotc3RhdGljIGNoYXIgIHhfZm9yd2FyZGVkX2Zvcl9oZWFkZXJbXSA9ICJYLUZvcndhcmRlZC1Gb3I6ICI7Ci1zdGF0aWMgY2hhciAgY29ubmVjdGlvbl9jbG9zZV9oZWFkZXJbXSA9ICJDb25uZWN0aW9uOiBjbG9zZSIgQ1JMRjsKLQotCi1pbnQgbmd4X2h0dHBfcHJveHlfcmVxdWVzdF91cHN0cmVhbShuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmM7Ci0gICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgKnI7Ci0gICAgbmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fdCAgKnU7Ci0KLSAgICByID0gcC0+cmVxdWVzdDsKLQotICAgIHUgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fdCkpOwotICAgIGlmICh1ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBwLT51cHN0cmVhbSA9IHU7Ci0KLSAgICB1LT5wZWVyLmxvZ19lcnJvciA9IE5HWF9FUlJPUl9FUlI7Ci0gICAgdS0+cGVlci5wZWVycyA9IHAtPmxjZi0+cGVlcnM7Ci0gICAgdS0+cGVlci50cmllcyA9IHAtPmxjZi0+cGVlcnMtPm51bWJlcjsKLSNpZiAoTkdYX1RIUkVBRFMpCi0gICAgdS0+cGVlci5sb2NrID0gJnItPmNvbm5lY3Rpb24tPmxvY2s7Ci0jZW5kaWYKLQotICAgIHUtPm1ldGhvZCA9IHItPm1ldGhvZDsKLQotICAgIHJjID0gbmd4X2h0dHBfcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KHIsIG5neF9odHRwX3Byb3h5X2luaXRfdXBzdHJlYW0pOwotCi0gICAgaWYgKHJjID49IE5HWF9IVFRQX1NQRUNJQUxfUkVTUE9OU0UpIHsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHJldHVybiBOR1hfRE9ORTsKLX0KLQotCi1zdGF0aWMgbmd4X2NoYWluX3QgKm5neF9odHRwX3Byb3h5X2NyZWF0ZV9yZXF1ZXN0KG5neF9odHRwX3Byb3h5X2N0eF90ICpwKQotewotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICBpLCBlc2NhcGUsICppbmRleDsKLSAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICAgICpiOwotICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICAgICAgICAgKmNoYWluOwotICAgIG5neF9saXN0X3BhcnRfdCAgICAgICAgICAgICAgICAgKnBhcnQ7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAqaGVhZGVyOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgKnI7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgICAgICAqdmFyOwotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgICAgKnZhbHVlOwotICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICAgICAgKmNtY2Y7Ci0gICAgbmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fY29uZl90ICAqdWM7Ci0KLSAgICByID0gcC0+cmVxdWVzdDsKLSAgICB1YyA9IHAtPmxjZi0+dXBzdHJlYW07Ci0KLSNpZiAoTkdYX1NVUFBSRVNTX1dBUk4pCi0gICAgdmFyID0gTlVMTDsKLSAgICBpbmRleCA9IE5VTEw7Ci0jZW5kaWYKLQotICAgIGVzY2FwZSA9IDA7Ci0KLSAgICBpZiAocC0+dXBzdHJlYW0tPm1ldGhvZCkgewotICAgICAgICBsZW4gPSBodHRwX21ldGhvZHNbcC0+dXBzdHJlYW0tPm1ldGhvZCAtIDFdLmxlbiArIHVjLT51cmkubGVuOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgbGVuID0gci0+bWV0aG9kX25hbWUubGVuICsgMSArIHVjLT51cmkubGVuOwotICAgIH0KLQotICAgIGlmIChwLT5sY2YtPnBhc3NfdW5wYXJzZWRfdXJpICYmIHItPnZhbGlkX3VucGFyc2VkX3VyaSkgewotICAgICAgICBsZW4gKz0gci0+dW5wYXJzZWRfdXJpLmxlbiAtIDE7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoci0+cXVvdGVkX3VyaSkgewotICAgICAgICAgICAgZXNjYXBlID0gMiAqIG5neF9lc2NhcGVfdXJpKE5VTEwsIHItPnVyaS5kYXRhICsgdWMtPmxvY2F0aW9uLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHVjLT5sb2NhdGlvbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfVVJJKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxlbiArPSByLT51cmkubGVuIC0gdWMtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGUKLSAgICAgICAgICAgICsgc2l6ZW9mKCI/IikgLSAxICsgci0+YXJncy5sZW47Ci0gICAgfQotCi0gICAgbGVuICs9IHNpemVvZihodHRwX3ZlcnNpb24pIC0gMQotICAgICAgICArIHNpemVvZihjb25uZWN0aW9uX2Nsb3NlX2hlYWRlcikgLSAxCi0gICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMTsKLQotCi0gICAgaWYgKHAtPmxjZi0+c2V0X3hfdXJsKSB7Ci0gICAgICAgIGxlbiArPSBzaXplb2YoeF91cmxfaGVhZGVyKSAtIDEKLSAgICAgICAgICAgICsgc2l6ZW9mKCJzOi8vIikgLSAxCi0gICAgICAgICAgICArIHItPnBvcnRfdGV4dC0+bGVuCi0gICAgICAgICAgICArIHItPnVucGFyc2VkX3VyaS5sZW4KLSAgICAgICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMTsKLQotICAgICAgICBpZiAoci0+aGVhZGVyc19pbi5ob3N0KSB7Ci0gICAgICAgICAgICBsZW4gKz0gci0+aGVhZGVyc19pbi5ob3N0X25hbWVfbGVuOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZW4gKz0gci0+c2VydmVyX25hbWUubGVuOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIGlmIChwLT5sY2YtPnByZXNlcnZlX2hvc3QpIHsKLSAgICAgICAgaWYgKHItPmhlYWRlcnNfaW4uaG9zdCkgewotICAgICAgICAgICAgbGVuICs9IHNpemVvZihob3N0X2hlYWRlcikgLSAxCi0gICAgICAgICAgICAgICAgKyByLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW4gKyBzaXplb2YoIjoiKSAtIDEKLSAgICAgICAgICAgICAgICArIHVjLT5wb3J0X3RleHQubGVuICsgc2l6ZW9mKENSTEYpIC0gMTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuICs9IHNpemVvZihob3N0X2hlYWRlcikgLSAxCi0gICAgICAgICAgICAgICAgKyByLT5zZXJ2ZXJfbmFtZS5sZW4gKyBzaXplb2YoIjoiKSAtIDEKLSAgICAgICAgICAgICAgICArIHVjLT5wb3J0X3RleHQubGVuICsgc2l6ZW9mKENSTEYpIC0gMTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgbGVuICs9IHNpemVvZihob3N0X2hlYWRlcikgLSAxICsgdWMtPmhvc3RfaGVhZGVyLmxlbgotICAgICAgICAgICAgKyBzaXplb2YoQ1JMRikgLSAxOwotICAgIH0KLQotCi0gICAgaWYgKHAtPmxjZi0+c2V0X3hfcmVhbF9pcCkgewotICAgICAgICBsZW4gKz0gc2l6ZW9mKHhfcmVhbF9pcF9oZWFkZXIpIC0gMSArIElORVRfQUREUlNUUkxFTiAtIDEKLSAgICAgICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMTsKLSAgICB9Ci0KLQotICAgIGlmIChwLT5sY2YtPmFkZF94X2ZvcndhcmRlZF9mb3IpIHsKLSAgICAgICAgaWYgKHItPmhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yKSB7Ci0gICAgICAgICAgICBsZW4gKz0gc2l6ZW9mKHhfZm9yd2FyZGVkX2Zvcl9oZWFkZXIpIC0gMQotICAgICAgICAgICAgICAgICsgci0+aGVhZGVyc19pbi54X2ZvcndhcmRlZF9mb3ItPnZhbHVlLmxlbgotICAgICAgICAgICAgICAgICsgc2l6ZW9mKCIsICIpIC0gMSArIElORVRfQUREUlNUUkxFTiAtIDEgKyBzaXplb2YoQ1JMRikgLSAxOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZW4gKz0gc2l6ZW9mKHhfZm9yd2FyZGVkX2Zvcl9oZWFkZXIpIC0gMSArIElORVRfQUREUlNUUkxFTiAtIDEKLSAgICAgICAgICAgICAgICArIHNpemVvZihDUkxGKSAtIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGlmIChwLT5sY2YtPnhfdmFycykgewotICAgICAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwotCi0gICAgICAgIHZhciA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOwotICAgICAgICBpbmRleCA9IHAtPmxjZi0+eF92YXJzLT5lbHRzOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwLT5sY2YtPnhfdmFycy0+bmVsdHM7IGkrKykgewotCi0gICAgICAgICAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKHIsIGluZGV4W2ldKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZS0+dGV4dC5sZW4pIHsKLSAgICAgICAgICAgICAgICBsZW4gKz0gc2l6ZW9mKCJYLSIpIC0gMSArIHZhcltpbmRleFtpXV0ubmFtZS5sZW4KLSAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoIjogIikgLSAxICsgdmFsdWUtPnRleHQubGVuICsgc2l6ZW9mKENSTEYpIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKLSAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwotCi0gICAgZm9yIChpID0gMDsgLyogdm9pZCAqLzsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKGkgPj0gcGFydC0+bmVsdHMpIHsKLSAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGFydCA9IHBhcnQtPm5leHQ7Ci0gICAgICAgICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJmhlYWRlcltpXSA9PSByLT5oZWFkZXJzX2luLmhvc3QpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCZoZWFkZXJbaV0gPT0gci0+aGVhZGVyc19pbi5jb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxlbiArPSBoZWFkZXJbaV0ua2V5LmxlbiArIHNpemVvZigiOiAiKSAtIDEKLSAgICAgICAgICAgICsgaGVhZGVyW2ldLnZhbHVlLmxlbiArIHNpemVvZihDUkxGKSAtIDE7Ci0gICAgfQotCi0jaWYgKE5HWF9ERUJVRykKLSAgICBsZW4rKzsKLSNlbmRpZgotCi0gICAgYiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgbGVuKTsKLSAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNoYWluID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7Ci0gICAgaWYgKGNoYWluID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY2hhaW4tPmJ1ZiA9IGI7Ci0gICAgY2hhaW4tPm5leHQgPSBOVUxMOwotCi0KLSAgICAvKiB0aGUgcmVxdWVzdCBsaW5lICovCi0KLSAgICBpZiAocC0+dXBzdHJlYW0tPm1ldGhvZCkgewotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwX21ldGhvZHNbcC0+dXBzdHJlYW0tPm1ldGhvZCAtIDFdLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfbWV0aG9kc1twLT51cHN0cmVhbS0+bWV0aG9kIC0gMV0ubGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5tZXRob2RfbmFtZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5tZXRob2RfbmFtZS5sZW4gKyAxKTsKLSAgICB9Ci0KLSAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB1Yy0+dXJpLmRhdGEsIHVjLT51cmkubGVuKTsKLQotICAgIGlmIChwLT5sY2YtPnBhc3NfdW5wYXJzZWRfdXJpICYmIHItPnZhbGlkX3VucGFyc2VkX3VyaSkgewotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT51bnBhcnNlZF91cmkuZGF0YSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVucGFyc2VkX3VyaS5sZW4gLSAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZXNjYXBlKSB7Ci0gICAgICAgICAgICBuZ3hfZXNjYXBlX3VyaShiLT5sYXN0LCByLT51cmkuZGF0YSArIHVjLT5sb2NhdGlvbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHVjLT5sb2NhdGlvbi0+bGVuLCBOR1hfRVNDQVBFX1VSSSk7Ci0gICAgICAgICAgICBiLT5sYXN0ICs9IHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbiArIGVzY2FwZTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+dXJpLmRhdGEgKyB1Yy0+bG9jYXRpb24tPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoci0+YXJncy5sZW4gPiAwKSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gJz8nOwotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBodHRwX3ZlcnNpb24sIHNpemVvZihodHRwX3ZlcnNpb24pIC0gMSk7Ci0KLQotICAgIC8qIHRoZSAiQ29ubmVjdGlvbjogY2xvc2UiIGhlYWRlciAqLwotCi0gICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgY29ubmVjdGlvbl9jbG9zZV9oZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNvbm5lY3Rpb25fY2xvc2VfaGVhZGVyKSAtIDEpOwotCi0KLSAgICAvKiB0aGUgIkhvc3QiIGhlYWRlciAqLwotCi0gICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgaG9zdF9oZWFkZXIsIHNpemVvZihob3N0X2hlYWRlcikgLSAxKTsKLQotICAgIGlmIChwLT5sY2YtPnByZXNlcnZlX2hvc3QpIHsKLSAgICAgICAgaWYgKHItPmhlYWRlcnNfaW4uaG9zdCkgewotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aGVhZGVyc19pbi5ob3N0LT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi5ob3N0X25hbWVfbGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnNlcnZlcl9uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXJfbmFtZS5sZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF1Yy0+ZGVmYXVsdF9wb3J0KSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gJzonOwotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgdWMtPnBvcnRfdGV4dC5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWMtPnBvcnRfdGV4dC5sZW4pOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB1Yy0+aG9zdF9oZWFkZXIuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWMtPmhvc3RfaGVhZGVyLmxlbik7Ci0gICAgfQotICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwotCi0KLSAgICAvKiB0aGUgIlgtVVJMIiBoZWFkZXIgKi8KLQotICAgIGlmIChwLT5sY2YtPnNldF94X3VybCkgewotCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHhfdXJsX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHhfdXJsX2hlYWRlcikgLSAxKTsKLQotI2lmIChOR1hfT1BFTlNTTCkKLQotICAgICAgICBpZiAoci0+Y29ubmVjdGlvbi0+c3NsKSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gJ3MnOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICpiLT5sYXN0KysgPSAnOic7ICpiLT5sYXN0KysgPSAnLyc7ICpiLT5sYXN0KysgPSAnLyc7Ci0KLSAgICAgICAgaWYgKHItPmhlYWRlcnNfaW4uaG9zdCkgewotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aGVhZGVyc19pbi5ob3N0LT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi5ob3N0X25hbWVfbGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnNlcnZlcl9uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXJfbmFtZS5sZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+cG9ydF90ZXh0LT5kYXRhLCByLT5wb3J0X3RleHQtPmxlbik7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnVucGFyc2VkX3VyaS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51bnBhcnNlZF91cmkubGVuKTsKLQotICAgICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKLSAgICB9Ci0KLQotICAgIC8qIHRoZSAiWC1SZWFsLUlQIiBoZWFkZXIgKi8KLQotICAgIGlmIChwLT5sY2YtPnNldF94X3JlYWxfaXApIHsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgeF9yZWFsX2lwX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHhfcmVhbF9pcF9oZWFkZXIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQubGVuKTsKLSAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7Ci0gICAgfQotCi0KLSAgICAvKiB0aGUgIlgtRm9yd2FyZGVkLUZvciIgaGVhZGVyICovCi0KLSAgICBpZiAocC0+bGNmLT5hZGRfeF9mb3J3YXJkZWRfZm9yKSB7Ci0gICAgICAgIGlmIChyLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2ZvcikgewotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgeF9mb3J3YXJkZWRfZm9yX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih4X2ZvcndhcmRlZF9mb3JfaGVhZGVyKSAtIDEpOwotCi0gICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi54X2ZvcndhcmRlZF9mb3ItPnZhbHVlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2Zvci0+dmFsdWUubGVuKTsKLQotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICcsJzsgKmItPmxhc3QrKyA9ICcgJzsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgeF9mb3J3YXJkZWRfZm9yX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih4X2ZvcndhcmRlZF9mb3JfaGVhZGVyKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5sZW4pOwotICAgICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKLSAgICB9Ci0KLQotICAgIGlmIChwLT5sY2YtPnhfdmFycykgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcC0+bGNmLT54X3ZhcnMtPm5lbHRzOyBpKyspIHsKLQotICAgICAgICAgICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCBpbmRleFtpXSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUtPnRleHQubGVuID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICdYJzsgKmItPmxhc3QrKyA9ICctJzsKLQotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgdmFyW2luZGV4W2ldXS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJbaW5kZXhbaV1dLm5hbWUubGVuKTsKLQotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICc6JzsgKmItPmxhc3QrKyA9ICcgJzsKLQotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgdmFsdWUtPnRleHQuZGF0YSwgdmFsdWUtPnRleHQubGVuKTsKLQotICAgICAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHBhcnQgPSAmci0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQ7Ci0gICAgaGVhZGVyID0gcGFydC0+ZWx0czsKLQotICAgIGZvciAoaSA9IDA7IC8qIHZvaWQgKi87IGkrKykgewotCi0gICAgICAgIGlmIChpID49IHBhcnQtPm5lbHRzKSB7Ci0gICAgICAgICAgICBpZiAocGFydC0+bmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OwotICAgICAgICAgICAgaGVhZGVyID0gcGFydC0+ZWx0czsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCZoZWFkZXJbaV0gPT0gci0+aGVhZGVyc19pbi5ob3N0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgmaGVhZGVyW2ldID09IHItPmhlYWRlcnNfaW4uY29ubmVjdGlvbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJmhlYWRlcltpXSA9PSByLT5oZWFkZXJzX2luLmtlZXBfYWxpdmUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCZoZWFkZXJbaV0gPT0gci0+aGVhZGVyc19pbi54X2ZvcndhcmRlZF9mb3IKLSAgICAgICAgICAgICYmIHAtPmxjZi0+YWRkX3hfZm9yd2FyZGVkX2ZvcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJmhlYWRlcltpXSA9PSByLT5oZWFkZXJzX2luLnhfcmVhbF9pcCAmJiBwLT5sY2YtPnNldF94X3JlYWxfaXApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCZoZWFkZXJbaV0gPT0gci0+aGVhZGVyc19pbi54X3VybCAmJiBwLT5sY2YtPnNldF94X3VybCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBoZWFkZXJbaV0ua2V5LmRhdGEsIGhlYWRlcltpXS5rZXkubGVuKTsKLQotICAgICAgICAqYi0+bGFzdCsrID0gJzonOyAqYi0+bGFzdCsrID0gJyAnOwotCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaV0udmFsdWUubGVuKTsKLQotICAgICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKLQotICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgaGVhZGVyOiBcIiVWOiAlVlwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcltpXS5rZXksICZoZWFkZXJbaV0udmFsdWUpOwotICAgIH0KLQotICAgIC8qIGFkZCAiXHJcbiIgYXQgdGhlIGhlYWRlciBlbmQgKi8KLSAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKLQotI2lmIChOR1hfREVCVUcpCi0gICAgKmItPmxhc3QgPSAnXDAnOwotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IGhlYWRlcjpcblwiJXNcIiIsIGItPnBvcyk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBjaGFpbjsKLX0KLQotCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9pbml0X3Vwc3RyZWFtKG5neF9odHRwX3JlcXVlc3RfdCAqcikKLXsKLQotICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICAgKmNsOwotICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICAgICAgKnA7Ci0gICAgbmd4X291dHB1dF9jaGFpbl9jdHhfdCAgICAqb3V0cHV0OwotICAgIG5neF9jaGFpbl93cml0ZXJfY3R4X3QgICAgKndyaXRlcjsKLSAgICBuZ3hfaHR0cF9wcm94eV9sb2dfY3R4X3QgICpjdHg7Ci0KLSAgICBwID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKLQotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgaW5pdCB1cHN0cmVhbSwgY2xpZW50IHRpbWVyOiAlZCIsCi0gICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5yZWFkLT50aW1lcl9zZXQpOwotCi0gICAgaWYgKHItPmNvbm5lY3Rpb24tPnJlYWQtPnRpbWVyX3NldCkgewotICAgICAgICBuZ3hfZGVsX3RpbWVyKHItPmNvbm5lY3Rpb24tPnJlYWQpOwotICAgIH0KLQotICAgIHItPnJlYWRfZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Byb3h5X3JkX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uOwotCi0gICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfQ0xFQVJfRVZFTlQpIHsKLQotICAgICAgICByLT53cml0ZV9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfd3JfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb247Ci0KLSAgICAgICAgaWYgKCFyLT5jb25uZWN0aW9uLT53cml0ZS0+YWN0aXZlKSB7Ci0gICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudChyLT5jb25uZWN0aW9uLT53cml0ZSwgTkdYX1dSSVRFX0VWRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NMRUFSX0VWRU5UKSA9PSBOR1hfRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgY2wgPSBuZ3hfaHR0cF9wcm94eV9jcmVhdGVfcmVxdWVzdChwKTsKLSAgICBpZiAoY2wgPT0gTlVMTCkgewotICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT5idWZzKSB7Ci0gICAgICAgIGNsLT5uZXh0ID0gci0+cmVxdWVzdF9ib2R5LT5idWZzOwotICAgIH0KLQotICAgIHItPnJlcXVlc3RfYm9keS0+YnVmcyA9IGNsOwotCi0gICAgY3R4ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X2xvZ19jdHhfdCkpOwotICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY3R4LT5jb25uZWN0aW9uID0gci0+Y29ubmVjdGlvbi0+bnVtYmVyOwotICAgIGN0eC0+cHJveHkgPSBwOwotCi0gICAgcC0+dXBzdHJlYW0tPnBlZXIubG9nID0gci0+Y29ubmVjdGlvbi0+bG9nOwotICAgIHAtPnNhdmVkX2N0eCA9IHItPmNvbm5lY3Rpb24tPmxvZy0+ZGF0YTsKLSAgICBwLT5zYXZlZF9oYW5kbGVyID0gci0+Y29ubmVjdGlvbi0+bG9nLT5oYW5kbGVyOwotICAgIHItPmNvbm5lY3Rpb24tPmxvZy0+ZGF0YSA9IGN0eDsKLSAgICByLT5jb25uZWN0aW9uLT5sb2ctPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9sb2dfZXJyb3I7Ci0gICAgcC0+YWN0aW9uID0gImNvbm5lY3RpbmcgdG8gdXBzdHJlYW0iOwotCi0gICAgb3V0cHV0ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9vdXRwdXRfY2hhaW5fY3R4X3QpKTsKLSAgICBpZiAob3V0cHV0ID09IE5VTEwpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcC0+dXBzdHJlYW0tPm91dHB1dF9jaGFpbl9jdHggPSBvdXRwdXQ7Ci0KLSAgICBvdXRwdXQtPnNlbmRmaWxlID0gci0+Y29ubmVjdGlvbi0+c2VuZGZpbGU7Ci0gICAgb3V0cHV0LT5wb29sID0gci0+cG9vbDsKLSAgICBvdXRwdXQtPmJ1ZnMubnVtID0gMTsKLSAgICBvdXRwdXQtPnRhZyA9IChuZ3hfYnVmX3RhZ190KSAmbmd4X2h0dHBfcHJveHlfbW9kdWxlOwotICAgIG91dHB1dC0+b3V0cHV0X2ZpbHRlciA9IG5neF9jaGFpbl93cml0ZXI7Ci0KLSAgICB3cml0ZXIgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfY2hhaW5fd3JpdGVyX2N0eF90KSk7Ci0gICAgaWYgKHdyaXRlciA9PSBOVUxMKSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG91dHB1dC0+ZmlsdGVyX2N0eCA9IHdyaXRlcjsKLSAgICB3cml0ZXItPnBvb2wgPSByLT5wb29sOwotCi0jaWYgMAotICAgIGlmIChwLT5sY2YtPmJ1c3lfbG9jayAmJiBwLT5idXN5X2xvY2sgPT0gTlVMTCkgewotI2Vsc2UKLSAgICBpZiAocC0+bGNmLT5idXN5X2xvY2sgJiYgIXAtPmJ1c3lfbG9ja2VkKSB7Ci0jZW5kaWYKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fYnVzeV9sb2NrKHApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2Nvbm5lY3QocCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X3JlaW5pdF91cHN0cmVhbShuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKLXsKLSAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAqY2w7Ci0gICAgbmd4X291dHB1dF9jaGFpbl9jdHhfdCAgKm91dHB1dDsKLSAgICBuZ3hfaHR0cF9wcm94eV9zdGF0ZV9lICAgc3RhdGU7Ci0KLSAgICAvKiByZWluaXQgdGhlIHJlcXVlc3QgY2hhaW4gKi8KLQotICAgIGZvciAoY2wgPSBwLT5yZXF1ZXN0LT5yZXF1ZXN0X2JvZHktPmJ1ZnM7IGNsOyBjbCA9IGNsLT5uZXh0KSB7Ci0gICAgICAgIGNsLT5idWYtPnBvcyA9IGNsLT5idWYtPnN0YXJ0OwotICAgICAgICBjbC0+YnVmLT5maWxlX3BvcyA9IDA7Ci0gICAgfQotCi0gICAgLyogcmVpbml0IHRoZSBuZ3hfb3V0cHV0X2NoYWluKCkgY29udGV4dCAqLwotCi0gICAgb3V0cHV0ID0gcC0+dXBzdHJlYW0tPm91dHB1dF9jaGFpbl9jdHg7Ci0KLSAgICBvdXRwdXQtPmJ1ZiA9IE5VTEw7Ci0gICAgb3V0cHV0LT5pbiA9IE5VTEw7Ci0gICAgb3V0cHV0LT5mcmVlID0gTlVMTDsKLSAgICBvdXRwdXQtPmJ1c3kgPSBOVUxMOwotCi0gICAgLyogcmVpbml0IHItPmhlYWRlcl9pbiBidWZmZXIgKi8KLQotICAgIGlmIChwLT5oZWFkZXJfaW4pIHsKLSAgICAgICAgaWYgKHAtPmNhY2hlKSB7Ci0gICAgICAgICAgICBwLT5oZWFkZXJfaW4tPnBvcyA9IHAtPmhlYWRlcl9pbi0+c3RhcnQgKyBwLT5jYWNoZS0+Y3R4LmhlYWRlcl9zaXplOwotICAgICAgICAgICAgcC0+aGVhZGVyX2luLT5sYXN0ID0gcC0+aGVhZGVyX2luLT5wb3M7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHAtPmhlYWRlcl9pbi0+cG9zID0gcC0+aGVhZGVyX2luLT5zdGFydDsKLSAgICAgICAgICAgIHAtPmhlYWRlcl9pbi0+bGFzdCA9IHAtPmhlYWRlcl9pbi0+c3RhcnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhZGQgb25lIG1vcmUgc3RhdGUgKi8KLQotICAgIHN0YXRlID0gcC0+c3RhdGUtPmNhY2hlX3N0YXRlOwotCi0gICAgcC0+c3RhdGUgPSBuZ3hfYXJyYXlfcHVzaCgmcC0+c3RhdGVzKTsKLSAgICBpZiAocC0+c3RhdGUgPT0gTlVMTCkgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBuZ3hfbWVtemVybyhwLT5zdGF0ZSwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X3N0YXRlX3QpKTsKLQotICAgIHAtPnN0YXRlLT5jYWNoZV9zdGF0ZSA9IHN0YXRlOyAKLQotICAgIHAtPnN0YXR1cyA9IDA7Ci0gICAgcC0+c3RhdHVzX2NvdW50ID0gMDsKLX0KLQotCi0jaWYgMAotCi12b2lkIG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX2J1c3lfbG9jayhuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKLXsKLSAgICBuZ3hfaW50X3QgIHJjOwotCi0gICAgcmMgPSBuZ3hfZXZlbnRfYnVzeV9sb2NrKHAtPmxjZi0+YnVzeV9sb2NrLCBwLT5idXN5X2xvY2spOwotCi0gICAgaWYgKHJjID09IE5HWF9BR0FJTikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJjID09IE5HWF9PSykgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9jb25uZWN0KHApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJjID09IE5HWF9FUlJPUikgewotICAgICAgICBwLT5zdGF0ZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiByYyA9PSBOR1hfQlVTWSAqLwotCi0jaWYgKE5HWF9IVFRQX0NBQ0hFKQotCi0gICAgaWYgKHAtPmJ1c3lfbG9jay0+dGltZXIpIHsKLSAgICAgICAgZnRfdHlwZSA9IE5HWF9IVFRQX1BST1hZX0ZUX01BWF9XQUlUSU5HOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZ0X3R5cGUgPSBOR1hfSFRUUF9QUk9YWV9GVF9CVVNZX0xPQ0s7Ci0gICAgfQotCi0gICAgaWYgKHAtPnN0YWxlICYmIChwLT5sY2YtPnVzZV9zdGFsZSAmIGZ0X3R5cGUpKSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9zZW5kX2NhY2hlZF9yZXNwb25zZShwKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgcC0+c3RhdGUtPnN0YXR1cyA9IE5HWF9IVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEU7Ci0gICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9TRVJWSUNFX1VOQVZBSUxBQkxFKTsKLX0KLQotI2VuZGlmCi0KLQotI2lmIDEKLQotdm9pZCBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9idXN5X2xvY2sobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCi17Ci0gICAgbmd4X2ludF90ICByYzsKLSNpZiAoTkdYX0hUVFBfQ0FDSEUpCi0gICAgbmd4X2ludF90ICBmdF90eXBlOwotI2VuZGlmCi0KLSAgICBpZiAocC0+YnVzeV9sb2NrLnRpbWUgPT0gMCkgewotICAgICAgICBwLT5idXN5X2xvY2suZXZlbnQgPSBwLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5yZWFkOwotICAgICAgICBwLT5idXN5X2xvY2suZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Byb3h5X2J1c3lfbG9ja19oYW5kbGVyOwotICAgIH0KLQotICAgIHJjID0gbmd4X2h0dHBfYnVzeV9sb2NrKHAtPmxjZi0+YnVzeV9sb2NrLCAmcC0+YnVzeV9sb2NrKTsKLQotICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyYyA9PSBOR1hfT0spIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfY29ubmVjdChwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5neF9odHRwX2J1c3lfdW5sb2NrKHAtPmxjZi0+YnVzeV9sb2NrLCAmcC0+YnVzeV9sb2NrKTsKLQotI2lmIChOR1hfSFRUUF9DQUNIRSkKLQotICAgIGlmIChyYyA9PSBOR1hfRE9ORSkgewotICAgICAgICBmdF90eXBlID0gTkdYX0hUVFBfUFJPWFlfRlRfQlVTWV9MT0NLOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogcmMgPT0gTkdYX0VSUk9SICovCi0gICAgICAgIGZ0X3R5cGUgPSBOR1hfSFRUUF9QUk9YWV9GVF9NQVhfV0FJVElORzsKLSAgICB9Ci0KLSAgICBpZiAocC0+c3RhbGUgJiYgKHAtPmxjZi0+dXNlX3N0YWxlICYgZnRfdHlwZSkpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X3NlbmRfY2FjaGVkX3Jlc3BvbnNlKHApKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICBwLT5zdGF0ZS0+c3RhdHVzID0gTkdYX0hUVFBfU0VSVklDRV9VTkFWQUlMQUJMRTsKLSAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEUpOwotfQotCi0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9jb25uZWN0KG5neF9odHRwX3Byb3h5X2N0eF90ICpwKQotewotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICByYzsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAqYzsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAqcjsKLSAgICBuZ3hfb3V0cHV0X2NoYWluX2N0eF90ICAqb3V0cHV0OwotICAgIG5neF9jaGFpbl93cml0ZXJfY3R4X3QgICp3cml0ZXI7Ci0KLSAgICBwLT5hY3Rpb24gPSAiY29ubmVjdGluZyB0byB1cHN0cmVhbSI7Ci0KLSAgICBwLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5zaW5nbGVfY29ubmVjdGlvbiA9IDA7Ci0KLSAgICByYyA9IG5neF9ldmVudF9jb25uZWN0X3BlZXIoJnAtPnVwc3RyZWFtLT5wZWVyKTsKLQotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgcC0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IGNvbm5lY3Q6ICVpIiwgcmMpOwotCi0gICAgaWYgKHJjID09IE5HWF9FUlJPUikgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwLT5zdGF0ZS0+cGVlciA9Ci0gICAgICAgICAgICAgICAmcC0+dXBzdHJlYW0tPnBlZXIucGVlcnMtPnBlZXJbcC0+dXBzdHJlYW0tPnBlZXIuY3VyX3BlZXJdLm5hbWU7Ci0KLSAgICBpZiAocmMgPT0gTkdYX0NPTk5FQ1RfRVJST1IpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByID0gcC0+cmVxdWVzdDsKLSAgICBjID0gcC0+dXBzdHJlYW0tPnBlZXIuY29ubmVjdGlvbjsKLQotICAgIGMtPmRhdGEgPSBwOwotICAgIGMtPndyaXRlLT5oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfc2VuZF9yZXF1ZXN0X2hhbmRsZXI7Ci0gICAgYy0+cmVhZC0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfdXBzdHJlYW1fc3RhdHVzX2xpbmU7Ci0KLSAgICBjLT5zZW5kZmlsZSA9IHItPmNvbm5lY3Rpb24tPnNlbmRmaWxlOwotCi0gICAgYy0+cG9vbCA9IHItPnBvb2w7Ci0gICAgYy0+cmVhZC0+bG9nID0gYy0+d3JpdGUtPmxvZyA9IGMtPmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKLQotICAgIC8qIGluaXQgb3IgcmVpbml0IHRoZSBuZ3hfb3V0cHV0X2NoYWluKCkgYW5kIG5neF9jaGFpbl93cml0ZXIoKSBjb250ZXh0cyAqLwotCi0gICAgb3V0cHV0ID0gcC0+dXBzdHJlYW0tPm91dHB1dF9jaGFpbl9jdHg7Ci0gICAgd3JpdGVyID0gb3V0cHV0LT5maWx0ZXJfY3R4OwotICAgIHdyaXRlci0+b3V0ID0gTlVMTDsKLSAgICB3cml0ZXItPmxhc3QgPSAmd3JpdGVyLT5vdXQ7Ci0gICAgd3JpdGVyLT5jb25uZWN0aW9uID0gYzsKLSAgICB3cml0ZXItPmxpbWl0ID0gMDsKLQotICAgIGlmIChwLT5yZXF1ZXN0X3NlbnQpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfcmVpbml0X3Vwc3RyZWFtKHApOwotICAgIH0KLQotICAgIGlmIChyLT5yZXF1ZXN0X2JvZHktPmJ1ZikgewotICAgICAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUpIHsKLQotICAgICAgICAgICAgb3V0cHV0LT5mcmVlID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0LT5mcmVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0cHV0LT5mcmVlLT5idWYgPSByLT5yZXF1ZXN0X2JvZHktPmJ1ZjsKLSAgICAgICAgICAgIG91dHB1dC0+ZnJlZS0+bmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICBvdXRwdXQtPmFsbG9jYXRlZCA9IDE7Ci0KLSAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT5wb3MgPSByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+c3RhcnQ7Ci0gICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+bGFzdCA9IHItPnJlcXVlc3RfYm9keS0+YnVmLT5zdGFydDsKLSAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT50YWcgPSAobmd4X2J1Zl90YWdfdCkgJm5neF9odHRwX3Byb3h5X21vZHVsZTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWYtPnBvcyA9IHItPnJlcXVlc3RfYm9keS0+YnVmLT5zdGFydDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHAtPnJlcXVlc3Rfc2VudCA9IDA7Ci0KLSAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7Ci0gICAgICAgIG5neF9hZGRfdGltZXIoYy0+d3JpdGUsIHAtPmxjZi0+Y29ubmVjdF90aW1lb3V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIHJjID09IE5HWF9PSyAqLwotCi0jaWYgMCAvKiB0ZXN0IG9ubHksIHNlZSBiZWxvdyBhYm91dCAicG9zdCBhaW8gb3BlcmF0aW9uIiAqLwotCi0gICAgaWYgKGMtPnJlYWQtPnJlYWR5KSB7Ci0gICAgICAgIC8qIHBvc3QgYWlvIG9wZXJhdGlvbiAqLwotICAgICAgICBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX3Vwc3RyZWFtX3N0YXR1c19saW5lKGMtPnJlYWQpOwotI2lmIDAKLSAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0gICAgfQotCi0jZW5kaWYKLQotICAgIG5neF9odHRwX3Byb3h5X3NlbmRfcmVxdWVzdChwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9zZW5kX3JlcXVlc3Qobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgIHJjOwotICAgIG5neF9jb25uZWN0aW9uX3QgICpjOwotCi0gICAgYyA9IHAtPnVwc3RyZWFtLT5wZWVyLmNvbm5lY3Rpb247Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGMtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBzZW5kIHJlcXVlc3QiKTsKLQotI2lmIChOR1hfSEFWRV9LUVVFVUUpCi0KLSAgICBpZiAoKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfS1FVRVVFX0VWRU5UKQotICAgICAgICAmJiAhcC0+cmVxdWVzdF9zZW50Ci0gICAgICAgICYmIGMtPndyaXRlLT5wZW5kaW5nX2VvZikKLSAgICB7Ci0gICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIGMtPmxvZywgYy0+d3JpdGUtPmtxX2Vycm5vLAotICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0KCkgZmFpbGVkIik7Ci0KLSAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgcC0+YWN0aW9uID0gInNlbmRpbmcgcmVxdWVzdCB0byB1cHN0cmVhbSI7Ci0KLSAgICByYyA9IG5neF9vdXRwdXRfY2hhaW4ocC0+dXBzdHJlYW0tPm91dHB1dF9jaGFpbl9jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnJlcXVlc3Rfc2VudCA/IE5VTEw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnJlcXVlc3QtPnJlcXVlc3RfYm9keS0+YnVmcyk7Ci0KLSAgICBwLT5yZXF1ZXN0X3NlbnQgPSAxOwotCi0gICAgaWYgKHJjID09IE5HWF9FUlJPUikgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9uZXh0X3Vwc3RyZWFtKHAsIE5HWF9IVFRQX1BST1hZX0ZUX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjLT53cml0ZS0+dGltZXJfc2V0KSB7Ci0gICAgICAgIG5neF9kZWxfdGltZXIoYy0+d3JpdGUpOwotICAgIH0KLQotICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKLSAgICAgICAgbmd4X2FkZF90aW1lcihjLT53cml0ZSwgcC0+bGNmLT5zZW5kX3RpbWVvdXQpOwotCi0gICAgICAgIGlmIChuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KGMtPndyaXRlLCBwLT5sY2YtPnNlbmRfbG93YXQpID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIHJjID09IE5HWF9PSyAqLwotCi0gICAgaWYgKGMtPnRjcF9ub3B1c2ggPT0gTkdYX1RDUF9OT1BVU0hfU0VUKSB7Ci0gICAgICAgIGlmIChuZ3hfdGNwX3B1c2goYy0+ZmQpID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0NSSVQsIGMtPmxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3NvY2tldF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3RjcF9wdXNoX24gIiBmYWlsZWQiKTsKLSAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybjsgCi0gICAgICAgIH0KLQotICAgICAgICBjLT50Y3Bfbm9wdXNoID0gTkdYX1RDUF9OT1BVU0hfVU5TRVQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBuZ3hfYWRkX3RpbWVyKGMtPnJlYWQsIHAtPmxjZi0+cmVhZF90aW1lb3V0KTsKLQotI2lmIDEKLSAgICBpZiAoYy0+cmVhZC0+cmVhZHkpIHsKLQotICAgICAgICAvKiBwb3N0IGFpbyBvcGVyYXRpb24gKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBhbHRob3VnaCB3ZSBjYW4gcG9zdCBhaW8gb3BlcmF0aW9uIGp1c3QgaW4gdGhlIGVuZAotICAgICAgICAgKiBvZiBuZ3hfaHR0cF9wcm94eV9jb25uZWN0KCkgQ0hFQ0sgSVQgISEhCi0gICAgICAgICAqIGl0J3MgYmV0dGVyIHRvIGRvIGhlcmUgYmVjYXVzZSB3ZSBwb3N0cG9uZSBoZWFkZXIgYnVmZmVyIGFsbG9jYXRpb24KLSAgICAgICAgICovCi0KLSAgICAgICAgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc191cHN0cmVhbV9zdGF0dXNfbGluZShjLT5yZWFkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9kdW1teV9oYW5kbGVyOwotCi0gICAgaWYgKG5neF9oYW5kbGVfd3JpdGVfZXZlbnQoYy0+d3JpdGUsIDApID09IE5HWF9FUlJPUikgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfc2VuZF9yZXF1ZXN0X2hhbmRsZXIobmd4X2V2ZW50X3QgKndldikKLXsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgKmM7Ci0gICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgICpwOwotCi0gICAgYyA9IHdldi0+ZGF0YTsKLSAgICBwID0gYy0+ZGF0YTsKLQotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgd2V2LT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgc2VuZCByZXF1ZXN0IGhhbmRsZXIiKTsKLQotICAgIGlmICh3ZXYtPnRpbWVkb3V0KSB7Ci0gICAgICAgIHAtPmFjdGlvbiA9ICJzZW5kaW5nIHJlcXVlc3QgdG8gdXBzdHJlYW0iOwotICAgICAgICBuZ3hfaHR0cF9wcm94eV9uZXh0X3Vwc3RyZWFtKHAsIE5HWF9IVFRQX1BST1hZX0ZUX1RJTUVPVVQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHAtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPndyaXRlLT5lb2YKLSAgICAgICAgJiYgKCFwLT5jYWNoYWJsZSB8fCAhcC0+cmVxdWVzdF9zZW50KSkKLSAgICB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgTkdYX0hUVFBfQ0xJRU5UX0NMT1NFRF9SRVFVRVNUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5neF9odHRwX3Byb3h5X3NlbmRfcmVxdWVzdChwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9kdW1teV9oYW5kbGVyKG5neF9ldmVudF90ICp3ZXYpCi17Ci0gICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCB3ZXYtPmxvZywgMCwgImh0dHAgcHJveHkgZHVtbXkgaGFuZGxlciIpOwotfQotCi0KLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfdXBzdHJlYW1fc3RhdHVzX2xpbmUobmd4X2V2ZW50X3QgKnJldikKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgIHJjOwotICAgIHNzaXplX3QgICAgICAgICAgICAgICAgbjsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgKmM7Ci0gICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgICpwOwotCi0gICAgYyA9IHJldi0+ZGF0YTsKLSAgICBwID0gYy0+ZGF0YTsKLSAgICBwLT5hY3Rpb24gPSAicmVhZGluZyB1cHN0cmVhbSBzdGF0dXMgbGluZSI7Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHJldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IHByb2Nlc3Mgc3RhdHVzIGxpbmUiKTsKLQotICAgIGlmIChyZXYtPnRpbWVkb3V0KSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X25leHRfdXBzdHJlYW0ocCwgTkdYX0hUVFBfUFJPWFlfRlRfVElNRU9VVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocC0+aGVhZGVyX2luID09IE5VTEwpIHsKLSAgICAgICAgcC0+aGVhZGVyX2luID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihwLT5yZXF1ZXN0LT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxjZi0+aGVhZGVyX2J1ZmZlcl9zaXplKTsKLSAgICAgICAgaWYgKHAtPmhlYWRlcl9pbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcC0+aGVhZGVyX2luLT50YWcgPSAobmd4X2J1Zl90YWdfdCkgJm5neF9odHRwX3Byb3h5X21vZHVsZTsKLQotICAgICAgICBpZiAocC0+Y2FjaGUpIHsKLSAgICAgICAgICAgIHAtPmhlYWRlcl9pbi0+cG9zICs9IHAtPmNhY2hlLT5jdHguaGVhZGVyX3NpemU7Ci0gICAgICAgICAgICBwLT5oZWFkZXJfaW4tPmxhc3QgPSBwLT5oZWFkZXJfaW4tPnBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG4gPSBuZ3hfaHR0cF9wcm94eV9yZWFkX3Vwc3RyZWFtX2hlYWRlcihwKTsKLQotICAgIGlmIChuID09IE5HWF9BR0FJTikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG4gPT0gMCkgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByZXYtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gcHJlbWF0dXJlbHkgY2xvc2VkIGNvbm5lY3Rpb24iKTsKLSAgICB9Ci0KLSAgICBpZiAobiA9PSBOR1hfRVJST1IgfHwgbiA9PSAwKSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X25leHRfdXBzdHJlYW0ocCwgTkdYX0hUVFBfUFJPWFlfRlRfRVJST1IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcC0+dmFsaWRfaGVhZGVyX2luID0gMDsKLQotICAgIHAtPnVwc3RyZWFtLT5wZWVyLmNhY2hlZCA9IDA7Ci0KLSAgICByYyA9IG5neF9odHRwX3Byb3h5X3BhcnNlX3N0YXR1c19saW5lKHApOwotCi0gICAgaWYgKHJjID09IE5HWF9BR0FJTikgewotICAgICAgICBpZiAocC0+aGVhZGVyX2luLT5wb3MgPT0gcC0+aGVhZGVyX2luLT5lbmQpIHsKLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHJldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gc2VudCB0b28gbG9uZyBzdGF0dXMgbGluZSIpOwotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9JTlZBTElEX0hFQURFUik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyYyA9PSBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVIpIHsKLSAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgcmV2LT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIHNlbnQgbm8gdmFsaWQgSFRUUC8xLjAgaGVhZGVyIik7Ci0KLSAgICAgICAgaWYgKHAtPmFjY2VsKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9uZXh0X3Vwc3RyZWFtKHAsIE5HWF9IVFRQX1BST1hZX0ZUX0lOVkFMSURfSEVBREVSKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcC0+cmVxdWVzdC0+aHR0cF92ZXJzaW9uID0gTkdYX0hUVFBfVkVSU0lPTl85OwotICAgICAgICAgICAgcC0+dXBzdHJlYW0tPnN0YXR1cyA9IE5HWF9IVFRQX09LOwotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfc2VuZF9yZXNwb25zZShwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiByYyA9PSBOR1hfT0sgKi8KLQotICAgIHAtPnVwc3RyZWFtLT5zdGF0dXMgPSBwLT5zdGF0dXM7Ci0gICAgcC0+c3RhdGUtPnN0YXR1cyA9IHAtPnN0YXR1czsKLQotICAgIGlmIChwLT5zdGF0dXMgPT0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSB7Ci0KLSAgICAgICAgaWYgKHAtPnVwc3RyZWFtLT5wZWVyLnRyaWVzID4gMQotICAgICAgICAgICAgJiYgKHAtPmxjZi0+bmV4dF91cHN0cmVhbSAmIE5HWF9IVFRQX1BST1hZX0ZUX0hUVFBfNTAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9IVFRQXzUwMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotI2lmIChOR1hfSFRUUF9DQUNIRSkKLQotICAgICAgICBpZiAocC0+dXBzdHJlYW0tPnBlZXIudHJpZXMgPT0gMAotICAgICAgICAgICAgJiYgcC0+c3RhbGUKLSAgICAgICAgICAgICYmIChwLT5sY2YtPnVzZV9zdGFsZSAmIE5HWF9IVFRQX1BST1hZX0ZUX0hUVFBfNTAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfc2VuZF9jYWNoZWRfcmVzcG9uc2UocCkpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotI2VuZGlmCi0gICAgfQotCi0gICAgaWYgKHAtPnN0YXR1cyA9PSBOR1hfSFRUUF9OT1RfRk9VTkQKLSAgICAgICAgJiYgcC0+dXBzdHJlYW0tPnBlZXIudHJpZXMgPiAxCi0gICAgICAgICYmIHAtPmxjZi0+bmV4dF91cHN0cmVhbSAmIE5HWF9IVFRQX1BST1hZX0ZUX0hUVFBfNDA0KQotICAgIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9IVFRQXzQwNCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBUT0RPOiAicHJveHlfZXJyb3JfcGFnZSIgKi8KLQotICAgIHAtPnVwc3RyZWFtLT5zdGF0dXNfbGluZS5sZW4gPSBwLT5zdGF0dXNfZW5kIC0gcC0+c3RhdHVzX3N0YXJ0OwotICAgIHAtPnVwc3RyZWFtLT5zdGF0dXNfbGluZS5kYXRhID0gbmd4X3BhbGxvYyhwLT5yZXF1ZXN0LT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnVwc3RyZWFtLT5zdGF0dXNfbGluZS5sZW4gKyAxKTsKLSAgICBpZiAocC0+dXBzdHJlYW0tPnN0YXR1c19saW5lLmRhdGEgPT0gTlVMTCkgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbmd4X2NweXN0cm4ocC0+dXBzdHJlYW0tPnN0YXR1c19saW5lLmRhdGEsIHAtPnN0YXR1c19zdGFydCwKLSAgICAgICAgICAgICAgICBwLT51cHN0cmVhbS0+c3RhdHVzX2xpbmUubGVuICsgMSk7Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHJldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IHN0YXR1cyAldWkgXCIlVlwiIiwKLSAgICAgICAgICAgICAgICAgICBwLT51cHN0cmVhbS0+c3RhdHVzLCAmcC0+dXBzdHJlYW0tPnN0YXR1c19saW5lKTsKLQotCi0gICAgLyogaW5pdCBvciByZWluaXQgdGhlIHAtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMgdGFibGUgKi8KLQotICAgIGlmIChwLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQuZWx0cykgewotICAgICAgICBwLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQubmVsdHMgPSAwOwotICAgICAgICBwLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQubmV4dCA9IE5VTEw7Ci0gICAgICAgIHAtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMubGFzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQ7Ci0KLSAgICAgICAgbmd4X21lbXplcm8oJnAtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmRhdGUsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QpIC0gc2l6ZW9mKG5neF9saXN0X3QpKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChuZ3hfbGlzdF9pbml0KCZwLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzLCBwLT5yZXF1ZXN0LT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLCBzaXplb2Yobmd4X3RhYmxlX2VsdF90KSkgPT0gTkdYX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX3Vwc3RyZWFtX2hlYWRlcnM7Ci0gICAgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc191cHN0cmVhbV9oZWFkZXJzKHJldik7Ci19Ci0KLQotc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc191cHN0cmVhbV9oZWFkZXJzKG5neF9ldmVudF90ICpyZXYpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBpLCByYzsKLSAgICBzc2l6ZV90ICAgICAgICAgICAgICAgIG47Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICpoOwotICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAqYzsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgKnI7Ci0gICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgICpwOwotCi0gICAgYyA9IHJldi0+ZGF0YTsKLSAgICBwID0gYy0+ZGF0YTsKLSAgICByID0gcC0+cmVxdWVzdDsKLSAgICBwLT5hY3Rpb24gPSAicmVhZGluZyB1cHN0cmVhbSBoZWFkZXJzIjsKLQotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgcmV2LT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgcHJvY2VzcyBoZWFkZXIgbGluZSIpOwotCi0gICAgaWYgKHJldi0+dGltZWRvdXQpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9USU1FT1VUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJjID0gTkdYX0FHQUlOOwotCi0gICAgZm9yICggOzsgKSB7Ci0gICAgICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKLSAgICAgICAgICAgIG4gPSBuZ3hfaHR0cF9wcm94eV9yZWFkX3Vwc3RyZWFtX2hlYWRlcihwKTsKLQotICAgICAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHJldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIHByZW1hdHVyZWx5IGNsb3NlZCBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuID09IE5HWF9FUlJPUiB8fCBuID09IDApIHsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9uZXh0X3Vwc3RyZWFtKHAsIE5HWF9IVFRQX1BST1hZX0ZUX0VSUk9SKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuID09IE5HWF9BR0FJTikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJjID0gbmd4X2h0dHBfcGFyc2VfaGVhZGVyX2xpbmUocC0+cmVxdWVzdCwgcC0+aGVhZGVyX2luKTsKLQotICAgICAgICBpZiAocmMgPT0gTkdYX09LICYmICFyLT5pbnZhbGlkX2hlYWRlcikgewotCi0gICAgICAgICAgICAvKiBhIGhlYWRlciBsaW5lIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgKi8KLQotICAgICAgICAgICAgaCA9IG5neF9saXN0X3B1c2goJnAtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMpOwotICAgICAgICAgICAgaWYgKGggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoLT5rZXkubGVuID0gci0+aGVhZGVyX25hbWVfZW5kIC0gci0+aGVhZGVyX25hbWVfc3RhcnQ7Ci0gICAgICAgICAgICBoLT52YWx1ZS5sZW4gPSByLT5oZWFkZXJfZW5kIC0gci0+aGVhZGVyX3N0YXJ0OwotCi0gICAgICAgICAgICBoLT5rZXkuZGF0YSA9IG5neF9wYWxsb2MocC0+cmVxdWVzdC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5rZXkubGVuICsgMSArIGgtPnZhbHVlLmxlbiArIDEpOwotICAgICAgICAgICAgaWYgKGgtPmtleS5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaC0+dmFsdWUuZGF0YSA9IGgtPmtleS5kYXRhICsgaC0+a2V5LmxlbiArIDE7Ci0gICAgICAgICAgICBuZ3hfY3B5c3RybihoLT5rZXkuZGF0YSwgci0+aGVhZGVyX25hbWVfc3RhcnQsIGgtPmtleS5sZW4gKyAxKTsKLSAgICAgICAgICAgIG5neF9jcHlzdHJuKGgtPnZhbHVlLmRhdGEsIHItPmhlYWRlcl9zdGFydCwgaC0+dmFsdWUubGVuICsgMSk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5baV0ubmFtZS5sZW4gIT0gMDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5baV0ubmFtZS5sZW4gIT0gaC0+a2V5LmxlbikgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmd4X3N0cmNhc2VjbXAobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbltpXS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmtleS5kYXRhKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKigobmd4X3RhYmxlX2VsdF90ICoqKSAoKGNoYXIgKikgJnAtPnVwc3RyZWFtLT5oZWFkZXJzX2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbltpXS5vZmZzZXQpKSA9IGg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCBjLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBoZWFkZXI6IFwiJVY6ICVWXCIiLCAmaC0+a2V5LCAmaC0+dmFsdWUpOwotCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICB9IGVsc2UgaWYgKHJjID09IE5HWF9IVFRQX1BBUlNFX0hFQURFUl9ET05FKSB7Ci0KLSAgICAgICAgICAgIC8qIGEgd2hvbGUgaGVhZGVyIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgKi8KLQotICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCBjLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBoZWFkZXIgZG9uZSIpOwotCi0gICAgICAgICAgICAvKiBUT0RPOiBob29rIHRvIHByb2Nlc3MgdGhlIHVwc3RyZWFtIGhlYWRlciAqLwotCi0jaWYgKE5HWF9IVFRQX0NBQ0hFKQotCi0gICAgICAgICAgICBpZiAocC0+Y2FjaGFibGUpIHsKLSAgICAgICAgICAgICAgICBwLT5jYWNoYWJsZSA9IG5neF9odHRwX3Byb3h5X2lzX2NhY2hhYmxlKHApOwotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfc2VuZF9yZXNwb25zZShwKTsKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICB9IGVsc2UgaWYgKHJjICE9IE5HWF9BR0FJTikgewotCi0gICAgICAgICAgICBpZiAoci0+aW52YWxpZF9oZWFkZXIpIHsKLSAgICAgICAgICAgICAgICByYyA9IE5HWF9IVFRQX1BBUlNFX0lOVkFMSURfSEVBREVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB0aGVyZSB3YXMgZXJyb3Igd2hpbGUgYSBoZWFkZXIgbGluZSBwYXJzaW5nICovCi0KLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHJldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgIHVwc3RyZWFtX2hlYWRlcl9lcnJvcnNbcmMgLSBOR1hfSFRUUF9QQVJTRV9IRUFERVJfRVJST1JdKTsKLQotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9JTlZBTElEX0hFQURFUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiByYyA9PSBOR1hfQUdBSU46IGEgaGVhZGVyIGxpbmUgcGFyc2luZyBpcyBzdGlsbCBub3QgY29tcGxldGUgKi8KLQotICAgICAgICBpZiAocC0+aGVhZGVyX2luLT5sYXN0ID09IHAtPmhlYWRlcl9pbi0+ZW5kKSB7Ci0gICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByZXYtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIHNlbnQgdG9vIGJpZyBoZWFkZXIiKTsKLQotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9JTlZBTElEX0hFQURFUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHNzaXplX3Qgbmd4X2h0dHBfcHJveHlfcmVhZF91cHN0cmVhbV9oZWFkZXIobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCi17Ci0gICAgc3NpemVfdCAgICAgICBuOwotICAgIG5neF9ldmVudF90ICAqcmV2OwotCi0gICAgcmV2ID0gcC0+dXBzdHJlYW0tPnBlZXIuY29ubmVjdGlvbi0+cmVhZDsKLQotICAgIG4gPSBwLT5oZWFkZXJfaW4tPmxhc3QgLSBwLT5oZWFkZXJfaW4tPnBvczsKLQotICAgIGlmIChuID4gMCkgewotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICBuID0gbmd4X3JlY3YocC0+dXBzdHJlYW0tPnBlZXIuY29ubmVjdGlvbiwgcC0+aGVhZGVyX2luLT5sYXN0LAotICAgICAgICAgICAgICAgICBwLT5oZWFkZXJfaW4tPmVuZCAtIHAtPmhlYWRlcl9pbi0+bGFzdCk7Ci0KLSAgICBpZiAobiA9PSBOR1hfQUdBSU4pIHsKLSNpZiAwCi0gICAgICAgIG5neF9hZGRfdGltZXIocmV2LCBwLT5sY2YtPnJlYWRfdGltZW91dCk7Ci0jZW5kaWYKLQotICAgICAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KHJldiwgMCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKLSAgICB9Ci0KLSAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHJldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHkgY29ubmVjdGlvbiIpOwotICAgIH0KLQotICAgIGlmIChuID09IDAgfHwgbiA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICB9Ci0KLSAgICBwLT5oZWFkZXJfaW4tPmxhc3QgKz0gbjsKLQotICAgIHJldHVybiBuOwotfQotCi0KLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X3NlbmRfcmVzcG9uc2Uobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmM7Ci0gICAgbmd4X2V2ZW50X3BpcGVfdCAgICAgICAgICAgICAqZXA7Ci0gICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAqcjsKLSAgICBuZ3hfaHR0cF9jYWNoZV9oZWFkZXJfdCAgICAgICpoZWFkZXI7Ci0gICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgICAqY2xjZjsKLQotICAgIHIgPSBwLT5yZXF1ZXN0OwotCi0gICAgci0+aGVhZGVyc19vdXQuc3RhdHVzID0gcC0+dXBzdHJlYW0tPnN0YXR1czsKLSAgICByLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZSA9IHAtPnVwc3RyZWFtLT5zdGF0dXNfbGluZTsKLQotI2lmIDAKLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uID0gLTE7Ci0gICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGggPSBOVUxMOwotI2VuZGlmCi0KLSAgICAvKiBjb3B5IGFuIHVwc3RyZWFtIGhlYWRlciB0byByLT5oZWFkZXJzX291dCAqLwotCi0gICAgaWYgKG5neF9odHRwX3Byb3h5X2NvcHlfaGVhZGVyKHAsICZwLT51cHN0cmVhbS0+aGVhZGVyc19pbikgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFRPRE86IHByZWFsbG9jYXRlIGV2ZW50X3BpcGUgYnVmcywgbG9vayAiQ29udGVudC1MZW5ndGgiICovCi0KLSAgICByYyA9IG5neF9odHRwX3NlbmRfaGVhZGVyKHIpOwotCi0gICAgaWYgKHJjID09IE5HWF9FUlJPUiB8fCByYyA+IE5HWF9PSykgewotICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIHJjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHAtPmhlYWRlcl9zZW50ID0gMTsKLQotICAgIGlmIChwLT5jYWNoZSAmJiBwLT5jYWNoZS0+Y3R4LmZpbGUuZmQgIT0gTkdYX0lOVkFMSURfRklMRSkgewotICAgICAgICBpZiAobmd4X2Nsb3NlX2ZpbGUocC0+Y2FjaGUtPmN0eC5maWxlLmZkKSA9PSBOR1hfRklMRV9FUlJPUikgewotICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIG5neF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2Nsb3NlX2ZpbGVfbiAiIFwiJXNcIiBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5jYWNoZS0+Y3R4LmZpbGUubmFtZS5kYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwLT5jYWNoYWJsZSkgewotICAgICAgICBoZWFkZXIgPSAobmd4X2h0dHBfY2FjaGVfaGVhZGVyX3QgKikgcC0+aGVhZGVyX2luLT5zdGFydDsKLQotICAgICAgICBoZWFkZXItPmV4cGlyZXMgPSBwLT5jYWNoZS0+Y3R4LmV4cGlyZXM7Ci0gICAgICAgIGhlYWRlci0+bGFzdF9tb2RpZmllZCA9IHAtPmNhY2hlLT5jdHgubGFzdF9tb2RpZmllZDsKLSAgICAgICAgaGVhZGVyLT5kYXRlID0gcC0+Y2FjaGUtPmN0eC5kYXRlOwotICAgICAgICBoZWFkZXItPmxlbmd0aCA9IHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoX247Ci0gICAgICAgIHAtPmNhY2hlLT5jdHgubGVuZ3RoID0gci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbjsKLQotICAgICAgICBoZWFkZXItPmtleV9sZW4gPSBwLT5jYWNoZS0+Y3R4LmtleTAubGVuOwotICAgICAgICBuZ3hfbWVtY3B5KCZoZWFkZXItPmtleSwgcC0+Y2FjaGUtPmN0eC5rZXkwLmRhdGEsIGhlYWRlci0+a2V5X2xlbik7Ci0gICAgICAgIGhlYWRlci0+a2V5W2hlYWRlci0+a2V5X2xlbl0gPSBMRjsKLSAgICB9Ci0KLSAgICBlcCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfZXZlbnRfcGlwZV90KSk7Ci0gICAgaWYgKGVwID09IE5VTEwpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHAtPnVwc3RyZWFtLT5ldmVudF9waXBlID0gZXA7Ci0KLSAgICBlcC0+aW5wdXRfZmlsdGVyID0gbmd4X2V2ZW50X3BpcGVfY29weV9pbnB1dF9maWx0ZXI7Ci0gICAgZXAtPm91dHB1dF9maWx0ZXIgPSAobmd4X2V2ZW50X3BpcGVfb3V0cHV0X2ZpbHRlcl9wdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfb3V0cHV0X2ZpbHRlcjsKLSAgICBlcC0+b3V0cHV0X2N0eCA9IHI7Ci0gICAgZXAtPnRhZyA9IChuZ3hfYnVmX3RhZ190KSAmbmd4X2h0dHBfcHJveHlfbW9kdWxlOwotICAgIGVwLT5idWZzID0gcC0+bGNmLT5idWZzOwotICAgIGVwLT5idXN5X3NpemUgPSBwLT5sY2YtPmJ1c3lfYnVmZmVyc19zaXplOwotICAgIGVwLT51cHN0cmVhbSA9IHAtPnVwc3RyZWFtLT5wZWVyLmNvbm5lY3Rpb247Ci0gICAgZXAtPmRvd25zdHJlYW0gPSByLT5jb25uZWN0aW9uOwotICAgIGVwLT5wb29sID0gci0+cG9vbDsKLSAgICBlcC0+bG9nID0gci0+Y29ubmVjdGlvbi0+bG9nOwotCi0gICAgZXAtPmNhY2hhYmxlID0gcC0+Y2FjaGFibGU7Ci0KLSAgICBlcC0+dGVtcF9maWxlID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF90ZW1wX2ZpbGVfdCkpOwotICAgIGlmIChlcC0+dGVtcF9maWxlID09IE5VTEwpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGVwLT50ZW1wX2ZpbGUtPmZpbGUuZmQgPSBOR1hfSU5WQUxJRF9GSUxFOwotICAgIGVwLT50ZW1wX2ZpbGUtPmZpbGUubG9nID0gci0+Y29ubmVjdGlvbi0+bG9nOwotICAgIGVwLT50ZW1wX2ZpbGUtPnBhdGggPSBwLT5sY2YtPnRlbXBfcGF0aDsKLSAgICBlcC0+dGVtcF9maWxlLT5wb29sID0gci0+cG9vbDsKLQotICAgIGlmIChwLT5jYWNoYWJsZSkgewotICAgICAgICBlcC0+dGVtcF9maWxlLT5wZXJzaXN0ZW50ID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcC0+dGVtcF9maWxlLT53YXJuID0gImFuIHVwc3RyZWFtIHJlc3BvbnNlIGlzIGJ1ZmZlcmVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBhIHRlbXBvcmFyeSBmaWxlIjsKLSAgICB9Ci0KLSAgICBlcC0+bWF4X3RlbXBfZmlsZV9zaXplID0gcC0+bGNmLT5tYXhfdGVtcF9maWxlX3NpemU7Ci0gICAgZXAtPnRlbXBfZmlsZV93cml0ZV9zaXplID0gcC0+bGNmLT50ZW1wX2ZpbGVfd3JpdGVfc2l6ZTsKLQotICAgIGVwLT5wcmVyZWFkX2J1ZnMgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKLSAgICBpZiAoZXAtPnByZXJlYWRfYnVmcyA9PSBOVUxMKSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZXAtPnByZXJlYWRfYnVmcy0+YnVmID0gcC0+aGVhZGVyX2luOwotICAgIGVwLT5wcmVyZWFkX2J1ZnMtPm5leHQgPSBOVUxMOwotICAgIHAtPmhlYWRlcl9pbi0+cmVjeWNsZWQgPSAxOwotCi0gICAgZXAtPnByZXJlYWRfc2l6ZSA9IHAtPmhlYWRlcl9pbi0+bGFzdCAtIHAtPmhlYWRlcl9pbi0+cG9zOwotCi0gICAgaWYgKHAtPmNhY2hhYmxlKSB7Ci0gICAgICAgIGVwLT5idWZfdG9fZmlsZSA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpOwotICAgICAgICBpZiAoZXAtPmJ1Zl90b19maWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZXAtPmJ1Zl90b19maWxlLT5wb3MgPSBwLT5oZWFkZXJfaW4tPnN0YXJ0OwotICAgICAgICBlcC0+YnVmX3RvX2ZpbGUtPmxhc3QgPSBwLT5oZWFkZXJfaW4tPnBvczsKLSAgICAgICAgZXAtPmJ1Zl90b19maWxlLT50ZW1wb3JhcnkgPSAxOwotICAgIH0KLQotICAgIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0FJT19FVkVOVCkgewotICAgICAgICAvKiB0aGUgcG9zdGVkIGFpbyBvcGVyYXRpb24gY2FuIGN1cnJ1cHQgYSBzaGFkb3cgYnVmZmVyICovCi0gICAgICAgIGVwLT5zaW5nbGVfYnVmID0gMTsKLSAgICB9Ci0KLSAgICAvKiBUT0RPOiBlcC0+ZnJlZV9idWZzID0gMCBpZiB1c2Ugbmd4X2NyZWF0ZV9jaGFpbl9vZl9idWZzKCkgKi8KLSAgICBlcC0+ZnJlZV9idWZzID0gMTsKLQotICAgIC8qCi0gICAgICogZXZlbnRfcGlwZSB3b3VsZCBkbyBwLT5oZWFkZXJfaW4tPmxhc3QgKz0gZXAtPnByZXJlYWRfc2l6ZQotICAgICAqIGFzIHRob3VnaCB0aGVzZSBieXRlcyB3ZXJlIHJlYWQuCi0gICAgICovCi0gICAgcC0+aGVhZGVyX2luLT5sYXN0ID0gcC0+aGVhZGVyX2luLT5wb3M7Ci0KLSAgICBpZiAocC0+bGNmLT5jeWNsaWNfdGVtcF9maWxlKSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogd2UgbmVlZCB0byBkaXNhYmxlIHRoZSB1c2Ugb2Ygc2VuZGZpbGUoKSBpZiB3ZSB1c2UgY3ljbGljIHRlbXAgZmlsZQotICAgICAgICAgKiBiZWNhdXNlIHRoZSB3cml0aW5nIGEgbmV3IGRhdGEgY2FuIGludGVyZmVyZSB3aXRoIHNlbmRmaWxlKCkKLSAgICAgICAgICogdGhhdCB1c2VzIHRoZSBzYW1lIGtlcm5lbCBmaWxlIHBhZ2VzIChhdCBsZWFzdCBvbiBGcmVlQlNEKQotICAgICAgICAgKi8KLQotICAgICAgICBlcC0+Y3ljbGljX3RlbXBfZmlsZSA9IDE7Ci0gICAgICAgIHItPmNvbm5lY3Rpb24tPnNlbmRmaWxlID0gMDsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVwLT5jeWNsaWNfdGVtcF9maWxlID0gMDsKLSAgICB9Ci0KLSAgICBjbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7Ci0KLSAgICBlcC0+cmVhZF90aW1lb3V0ID0gcC0+bGNmLT5yZWFkX3RpbWVvdXQ7Ci0gICAgZXAtPnNlbmRfdGltZW91dCA9IGNsY2YtPnNlbmRfdGltZW91dDsKLSAgICBlcC0+c2VuZF9sb3dhdCA9IGNsY2YtPnNlbmRfbG93YXQ7Ci0KLSAgICBwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uLT5yZWFkLT5oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19ib2R5OwotICAgIHItPndyaXRlX2V2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2Rvd25zdHJlYW07Ci0KLSAgICBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2JvZHkocC0+dXBzdHJlYW0tPnBlZXIuY29ubmVjdGlvbi0+cmVhZCk7Ci0KLSAgICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19kb3duc3RyZWFtKG5neF9odHRwX3JlcXVlc3RfdCAqcikKLXsKLSAgICBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2JvZHkoci0+Y29ubmVjdGlvbi0+d3JpdGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfYm9keShuZ3hfZXZlbnRfdCAqZXYpCi17Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICpjOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAqcjsKLSAgICBuZ3hfaHR0cF9wcm94eV9jdHhfdCAgKnA7Ci0gICAgbmd4X2V2ZW50X3BpcGVfdCAgICAgICplcDsKLQotICAgIGMgPSBldi0+ZGF0YTsKLQotICAgIGlmIChldi0+d3JpdGUpIHsKLSAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCBldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBwcm9jZXNzIGRvd25zdHJlYW0iKTsKLSAgICAgICAgciA9IGMtPmRhdGE7Ci0gICAgICAgIHAgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwotICAgICAgICBwLT5hY3Rpb24gPSAic2VuZGluZyB0byBjbGllbnQiOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCBldi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBwcm9jZXNzIHVwc3RyZWFtIik7Ci0gICAgICAgIHAgPSBjLT5kYXRhOwotICAgICAgICBwLT5hY3Rpb24gPSAicmVhZGluZyB1cHN0cmVhbSBib2R5IjsKLSAgICB9Ci0KLSAgICBlcCA9IHAtPnVwc3RyZWFtLT5ldmVudF9waXBlOwotCi0gICAgaWYgKGV2LT50aW1lZG91dCkgewotICAgICAgICBpZiAoZXYtPndyaXRlKSB7Ci0gICAgICAgICAgICBlcC0+ZG93bnN0cmVhbV9lcnJvciA9IDE7Ci0gICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBjLT5sb2csIE5HWF9FVElNRURPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgdGltZWQgb3V0Iik7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVwLT51cHN0cmVhbV9lcnJvciA9IDE7Ci0gICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBjLT5sb2csIE5HWF9FVElNRURPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSB0aW1lZCBvdXQiKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG5neF9ldmVudF9waXBlKGVwLCBldi0+d3JpdGUpID09IE5HWF9BQk9SVCkgewotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCAwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uKSB7Ci0KLSNpZiAoTkdYX0hUVFBfRklMRV9DQUNIRSkKLQotICAgICAgICBpZiAoZXAtPnVwc3RyZWFtX2RvbmUgJiYgcC0+Y2FjaGFibGUpIHsKLSAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9wcm94eV91cGRhdGVfY2FjaGUocCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfYnVzeV91bmxvY2socC0+bGNmLT5idXN5X2xvY2ssICZwLT5idXN5X2xvY2spOwotICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoZXAtPnVwc3RyZWFtX2VvZiAmJiBwLT5jYWNoYWJsZSkgewotCi0gICAgICAgICAgICAvKiBUT0RPOiBjaGVjayBsZW5ndGggJiB1cGRhdGUgY2FjaGUgKi8KLQotICAgICAgICAgICAgaWYgKG5neF9odHRwX3Byb3h5X3VwZGF0ZV9jYWNoZShwKSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9idXN5X3VubG9jayhwLT5sY2YtPmJ1c3lfbG9jaywgJnAtPmJ1c3lfbG9jayk7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKGVwLT51cHN0cmVhbV9kb25lIHx8IGVwLT51cHN0cmVhbV9lb2YgfHwgZXAtPnVwc3RyZWFtX2Vycm9yKSB7Ci0gICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGV2LT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSB1cHN0cmVhbSBleGl0OiAlcCIsIGVwLT5vdXQpOwotICAgICAgICAgICAgbmd4X2h0dHBfYnVzeV91bmxvY2socC0+bGNmLT5idXN5X2xvY2ssICZwLT5idXN5X2xvY2spOwotICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCAwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcC0+ZG93bnN0cmVhbV9lcnJvcikgewotICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGV2LT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IGRvd25zdHJlYW0gZXJyb3IiKTsKLSAgICAgICAgaWYgKCFwLT5jYWNoYWJsZSAmJiBwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIDApOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X25leHRfdXBzdHJlYW0obmd4X2h0dHBfcHJveHlfY3R4X3QgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF91aW50X3QgZnRfdHlwZSkKLXsKLSAgICBuZ3hfdWludF90ICBzdGF0dXM7Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHAtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBuZXh0IHVwc3RyZWFtOiAldWkiLCBmdF90eXBlKTsKLQotICAgIG5neF9odHRwX2J1c3lfdW5sb2NrKHAtPmxjZi0+YnVzeV9sb2NrLCAmcC0+YnVzeV9sb2NrKTsKLQotICAgIGlmIChmdF90eXBlICE9IE5HWF9IVFRQX1BST1hZX0ZUX0hUVFBfNDA0KSB7Ci0gICAgICAgIG5neF9ldmVudF9jb25uZWN0X3BlZXJfZmFpbGVkKCZwLT51cHN0cmVhbS0+cGVlcik7Ci0gICAgfQotCi0gICAgaWYgKGZ0X3R5cGUgPT0gTkdYX0hUVFBfUFJPWFlfRlRfVElNRU9VVCkgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBwLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5sb2csIE5HWF9FVElNRURPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIHRpbWVkIG91dCIpOwotICAgIH0KLQotICAgIGlmIChwLT51cHN0cmVhbS0+cGVlci5jYWNoZWQgJiYgZnRfdHlwZSA9PSBOR1hfSFRUUF9QUk9YWV9GVF9FUlJPUikgewotICAgICAgICBzdGF0dXMgPSAwOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoKGZ0X3R5cGUpIHsKLSAgICAgICAgY2FzZSBOR1hfSFRUUF9QUk9YWV9GVF9USU1FT1VUOgotICAgICAgICAgICAgc3RhdHVzID0gTkdYX0hUVFBfR0FURVdBWV9USU1FX09VVDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTkdYX0hUVFBfUFJPWFlfRlRfSFRUUF81MDA6Ci0gICAgICAgICAgICBzdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE5HWF9IVFRQX1BST1hZX0ZUX0hUVFBfNDA0OgotICAgICAgICAgICAgc3RhdHVzID0gTkdYX0hUVFBfTk9UX0ZPVU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTkdYX0hUVFBfUFJPWFlfRlRfQlVTWV9MT0NLIGFuZCBOR1hfSFRUUF9QUk9YWV9GVF9NQVhfV0FJVElORwotICAgICAgICAgKiBuZXZlciByZWFjaCBoZXJlCi0gICAgICAgICAqLwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzdGF0dXMgPSBOR1hfSFRUUF9CQURfR0FURVdBWTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uKSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2Nsb3NlX2Nvbm5lY3Rpb24ocCk7Ci0gICAgfQotCi0gICAgaWYgKHAtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPndyaXRlLT5lb2YpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9DTElFTlRfQ0xPU0VEX1JFUVVFU1QpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBwLT5zdGF0ZS0+c3RhdHVzID0gc3RhdHVzOwotCi0gICAgICAgIGlmIChwLT51cHN0cmVhbS0+cGVlci50cmllcyA9PSAwIHx8ICEocC0+bGNmLT5uZXh0X3Vwc3RyZWFtICYgZnRfdHlwZSkpCi0gICAgICAgIHsKLQotI2lmIChOR1hfSFRUUF9DQUNIRSkKLQotICAgICAgICAgICAgaWYgKHAtPnN0YWxlICYmIChwLT5sY2YtPnVzZV9zdGFsZSAmIGZ0X3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfc2VuZF9jYWNoZWRfcmVzcG9uc2UocCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwLT5sY2YtPmJ1c3lfbG9jayAmJiAhcC0+YnVzeV9sb2NrZWQpIHsKLSAgICAgICAgbmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fYnVzeV9sb2NrKHApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5neF9odHRwX3Byb3h5X2Nvbm5lY3QocCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCmluZGV4IDg3MGRkOGIuLjUxNDY1OGMgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKQEAgLTE1MDMsNiArMTUwMywxMCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgaWYgKCFyLT5wb3N0X2FjdGlvbikgeworICAgICAgICByLT5yZXF1ZXN0X2NvbXBsZXRlID0gMTsKKyAgICB9CisKICAgICBpZiAobmd4X2h0dHBfcG9zdF9hY3Rpb24ocikgPT0gTkdYX09LKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMjU0LDYgKzIyNTgsNyBAQAogCiAgICAgci0+aHR0cF92ZXJzaW9uID0gTkdYX0hUVFBfVkVSU0lPTl85OwogICAgIHItPmhlYWRlcl9vbmx5ID0gMTsKKyAgICByLT5wb3N0X2FjdGlvbiA9IDE7CiAKICAgICBuZ3hfaHR0cF9pbnRlcm5hbF9yZWRpcmVjdChyLCAmY2xjZi0+cG9zdF9hY3Rpb24sIE5VTEwpOwogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKaW5kZXggODQ1MGIwNC4uN2UxYTQzYiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaApAQCAtNDA1LDYgKzQwNSw4IEBACiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmdlcmluZ19jbG9zZToxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkX2JvZHk6MTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9hY3Rpb246MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9jb21wbGV0ZToxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHV0Zjg6MTsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKaW5kZXggOWZkMWExZS4uYmZhZWQ3MCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCkBAIC0yNzcsOSArMjc3LDkgQEAKICAgICAgICAgbmd4X2RlbF90aW1lcihjLT5yZWFkKTsKICAgICB9CiAKLSAgICBpZiAoIShyLT5odHRwX3ZlcnNpb24gPT0gTkdYX0hUVFBfVkVSU0lPTl85ICYmIHItPmhlYWRlcl9vbmx5KSkgewotICAgICAgICAvKiBub3QgYSBwb3N0X2FjdGlvbiAqLworICAgIHUgPSByLT51cHN0cmVhbTsKIAorICAgIGlmICghci0+cG9zdF9hY3Rpb24gJiYgIXUtPmNvbmYtPmlnbm9yZV9jbGllbnRfYWJvcnQpIHsKICAgICAgICAgci0+cmVhZF9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fcmRfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb247CiAgICAgICAgIHItPndyaXRlX2V2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV93cl9jaGVja19icm9rZW5fY29ubmVjdGlvbjsKICAgICB9CkBAIC0yOTYsOCArMjk2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHUgPSByLT51cHN0cmVhbTsKLQogICAgIGlmIChyLT5yZXF1ZXN0X2JvZHkpIHsKICAgICAgICAgdS0+cmVxdWVzdF9idWZzID0gci0+cmVxdWVzdF9ib2R5LT5idWZzOwogICAgIH0KQEAgLTEyMDgsMTAgKzEyMDYsNyBAQAogCiAgICAgcmMgPSBuZ3hfaHR0cF9zZW5kX2hlYWRlcihyKTsKIAotICAgIGlmIChyYyA9PSBOR1hfRVJST1IKLSAgICAgICAgfHwgcmMgPiBOR1hfT0sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdF9hY3Rpb24gKi8KLSAgICAgICAgfHwgKHItPmh0dHBfdmVyc2lvbiA9PSBOR1hfSFRUUF9WRVJTSU9OXzkgJiYgci0+aGVhZGVyX29ubHkpKSB7CisgICAgaWYgKHJjID09IE5HWF9FUlJPUiB8fCByYyA+IE5HWF9PSyB8fCByLT5wb3N0X2FjdGlvbikgewogICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsIHJjKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE5NDcsMTEgKzE5NDIsNyBAQAogCiAgICAgci0+Y29ubmVjdGlvbi0+bG9nLT5hY3Rpb24gPSAic2VuZGluZyB0byBjbGllbnQiOwogCi0gICAgaWYgKHJjID09IDAKLSAgICAgICAgJiYgciA9PSByLT5tYWluCi0gICAgICAgICAgICAgLyogbm90IGEgcG9zdF9hY3Rpb24gKi8KLSAgICAgICAgJiYgIShyLT5odHRwX3ZlcnNpb24gPT0gTkdYX0hUVFBfVkVSU0lPTl85ICYmIHItPmhlYWRlcl9vbmx5KSkKLSAgICB7CisgICAgaWYgKHJjID09IDAgJiYgciA9PSByLT5tYWluICYmICFyLT5wb3N0X2FjdGlvbikgewogICAgICAgICByYyA9IG5neF9odHRwX3NlbmRfc3BlY2lhbChyLCBOR1hfSFRUUF9MQVNUKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oCmluZGV4IDExN2RlZjEuLjRkMDdjM2UgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaApAQCAtNzMsNiArNzMsNyBAQAogICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgICAgcGFzc19yZXF1ZXN0X2hlYWRlcnM7CiAgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICBwYXNzX3JlcXVlc3RfYm9keTsKIAorICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgICAgaWdub3JlX2NsaWVudF9hYm9ydDsKICAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0X2Vycm9yczsKICAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgICAgIGN5Y2xpY190ZW1wX2ZpbGU7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKaW5kZXggMTM3MDE2Mi4uMjYxNTkyOSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKQEAgLTQ0LDYgKzQ0LDggQEAKICAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlX2JvZHlfYnl0ZXNfc2VudChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0X2NvbXBsZXRpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKTsKIAogCiAvKgpAQCAtMTM1LDYgKzEzNyw5IEBACiAgICAgeyBuZ3hfc3RyaW5nKCJib2R5X2J5dGVzX3NlbnQiKSwgbmd4X2h0dHBfdmFyaWFibGVfYm9keV9ieXRlc19zZW50LAogICAgICAgMCwgMCwgMCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJyZXF1ZXN0X2NvbXBsZXRpb24iKSwgbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdF9jb21wbGV0aW9uLAorICAgICAgMCwgMCwgMCB9LAorCiAgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIE5VTEwsIDAsIDAsIDAgfQogfTsKIApAQCAtNzk4LDYgKzgwMywzMCBAQAogfQogCiAKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfY29tcGxldGlvbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpCit7CisgICAgaWYgKHItPnJlcXVlc3RfY29tcGxldGUpIHsKKyAgICAgICAgdi0+bGVuID0gMjsKKyAgICAgICAgdi0+dmFsaWQgPSAxOworICAgICAgICB2LT5ub19jYWNoYWJsZSA9IDA7CisgICAgICAgIHYtPm5vdF9mb3VuZCA9IDA7CisgICAgICAgIHYtPmRhdGEgPSAodV9jaGFyICopICJPSyI7CisKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICB2LT5sZW4gPSAwOworICAgIHYtPnZhbGlkID0gMTsKKyAgICB2LT5ub19jYWNoYWJsZSA9IDA7CisgICAgdi0+bm90X2ZvdW5kID0gMDsKKyAgICB2LT5kYXRhID0gKHVfY2hhciAqKSAiIjsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKwogbmd4X2ludF90CiBuZ3hfaHR0cF92YXJpYWJsZXNfYWRkX2NvcmVfdmFycyhuZ3hfY29uZl90ICpjZikKIHsK