ZGlmZiAtLWdpdCBhL2RvY3MvZHRkL2NoYW5nZXMuZHRkIGIvZG9jcy9kdGQvY2hhbmdlcy5kdGQKaW5kZXggNWIyMjlkNS4uNGRlYTJjNyAxMDA2NDQKLS0tIGEvZG9jcy9kdGQvY2hhbmdlcy5kdGQKKysrIGIvZG9jcy9kdGQvY2hhbmdlcy5kdGQKQEAgLTEsNSArMSw2IEBACiAKIDwhRU5USVRZICBuYnNwICAgICAgICAgIiYjeEEwOyIgPgorPCFFTlRJVFkgIG1kYXNoICAgICAgICAiJiN4QTA7LSAiID4KIAogCiA8IUVMRU1FTlQgY2hhbmdlX2xvZyAgIChjaGFuZ2VzKSogPgpkaWZmIC0tZ2l0IGEvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwgYi9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbAppbmRleCBhNmFjYjY2Li43MzAxNmEzIDEwMDY0NAotLS0gYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbAorKysgYi9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbApAQCAtOSw2ICs5LDgwIEBACiA8dGl0bGUgbGFuZz0iZW4iPm5naW54IGNoYW5nZWxvZzwvdGl0bGU+CiAKIAorPGNoYW5nZXMgdmVyPSIwLjIuMiIgZGF0ZT0iMzAuMDkuMjAwNSI+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivLz83BzsTBIGNvbmZpZyBlcnJtc2cg1yDNz8TVzMUgbmd4X2h0dHBfc3NpX21vZHVsZS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAiY29uZmlnIGVycm1zZyIgY29tbWFuZCBvZiB0aGUgbmd4X2h0dHBfc3NpX21vZHVsZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImNoYW5nZSI+Cis8cGFyYSBsYW5nPSJydSI+CivQxdLFzcXOztnFIM3PxNXM0SBuZ3hfaHR0cF9nZW9fbW9kdWxlIM3P1s7PINDF0sXP0NLFxMXM0dTYIMTJ0sXL1MnXz8ogc2V0LgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX2dlb19tb2R1bGUgdmFyaWFibGVzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAic2V0IiBkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnX2SBzc2xfcHJvdG9jb2xzIMkgc3NsX3ByZWZlcl9zZXJ2ZXJfY2lwaGVycyDNz8TVzMXKCituZ3hfaHR0cF9zc2xfbW9kdWxlIMkgbmd4X2ltYXBfc3NsX21vZHVsZS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAic3NsX3Byb3RvY29scyIgYW5kICJzc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzIiBkaXJlY3RpdmVzCitvZiB0aGUgbmd4X2h0dHBfc3NsX21vZHVsZSBhbmQgbmd4X2ltYXBfc3NsX21vZHVsZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivP28nCy8Eg1yDNz8TVzMUgbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZSDQ0skg0M/LwdrFIMTMyc7O2cggyc2jziDGwcrMz9c7Cis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZSBkaWQgbm90IHNob3cgY29ycmVjdGx5IHRoZSBsb25nIGZpbGUgbmFtZXM7Cis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorzc/E1czYIG5neF9odHRwX2F1dG9pbmRleF9tb2R1bGUg1MXQxdLYIM7FINDPy8Ha2dfBxdQgxsHKzNksCivOwd7JzsHA3cnF09EgzsEg1M/ey9UuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZSBub3cgZG8gbm90IHNob3cgdGhlIGZpbGVzIHN0YXJ0aW5nIGJ5IGRvdC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivF08zJIFNTTCBoYW5kc2hha2Ug2sHXxdLbwczT0SDTIM/bycLLz8osINTPINzUzyDNz8fMzyDQ0snXxdPUySDUwcvWxQor1yDawcvS2dTJwCDE0tXHz8fPINPPxcTJzsXOydEuCivz0MHTycLPIFJvYiBNdWVsbGVyLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgoraWYgdGhlIFNTTCBoYW5kc2hha2UgZmFpbGVkIHRoZW4gYW5vdGhlciBjb25uZWN0aW9uIG1heSBiZSBjbG9zZWQgdG9vLgorVGhhbmtzIHRvIFJvYiBNdWVsbGVyLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK9zL09DP0tTO2cUg18XS08nJIE1TSUUgNS54IM7FIM3Px8zJINPPxcTJzsnU2NPRINDPIEhUVFBTLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIGV4cG9ydCB2ZXJzaW9ucyBvZiBNU0lFIDUueCBjb3VsZCBub3QgY29ubmVjdCB2aWEgSFRUUFMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPC9jaGFuZ2VzPgorCisKIDxjaGFuZ2VzIHZlcj0iMC4yLjEiIGRhdGU9IjIzLjA5LjIwMDUiPgogCiA8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+CkBAIC0zOCw4ICsxMTIsOSBAQAog7s/X2cogz9POz9fOz8og0NLPw8XT0yDTz9rEwaPUIM/C2d7O2cogcGlkLcbByswgwsXaINPVxsbJy9PBICIubmV3YmluIi4KIOXTzMkgzs/X2cogz9POz9fOz8og0NLPw8XT0yDX2cjPxMnULCDUzyDT1MHS2cog0NLPw8XT0yDQxdLFyc3Fzs/X2dfBxdQg09fPygogcGlkLcbByswgYyDT1cbGycvTz80gIi5vbGRiaW4iINcgcGlkLcbByswgwsXaINPVxsbJy9PBLgot8NLJIM/Czs/XzMXOyckg0yDXxdLTyckgMC4xLsggxM8gMC4yLjAgztXWzs8g1d7J1NnXwdTYLCDe1M8g09TB0tnKINDSz8PF09MKLTAuMS54IMkgzs/X2cog0NLPw8XT0yAwLjIuMCDPwsEgydPQz8zY2tXA1CBwaWQtxsHKzCDCxdog09XGxsnL08/XLgor8NLJIM/Czs/XzMXOyckg0yDXxdLTyckgMC4xLsggxM8gMC4yLjAgztXWzs8g1d7J1NnXwdTYLCDe1M8gz8LBCivQ0s/DxdPTwSZtZGFzaDvT1MHS2cogMC4xLnggySDOz9fZyiAwLjIuMCZtZGFzaDvJ09DPzNja1cDUIHBpZC3GwcrMCivCxdog09XGxsnL08/XLgogPC9wYXJhPgogPHBhcmEgbGFuZz0iZW4iPgogVGhlIHBpZC1maWxlIG5hbWVzIHVzZWQgZHVyaW5nIG9ubGluZSB1cGdyYWRlIHdhcyBjaGFuZ2VkIGFuZCBub3cgaXMgbm90CkBAIC0xMjIsNiArMTk3LDcgQEAKIDwvcGFyYT4KIDxwYXJhIGxhbmc9ImVuIj4KIGluIElNQVAvUE9QMyBjb21tYW5kIGFyZ3VtZW50IHBhcnNpbmcuCitUaGFua3MgdG8gUm9iIE11ZWxsZXIuCiA8L3BhcmE+CiA8L2NoYW5nZT4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmdpbnguaCBiL3NyYy9jb3JlL25naW54LmgKaW5kZXggNjQ2OGI5NC4uZDRjMWNkNiAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmdpbnguaAorKysgYi9zcmMvY29yZS9uZ2lueC5oCkBAIC04LDcgKzgsNyBAQAogI2RlZmluZSBfTkdJTlhfSF9JTkNMVURFRF8KIAogCi0jZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4yLjEiCisjZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4yLjIiCiAKICNkZWZpbmUgTkdJTlhfVkFSICAgICAgICAgICJOR0lOWCIKICNkZWZpbmUgTkdYX09MRFBJRF9FWFQgICAgICIub2xkYmluIgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uaCBiL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmgKaW5kZXggZTEzZjI4NS4uZTVkZjQzNyAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uaAorKysgYi9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5oCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICBiYWNrbG9nOwogCiAgICAgLyogaGFuZGxlciBvZiBhY2NlcHRlZCBjb25uZWN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICAgKCpoYW5kbGVyKShuZ3hfY29ubmVjdGlvbl90ICpjKTsKKyAgICBuZ3hfY29ubmVjdGlvbl9oYW5kbGVyX3B0ICAgaGFuZGxlcjsKIAogICAgIHZvaWQgICAgICAgICAgICAgICAqY3R4OyAgICAgIC8qIG5neF9odHRwX2NvbmZfY3R4X3QsIGZvciBleGFtcGxlICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICpzZXJ2ZXJzOyAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfaW5fYWRkcl90LCBmb3IgZXhhbXBsZSAqLwpAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgbmd4X3N0cl90ICAgICAgICAgICBhZGRyX3RleHQ7CiAKICNpZiAoTkdYX09QRU5TU0wpCi0gICAgbmd4X3NzbF90ICAgICAgICAgICpzc2w7CisgICAgbmd4X3NzbF9jb25uZWN0aW9uX3QgICpzc2w7CiAjZW5kaWYKIAogI2lmIChOR1hfSEFWRV9JT0NQKQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvcmUuaCBiL3NyYy9jb3JlL25neF9jb3JlLmgKaW5kZXggOTY0NmY2Yy4uYTMyNzMzOSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2NvcmUuaAorKysgYi9zcmMvY29yZS9uZ3hfY29yZS5oCkBAIC0yMyw3ICsyMyw3IEBACiB0eXBlZGVmIHN0cnVjdCBuZ3hfY29ubmVjdGlvbl9zICBuZ3hfY29ubmVjdGlvbl90OwogCiB0eXBlZGVmIHZvaWQgKCpuZ3hfZXZlbnRfaGFuZGxlcl9wdCkobmd4X2V2ZW50X3QgKmV2KTsKLQordHlwZWRlZiB2b2lkICgqbmd4X2Nvbm5lY3Rpb25faGFuZGxlcl9wdCkobmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiAKIAogI2RlZmluZSAgTkdYX09LICAgICAgICAgIDAKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKaW5kZXggYjdlMDcyNS4uMjQ2MDQ3OCAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKQEAgLTE0LDkgKzE0LDEyIEBACiB9IG5neF9vcGVuc3NsX2NvbmZfdDsKIAogCitzdGF0aWMgdm9pZCBuZ3hfc3NsX2hhbmRzaGFrZV9oYW5kbGVyKG5neF9ldmVudF90ICpldik7CiBzdGF0aWMgbmd4X2ludF90IG5neF9zc2xfaGFuZGxlX3JlY3Yobmd4X2Nvbm5lY3Rpb25fdCAqYywgaW50IG4pOwogc3RhdGljIHZvaWQgbmd4X3NzbF93cml0ZV9oYW5kbGVyKG5neF9ldmVudF90ICp3ZXYpOwogc3RhdGljIHZvaWQgbmd4X3NzbF9yZWFkX2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldik7CitzdGF0aWMgdm9pZCBuZ3hfc3NsX2Nvbm5lY3Rpb25fZXJyb3Iobmd4X2Nvbm5lY3Rpb25fdCAqYywgaW50IHNzbGVyciwKKyAgICBuZ3hfZXJyX3QgZXJyLCBjaGFyICp0ZXh0KTsKIHN0YXRpYyB2b2lkICpuZ3hfb3BlbnNzbF9jcmVhdGVfY29uZihuZ3hfY3ljbGVfdCAqY3ljbGUpOwogc3RhdGljIGNoYXIgKm5neF9vcGVuc3NsX2luaXRfY29uZihuZ3hfY3ljbGVfdCAqY3ljbGUsIHZvaWQgKmNvbmYpOwogCkBAIC02Myw3ICs2NiwxOSBAQAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgcHJvY2VzcyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgbWFzdGVyICovCiAgICAgTkdYX01PRFVMRV9WMV9QQURESU5HCi19OyAgCit9OworCisKK3N0YXRpYyBsb25nICBuZ3hfc3NsX3Byb3RvY29sc1tdID0geworICAgIFNTTF9PUF9OT19TU0x2MnxTU0xfT1BfTk9fU1NMdjN8U1NMX09QX05PX1RMU3YxLAorICAgIFNTTF9PUF9OT19TU0x2M3xTU0xfT1BfTk9fVExTdjEsCisgICAgU1NMX09QX05PX1NTTHYyfFNTTF9PUF9OT19UTFN2MSwKKyAgICBTU0xfT1BfTk9fVExTdjEsCisgICAgU1NMX09QX05PX1NTTHYyfFNTTF9PUF9OT19TU0x2MywKKyAgICBTU0xfT1BfTk9fU1NMdjMsCisgICAgU1NMX09QX05PX1NTTHYyLAorICAgIDAsCit9OwogCiAKIG5neF9pbnRfdApAQCAtODEsNDUgKzk2LDI0MSBAQAogCiAKIG5neF9pbnRfdAotbmd4X3NzbF9jcmVhdGVfY29ubmVjdGlvbihuZ3hfc3NsX2N0eF90ICpzc2xfY3R4LCBuZ3hfY29ubmVjdGlvbl90ICpjLAotICAgIG5neF91aW50X3QgZmxhZ3MpCi17ICAgCi0gICAgbmd4X3NzbF90ICAqc3NsOworbmd4X3NzbF9jcmVhdGUobmd4X3NzbF90ICpzc2wsIG5neF91aW50X3QgcHJvdG9jb2xzKQoreworICAgIHNzbC0+Y3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX3NlcnZlcl9tZXRob2QoKSk7CiAKLSAgICBzc2wgPSBuZ3hfcGNhbGxvYyhjLT5wb29sLCBzaXplb2Yobmd4X3NzbF90KSk7Ci0gICAgaWYgKHNzbCA9PSBOVUxMKSB7CisgICAgaWYgKHNzbC0+Y3R4ID09IE5VTEwpIHsKKyAgICAgICAgbmd4X3NzbF9lcnJvcihOR1hfTE9HX0VNRVJHLCBzc2wtPmxvZywgMCwgIlNTTF9DVFhfbmV3KCkgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzc2wtPmN0eCwgU1NMX09QX0FMTCk7CisKKyAgICBpZiAobmd4X3NzbF9wcm90b2NvbHNbcHJvdG9jb2xzID4+IDFdICE9IDApIHsKKyAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzc2wtPmN0eCwgbmd4X3NzbF9wcm90b2NvbHNbcHJvdG9jb2xzID4+IDFdKTsKKyAgICB9CisKKyAgICBTU0xfQ1RYX3NldF9tb2RlKHNzbC0+Y3R4LCBTU0xfTU9ERV9BQ0NFUFRfTU9WSU5HX1dSSVRFX0JVRkZFUik7CisKKyAgICBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkKHNzbC0+Y3R4LCAxKTsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworbmd4X2ludF90CituZ3hfc3NsX2NlcnRpZmljYXRlKG5neF9zc2xfdCAqc3NsLCB1X2NoYXIgKmNlcnQsIHVfY2hhciAqa2V5KQoreworICAgIGlmIChTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNzbC0+Y3R4LCAoY2hhciAqKSBjZXJ0KSA9PSAwKSB7CisgICAgICAgIG5neF9zc2xfZXJyb3IoTkdYX0xPR19FTUVSRywgc3NsLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoXCIlc1wiKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgIGNlcnQpOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGlmIChTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc3NsLT5jdHgsIChjaGFyICopIGtleSwgU1NMX0ZJTEVUWVBFX1BFTSkKKyAgICAgICAgPT0gMCkKKyAgICB7CisgICAgICAgIG5neF9zc2xfZXJyb3IoTkdYX0xPR19FTUVSRywgc3NsLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgIlNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShcIiVzXCIpIGZhaWxlZCIsIGtleSk7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCituZ3hfaW50X3QKK25neF9zc2xfZ2VuZXJhdGVfcnNhNTEyX2tleShuZ3hfc3NsX3QgKnNzbCkKK3sKKyAgICBzc2wtPnJzYTUxMl9rZXkgPSBSU0FfZ2VuZXJhdGVfa2V5KDUxMiwgUlNBX0Y0LCBOVUxMLCBOVUxMKTsKKworICAgIGlmIChzc2wtPnJzYTUxMl9rZXkpIHsKKyAgICAgICAgU1NMX0NUWF9zZXRfdG1wX3JzYShzc2wtPmN0eCwgc3NsLT5yc2E1MTJfa2V5KTsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICBuZ3hfc3NsX2Vycm9yKE5HWF9MT0dfRU1FUkcsIHNzbC0+bG9nLCAwLCAiUlNBX2dlbmVyYXRlX2tleSg1MTIpIGZhaWxlZCIpOworCisgICAgcmV0dXJuIE5HWF9FUlJPUjsKK30KKworCituZ3hfaW50X3QKK25neF9zc2xfY3JlYXRlX2Nvbm5lY3Rpb24obmd4X3NzbF90ICpzc2wsIG5neF9jb25uZWN0aW9uX3QgKmMsIG5neF91aW50X3QgZmxhZ3MpCit7ICAgCisgICAgbmd4X3NzbF9jb25uZWN0aW9uX3QgICpzYzsKKworICAgIHNjID0gbmd4X3BjYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9zc2xfY29ubmVjdGlvbl90KSk7CisgICAgaWYgKHNjID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKICAgICBpZiAoZmxhZ3MgJiBOR1hfU1NMX0JVRkZFUikgewotICAgICAgICBzc2wtPmJ1ZmZlciA9IDE7CisgICAgICAgIHNjLT5idWZmZXIgPSAxOwogCi0gICAgICAgIHNzbC0+YnVmID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjLT5wb29sLCBOR1hfU1NMX0JVRlNJWkUpOwotICAgICAgICBpZiAoc3NsLT5idWYgPT0gTlVMTCkgeworICAgICAgICBzYy0+YnVmID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjLT5wb29sLCBOR1hfU1NMX0JVRlNJWkUpOworICAgICAgICBpZiAoc2MtPmJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc3NsLT5jb25uZWN0aW9uID0gU1NMX25ldyhzc2xfY3R4KTsKKyAgICBzYy0+Y29ubmVjdGlvbiA9IFNTTF9uZXcoc3NsLT5jdHgpOwogCi0gICAgaWYgKHNzbC0+Y29ubmVjdGlvbiA9PSBOVUxMKSB7CisgICAgaWYgKHNjLT5jb25uZWN0aW9uID09IE5VTEwpIHsKICAgICAgICAgbmd4X3NzbF9lcnJvcihOR1hfTE9HX0FMRVJULCBjLT5sb2csIDAsICJTU0xfbmV3KCkgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgaWYgKFNTTF9zZXRfZmQoc3NsLT5jb25uZWN0aW9uLCBjLT5mZCkgPT0gMCkgeworICAgIGlmIChTU0xfc2V0X2ZkKHNjLT5jb25uZWN0aW9uLCBjLT5mZCkgPT0gMCkgewogICAgICAgICBuZ3hfc3NsX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGMtPmxvZywgMCwgIlNTTF9zZXRfZmQoKSBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKLSAgICBTU0xfc2V0X2FjY2VwdF9zdGF0ZShzc2wtPmNvbm5lY3Rpb24pOworICAgIFNTTF9zZXRfYWNjZXB0X3N0YXRlKHNjLT5jb25uZWN0aW9uKTsKIAotICAgIGMtPnNzbCA9IHNzbDsKKyAgICBjLT5zc2wgPSBzYzsKIAogICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIAorbmd4X2ludF90CituZ3hfc3NsX2hhbmRzaGFrZShuZ3hfY29ubmVjdGlvbl90ICpjKQoreworICAgIGludCAgICAgICAgbiwgc3NsZXJyOworICAgIG5neF9lcnJfdCAgZXJyOworCisgICAgbiA9IFNTTF9kb19oYW5kc2hha2UoYy0+c3NsLT5jb25uZWN0aW9uKTsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwgIlNTTF9kb19oYW5kc2hha2U6ICVkIiwgbik7IAorCisgICAgaWYgKG4gPT0gMSkgeworCisgICAgICAgIGlmIChuZ3hfaGFuZGxlX3JlYWRfZXZlbnQoYy0+cmVhZCwgMCkgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5neF9oYW5kbGVfd3JpdGVfZXZlbnQoYy0+d3JpdGUsIDApID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisjaWYgKE5HWF9ERUJVRykKKyAgICAgICAgeworICAgICAgICBjaGFyICAgICAgICAgYnVmWzEyOV0sICpzLCAqZDsKKyAgICAgICAgU1NMX0NJUEhFUiAgKmNpcGhlcjsKKworICAgICAgICBjaXBoZXIgPSBTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKGMtPnNzbC0+Y29ubmVjdGlvbik7CisKKyAgICAgICAgaWYgKGNpcGhlcikgeworICAgICAgICAgICAgU1NMX0NJUEhFUl9kZXNjcmlwdGlvbihjaXBoZXIsICZidWZbMV0sIDEyOCk7CisKKyAgICAgICAgICAgIGZvciAocyA9ICZidWZbMV0sIGQgPSBidWY7ICpzOyBzKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKnMgPT0gJyAnICYmICpkID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKnMgPT0gTEYgfHwgKnMgPT0gQ1IpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKisrZCA9ICpzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKmQgIT0gJyAnKSB7CisgICAgICAgICAgICAgICAgZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqZCA9ICdcMCc7CisKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTU0w6ICVzLCBjaXBoZXI6IFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfZ2V0X3ZlcnNpb24oYy0+c3NsLT5jb25uZWN0aW9uKSwgJmJ1ZlsxXSk7IAorCisgICAgICAgICAgICBpZiAoU1NMX3Nlc3Npb25fcmV1c2VkKGMtPnNzbC0+Y29ubmVjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBjLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCByZXVzZWQgc2Vzc2lvbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0VWRU5ULCBjLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIG5vIHNoYXJlZCBjaXBoZXJzIik7IAorICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGMtPnNzbC0+aGFuZHNoYWtlZCA9IDE7CisKKyAgICAgICAgYy0+cmVjdiA9IG5neF9zc2xfcmVjdjsKKyAgICAgICAgYy0+c2VuZCA9IG5neF9zc2xfd3JpdGU7CisgICAgICAgIGMtPnNlbmRfY2hhaW4gPSBuZ3hfc3NsX3NlbmRfY2hhaW47IAorCisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgc3NsZXJyID0gU1NMX2dldF9lcnJvcihjLT5zc2wtPmNvbm5lY3Rpb24sIG4pOworCisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19FVkVOVCwgYy0+bG9nLCAwLCAiU1NMX2dldF9lcnJvcjogJWQiLCBzc2xlcnIpOworCisgICAgaWYgKHNzbGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKSB7CisgICAgICAgIGMtPnJlYWQtPnJlYWR5ID0gMDsKKyAgICAgICAgYy0+cmVhZC0+aGFuZGxlciA9IG5neF9zc2xfaGFuZHNoYWtlX2hhbmRsZXI7CisKKyAgICAgICAgaWYgKG5neF9oYW5kbGVfcmVhZF9ldmVudChjLT5yZWFkLCAwKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTkdYX0FHQUlOOworICAgIH0KKworICAgIGlmIChzc2xlcnIgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpIHsKKyAgICAgICAgYy0+d3JpdGUtPnJlYWR5ID0gMDsKKyAgICAgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfc3NsX2hhbmRzaGFrZV9oYW5kbGVyOworCisgICAgICAgIGlmIChuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KGMtPndyaXRlLCAwKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTkdYX0FHQUlOOworICAgIH0KKworICAgIGVyciA9IChzc2xlcnIgPT0gU1NMX0VSUk9SX1NZU0NBTEwpID8gbmd4X2Vycm5vIDogMDsKKworICAgIGMtPnNzbC0+bm9fd2FpdF9zaHV0ZG93biA9IDE7CisgICAgYy0+c3NsLT5ub19zZW5kX3NodXRkb3duID0gMTsKKworICAgIGlmIChzc2xlcnIgPT0gU1NMX0VSUk9SX1pFUk9fUkVUVVJOIHx8IEVSUl9wZWVrX2Vycm9yKCkgPT0gMCkgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgYy0+bG9nLCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBjbG9zZWQgY29ubmVjdGlvbiBpbiBTU0wgaGFuZHNoYWtlIik7CisKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBuZ3hfc3NsX2Nvbm5lY3Rpb25fZXJyb3IoYywgc3NsZXJyLCBlcnIsICJTU0xfZG9faGFuZHNoYWtlKCkgZmFpbGVkIik7CisKKyAgICByZXR1cm4gTkdYX0VSUk9SOworfQorCisKK3N0YXRpYyB2b2lkCituZ3hfc3NsX2hhbmRzaGFrZV9oYW5kbGVyKG5neF9ldmVudF90ICpldikKK3sKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAqYzsKKworICAgIGMgPSBldi0+ZGF0YTsKKworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAic3NsIGhhbmRzaGFrZSBoYW5kbGVyOiAlZCIsIGV2LT53cml0ZSk7CisKKyAgICBpZiAobmd4X3NzbF9oYW5kc2hha2UoYykgPT0gTkdYX0FHQUlOKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT5zc2wtPmhhbmRsZXIoYyk7Cit9CisKKwogc3NpemVfdAogbmd4X3NzbF9yZWN2KG5neF9jb25uZWN0aW9uX3QgKmMsIHVfY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKQEAgLTE0Myw1NiArMzU0LDcgQEAKICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19FVkVOVCwgYy0+bG9nLCAwLCAiU1NMX3JlYWQ6ICVkIiwgbik7IAogCiAgICAgICAgIGlmIChuID4gMCkgewotCiAgICAgICAgICAgICBieXRlcyArPSBuOwotCi0jaWYgKE5HWF9ERUJVRykKLQotICAgICAgICAgICAgaWYgKCFjLT5zc2wtPmhhbmRzaGFrZWQgJiYgU1NMX2lzX2luaXRfZmluaXNoZWQoYy0+c3NsLT5jb25uZWN0aW9uKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgYnVmWzEyOV0sICpzLCAqZDsKLSAgICAgICAgICAgICAgICBTU0xfQ0lQSEVSICAqY2lwaGVyOwotCi0gICAgICAgICAgICAgICAgYy0+c3NsLT5oYW5kc2hha2VkID0gMTsKLQotICAgICAgICAgICAgICAgIGNpcGhlciA9IFNTTF9nZXRfY3VycmVudF9jaXBoZXIoYy0+c3NsLT5jb25uZWN0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChjaXBoZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgU1NMX0NJUEhFUl9kZXNjcmlwdGlvbihjaXBoZXIsICZidWZbMV0sIDEyOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gJmJ1ZlsxXSwgZCA9IGJ1ZjsgKnM7IHMrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpzID09ICcgJyAmJiAqZCA9PSAnICcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpzID09IExGIHx8ICpzID09IENSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICorK2QgPSAqczsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICgqZCAhPSAnICcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICpkID0gJ1wwJzsKLQotICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBjLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTU0wgY2lwaGVyOiBcIiVzXCIiLCAmYnVmWzFdKTsgCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFNTTF9zZXNzaW9uX3JldXNlZChjLT5zc2wtPmNvbm5lY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBjLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIHJldXNlZCBzZXNzaW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCBubyBzaGFyZWQgY2lwaGVycyIpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQogICAgICAgICB9CiAKICAgICAgICAgYy0+c3NsLT5sYXN0ID0gbmd4X3NzbF9oYW5kbGVfcmVjdihjLCBuKTsKQEAgLTIyMSwxMCArMzgzLDggQEAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9zc2xfaGFuZGxlX3JlY3Yobmd4X2Nvbm5lY3Rpb25fdCAqYywgaW50IG4pCiB7Ci0gICAgaW50ICAgICAgICAgIHNzbGVycjsKLSAgICBjaGFyICAgICAgICAqaGFuZHNoYWtlOwotICAgIG5neF9lcnJfdCAgICBlcnI7Ci0gICAgbmd4X3VpbnRfdCAgIGxldmVsOworICAgIGludCAgICAgICAgc3NsZXJyOworICAgIG5neF9lcnJfdCAgZXJyOwogCiAgICAgaWYgKG4gPiAwKSB7CiAKQEAgLTI1MCwxMyArNDEwLDYgQEAKICAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKLSAgICBpZiAoIVNTTF9pc19pbml0X2ZpbmlzaGVkKGMtPnNzbC0+Y29ubmVjdGlvbikpIHsKLSAgICAgICAgaGFuZHNoYWtlID0gIiBpbiBTU0wgaGFuZHNoYWtlIjsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhbmRzaGFrZSA9ICIiOwotICAgIH0KLQogICAgIHNzbGVyciA9IFNTTF9nZXRfZXJyb3IoYy0+c3NsLT5jb25uZWN0aW9uLCBuKTsKIAogICAgIGVyciA9IChzc2xlcnIgPT0gU1NMX0VSUk9SX1NZU0NBTEwpID8gbmd4X2Vycm5vIDogMDsKQEAgLTI3MCw5ICs0MjMsOCBAQAogCiAgICAgaWYgKHNzbGVyciA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkgewogCi0gICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19JTkZPLCBjLT5sb2csIGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IGRvZXMgU1NMICVzaGFuZHNoYWtlIiwKLSAgICAgICAgICAgICAgICAgICAgICBTU0xfaXNfaW5pdF9maW5pc2hlZChjLT5zc2wtPmNvbm5lY3Rpb24pID8gInJlIiA6ICIiKTsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGMtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHN0YXJ0ZWQgU1NMIHJlbmVnb3RpYXRpb24iKTsKIAogICAgICAgICBjLT53cml0ZS0+cmVhZHkgPSAwOwogCkBAIC0yOTIsNDQgKzQ0NCwxNiBAQAogICAgICAgICByZXR1cm4gTkdYX0FHQUlOOwogICAgIH0KIAotICAgIGMtPnNzbC0+bm9fcmN2X3NodXQgPSAxOwotICAgIGMtPnNzbC0+bm9fc2VuZF9zaHV0ID0gMTsKKyAgICBjLT5zc2wtPm5vX3dhaXRfc2h1dGRvd24gPSAxOworICAgIGMtPnNzbC0+bm9fc2VuZF9zaHV0ZG93biA9IDE7CiAKICAgICBpZiAoc3NsZXJyID09IFNTTF9FUlJPUl9aRVJPX1JFVFVSTiB8fCBFUlJfcGVla19lcnJvcigpID09IDApIHsKLSAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGMtPmxvZywgZXJyLAotICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgY2xvc2VkIGNvbm5lY3Rpb24lcyIsIGhhbmRzaGFrZSk7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19JTkZPLCBjLT5sb2csIGVyciwgImNsaWVudCBjbG9zZWQgY29ubmVjdGlvbiIpOwogCiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgbGV2ZWwgPSBOR1hfTE9HX0NSSVQ7Ci0KLSAgICBpZiAoc3NsZXJyID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBOR1hfRUNPTk5SRVNFVAotICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FUElQRQotICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FTk9UQ09OTgotICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FQ09OTlJFRlVTRUQKLSAgICAgICAgICAgIHx8IGVyciA9PSBOR1hfRUhPU1RVTlJFQUNIKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMtPmxvZ19lcnJvcikgewotCi0gICAgICAgICAgICBjYXNlIE5HWF9FUlJPUl9JR05PUkVfRUNPTk5SRVNFVDoKLSAgICAgICAgICAgIGNhc2UgTkdYX0VSUk9SX0lORk86Ci0gICAgICAgICAgICAgICAgbGV2ZWwgPSBOR1hfTE9HX0lORk87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTkdYX0VSUk9SX0VSUjoKLSAgICAgICAgICAgICAgICBsZXZlbCA9IE5HWF9MT0dfRVJSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgbmd4X3NzbF9lcnJvcihsZXZlbCwgYy0+bG9nLCBlcnIsICJTU0xfcmVhZCgpIGZhaWxlZCVzIiwgaGFuZHNoYWtlKTsKKyAgICBuZ3hfc3NsX2Nvbm5lY3Rpb25fZXJyb3IoYywgc3NsZXJyLCBlcnIsICJTU0xfcmVhZCgpIGZhaWxlZCIpOwogCiAgICAgcmV0dXJuIE5HWF9FUlJPUjsKIH0KQEAgLTM0MSw2ICs0NjUsNyBAQAogICAgIG5neF9jb25uZWN0aW9uX3QgICpjOwogCiAgICAgYyA9IHdldi0+ZGF0YTsKKwogICAgIGMtPnJlYWQtPmhhbmRsZXIoYy0+cmVhZCk7CiB9CiAKQEAgLTQ4Miw5ICs2MDcsOCBAQAogc3NpemVfdAogbmd4X3NzbF93cml0ZShuZ3hfY29ubmVjdGlvbl90ICpjLCB1X2NoYXIgKmRhdGEsIHNpemVfdCBzaXplKQogewotICAgIGludCAgICAgICAgIG4sIHNzbGVycjsKLSAgICBuZ3hfZXJyX3QgICBlcnI7Ci0gICAgbmd4X3VpbnRfdCAgbGV2ZWw7CisgICAgaW50ICAgICAgICBuLCBzc2xlcnI7CisgICAgbmd4X2Vycl90ICBlcnI7CiAKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBjLT5sb2csIDAsICJTU0wgdG8gd3JpdGU6ICVkIiwgc2l6ZSk7CiAKQEAgLTQ5NCw1MiArNjE4LDYgQEAKIAogICAgIGlmIChuID4gMCkgewogCi0jaWYgKE5HWF9ERUJVRykKLQotICAgICAgICBpZiAoIWMtPnNzbC0+aGFuZHNoYWtlZCAmJiBTU0xfaXNfaW5pdF9maW5pc2hlZChjLT5zc2wtPmNvbm5lY3Rpb24pKSB7Ci0gICAgICAgICAgICBjaGFyICAgICAgICAgYnVmWzEyOV0sICpzLCAqZDsKLSAgICAgICAgICAgIFNTTF9DSVBIRVIgICpjaXBoZXI7Ci0KLSAgICAgICAgICAgIGMtPnNzbC0+aGFuZHNoYWtlZCA9IDE7Ci0KLSAgICAgICAgICAgIGNpcGhlciA9IFNTTF9nZXRfY3VycmVudF9jaXBoZXIoYy0+c3NsLT5jb25uZWN0aW9uKTsKLQotICAgICAgICAgICAgaWYgKGNpcGhlcikgewotICAgICAgICAgICAgICAgIFNTTF9DSVBIRVJfZGVzY3JpcHRpb24oY2lwaGVyLCAmYnVmWzFdLCAxMjgpOwotCi0gICAgICAgICAgICAgICAgZm9yIChzID0gJmJ1ZlsxXSwgZCA9IGJ1ZjsgKnM7IHMrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnMgPT0gJyAnICYmICpkID09ICcgJykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKnMgPT0gTEYgfHwgKnMgPT0gQ1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgKisrZCA9ICpzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgqZCAhPSAnICcpIHsKLSAgICAgICAgICAgICAgICAgICAgZCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICpkID0gJ1wwJzsKLQotICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIGNpcGhlcjogXCIlc1wiIiwgJmJ1ZlsxXSk7IAotCi0gICAgICAgICAgICAgICAgaWYgKFNTTF9zZXNzaW9uX3JldXNlZChjLT5zc2wtPmNvbm5lY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCByZXVzZWQgc2Vzc2lvbiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0VWRU5ULCBjLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCBubyBzaGFyZWQgY2lwaGVycyIpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgaWYgKGMtPnNzbC0+c2F2ZWRfcmVhZF9oYW5kbGVyKSB7CiAKICAgICAgICAgICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBjLT5zc2wtPnNhdmVkX3JlYWRfaGFuZGxlcjsKQEAgLTU3NSw5ICs2NTMsOCBAQAogCiAgICAgaWYgKHNzbGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKSB7CiAKLSAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGMtPmxvZywgZXJyLAotICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgZG9lcyBTU0wgJXNoYW5kc2hha2UiLAotICAgICAgICAgICAgICAgICAgICAgIFNTTF9pc19pbml0X2ZpbmlzaGVkKGMtPnNzbC0+Y29ubmVjdGlvbikgPyAicmUiIDogIiIpOworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgYy0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgc3RhcnRlZCBTU0wgcmVuZWdvdGlhdGlvbiIpOwogCiAgICAgICAgIGMtPnJlYWQtPnJlYWR5ID0gMDsKIApAQCAtNTk4LDM3ICs2NzUsMTAgQEAKICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKICAgICB9CiAKLSAgICBjLT5zc2wtPm5vX3Jjdl9zaHV0ID0gMTsKLSAgICBjLT5zc2wtPm5vX3NlbmRfc2h1dCA9IDE7CisgICAgYy0+c3NsLT5ub193YWl0X3NodXRkb3duID0gMTsKKyAgICBjLT5zc2wtPm5vX3NlbmRfc2h1dGRvd24gPSAxOwogCi0gICAgbGV2ZWwgPSBOR1hfTE9HX0NSSVQ7Ci0KLSAgICBpZiAoc3NsZXJyID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBOR1hfRUNPTk5SRVNFVAotICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FUElQRQotICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FTk9UQ09OTgotICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FQ09OTlJFRlVTRUQKLSAgICAgICAgICAgIHx8IGVyciA9PSBOR1hfRUhPU1RVTlJFQUNIKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMtPmxvZ19lcnJvcikgewotCi0gICAgICAgICAgICBjYXNlIE5HWF9FUlJPUl9JR05PUkVfRUNPTk5SRVNFVDoKLSAgICAgICAgICAgIGNhc2UgTkdYX0VSUk9SX0lORk86Ci0gICAgICAgICAgICAgICAgbGV2ZWwgPSBOR1hfTE9HX0lORk87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTkdYX0VSUk9SX0VSUjoKLSAgICAgICAgICAgICAgICBsZXZlbCA9IE5HWF9MT0dfRVJSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgbmd4X3NzbF9lcnJvcihsZXZlbCwgYy0+bG9nLCBlcnIsICJTU0xfd3JpdGUoKSBmYWlsZWQiKTsKKyAgICBuZ3hfc3NsX2Nvbm5lY3Rpb25fZXJyb3IoYywgc3NsZXJyLCBlcnIsICJTU0xfd3JpdGUoKSBmYWlsZWQiKTsKIAogICAgIHJldHVybiBOR1hfRVJST1I7CiB9CkBAIC02NDAsNiArNjkwLDcgQEAKICAgICBuZ3hfY29ubmVjdGlvbl90ICAqYzsKIAogICAgIGMgPSByZXYtPmRhdGE7CisKICAgICBjLT53cml0ZS0+aGFuZGxlcihjLT53cml0ZSk7CiB9CiAKQEAgLTY1MCwzMSArNzAxLDIzIEBACiAgICAgaW50ICAgICAgICAgbiwgc3NsZXJyLCBtb2RlOwogICAgIG5neF91aW50X3QgIGFnYWluOwogCi0gICAgaWYgKCFjLT5zc2wtPnNodXRkb3duX3NldCkgeworICAgIGlmIChjLT5yZWFkLT50aW1lZG91dCkgeworICAgICAgICBtb2RlID0gU1NMX1JFQ0VJVkVEX1NIVVRET1dOfFNTTF9TRU5UX1NIVVRET1dOOwogCi0gICAgICAgIC8qIGl0IHNlZW1zIHRoYXQgU1NMX3NldF9zaHV0ZG93bigpIGNvdWxkIGJlIGNhbGxlZCBvbmNlIG9ubHkgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBtb2RlID0gU1NMX2dldF9zaHV0ZG93bihjLT5zc2wtPmNvbm5lY3Rpb24pOwogCi0gICAgICAgIGlmIChjLT5yZWFkLT50aW1lZG91dCkgewotICAgICAgICAgICAgbW9kZSA9IFNTTF9SRUNFSVZFRF9TSFVURE9XTnxTU0xfU0VOVF9TSFVURE9XTjsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbW9kZSA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChjLT5zc2wtPm5vX3Jjdl9zaHV0KSB7Ci0gICAgICAgICAgICAgICAgbW9kZSA9IFNTTF9SRUNFSVZFRF9TSFVURE9XTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGMtPnNzbC0+bm9fc2VuZF9zaHV0KSB7Ci0gICAgICAgICAgICAgICAgbW9kZSB8PSBTU0xfU0VOVF9TSFVURE9XTjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGMtPnNzbC0+bm9fd2FpdF9zaHV0ZG93bikgeworICAgICAgICAgICAgbW9kZSB8PSBTU0xfUkVDRUlWRURfU0hVVERPV047CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobW9kZSkgewotICAgICAgICAgICAgU1NMX3NldF9zaHV0ZG93bihjLT5zc2wtPmNvbm5lY3Rpb24sIG1vZGUpOwotICAgICAgICAgICAgYy0+c3NsLT5zaHV0ZG93bl9zZXQgPSAxOworICAgICAgICBpZiAoYy0+c3NsLT5ub19zZW5kX3NodXRkb3duKSB7CisgICAgICAgICAgICBtb2RlIHw9IFNTTF9TRU5UX1NIVVRET1dOOwogICAgICAgICB9CiAgICAgfQogCisgICAgU1NMX3NldF9zaHV0ZG93bihjLT5zc2wtPmNvbm5lY3Rpb24sIG1vZGUpOworCiAgICAgYWdhaW4gPSAwOwogI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKICAgICBzc2xlcnIgPSAwOwpAQCAtNzM2LDExICs3NzksNDkgQEAKIH0KIAogCitzdGF0aWMgdm9pZAorbmd4X3NzbF9jb25uZWN0aW9uX2Vycm9yKG5neF9jb25uZWN0aW9uX3QgKmMsIGludCBzc2xlcnIsIG5neF9lcnJfdCBlcnIsCisgICAgY2hhciAqdGV4dCkKK3sKKyAgICBuZ3hfdWludF90ICBsZXZlbDsKKworICAgIGxldmVsID0gTkdYX0xPR19DUklUOworCisgICAgaWYgKHNzbGVyciA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworCisgICAgICAgIGlmIChlcnIgPT0gTkdYX0VDT05OUkVTRVQKKyAgICAgICAgICAgIHx8IGVyciA9PSBOR1hfRVBJUEUKKyAgICAgICAgICAgIHx8IGVyciA9PSBOR1hfRU5PVENPTk4KKyAgICAgICAgICAgIHx8IGVyciA9PSBOR1hfRUNPTk5SRUZVU0VECisgICAgICAgICAgICB8fCBlcnIgPT0gTkdYX0VIT1NUVU5SRUFDSCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjLT5sb2dfZXJyb3IpIHsKKworICAgICAgICAgICAgY2FzZSBOR1hfRVJST1JfSUdOT1JFX0VDT05OUkVTRVQ6CisgICAgICAgICAgICBjYXNlIE5HWF9FUlJPUl9JTkZPOgorICAgICAgICAgICAgICAgIGxldmVsID0gTkdYX0xPR19JTkZPOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5HWF9FUlJPUl9FUlI6CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBOR1hfTE9HX0VSUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG5neF9zc2xfZXJyb3IobGV2ZWwsIGMtPmxvZywgZXJyLCB0ZXh0KTsKK30KKworCiB2b2lkCiBuZ3hfc3NsX2Vycm9yKG5neF91aW50X3QgbGV2ZWwsIG5neF9sb2dfdCAqbG9nLCBuZ3hfZXJyX3QgZXJyLCBjaGFyICpmbXQsIC4uLikKIHsgICAKLSAgICB1X2NoYXIgICBlcnJzdHJbTkdYX01BWF9DT05GX0VSUlNUUl0sICpwLCAqbGFzdDsKKyAgICB1X2xvbmcgICBuOwogICAgIHZhX2xpc3QgIGFyZ3M7CisgICAgdV9jaGFyICAgZXJyc3RyW05HWF9NQVhfQ09ORl9FUlJTVFJdLCAqcCwgKmxhc3Q7CiAKICAgICBsYXN0ID0gZXJyc3RyICsgTkdYX01BWF9DT05GX0VSUlNUUjsKIApAQCAtNzQ4LDkgKzgyOSwxOCBAQAogICAgIHAgPSBuZ3hfdnNucHJpbnRmKGVycnN0ciwgc2l6ZW9mKGVycnN0cikgLSAxLCBmbXQsIGFyZ3MpOwogICAgIHZhX2VuZChhcmdzKTsKIAotICAgIHAgPSBuZ3hfY3B5c3RybihwLCAodV9jaGFyICopICIgKFNTTDogIiwgbGFzdCAtIHApOworICAgIHAgPSBuZ3hfY3B5c3RybihwLCAodV9jaGFyICopICIgKFNTTDoiLCBsYXN0IC0gcCk7CiAKLSAgICBFUlJfZXJyb3Jfc3RyaW5nX24oRVJSX2dldF9lcnJvcigpLCAoY2hhciAqKSBwLCBsYXN0IC0gcCk7CisgICAgd2hpbGUgKHAgPCBsYXN0ICYmIChuID0gRVJSX2dldF9lcnJvcigpKSkgeworCisgICAgICAgICpwKysgPSAnICc7CisKKyAgICAgICAgRVJSX2Vycm9yX3N0cmluZ19uKG4sIChjaGFyICopIHAsIGxhc3QgLSBwKTsKKworICAgICAgICB3aGlsZSAocCA8IGxhc3QgJiYgKnApIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG5neF9sb2dfZXJyb3IobGV2ZWwsIGxvZywgZXJyLCAiJXMpIiwgZXJyc3RyKTsKIH0KQEAgLTc1OSw5ICs4NDksMTAgQEAKIHZvaWQKIG5neF9zc2xfY2xlYW51cF9jdHgodm9pZCAqZGF0YSkKIHsKLSAgIFNTTF9DVFggICpjdHggPSBkYXRhOworICAgbmd4X3NzbF90ICAqc3NsID0gZGF0YTsKIAotICAgU1NMX0NUWF9mcmVlKGN0eCk7CisgICBSU0FfZnJlZShzc2wtPnJzYTUxMl9rZXkpOworICAgU1NMX0NUWF9mcmVlKHNzbC0+Y3R4KTsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X29wZW5zc2wuaCBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCmluZGV4IGZhN2YyN2UuLmNkMzg5OGMgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCkBAIC0xNiw0NCArMTYsNTMgQEAKIAogI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMAogI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+Ci0jZGVmaW5lIE5HWF9TU0xfRU5HSU5FICAgICAxCisjZGVmaW5lIE5HWF9TU0xfRU5HSU5FICAgMQogI2VuZGlmCiAKLSNkZWZpbmUgTkdYX1NTTF9OQU1FICAgICAgICJPcGVuU1NMIgorI2RlZmluZSBOR1hfU1NMX05BTUUgICAgICJPcGVuU1NMIgogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBTU0wgICAgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb247Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgICBsYXN0OwotICAgIG5neF9idWZfdCAgICAgICAgICAgICAqYnVmOwotICAgIG5neF9ldmVudF9oYW5kbGVyX3B0ICAgc2F2ZWRfcmVhZF9oYW5kbGVyOwotICAgIG5neF9ldmVudF9oYW5kbGVyX3B0ICAgc2F2ZWRfd3JpdGVfaGFuZGxlcjsKLQotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgYnVmZmVyOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgICBub19yY3Zfc2h1dDoxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgbm9fc2VuZF9zaHV0OjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgICBzaHV0ZG93bl9zZXQ6MTsKLQotI2lmIChOR1hfREVCVUcpCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICBoYW5kc2hha2VkOjE7Ci0jZW5kaWYKKyAgICBTU0xfQ1RYICAgICAgICAgICAgICAgICAgICAqY3R4OworICAgIFJTQSAgICAgICAgICAgICAgICAgICAgICAgICpyc2E1MTJfa2V5OworICAgIG5neF9sb2dfdCAgICAgICAgICAgICAgICAgICpsb2c7CiB9IG5neF9zc2xfdDsKIAogCi10eXBlZGVmIFNTTF9DVFggIG5neF9zc2xfY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgU1NMICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb247CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgKmJ1ZjsKKworICAgIG5neF9jb25uZWN0aW9uX2hhbmRsZXJfcHQgICBoYW5kbGVyOworCisgICAgbmd4X2V2ZW50X2hhbmRsZXJfcHQgICAgICAgIHNhdmVkX3JlYWRfaGFuZGxlcjsKKyAgICBuZ3hfZXZlbnRfaGFuZGxlcl9wdCAgICAgICAgc2F2ZWRfd3JpdGVfaGFuZGxlcjsKKworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2VkOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBub193YWl0X3NodXRkb3duOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIG5vX3NlbmRfc2h1dGRvd246MTsKK30gbmd4X3NzbF9jb25uZWN0aW9uX3Q7CiAKIAotI2RlZmluZSBOR1hfU1NMX0JVRkZFUiAgICAgICAxCisjZGVmaW5lIE5HWF9TU0xfU1NMdjIgICAgMgorI2RlZmluZSBOR1hfU1NMX1NTTHYzICAgIDQKKyNkZWZpbmUgTkdYX1NTTF9UTFN2MSAgICA4CiAKLSNkZWZpbmUgTkdYX1NTTF9CVUZTSVpFICAgICAgMTYzODQKKworI2RlZmluZSBOR1hfU1NMX0JVRkZFUiAgIDEKKworI2RlZmluZSBOR1hfU1NMX0JVRlNJWkUgIDE2Mzg0CiAKIAogbmd4X2ludF90IG5neF9zc2xfaW5pdChuZ3hfbG9nX3QgKmxvZyk7Ci1uZ3hfaW50X3Qgbmd4X3NzbF9jcmVhdGVfY29ubmVjdGlvbihuZ3hfc3NsX2N0eF90ICpjdHgsIG5neF9jb25uZWN0aW9uX3QgKmMsCituZ3hfaW50X3Qgbmd4X3NzbF9jcmVhdGUobmd4X3NzbF90ICpzc2wsIG5neF91aW50X3QgcHJvdG9jb2xzKTsKK25neF9pbnRfdCBuZ3hfc3NsX2NlcnRpZmljYXRlKG5neF9zc2xfdCAqc3NsLCB1X2NoYXIgKmNlcnQsIHVfY2hhciAqa2V5KTsKK25neF9pbnRfdCBuZ3hfc3NsX2dlbmVyYXRlX3JzYTUxMl9rZXkobmd4X3NzbF90ICpzc2wpOworbmd4X2ludF90IG5neF9zc2xfY3JlYXRlX2Nvbm5lY3Rpb24obmd4X3NzbF90ICpzc2wsIG5neF9jb25uZWN0aW9uX3QgKmMsCiAgICAgbmd4X3VpbnRfdCBmbGFncyk7Ci0KLSNkZWZpbmUgbmd4X3NzbF9oYW5kc2hha2UoYykgICAgIE5HWF9PSwotCituZ3hfaW50X3Qgbmd4X3NzbF9oYW5kc2hha2Uobmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiBzc2l6ZV90IG5neF9zc2xfcmVjdihuZ3hfY29ubmVjdGlvbl90ICpjLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogc3NpemVfdCBuZ3hfc3NsX3dyaXRlKG5neF9jb25uZWN0aW9uX3QgKmMsIHVfY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpOwogbmd4X2NoYWluX3QgKm5neF9zc2xfc2VuZF9jaGFpbihuZ3hfY29ubmVjdGlvbl90ICpjLCBuZ3hfY2hhaW5fdCAqaW4sCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jCmluZGV4IGZiNDA2NjkuLmQ1YTZiNjkgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jCkBAIC0yNzEsMjEgKzI3MSwxNCBAQAogCiAgICAgICAgIGxlbiA9IG5neF9kZV9uYW1lbGVuKCZkaXIpOwogCi0gICAgICAgIGlmIChsZW4gPT0gMSAmJiBuZ3hfZGVfbmFtZSgmZGlyKVswXSA9PSAnLicpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlbiA9PSAyCi0gICAgICAgICAgICAmJiBuZ3hfZGVfbmFtZSgmZGlyKVswXSA9PSAnLicKLSAgICAgICAgICAgICYmIG5neF9kZV9uYW1lKCZkaXIpWzFdID09ICcuJykKLSAgICAgICAgeworICAgICAgICBpZiAobmd4X2RlX25hbWUoJmRpcilbMF0gPT0gJy4nKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghZGlyLnZhbGlkX2luZm8pIHsKIAotICAgICAgICAgICAgaWYgKGRuYW1lLmxlbiArIDEgKyBsZW4gPiBmbmFtZS5sZW4pIHsKLSAgICAgICAgICAgICAgICBmbmFtZS5sZW4gPSBkbmFtZS5sZW4gKyAxICsgbGVuICsgMzI7CisgICAgICAgICAgICBpZiAoZG5hbWUubGVuICsgMSArIGxlbiArIDEgPiBmbmFtZS5sZW4pIHsKKyAgICAgICAgICAgICAgICBmbmFtZS5sZW4gPSBkbmFtZS5sZW4gKyAxICsgbGVuICsgMSArIDMyOwogCiAgICAgICAgICAgICAgICAgZm5hbWUuZGF0YSA9IG5neF9wYWxsb2MocG9vbCwgZm5hbWUubGVuKTsKICAgICAgICAgICAgICAgICBpZiAoZm5hbWUuZGF0YSA9PSBOVUxMKSB7CkBAIC00NjgsNyArNDYxLDggQEAKIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGVudHJ5W2ldLmRpcikgewotICAgICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICAiICAgICAtIiwgc2l6ZW9mKCIgICAgIC0iKSAtIDEpOworICAgICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICAiICAgICAgLSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCIgICAgICAtIikgLSAxKTsKIAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsZW5ndGggPSBlbnRyeVtpXS5zaXplOwpAQCAtNDk4LDEzICs0OTIsMTQgQEAKIAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAobmd4X2ludF90KSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gJyAnOworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9zcHJpbnRmKGItPmxhc3QsICIlNmkiLCBzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoc2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9zcHJpbnRmKGItPmxhc3QsICIlNmklYyIsIHNpemUsIHNjYWxlKTsKIAotICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSAnICcpIHsKLSAgICAgICAgICAgICAgICAgICAgKmItPmxhc3QrKyA9IHNjYWxlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfc3ByaW50ZihiLT5sYXN0LCAiICU2aSIsIHNpemUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZS5jCmluZGV4IDZlZmFjM2QuLjliMzE3ZjkgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfbW9kdWxlLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgICAgTlVMTCB9LAogCiAgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX25leHRfdXBzdHJlYW0iKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9BTlksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfMU1PUkUsCiAgICAgICBuZ3hfY29uZl9zZXRfYml0bWFza19zbG90LAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5uZXh0X3Vwc3RyZWFtKSwKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nZW9fbW9kdWxlLmMKaW5kZXggODM0MjgyYi4uMjAzMWE0YyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nZW9fbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nZW9fbW9kdWxlLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICBuYW1lLmRhdGErKzsKICAgICB9CiAKLSAgICB2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsICZuYW1lLCAwKTsKKyAgICB2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsICZuYW1lLCBOR1hfSFRUUF9WQVJfQ0hBTkdBQkxFKTsKICAgICBpZiAodmFyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyX21vZHVsZS5jCmluZGV4IGMzN2Y3OWMuLjAxMmVhNDUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAgICAgICAmbmd4X2h0dHBfZ3ppcF9odHRwX3ZlcnNpb24gfSwKIAogICAgIHsgbmd4X3N0cmluZygiZ3ppcF9wcm94aWVkIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfQU5ZLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GXzFNT1JFLAogICAgICAgbmd4X2NvbmZfc2V0X2JpdG1hc2tfc2xvdCwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIG9mZnNldG9mKG5neF9odHRwX2d6aXBfY29uZl90LCBwcm94aWVkKSwKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCmluZGV4IGM4MDdkZjkuLmE3ZmQ3NDEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAgICAgICBOVUxMIH0sCiAKICAgICB7IG5neF9zdHJpbmcoInByb3h5X25leHRfdXBzdHJlYW0iKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9BTlksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfMU1PUkUsCiAgICAgICBuZ3hfY29uZl9zZXRfYml0bWFza19zbG90LAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ubmV4dF91cHN0cmVhbSksCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKaW5kZXggMGYzODI5NS4uZjNlYjA5MyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwpAQCAtNTksNiArNTksNyBAQAogICAgIG5neF91aW50X3QgICAgICAgICBvdXRwdXQ7ICAgICAgICAvKiB1bnNpZ25lZCAgb3V0cHV0OjE7ICovCiAKICAgICBuZ3hfc3RyX3QgICAgICAgICAgdGltZWZtdDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgZXJybXNnOwogfSBuZ3hfaHR0cF9zc2lfY3R4X3Q7CiAKIApAQCAtMjE3LDggKzIxOCw2IEBACiAKIAogc3RhdGljIHVfY2hhciBuZ3hfaHR0cF9zc2lfc3RyaW5nW10gPSAiPCEtLSI7Ci1zdGF0aWMgdV9jaGFyIG5neF9odHRwX3NzaV9lcnJvcl9zdHJpbmdbXSA9Ci0gICAgIlthbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkaXJlY3RpdmVdIjsKIAogc3RhdGljIG5neF9zdHJfdCBuZ3hfaHR0cF9zc2lfbm9uZSA9IG5neF9zdHJpbmcoIihub25lKSIpOwogCkBAIC0yMjYsNyArMjI1LDggQEAKICNkZWZpbmUgIE5HWF9IVFRQX1NTSV9FQ0hPX1ZBUiAgICAgICAgIDAKICNkZWZpbmUgIE5HWF9IVFRQX1NTSV9FQ0hPX0RFRkFVTFQgICAgIDEKIAotI2RlZmluZSAgTkdYX0hUVFBfU1NJX0NPTkZJR19USU1FRk1UICAgMAorI2RlZmluZSAgTkdYX0hUVFBfU1NJX0NPTkZJR19FUlJNU0cgICAgMAorI2RlZmluZSAgTkdYX0hUVFBfU1NJX0NPTkZJR19USU1FRk1UICAgMQogCiAjZGVmaW5lICBOR1hfSFRUUF9TU0lfSU5DTFVERV9WSVJUVUFMICAwCiAjZGVmaW5lICBOR1hfSFRUUF9TU0lfSU5DTFVERV9GSUxFICAgICAxCkBAIC0yNTAsNiArMjUwLDcgQEAKIAogCiBzdGF0aWMgbmd4X2h0dHBfc3NpX3BhcmFtX3QgIG5neF9odHRwX3NzaV9jb25maWdfcGFyYW1zW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJlcnJtc2ciKSwgTkdYX0hUVFBfU1NJX0NPTkZJR19FUlJNU0csIDAgfSwKICAgICB7IG5neF9zdHJpbmcoInRpbWVmbXQiKSwgTkdYX0hUVFBfU1NJX0NPTkZJR19USU1FRk1ULCAwIH0sCiAgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAsIDAgfQogfTsKQEAgLTM0Nyw2ICszNDgsMTEgQEAKICAgICBjdHgtPnRpbWVmbXQubGVuID0gc2l6ZW9mKCIlQSwgJWQtJWItJVkgJUg6JU06JVMgJVoiKSAtIDE7CiAgICAgY3R4LT50aW1lZm10LmRhdGEgPSAodV9jaGFyICopICIlQSwgJWQtJWItJVkgJUg6JU06JVMgJVoiOwogCisgICAgY3R4LT5lcnJtc2cubGVuID0KKyAgICAgICAgICAgICAgc2l6ZW9mKCJbYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZGlyZWN0aXZlXSIpIC0gMTsKKyAgICBjdHgtPmVycm1zZy5kYXRhID0gKHVfY2hhciAqKQorICAgICAgICAgICAgICAgICAgICAgIlthbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkaXJlY3RpdmVdIjsKKwogICAgIHItPmZpbHRlcl9uZWVkX2luX21lbW9yeSA9IDE7CiAKICAgICBpZiAoci0+bWFpbiA9PSBOVUxMKSB7CkBAIC02NTMsOSArNjU5LDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYi0+bWVtb3J5ID0gMTsKLSAgICAgICAgICAgIGItPnBvcyA9IG5neF9odHRwX3NzaV9lcnJvcl9zdHJpbmc7Ci0gICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2h0dHBfc3NpX2Vycm9yX3N0cmluZwotICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKG5neF9odHRwX3NzaV9lcnJvcl9zdHJpbmcpIC0gMTsKKyAgICAgICAgICAgIGItPnBvcyA9IGN0eC0+ZXJybXNnLmRhdGE7CisgICAgICAgICAgICBiLT5sYXN0ID0gY3R4LT5lcnJtc2cuZGF0YSArIGN0eC0+ZXJybXNnLmxlbjsKIAogICAgICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwogICAgICAgICAgICAgKmN0eC0+bGFzdF9vdXQgPSBjbDsKQEAgLTEzNzEsNiArMTM3NiwxMiBAQAogICAgICAgICBjdHgtPnRpbWVmbXQgPSAqdmFsdWU7CiAgICAgfQogCisgICAgdmFsdWUgPSBwYXJhbXNbTkdYX0hUVFBfU1NJX0NPTkZJR19FUlJNU0ddOworCisgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGN0eC0+ZXJybXNnID0gKnZhbHVlOworICAgIH0KKwogICAgIHJldHVybiBOR1hfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKaW5kZXggMTMwZjJiMy4uYmI5YTU1ZiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKQEAgLTgsOSArOCw5IEBACiAjaW5jbHVkZSA8bmd4X2NvcmUuaD4KICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCi0KICNkZWZpbmUgTkdYX0RFRkxBVVRfQ0VSVElGSUNBVEUgICAgICAiY2VydC5wZW0iCiAjZGVmaW5lIE5HWF9ERUZMQVVUX0NFUlRJRklDQVRFX0tFWSAgImNlcnQucGVtIgorI2RlZmluZSBOR1hfREVGTEFVVF9DSVBIRVJTICAiQUxMOiFBREg6UkM0K1JTQTorSElHSDorTUVESVVNOitMT1c6K1NTTHYyOitFWFAiCiAKIAogc3RhdGljIHZvaWQgKm5neF9odHRwX3NzbF9jcmVhdGVfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YpOwpAQCAtMTgsNiArMTgsMTQgQEAKICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKIAogCitzdGF0aWMgbmd4X2NvbmZfYml0bWFza190ICBuZ3hfaHR0cF9zc2xfcHJvdG9jb2xzW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJTU0x2MiIpLCBOR1hfU1NMX1NTTHYyIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJTU0x2MyIpLCBOR1hfU1NMX1NTTHYzIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJUTFN2MSIpLCBOR1hfU1NMX1RMU3YxIH0sCisgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAgfQorfTsKKworCiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2h0dHBfc3NsX2NvbW1hbmRzW10gPSB7CiAKICAgICB7IG5neF9zdHJpbmcoInNzbCIpLApAQCAtNDEsMTMgKzQ5LDI3IEBACiAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdCwgY2VydGlmaWNhdGVfa2V5KSwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygic3NsX3Byb3RvY29scyIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X2JpdG1hc2tfc2xvdCwKKyAgICAgIE5HWF9IVFRQX1NSVl9DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzbF9zcnZfY29uZl90LCBwcm90b2NvbHMpLAorICAgICAgJm5neF9odHRwX3NzbF9wcm90b2NvbHMgfSwKKwogICAgIHsgbmd4X3N0cmluZygic3NsX2NpcGhlcnMiKSwKLSAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GXzFNT1JFLAogICAgICAgbmd4X2NvbmZfc2V0X3N0cl9zbG90LAogICAgICAgTkdYX0hUVFBfU1JWX0NPTkZfT0ZGU0VULAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfc3NsX3Nydl9jb25mX3QsIGNpcGhlcnMpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJzc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSFRUUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdCwgcHJlZmVyX3NlcnZlcl9jaXBoZXJzKSwKKyAgICAgIE5VTEwgfSwKKwogICAgICAgbmd4X251bGxfY29tbWFuZAogfTsKIApAQCAtOTksNiArMTIxLDggQEAKICAgICAvKgogICAgICAqIHNldCBieSBuZ3hfcGNhbGxvYygpOgogICAgICAqCisgICAgICogICAgIHNjZi0+cHJvdG9jb2xzID0gMDsKKwogICAgICAqICAgICBzY2YtPmNlcnRpZmljYXRlLmxlbiA9IDA7CiAgICAgICogICAgIHNjZi0+Y2VydGlmaWNhdGUuZGF0YSA9IE5VTEw7CiAgICAgICogICAgIHNjZi0+Y2VydGlmaWNhdGVfa2V5LmxlbiA9IDA7CkBAIC0xMDgsNiArMTMyLDcgQEAKICAgICAgKi8KIAogICAgIHNjZi0+ZW5hYmxlID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgc2NmLT5wcmVmZXJfc2VydmVyX2NpcGhlcnMgPSBOR1hfQ09ORl9VTlNFVDsKIAogICAgIHJldHVybiBzY2Y7CiB9CkBAIC0xMjUsMTAxICsxNTAsNjAgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogICAgIH0KIAorICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnByZWZlcl9zZXJ2ZXJfY2lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5wcmVmZXJfc2VydmVyX2NpcGhlcnMsIDApOworCisgICAgbmd4X2NvbmZfbWVyZ2VfYml0bWFza192YWx1ZShjb25mLT5wcm90b2NvbHMsIHByZXYtPnByb3RvY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTkdYX0NPTkZfQklUTUFTS19TRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9TU0xfU1NMdjJ8TkdYX1NTTF9TU0x2M3xOR1hfU1NMX1RMU3YxKSk7CisKICAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+Y2VydGlmaWNhdGUsIHByZXYtPmNlcnRpZmljYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfREVGTEFVVF9DRVJUSUZJQ0FURSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0RFRkxBVVRfQ0VSVElGSUNBVEUpOwogCiAgICAgbmd4X2NvbmZfbWVyZ2Vfc3RyX3ZhbHVlKGNvbmYtPmNlcnRpZmljYXRlX2tleSwgcHJldi0+Y2VydGlmaWNhdGVfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfREVGTEFVVF9DRVJUSUZJQ0FURV9LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9ERUZMQVVUX0NFUlRJRklDQVRFX0tFWSk7CiAKLSAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+Y2lwaGVycywgcHJldi0+Y2lwaGVycywgIiIpOworICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5jaXBoZXJzLCBwcmV2LT5jaXBoZXJzLCBOR1hfREVGTEFVVF9DSVBIRVJTKTsKIAogCi0gICAgLyogVE9ETzogY29uZmlndXJlIG1ldGhvZHMgKi8KKyAgICBjb25mLT5zc2wubG9nID0gY2YtPmxvZzsKIAotICAgIGNvbmYtPnNzbF9jdHggPSBTU0xfQ1RYX25ldyhTU0x2MjNfc2VydmVyX21ldGhvZCgpKTsKLQotICAgIGlmIChjb25mLT5zc2xfY3R4ID09IE5VTEwpIHsKLSAgICAgICAgbmd4X3NzbF9lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLCAiU1NMX0NUWF9uZXcoKSBmYWlsZWQiKTsKKyAgICBpZiAobmd4X3NzbF9jcmVhdGUoJmNvbmYtPnNzbCwgY29uZi0+cHJvdG9jb2xzKSAhPSBOR1hfT0spIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChuZ3hfcG9vbF9jbGVhbnVwX2FkZChjZi0+cG9vbCwgbmd4X3NzbF9jbGVhbnVwX2N0eCwgY29uZi0+c3NsX2N0eCkKLSAgICAgICAgPT0gTlVMTCkKKyAgICBpZiAobmd4X3Bvb2xfY2xlYW51cF9hZGQoY2YtPnBvb2wsIG5neF9zc2xfY2xlYW51cF9jdHgsICZjb25mLT5zc2wpID09IE5VTEwpCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0KLSAgICBpZiAoY29uZi0+Y2lwaGVycy5sZW4pIHsKLSAgICAgICAgaWYgKFNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGNvbmYtPnNzbF9jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopIGNvbmYtPmNpcGhlcnMuZGF0YSkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbmd4X3NzbF9lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoXCIlVlwiKSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZi0+Y2lwaGVycyk7Ci0gICAgICAgIH0KKyAgICBpZiAobmd4X3NzbF9jZXJ0aWZpY2F0ZSgmY29uZi0+c3NsLCBjb25mLT5jZXJ0aWZpY2F0ZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYtPmNlcnRpZmljYXRlX2tleS5kYXRhKSAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgaWYgKFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoY29uZi0+c3NsX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgY29uZi0+Y2VydGlmaWNhdGUuZGF0YSkgPT0gMCkKKyAgICBpZiAoU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY29uZi0+c3NsLmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgY29uZi0+Y2lwaGVycy5kYXRhKSA9PSAwKQogICAgIHsKICAgICAgICAgbmd4X3NzbF9lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICJTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKFwiJXNcIikgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25mLT5jZXJ0aWZpY2F0ZS5kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAiU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoXCIlVlwiKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICZjb25mLT5jaXBoZXJzKTsKKyAgICB9CisKKyAgICBpZiAoY29uZi0+cHJlZmVyX3NlcnZlcl9jaXBoZXJzKSB7CisgICAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29uZi0+c3NsLmN0eCwgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSk7CisgICAgfQorCisgICAgLyogYSB0ZW1wb3JhcnkgNTEyLWJpdCBSU0Ega2V5IGlzIHJlcXVpcmVkIGZvciBleHBvcnQgdmVyc2lvbnMgb2YgTVNJRSAqLworICAgIGlmIChuZ3hfc3NsX2dlbmVyYXRlX3JzYTUxMl9rZXkoJmNvbmYtPnNzbCkgIT0gTkdYX09LKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAoU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGNvbmYtPnNzbF9jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBjb25mLT5jZXJ0aWZpY2F0ZV9rZXkuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9GSUxFVFlQRV9QRU0pID09IDApCi0gICAgewotICAgICAgICBuZ3hfc3NsX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIlNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShcIiVzXCIpIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uZi0+Y2VydGlmaWNhdGVfa2V5LmRhdGEpOwotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQorICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjb25mLT5zc2wuY3R4LCBTU0xfU0VTU19DQUNIRV9TRVJWRVIpOwogCi0gICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb25mLT5zc2xfY3R4LCBTU0xfT1BfQUxMKTsKLQotICAgIFNTTF9DVFhfc2V0X21vZGUoY29uZi0+c3NsX2N0eCwgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIpOwotCi0gICAgU1NMX0NUWF9zZXRfcmVhZF9haGVhZChjb25mLT5zc2xfY3R4LCAxKTsKLQotICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjb25mLT5zc2xfY3R4LCBTU0xfU0VTU19DQUNIRV9TRVJWRVIpOwotCi0gICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KGNvbmYtPnNzbF9jdHgsIG5neF9odHRwX3Nlc3Npb25faWRfY3R4LAorICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChjb25mLT5zc2wuY3R4LCBuZ3hfaHR0cF9zZXNzaW9uX2lkX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Nlc3Npb25faWRfY3R4KSAtIDEpOwogCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQotCi0KLSNpZiAwCi0KLS8qIGhvdyB0byBlbnVtcmF0ZSBzZXJ2ZXInIGNvbmZpZ3MgKi8KLQotc3RhdGljIG5neF9pbnRfdAotbmd4X2h0dHBfc3NsX2luaXRfcHJvY2VzcyhuZ3hfY3ljbGVfdCAqY3ljbGUpCi17Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICBpOwotICAgIG5neF9odHRwX3NzbF9zcnZfY29uZl90ICAgICAqc3NjZjsKLSAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgICAqKmNzY2ZwOwotICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICAqY21jZjsKLQotICAgIGNtY2YgPSBuZ3hfaHR0cF9jeWNsZV9nZXRfbW9kdWxlX21haW5fY29uZihjeWNsZSwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwotCi0gICAgY3NjZnAgPSBjbWNmLT5zZXJ2ZXJzLmVsdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY21jZi0+c2VydmVycy5uZWx0czsgaSsrKSB7Ci0gICAgICAgIHNzY2YgPSBjc2NmcFtpXS0+Y3R4LT5zcnZfY29uZltuZ3hfaHR0cF9zc2xfbW9kdWxlLmN0eF9pbmRleF07Ci0KLSAgICAgICAgaWYgKHNzY2YtPmVuYWJsZSkgewotICAgICAgICAgICAgY3NjZnBbaV0tPnJlY3YgPSBuZ3hfc3NsX3JlY3Y7Ci0gICAgICAgICAgICBjc2NmcFtpXS0+c2VuZF9jaGFpbiA9IG5neF9zc2xfc2VuZF9jaGFpbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOR1hfT0s7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmggYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuaAppbmRleCBhY2IwYWVlLi5hNzA1NjM1IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuaAorKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuaApAQCAtMTUsMTIgKzE1LDE3IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBuZ3hfZmxhZ190ICAgICAgZW5hYmxlOworCisgICAgbmd4X3NzbF90ICAgICAgIHNzbDsKKworICAgIG5neF9mbGFnX3QgICAgICBwcmVmZXJfc2VydmVyX2NpcGhlcnM7CisKKyAgICBuZ3hfdWludF90ICAgICAgcHJvdG9jb2xzOworCiAgICAgbmd4X3N0cl90ICAgICAgIGNlcnRpZmljYXRlOwogICAgIG5neF9zdHJfdCAgICAgICBjZXJ0aWZpY2F0ZV9rZXk7CiAKICAgICBuZ3hfc3RyX3QgICAgICAgY2lwaGVyczsKLQotICAgIG5neF9zc2xfY3R4X3QgICpzc2xfY3R4OwogfSBuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdDsKIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKaW5kZXggY2IzOTM3Yy4uMGU2NjEzYiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwpAQCAtNDksNiArNDksNyBAQAogCiAjaWYgKE5HWF9IVFRQX1NTTCkKIHN0YXRpYyB2b2lkIG5neF9odHRwX3NzbF9oYW5kc2hha2Uobmd4X2V2ZW50X3QgKnJldik7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF9zc2xfaGFuZHNoYWtlX2hhbmRsZXIobmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9zc2xfY2xvc2VfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpOwogI2VuZGlmCiAKQEAgLTM1OSw3ICszNjAsNyBAQAogICAgIGlmIChzc2NmLT5lbmFibGUpIHsKIAogICAgICAgICBpZiAoYy0+c3NsID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChuZ3hfc3NsX2NyZWF0ZV9jb25uZWN0aW9uKHNzY2YtPnNzbF9jdHgsIGMsIE5HWF9TU0xfQlVGRkVSKQorICAgICAgICAgICAgaWYgKG5neF9zc2xfY3JlYXRlX2Nvbm5lY3Rpb24oJnNzY2YtPnNzbCwgYywgTkdYX1NTTF9CVUZGRVIpCiAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CkBAIC0zNjcsMTYgKzM2OCw2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldi0+aGFuZGxlciA9IG5neF9odHRwX3NzbF9oYW5kc2hha2U7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgbWFqb3JpdHkgb2YgYnJvd3NlcnMgZG8gbm90IHNlbmQgdGhlICJjbG9zZSBub3RpZnkiIGFsZXJ0LgotICAgICAgICAgICAgICogQW1vbmcgdGhlbSBhcmUgTVNJRSwgTW96aWxsYSwgTmV0c2NhcGUgNCwgS29ucXVlcm9yLCBhbmQgTGlua3MuCi0gICAgICAgICAgICAgKiBBbmQgd2hhdCBpcyBtb3JlLCBNU0lFIGlnbm9yZXMgdGhlIHNlcnZlcidzIGFsZXJ0LgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIE9wZXJhIGFsd2F5cyBzZW5kcyB0aGUgYWxlcnQuCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgYy0+c3NsLT5ub19yY3Zfc2h1dCA9IDE7CiAgICAgICAgIH0KIAogICAgICAgICByLT5tYWluX2ZpbHRlcl9uZWVkX2luX21lbW9yeSA9IDE7CkBAIC00OTEsMjEgKzQ4MiwxNiBAQAogICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByZXYtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwcyBzc2wgaGFuZHNoYWtlOiAweCUwMlhkIiwgYnVmWzBdKTsKIAotICAgICAgICAgICAgYy0+cmVjdiA9IG5neF9zc2xfcmVjdjsKLSAgICAgICAgICAgIGMtPnNlbmQgPSBuZ3hfc3NsX3dyaXRlOwotICAgICAgICAgICAgYy0+c2VuZF9jaGFpbiA9IG5neF9zc2xfc2VuZF9jaGFpbjsKLQogICAgICAgICAgICAgcmMgPSBuZ3hfc3NsX2hhbmRzaGFrZShjKTsKIAotICAgICAgICAgICAgaWYgKHJjID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfQkFEX1JFUVVFU1QpOwotICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7CisgICAgICAgICAgICAgICAgYy0+c3NsLT5oYW5kbGVyID0gbmd4X2h0dHBfc3NsX2hhbmRzaGFrZV9oYW5kbGVyOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHJjICE9IE5HWF9PSykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5neF9odHRwX3NzbF9oYW5kc2hha2VfaGFuZGxlcihjKTsKKworICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHJldi0+bG9nLCAwLApAQCAtNTE5LDYgKzUwNSw0MSBAQAogICAgIG5neF9odHRwX3Byb2Nlc3NfcmVxdWVzdF9saW5lKHJldik7CiB9CiAKKworc3RhdGljIHZvaWQKK25neF9odHRwX3NzbF9oYW5kc2hha2VfaGFuZGxlcihuZ3hfY29ubmVjdGlvbl90ICpjKQoreworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgKnI7CisKKyAgICBpZiAoYy0+c3NsLT5oYW5kc2hha2VkKSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIG1ham9yaXR5IG9mIGJyb3dzZXJzIGRvIG5vdCBzZW5kIHRoZSAiY2xvc2Ugbm90aWZ5IiBhbGVydC4KKyAgICAgICAgICogQW1vbmcgdGhlbSBhcmUgTVNJRSwgb2xkIE1vemlsbGEsIE5ldHNjYXBlIDQsIEtvbnF1ZXJvciwKKyAgICAgICAgICogYW5kIExpbmtzLiAgQW5kIHdoYXQgaXMgbW9yZSwgTVNJRSBpZ25vcmVzIHRoZSBzZXJ2ZXIncyBhbGVydC4KKyAgICAgICAgICoKKyAgICAgICAgICogT3BlcmEgYW5kIHJlY2VudCBNb3ppbGxhIHNlbmQgdGhlIGFsZXJ0LgorICAgICAgICAgKi8KKworICAgICAgICBjLT5zc2wtPm5vX3dhaXRfc2h1dGRvd24gPSAxOworCisgICAgICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm9jZXNzX3JlcXVlc3RfbGluZTsKKyAgICAgICAgLyogU1RVQjogZXBvbGwgZWRnZSAqLyBjLT53cml0ZS0+aGFuZGxlciA9IG5neF9odHRwX2VtcHR5X2hhbmRsZXI7CisKKyAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2xpbmUoYy0+cmVhZCk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHIgPSBjLT5kYXRhOworCisgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9CQURfUkVRVUVTVCk7CisgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihyLT5jb25uZWN0aW9uKTsKKworICAgIHJldHVybjsKK30KKworCiAjZW5kaWYKIAogCkBAIC0xMjkwLDcgKzEzMTEsNyBAQAogI2lmIDAKICAgICAgICAgICAgIC8qIE1TSUUgaWdub3JlcyB0aGUgU1NMICJjbG9zZSBub3RpZnkiIGFsZXJ0ICovCiAgICAgICAgICAgICBpZiAoYy0+c3NsKSB7Ci0gICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+c3NsLT5ub19zZW5kX3NodXQgPSAxOworICAgICAgICAgICAgICAgIGMtPnNzbC0+bm9fc2VuZF9zaHV0ZG93biA9IDE7CiAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgfQpAQCAtMjEyNiw3ICsyMTQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBhbGl2ZSBjb25uZWN0aW9uIiwgJmMtPmFkZHJfdGV4dCk7CiAjaWYgKE5HWF9IVFRQX1NTTCkKICAgICAgICAgICAgIGlmIChjLT5zc2wpIHsKLSAgICAgICAgICAgICAgICBjLT5zc2wtPm5vX3NlbmRfc2h1dCA9IDE7CisgICAgICAgICAgICAgICAgYy0+c3NsLT5ub19zZW5kX3NodXRkb3duID0gMTsKICAgICAgICAgICAgIH0KICNlbmRpZgogICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuYyBiL3NyYy9pbWFwL25neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuYwppbmRleCA2MTYyMjI3Li41NzFjZDI3IDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9hdXRoX2h0dHBfbW9kdWxlLmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfYXV0aF9odHRwX21vZHVsZS5jCkBAIC00NSw5ICs0NSw5IEBACiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICBwb3J0OwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgZXJyOwogCi0gICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgICAgICBzbGVlcDsKKyAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwOwogCi0gICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAgICAgICAgICpwZWVyczsKKyAgICBuZ3hfcG9vbF90ICAgICAgICAgICAgICAgICAgICAgKnBvb2w7CiB9OwogCiAKQEAgLTYzLDcgKzYzLDcgQEAKIHN0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfaHR0cF9ibG9ja19yZWFkKG5neF9ldmVudF90ICpyZXYpOwogc3RhdGljIHZvaWQgbmd4X2ltYXBfYXV0aF9odHRwX2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KTsKIHN0YXRpYyBuZ3hfYnVmX3QgKm5neF9pbWFwX2F1dGhfaHR0cF9jcmVhdGVfcmVxdWVzdChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMsCi0gICAgbmd4X2ltYXBfYXV0aF9odHRwX2NvbmZfdCAqYWhjZik7CisgICAgbmd4X3Bvb2xfdCAqcG9vbCwgbmd4X2ltYXBfYXV0aF9odHRwX2NvbmZfdCAqYWhjZik7CiAKIHN0YXRpYyB2b2lkICpuZ3hfaW1hcF9hdXRoX2h0dHBfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9pbWFwX2F1dGhfaHR0cF9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsCkBAIC0xMjMsMjEgKzEyMywzMiBAQAogbmd4X2ltYXBfYXV0aF9odHRwX2luaXQobmd4X2ltYXBfc2Vzc2lvbl90ICpzKQogewogICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfcG9vbF90ICAgICAgICAgICAgICAgICAqcG9vbDsKICAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3QgICAqY3R4OwogICAgIG5neF9pbWFwX2F1dGhfaHR0cF9jb25mX3QgICphaGNmOwogCiAgICAgcy0+Y29ubmVjdGlvbi0+bG9nLT5hY3Rpb24gPSAiaW4gaHR0cCBhdXRoIHN0YXRlIjsKIAotICAgIGN0eCA9IG5neF9wY2FsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIHNpemVvZihuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3QpKTsKLSAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBwb29sID0gbmd4X2NyZWF0ZV9wb29sKDIwNDgsIHMtPmNvbm5lY3Rpb24tPmxvZyk7CisgICAgaWYgKHBvb2wgPT0gTlVMTCkgewogICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGN0eCA9IG5neF9wY2FsbG9jKHBvb2wsIHNpemVvZihuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3QpKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKKyAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdHgtPnBvb2wgPSBwb29sOworCiAgICAgYWhjZiA9IG5neF9pbWFwX2dldF9tb2R1bGVfc3J2X2NvbmYocywgbmd4X2ltYXBfYXV0aF9odHRwX21vZHVsZSk7CiAKLSAgICBjdHgtPnJlcXVlc3QgPSBuZ3hfaW1hcF9hdXRoX2h0dHBfY3JlYXRlX3JlcXVlc3QocywgYWhjZik7CisgICAgY3R4LT5yZXF1ZXN0ID0gbmd4X2ltYXBfYXV0aF9odHRwX2NyZWF0ZV9yZXF1ZXN0KHMsIHBvb2wsIGFoY2YpOwogICAgIGlmIChjdHgtPnJlcXVlc3QgPT0gTlVMTCkgeworICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGN0eC0+cG9vbCk7CiAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTUyLDYgKzE2Myw3IEBACiAKICAgICBpZiAocmMgPT0gTkdYX0VSUk9SIHx8IHJjID09IE5HWF9CVVNZIHx8IHJjID09IE5HWF9ERUNMSU5FRCkgewogICAgICAgICBuZ3hfY2xvc2VfY29ubmVjdGlvbihjdHgtPnBlZXIuY29ubmVjdGlvbik7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY3R4LT5wb29sKTsKICAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xOTcsNiArMjA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAiYXV0aCBodHRwIHNlcnZlciAlViB0aW1lZCBvdXQiLAogICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnBlZXIucGVlcnMtPnBlZXJbMF0ubmFtZSk7CiAgICAgICAgIG5neF9jbG9zZV9jb25uZWN0aW9uKGN0eC0+cGVlci5jb25uZWN0aW9uKTsKKyAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChjdHgtPnBvb2wpOwogICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIwNyw2ICsyMjAsNyBAQAogCiAgICAgaWYgKG4gPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgIG5neF9jbG9zZV9jb25uZWN0aW9uKGN0eC0+cGVlci5jb25uZWN0aW9uKTsKKyAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChjdHgtPnBvb2wpOwogICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTI1MywxNCArMjY3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgImF1dGggaHR0cCBzZXJ2ZXIgJVYgdGltZWQgb3V0IiwKICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5wZWVyLnBlZXJzLT5wZWVyWzBdLm5hbWUpOwogICAgICAgICBuZ3hfY2xvc2VfY29ubmVjdGlvbihjdHgtPnBlZXIuY29ubmVjdGlvbik7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY3R4LT5wb29sKTsKICAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAoY3R4LT5yZXNwb25zZSA9PSBOVUxMKSB7Ci0gICAgICAgIGN0eC0+cmVzcG9uc2UgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHMtPmNvbm5lY3Rpb24tPnBvb2wsIDEwMjQpOworICAgICAgICBjdHgtPnJlc3BvbnNlID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjdHgtPnBvb2wsIDEwMjQpOwogICAgICAgICBpZiAoY3R4LT5yZXNwb25zZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBuZ3hfY2xvc2VfY29ubmVjdGlvbihjdHgtPnBlZXIuY29ubmVjdGlvbik7CisgICAgICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGN0eC0+cG9vbCk7CiAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMjgyLDYgKzI5OCw3IEBACiAgICAgfQogCiAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24oY3R4LT5wZWVyLmNvbm5lY3Rpb24pOworICAgIG5neF9kZXN0cm95X3Bvb2woY3R4LT5wb29sKTsKICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKIH0KIApAQCAtMzY5LDYgKzM4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXRoIGh0dHAgc2VydmVyICZWIHNlbnQgaW52YWxpZCByZXNwb25zZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnBlZXIucGVlcnMtPnBlZXJbMF0ubmFtZSk7CiAgICAgICAgICAgICBuZ3hfY2xvc2VfY29ubmVjdGlvbihjdHgtPnBlZXIuY29ubmVjdGlvbik7CisgICAgICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGN0eC0+cG9vbCk7CiAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMzk3LDggKzQxNSwxMCBAQAogICAgIG5neF9pbWFwX2F1dGhfaHR0cF9jdHhfdCAqY3R4KQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgKnA7CisgICAgdGltZV90ICAgICAgICAgICAgICAgdGltZXI7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbGVuLCBzaXplOwogICAgIG5neF9pbnRfdCAgICAgICAgICAgIHJjLCBwb3J0LCBuOworICAgIG5neF9wZWVyc190ICAgICAgICAgKnBlZXJzOwogICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgKnNpbjsKIAogICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLApAQCAtNDUwLDYgKzQ3MCw3IEBACiAgICAgICAgICAgICAgICAgcCA9IG5neF9wY2FsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIHNpemUpOwogICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24oY3R4LT5wZWVyLmNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGN0eC0+cG9vbCk7CiAgICAgICAgICAgICAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQpAQCAtNTMwLDE2ICs1NTEsMjAgQEAKIAogICAgICAgICAgICAgaWYgKGN0eC0+ZXJyLmxlbikgewogICAgICAgICAgICAgICAgIHMtPm91dCA9IGN0eC0+ZXJyOworICAgICAgICAgICAgICAgIHRpbWVyID0gY3R4LT5zbGVlcDsKIAotICAgICAgICAgICAgICAgIGlmIChjdHgtPnNsZWVwID09IDApIHsKKyAgICAgICAgICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGN0eC0+cG9vbCk7CisKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBsb2dpbiBmYWlsZWQiKTsKKworICAgICAgICAgICAgICAgIGlmICh0aW1lciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHMtPnF1aXQgPSAxOwotCiAgICAgICAgICAgICAgICAgICAgIG5neF9pbWFwX3NlbmQocy0+Y29ubmVjdGlvbi0+d3JpdGUpOwotCiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBuZ3hfYWRkX3RpbWVyKHMtPmNvbm5lY3Rpb24tPnJlYWQsIGN0eC0+c2xlZXAgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICBuZ3hfYWRkX3RpbWVyKHMtPmNvbm5lY3Rpb24tPnJlYWQsIHRpbWVyICogMTAwMCk7CiAKICAgICAgICAgICAgICAgICBzLT5jb25uZWN0aW9uLT5yZWFkLT5oYW5kbGVyID0gbmd4X2ltYXBfYXV0aF9zbGVlcF9oYW5kbGVyOwogCkBAIC01NTAsMTggKzU3NSwyMSBAQAogICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHMtPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXRoIGh0dHAgc2VydmVyICVWIGRpZCBub3Qgc2VuZCBzZXJ2ZXIgb3IgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5wZWVyLnBlZXJzLT5wZWVyWzBdLm5hbWUpOworICAgICAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY3R4LT5wb29sKTsKICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGN0eC0+cGVlcnMgPSBuZ3hfcGNhbGxvYyhzLT5jb25uZWN0aW9uLT5wb29sLCBzaXplb2Yobmd4X3BlZXJzX3QpKTsKLSAgICAgICAgICAgIGlmIChjdHgtPnBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBlZXJzID0gbmd4X3BjYWxsb2Mocy0+Y29ubmVjdGlvbi0+cG9vbCwgc2l6ZW9mKG5neF9wZWVyc190KSk7CisgICAgICAgICAgICBpZiAocGVlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY3R4LT5wb29sKTsKICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNpbiA9IG5neF9wY2FsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKICAgICAgICAgICAgIGlmIChzaW4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY3R4LT5wb29sKTsKICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC01NzQsNiArNjAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXRoIGh0dHAgc2VydmVyICVWIHNlbnQgaW52YWxpZCBzZXJ2ZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQ6XCIlVlwiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnBlZXIucGVlcnMtPnBlZXJbMF0ubmFtZSwgJmN0eC0+cG9ydCk7CisgICAgICAgICAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChjdHgtPnBvb2wpOwogICAgICAgICAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTU4NywzOCArNjE2LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aCBodHRwIHNlcnZlciAlViBzZW50IGludmFsaWQgc2VydmVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyZXNzOlwiJVZcIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5wZWVyLnBlZXJzLT5wZWVyWzBdLm5hbWUsICZjdHgtPmFkZHIpOworICAgICAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY3R4LT5wb29sKTsKICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGN0eC0+cGVlcnMtPm51bWJlciA9IDE7CisgICAgICAgICAgICBwZWVycy0+bnVtYmVyID0gMTsKIAotICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5zb2NrYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luOwotICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5zb2NrbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisgICAgICAgICAgICBwZWVycy0+cGVlclswXS5zb2NrYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luOworICAgICAgICAgICAgcGVlcnMtPnBlZXJbMF0uc29ja2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwogCiAgICAgICAgICAgICBsZW4gPSBjdHgtPmFkZHIubGVuICsgMSArIGN0eC0+cG9ydC5sZW47CiAKLSAgICAgICAgICAgIGN0eC0+cGVlcnMtPnBlZXJbMF0ubmFtZS5sZW4gPSBsZW47CisgICAgICAgICAgICBwZWVycy0+cGVlclswXS5uYW1lLmxlbiA9IGxlbjsKIAotICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLSAgICAgICAgICAgIGlmIChjdHgtPnBlZXJzLT5wZWVyWzBdLm5hbWUuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBwZWVycy0+cGVlclswXS5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIGxlbik7CisgICAgICAgICAgICBpZiAocGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGN0eC0+cG9vbCk7CiAgICAgICAgICAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBsZW4gPSBjdHgtPmFkZHIubGVuOwogCi0gICAgICAgICAgICBuZ3hfbWVtY3B5KGN0eC0+cGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhLCBjdHgtPmFkZHIuZGF0YSwgbGVuKTsKKyAgICAgICAgICAgIG5neF9tZW1jcHkocGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhLCBjdHgtPmFkZHIuZGF0YSwgbGVuKTsKIAotICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5uYW1lLmRhdGFbbGVuKytdID0gJzonOworICAgICAgICAgICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhW2xlbisrXSA9ICc6JzsKIAotICAgICAgICAgICAgbmd4X21lbWNweShjdHgtPnBlZXJzLT5wZWVyWzBdLm5hbWUuZGF0YSArIGxlbiwKKyAgICAgICAgICAgIG5neF9tZW1jcHkocGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhICsgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBvcnQuZGF0YSwgY3R4LT5wb3J0Lmxlbik7CiAKLSAgICAgICAgICAgIGN0eC0+cGVlcnMtPnBlZXJbMF0udXJpX3NlcGFyYXRvciA9ICIiOworICAgICAgICAgICAgcGVlcnMtPnBlZXJbMF0udXJpX3NlcGFyYXRvciA9ICIiOwogCi0gICAgICAgICAgICBuZ3hfaW1hcF9wcm94eV9pbml0KHMsIGN0eC0+cGVlcnMpOworICAgICAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChjdHgtPnBvb2wpOworICAgICAgICAgICAgbmd4X2ltYXBfcHJveHlfaW5pdChzLCBwZWVycyk7CiAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNjMzLDYgKzY2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgImF1dGggaHR0cCBzZXJ2ZXIgJVYgc2VudCBpbnZhbGlkIGhlYWRlciBpbiByZXNwb25zZSIsCiAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+cGVlci5wZWVycy0+cGVlclswXS5uYW1lKTsKICAgICAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24oY3R4LT5wZWVyLmNvbm5lY3Rpb24pOworICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGN0eC0+cG9vbCk7CiAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogCiAgICAgICAgIHJldHVybjsKQEAgLTkwNiw2ICs5MzgsNyBAQAogICAgICAgICBjdHggPSBuZ3hfaW1hcF9nZXRfbW9kdWxlX2N0eChzLCBuZ3hfaW1hcF9hdXRoX2h0dHBfbW9kdWxlKTsKIAogICAgICAgICBuZ3hfY2xvc2VfY29ubmVjdGlvbihjdHgtPnBlZXIuY29ubmVjdGlvbik7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY3R4LT5wb29sKTsKICAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CiAgICAgfQogfQpAQCAtOTIwLDcgKzk1Myw3IEBACiAKIAogc3RhdGljIG5neF9idWZfdCAqCi1uZ3hfaW1hcF9hdXRoX2h0dHBfY3JlYXRlX3JlcXVlc3Qobmd4X2ltYXBfc2Vzc2lvbl90ICpzLAorbmd4X2ltYXBfYXV0aF9odHRwX2NyZWF0ZV9yZXF1ZXN0KG5neF9pbWFwX3Nlc3Npb25fdCAqcywgbmd4X3Bvb2xfdCAqcG9vbCwKICAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY29uZl90ICphaGNmKQogewogICAgIHNpemVfdCAgICAgIGxlbjsKQEAgLTkzOCw3ICs5NzEsNyBAQAogICAgICAgICAgICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMQogICAgICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMTsKIAotICAgIGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHMtPmNvbm5lY3Rpb24tPnBvb2wsIGxlbik7CisgICAgYiA9IG5neF9jcmVhdGVfdGVtcF9idWYocG9vbCwgbGVuKTsKICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTk4MSw3ICsxMDE0LDcgQEAKICAgICAvKiBhZGQgIlxyXG4iIGF0IHRoZSBoZWFkZXIgZW5kICovCiAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CiAKLSNpZiAoTkdYX0RFQlVHKQorI2lmIChOR1hfREVCVUdfSU1BUF9QQVNTV0QpCiAgICAgewogICAgIG5neF9zdHJfdCAgbDsKIApkaWZmIC0tZ2l0IGEvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jIGIvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jCmluZGV4IDY0OTdjZWQuLjRmZTEyNDggMTAwNjQ0Ci0tLSBhL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMKQEAgLTEwLDEyICsxMCwxMyBAQAogI2luY2x1ZGUgPG5neF9pbWFwLmg+CiAKIAotc3RhdGljIHZvaWQgbmd4X2ltYXBfaW5pdF9zZXNzaW9uKG5neF9ldmVudF90ICpyZXYpOworc3RhdGljIHZvaWQgbmd4X2ltYXBfaW5pdF9zZXNzaW9uKG5neF9jb25uZWN0aW9uX3QgKmMpOwogc3RhdGljIHZvaWQgbmd4X2ltYXBfaW5pdF9wcm90b2NvbChuZ3hfZXZlbnRfdCAqcmV2KTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2ltYXBfcmVhZF9jb21tYW5kKG5neF9pbWFwX3Nlc3Npb25fdCAqcyk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaW1hcF9sb2dfZXJyb3Iobmd4X2xvZ190ICpsb2csIHVfY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKIAogI2lmIChOR1hfSU1BUF9TU0wpCitzdGF0aWMgdm9pZCBuZ3hfaW1hcF9zc2xfaGFuZHNoYWtlX2hhbmRsZXIobmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiBzdGF0aWMgdm9pZCBuZ3hfaW1hcF9zc2xfY2xvc2VfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpOwogI2VuZGlmCiAKQEAgLTQzLDEzICs0NCwxNSBAQAogdm9pZAogbmd4X2ltYXBfaW5pdF9jb25uZWN0aW9uKG5neF9jb25uZWN0aW9uX3QgKmMpCiB7Ci0gICAgbmd4X2ltYXBfbG9nX2N0eF90ICAgKmxjdHg7CisgICAgbmd4X2ltYXBfbG9nX2N0eF90ICAgICAgICAqbGN0eDsKICNpZiAoTkdYX0lNQVBfU1NMKQotICAgIG5neF9pbWFwX2NvbmZfY3R4X3QgICpjdHg7Ci0gICAgbmd4X2ltYXBfc3NsX2NvbmZfdCAgKnNzbGNmOworICAgIG5neF9pbWFwX2NvbmZfY3R4X3QgICAgICAgKmN0eDsKKyAgICBuZ3hfaW1hcF9zc2xfY29uZl90ICAgICAgICpzc2xjZjsKKyAgICBuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QgICpjc2NmOwogI2VuZGlmCiAKLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0lNQVAsIGMtPmxvZywgMCwgImltYXAgaW5pdCBjb25uZWN0aW9uIik7CisgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGMtPmxvZywgMCwgIioldWkgY2xpZW50ICVWIGNvbm5lY3RlZCB0byAlViIsCisgICAgICAgICAgICAgICAgICBjLT5udW1iZXIsICZjLT5hZGRyX3RleHQsICZjLT5saXN0ZW5pbmctPmFkZHJfdGV4dCk7CiAKICAgICBsY3R4ID0gbmd4X3BhbGxvYyhjLT5wb29sLCBzaXplb2Yobmd4X2ltYXBfbG9nX2N0eF90KSk7CiAgICAgaWYgKGxjdHggPT0gTlVMTCkgewpAQCAtNzMsNjMgKzc2LDU5IEBACiAgICAgc3NsY2YgPSBuZ3hfaW1hcF9nZXRfbW9kdWxlX3Nydl9jb25mKGN0eCwgbmd4X2ltYXBfc3NsX21vZHVsZSk7CiAKICAgICBpZiAoc3NsY2YtPmVuYWJsZSkgewotICAgICAgICBpZiAobmd4X3NzbF9jcmVhdGVfY29ubmVjdGlvbihzc2xjZi0+c3NsX2N0eCwgYywgMCkgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIGlmIChuZ3hfc3NsX2NyZWF0ZV9jb25uZWN0aW9uKCZzc2xjZi0+c3NsLCBjLCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBjLT5yZWN2ID0gbmd4X3NzbF9yZWN2OwotICAgICAgICBjLT5zZW5kID0gbmd4X3NzbF93cml0ZTsKLSAgICAgICAgYy0+c2VuZF9jaGFpbiA9IG5neF9zc2xfc2VuZF9jaGFpbjsKKyAgICAgICAgaWYgKG5neF9zc2xfaGFuZHNoYWtlKGMpID09IE5HWF9BR0FJTikgeworCisgICAgICAgICAgICBjc2NmID0gbmd4X2ltYXBfZ2V0X21vZHVsZV9zcnZfY29uZihjdHgsIG5neF9pbWFwX2NvcmVfbW9kdWxlKTsKKworICAgICAgICAgICAgbmd4X2FkZF90aW1lcihjLT5yZWFkLCBjc2NmLT50aW1lb3V0KTsKKworICAgICAgICAgICAgYy0+c3NsLT5oYW5kbGVyID0gbmd4X2ltYXBfc3NsX2hhbmRzaGFrZV9oYW5kbGVyOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBuZ3hfaW1hcF9zc2xfaGFuZHNoYWtlX2hhbmRsZXIoYyk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICNlbmRpZgogCi0gICAgbmd4X2ltYXBfaW5pdF9zZXNzaW9uKGMtPnJlYWQpOworICAgIG5neF9pbWFwX2luaXRfc2Vzc2lvbihjKTsKIH0KIAogCisjaWYgKE5HWF9JTUFQX1NTTCkKKwogc3RhdGljIHZvaWQKLW5neF9pbWFwX2luaXRfc2Vzc2lvbihuZ3hfZXZlbnRfdCAqcmV2KQorbmd4X2ltYXBfc3NsX2hhbmRzaGFrZV9oYW5kbGVyKG5neF9jb25uZWN0aW9uX3QgKmMpCit7ICAgCisgICAgaWYgKGMtPnNzbC0+aGFuZHNoYWtlZCkgeworICAgICAgICBuZ3hfaW1hcF9pbml0X3Nlc3Npb24oYyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGMpOworICAgIHJldHVybjsKK30KKworI2VuZGlmCisKKworc3RhdGljIHZvaWQKK25neF9pbWFwX2luaXRfc2Vzc2lvbihuZ3hfY29ubmVjdGlvbl90ICpjKQogewotICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CiAgICAgbmd4X2ltYXBfc2Vzc2lvbl90ICAgICAgICAqczsKICAgICBuZ3hfaW1hcF9sb2dfY3R4X3QgICAgICAgICpsY3R4OwogICAgIG5neF9pbWFwX2NvbmZfY3R4X3QgICAgICAgKmN0eDsKICAgICBuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QgICpjc2NmOwotI2lmIChOR1hfSU1BUF9TU0wpCi0gICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgcmM7Ci0jZW5kaWYKIAotICAgIGMgPSByZXYtPmRhdGE7Ci0gICAgY3R4ID0gYy0+Y3R4OwotICAgIGNzY2YgPSBuZ3hfaW1hcF9nZXRfbW9kdWxlX3Nydl9jb25mKGN0eCwgbmd4X2ltYXBfY29yZV9tb2R1bGUpOwotCi0jaWYgKE5HWF9JTUFQX1NTTCkKLQotICAgIGlmIChjLT5zc2wpIHsKLQotICAgICAgICByYyA9IG5neF9zc2xfaGFuZHNoYWtlKGMpOwotCi0gICAgICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7Ci0gICAgICAgICAgICBuZ3hfYWRkX3RpbWVyKHJldiwgY3NjZi0+dGltZW91dCk7Ci0gICAgICAgICAgICBjLT5yZWFkLT5oYW5kbGVyID0gbmd4X2ltYXBfaW5pdF9zZXNzaW9uOwotCi0gICAgICAgICAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KHJldiwgMCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihjKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSNlbmRpZgorICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaW1hcF9pbml0X3Byb3RvY29sOworICAgIGMtPndyaXRlLT5oYW5kbGVyID0gbmd4X2ltYXBfc2VuZDsKIAogICAgIHMgPSBuZ3hfcGNhbGxvYyhjLT5wb29sLCBzaXplb2Yobmd4X2ltYXBfc2Vzc2lvbl90KSk7CiAgICAgaWYgKHMgPT0gTlVMTCkgewpAQCAtMTM3LDYgKzEzNiw5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBjdHggPSBjLT5jdHg7CisgICAgY3NjZiA9IG5neF9pbWFwX2dldF9tb2R1bGVfc3J2X2NvbmYoY3R4LCBuZ3hfaW1hcF9jb3JlX21vZHVsZSk7CisKICAgICBjLT5kYXRhID0gczsKICAgICBzLT5jb25uZWN0aW9uID0gYzsKIApAQCAtMTU2LDEyICsxNTgsOSBAQAogICAgIGxjdHggPSBjLT5sb2ctPmRhdGE7CiAgICAgbGN0eC0+c2Vzc2lvbiA9IHM7CiAKLSAgICBjLT5yZWFkLT5oYW5kbGVyID0gbmd4X2ltYXBfaW5pdF9wcm90b2NvbDsKLSAgICBjLT53cml0ZS0+aGFuZGxlciA9IG5neF9pbWFwX3NlbmQ7CisgICAgbmd4X2FkZF90aW1lcihjLT5yZWFkLCBjc2NmLT50aW1lb3V0KTsKIAotICAgIG5neF9hZGRfdGltZXIocmV2LCBjc2NmLT50aW1lb3V0KTsKLQotICAgIGlmIChuZ3hfaGFuZGxlX3JlYWRfZXZlbnQocmV2LCAwKSA9PSBOR1hfRVJST1IpIHsKKyAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KGMtPnJlYWQsIDApID09IE5HWF9FUlJPUikgewogICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgIH0KIApAQCAtMzc4LDkgKzM3NywxNCBAQAogCiAgICAgICAgICAgICAgICAgbmd4X21lbWNweShzLT5wYXNzd2QuZGF0YSwgYXJnWzFdLmRhdGEsIHMtPnBhc3N3ZC5sZW4pOwogCisjaWYgKE5HWF9ERUJVR19JTUFQX1BBU1NXRCkKICAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0lNQVAsIGMtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1hcCBsb2dpbjpcIiVWXCIgcGFzc3dkOlwiJVZcIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmxvZ2luLCAmcy0+cGFzc3dkKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19JTUFQLCBjLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYXAgbG9naW46XCIlVlwiIiwgJnMtPmxvZ2luKTsKKyNlbmRpZgogCiAgICAgICAgICAgICAgICAgcy0+YXJncy5uZWx0cyA9IDA7CiAgICAgICAgICAgICAgICAgcy0+YnVmZmVyLT5wb3MgPSBzLT5idWZmZXItPnN0YXJ0OwpAQCAtNTg0LDggKzU4OCwxMCBAQAogCiAgICAgICAgICAgICAgICAgICAgIG5neF9tZW1jcHkocy0+cGFzc3dkLmRhdGEsIGFyZ1swXS5kYXRhLCBzLT5wYXNzd2QubGVuKTsKIAorI2lmIChOR1hfREVCVUdfSU1BUF9QQVNTV0QpCiAgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSU1BUCwgYy0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9wMyBwYXNzd2Q6IFwiJVZcIiIsICZzLT5wYXNzd2QpOworI2VuZGlmCiAKICAgICAgICAgICAgICAgICAgICAgcy0+YXJncy5uZWx0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHMtPmJ1ZmZlci0+cG9zID0gcy0+YnVmZmVyLT5zdGFydDsKZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5X21vZHVsZS5jIGIvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHlfbW9kdWxlLmMKaW5kZXggODZhNGZmOC4uYmZiY2MxYyAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHlfbW9kdWxlLmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHlfbW9kdWxlLmMKQEAgLTE1Niw2ICsxNTYsNyBAQAogc3RhdGljIHZvaWQKIG5neF9pbWFwX3Byb3h5X2ltYXBfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KQogeworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgKmFjdGlvbjsKICAgICB1X2NoYXIgICAgICAgICAgICAgICAgICpwOwogICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgIHJjOwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgIGxpbmU7CkBAIC0yOTMsNiArMjk0LDExIEBACiAgICAgICAgIG5neF9hZGRfdGltZXIocy0+Y29ubmVjdGlvbi0+cmVhZCwgcGNmLT50aW1lb3V0KTsKICAgICAgICAgbmd4X2RlbF90aW1lcihjLT5yZWFkKTsKIAorICAgICAgICBhY3Rpb24gPSBjLT5sb2ctPmFjdGlvbjsKKyAgICAgICAgYy0+bG9nLT5hY3Rpb24gPSBOVUxMOworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgYy0+bG9nLCAwLCAiY2xpZW50IGxvZ2dlZCBpbiIpOworICAgICAgICBjLT5sb2ctPmFjdGlvbiA9IGFjdGlvbjsKKwogICAgICAgICBjLT5sb2ctPmFjdGlvbiA9ICJwcm94eWluZyI7CiAgICAgfQogfQpAQCAtMzAxLDYgKzMwNyw3IEBACiBzdGF0aWMgdm9pZAogbmd4X2ltYXBfcHJveHlfcG9wM19oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpCiB7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAqYWN0aW9uOwogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgKnA7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgcmM7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgbGluZTsKQEAgLTQxOCw2ICs0MjUsMTEgQEAKICAgICAgICAgbmd4X2FkZF90aW1lcihzLT5jb25uZWN0aW9uLT5yZWFkLCBwY2YtPnRpbWVvdXQpOwogICAgICAgICBuZ3hfZGVsX3RpbWVyKGMtPnJlYWQpOwogCisgICAgICAgIGFjdGlvbiA9IGMtPmxvZy0+YWN0aW9uOworICAgICAgICBjLT5sb2ctPmFjdGlvbiA9IE5VTEw7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19JTkZPLCBjLT5sb2csIDAsICJjbGllbnQgbG9nZ2VkIGluIik7CisgICAgICAgIGMtPmxvZy0+YWN0aW9uID0gYWN0aW9uOworCiAgICAgICAgIGMtPmxvZy0+YWN0aW9uID0gInByb3h5aW5nIjsKICAgICB9CiB9CkBAIC01MDcsNiArNTE5LDcgQEAKIHN0YXRpYyB2b2lkCiBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyKG5neF9ldmVudF90ICpldikKIHsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICphY3Rpb247CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgc2l6ZTsKICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICBuOwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgKmI7CkBAIC02MDMsNyArNjE2LDE3IEBACiAgICAgICAgIGlmIChzaXplICYmIHNyYy0+cmVhZC0+cmVhZHkpIHsKICAgICAgICAgICAgIG4gPSBzcmMtPnJlY3Yoc3JjLCBiLT5sYXN0LCBzaXplKTsKIAotICAgICAgICAgICAgaWYgKG4gPT0gTkdYX0VSUk9SIHx8IG4gPT0gMCkgeworICAgICAgICAgICAgaWYgKG4gPT0gTkdYX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbmd4X2ltYXBfcHJveHlfY2xvc2Vfc2Vzc2lvbihzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBjLT5sb2ctPmFjdGlvbjsKKyAgICAgICAgICAgICAgICBjLT5sb2ctPmFjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGMtPmxvZywgMCwgInByb3hpZWQgc2Vzc2lvbiBkb25lIik7CisgICAgICAgICAgICAgICAgYy0+bG9nLT5hY3Rpb24gPSBhY3Rpb247CisKICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9wcm94eV9jbG9zZV9zZXNzaW9uKHMpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX3NzbF9tb2R1bGUuYyBiL3NyYy9pbWFwL25neF9pbWFwX3NzbF9tb2R1bGUuYwppbmRleCBiZDQ1NzllLi5iZTZmY2E5IDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9zc2xfbW9kdWxlLmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfc3NsX21vZHVsZS5jCkBAIC0xMSwxMiArMTEsMjEgQEAKIAogI2RlZmluZSBOR1hfREVGTEFVVF9DRVJUSUZJQ0FURSAgICAgICJjZXJ0LnBlbSIKICNkZWZpbmUgTkdYX0RFRkxBVVRfQ0VSVElGSUNBVEVfS0VZICAiY2VydC5wZW0iCisjZGVmaW5lIE5HWF9ERUZMQVVUX0NJUEhFUlMgICJBTEw6IUFESDpSQzQrUlNBOitISUdIOitNRURJVU06K0xPVzorU1NMdjI6K0VYUCIKIAogCiBzdGF0aWMgdm9pZCAqbmd4X2ltYXBfc3NsX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaW1hcF9zc2xfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CiAKIAorc3RhdGljIG5neF9jb25mX2JpdG1hc2tfdCAgbmd4X2ltYXBfc3NsX3Byb3RvY29sc1tdID0geyAKKyAgICB7IG5neF9zdHJpbmcoIlNTTHYyIiksIE5HWF9TU0xfU1NMdjIgfSwKKyAgICB7IG5neF9zdHJpbmcoIlNTTHYzIiksIE5HWF9TU0xfU1NMdjMgfSwKKyAgICB7IG5neF9zdHJpbmcoIlRMU3YxIiksIE5HWF9TU0xfVExTdjEgfSwKKyAgICB7IG5neF9udWxsX3N0cmluZywgMCB9Cit9OworCisKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaW1hcF9zc2xfY29tbWFuZHNbXSA9IHsKIAogICAgIHsgbmd4X3N0cmluZygic3NsIiksCkBAIC00MCw2ICs0OSwxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2ltYXBfc3NsX2NvbmZfdCwgY2VydGlmaWNhdGVfa2V5KSwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygic3NsX3Byb3RvY29scyIpLAorICAgICAgTkdYX0lNQVBfTUFJTl9DT05GfE5HWF9JTUFQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X2JpdG1hc2tfc2xvdCwKKyAgICAgIE5HWF9JTUFQX1NSVl9DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9pbWFwX3NzbF9jb25mX3QsIHByb3RvY29scyksCisgICAgICAmbmd4X2ltYXBfc3NsX3Byb3RvY29scyB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJzc2xfY2lwaGVycyIpLAogICAgICAgTkdYX0lNQVBfTUFJTl9DT05GfE5HWF9JTUFQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UxLAogICAgICAgbmd4X2NvbmZfc2V0X3N0cl9zbG90LApAQCAtNDcsNiArNjMsMTMgQEAKICAgICAgIG9mZnNldG9mKG5neF9pbWFwX3NzbF9jb25mX3QsIGNpcGhlcnMpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJzc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzIiksCisgICAgICBOR1hfSU1BUF9NQUlOX0NPTkZ8TkdYX0lNQVBfU1JWX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaW1hcF9zc2xfY29uZl90LCBwcmVmZXJfc2VydmVyX2NpcGhlcnMpLAorICAgICAgTlVMTCB9LAorCiAgICAgICBuZ3hfbnVsbF9jb21tYW5kCiB9OwogCkBAIC05Miw2ICsxMTUsOCBAQAogICAgIC8qCiAgICAgICogc2V0IGJ5IG5neF9wY2FsbG9jKCk6ICAKICAgICAgKgorICAgICAqICAgICBzY2YtPnByb3RvY29scyA9IDA7CisgICAgICoKICAgICAgKiAgICAgc2NmLT5jZXJ0aWZpY2F0ZS5sZW4gPSAwOwogICAgICAqICAgICBzY2YtPmNlcnRpZmljYXRlLmRhdGEgPSBOVUxMOwogICAgICAqICAgICBzY2YtPmNlcnRpZmljYXRlX2tleS5sZW4gPSAwOwpAQCAtMTAxLDYgKzEyNiw3IEBACiAgICAgICovCiAKICAgICBzY2YtPmVuYWJsZSA9IE5HWF9DT05GX1VOU0VUOworICAgIHNjZi0+cHJlZmVyX3NlcnZlcl9jaXBoZXJzID0gTkdYX0NPTkZfVU5TRVQ7CiAKICAgICByZXR1cm4gc2NmOwogfQpAQCAtMTE4LDM5ICsxNDQsNDEgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogICAgIH0KIAorICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnByZWZlcl9zZXJ2ZXJfY2lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5wcmVmZXJfc2VydmVyX2NpcGhlcnMsIDApOworCisgICAgbmd4X2NvbmZfbWVyZ2VfYml0bWFza192YWx1ZShjb25mLT5wcm90b2NvbHMsIHByZXYtPnByb3RvY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTkdYX0NPTkZfQklUTUFTS19TRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9TU0xfU1NMdjJ8TkdYX1NTTF9TU0x2M3xOR1hfU1NMX1RMU3YxKSk7CisKICAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+Y2VydGlmaWNhdGUsIHByZXYtPmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfREVGTEFVVF9DRVJUSUZJQ0FURSk7CiAKICAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+Y2VydGlmaWNhdGVfa2V5LCBwcmV2LT5jZXJ0aWZpY2F0ZV9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9ERUZMQVVUX0NFUlRJRklDQVRFX0tFWSk7CiAKLSAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+Y2lwaGVycywgcHJldi0+Y2lwaGVycywgIiIpOworICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5jaXBoZXJzLCBwcmV2LT5jaXBoZXJzLCBOR1hfREVGTEFVVF9DSVBIRVJTKTsKIAogCi0gICAgLyogVE9ETzogY29uZmlndXJlIG1ldGhvZHMgKi8KKyAgICBjb25mLT5zc2wubG9nID0gY2YtPmxvZzsKIAotICAgIGNvbmYtPnNzbF9jdHggPSBTU0xfQ1RYX25ldyhTU0x2MjNfc2VydmVyX21ldGhvZCgpKTsKLQotICAgIGlmIChjb25mLT5zc2xfY3R4ID09IE5VTEwpIHsKLSAgICAgICAgbmd4X3NzbF9lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLCAiU1NMX0NUWF9uZXcoKSBmYWlsZWQiKTsKKyAgICBpZiAobmd4X3NzbF9jcmVhdGUoJmNvbmYtPnNzbCwgY29uZi0+cHJvdG9jb2xzKSAhPSBOR1hfT0spIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChuZ3hfcG9vbF9jbGVhbnVwX2FkZChjZi0+cG9vbCwgbmd4X3NzbF9jbGVhbnVwX2N0eCwgY29uZi0+c3NsX2N0eCkKLSAgICAgICAgPT0gTlVMTCkKKyAgICBpZiAobmd4X3Bvb2xfY2xlYW51cF9hZGQoY2YtPnBvb2wsIG5neF9zc2xfY2xlYW51cF9jdHgsICZjb25mLT5zc2wpID09IE5VTEwpCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0KLSNpZiAwCi0gICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb25mLT5zc2xfY3R4LCBTU0xfT1BfQUxMKTsKLSAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbmYtPnNzbF9jdHgsIFNTTF9PUF9OT19TU0x2Myk7Ci0gICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb25mLT5zc2xfY3R4LCBTU0xfT1BfU0lOR0xFX0RIX1VTRSk7Ci0jZW5kaWYKKyAgICBpZiAobmd4X3NzbF9jZXJ0aWZpY2F0ZSgmY29uZi0+c3NsLCBjb25mLT5jZXJ0aWZpY2F0ZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYtPmNlcnRpZmljYXRlX2tleS5kYXRhKSAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQogCiAgICAgaWYgKGNvbmYtPmNpcGhlcnMubGVuKSB7Ci0gICAgICAgIGlmIChTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjb25mLT5zc2xfY3R4LAorICAgICAgICBpZiAoU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY29uZi0+c3NsLmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgY29uZi0+Y2lwaGVycy5kYXRhKSA9PSAwKQogICAgICAgICB7CiAgICAgICAgICAgICBuZ3hfc3NsX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCkBAIC0xNTksMzUgKzE4NywxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoY29uZi0+c3NsX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgY29uZi0+Y2VydGlmaWNhdGUuZGF0YSkgPT0gMCkKLSAgICB7Ci0gICAgICAgIG5neF9zc2xfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAiU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShcIiVzXCIpIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uZi0+Y2VydGlmaWNhdGUuZGF0YSk7CisgICAgaWYgKG5neF9zc2xfZ2VuZXJhdGVfcnNhNTEyX2tleSgmY29uZi0+c3NsKSAhPSBOR1hfT0spIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAorICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjb25mLT5zc2wuY3R4LCBTU0xfU0VTU19DQUNIRV9TRVJWRVIpOwogCi0gICAgaWYgKFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjb25mLT5zc2xfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgY29uZi0+Y2VydGlmaWNhdGVfa2V5LmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfRklMRVRZUEVfUEVNKSA9PSAwKQotICAgIHsKLSAgICAgICAgbmd4X3NzbF9lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICJTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoXCIlc1wiKSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgIGNvbmYtPmNlcnRpZmljYXRlX2tleS5kYXRhKTsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29uZi0+c3NsX2N0eCwgU1NMX09QX0FMTCk7Ci0KLSAgICBTU0xfQ1RYX3NldF9tb2RlKGNvbmYtPnNzbF9jdHgsIFNTTF9NT0RFX0FDQ0VQVF9NT1ZJTkdfV1JJVEVfQlVGRkVSKTsKLQotICAgIFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQoY29uZi0+c3NsX2N0eCwgMSk7Ci0KLSAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUoY29uZi0+c3NsX2N0eCwgU1NMX1NFU1NfQ0FDSEVfU0VSVkVSKTsKLQotICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChjb25mLT5zc2xfY3R4LCBuZ3hfaW1hcF9zZXNzaW9uX2lkX2N0eCwKKyAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoY29uZi0+c3NsLmN0eCwgbmd4X2ltYXBfc2Vzc2lvbl9pZF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaW1hcF9zZXNzaW9uX2lkX2N0eCkgLSAxKTsKIAogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX3NzbF9tb2R1bGUuaCBiL3NyYy9pbWFwL25neF9pbWFwX3NzbF9tb2R1bGUuaAppbmRleCAxNTBhNjE3Li5mZDBjY2FkIDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9zc2xfbW9kdWxlLmgKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfc3NsX21vZHVsZS5oCkBAIC0xNSwxMiArMTUsMTggQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIG5neF9mbGFnX3QgICAgICBlbmFibGU7CisKKyAgICBuZ3hfc3NsX3QgICAgICAgc3NsOworCisgICAgbmd4X2ZsYWdfdCAgICAgIHByZWZlcl9zZXJ2ZXJfY2lwaGVyczsKKworICAgIG5neF91aW50X3QgICAgICBwcm90b2NvbHM7CisKICAgICBuZ3hfc3RyX3QgICAgICAgY2VydGlmaWNhdGU7CiAgICAgbmd4X3N0cl90ICAgICAgIGNlcnRpZmljYXRlX2tleTsKIAogICAgIG5neF9zdHJfdCAgICAgICBjaXBoZXJzOwogCi0gICAgbmd4X3NzbF9jdHhfdCAgKnNzbF9jdHg7CiB9IG5neF9pbWFwX3NzbF9jb25mX3Q7CiAKIApkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2F0b21pYy5oIGIvc3JjL29zL3VuaXgvbmd4X2F0b21pYy5oCmluZGV4IDc0NmE3MTUuLjk3MTA4NTUgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9hdG9taWMuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfYXRvbWljLmgKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxuZ3hfY29yZS5oPgogCiAKLSNpZiAoIF9faTM4Nl9fICkKKyNpZiAoIF9faTM4Nl9fIHx8IF9faTM4NiApCiAKICNkZWZpbmUgTkdYX0hBVkVfQVRPTUlDX09QUyAgMQogCkBAIC0xMDksNyArMTA5LDcgQEAKIH0KIAogCi0jZWxpZiAoIF9fYW1kNjRfXyApCisjZWxpZiAoIF9fYW1kNjRfXyB8fCBfX2FtZDY0ICkKIAogI2RlZmluZSBOR1hfSEFWRV9BVE9NSUNfT1BTICAxCiAKQEAgLTE4Myw3ICsxODMsNyBAQAogfQogCiAKLSNlbGlmICggX19zcGFyY19fICkKKyNlbGlmICggX19zcGFyY19fIHx8IF9fc3BhcmN2OSApCiAKICNkZWZpbmUgTkdYX0hBVkVfQVRPTUlDX09QUyAgMQogCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9pbml0LmMgYi9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9pbml0LmMKaW5kZXggODYxMGE1Ni4uZjgyYTZhYyAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfaW5pdC5jCisrKyBiL3NyYy9vcy91bml4L25neF9mcmVlYnNkX2luaXQuYwpAQCAtNzcsNyArNzcsNyBAQAogdm9pZAogbmd4X2RlYnVnX2luaXQoKQogewotI2lmIChOR1hfREVCVUcgJiYgIU5HWF9OT19ERUJVR19NQUxMT0MpCisjaWYgKE5HWF9ERUJVR19NQUxMT0MpCiAKICNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKICAgICBfbWFsbG9jX29wdGlvbnMgPSAiSiI7Cg==