LyogJElkOiBoZmNfcGNpLmMsdiAxLjQ4LjIuNCAyMDA0LzAyLzExIDEzOjIxOjMzIGtlaWwgRXhwICQKICoKICogbG93IGxldmVsIGRyaXZlciBmb3IgQ0NEtHMgaGZjLXBjaSBiYXNlZCBjYXJkcwogKgogKiBBdXRob3IgICAgICAgV2VybmVyIENvcm5lbGl1cwogKiAgICAgICAgICAgICAgYmFzZWQgb24gZXhpc3RpbmcgZHJpdmVyIGZvciBDQ0QgaGZjIElTQSBjYXJkcwogKiBDb3B5cmlnaHQgICAgYnkgV2VybmVyIENvcm5lbGl1cyAgPHdlcm5lckBpc2RuNGxpbnV4LmRlPgogKiAgICAgICAgICAgICAgYnkgS2Fyc3RlbiBLZWlsICAgICAgPGtlaWxAaXNkbjRsaW51eC5kZT4KICogCiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KICoKICogRm9yIGNoYW5nZXMgYW5kIG1vZGlmaWNhdGlvbnMgcGxlYXNlIHJlYWQKICogRG9jdW1lbnRhdGlvbi9pc2RuL0hpU2F4LmNlcnQKICoKICovCgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlICJoaXNheC5oIgojaW5jbHVkZSAiaGZjX3BjaS5oIgojaW5jbHVkZSAiaXNkbmwxLmgiCiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgoKZXh0ZXJuIGNvbnN0IGNoYXIgKkNhcmRUeXBlW107CgpzdGF0aWMgY29uc3QgY2hhciAqaGZjcGNpX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS40OC4yLjQgJCI7CgovKiB0YWJsZSBlbnRyeSBpbiB0aGUgUENJIGRldmljZXMgbGlzdCAqLwp0eXBlZGVmIHN0cnVjdCB7CglpbnQgdmVuZG9yX2lkOwoJaW50IGRldmljZV9pZDsKCWNoYXIgKnZlbmRvcl9uYW1lOwoJY2hhciAqY2FyZF9uYW1lOwp9IFBDSV9FTlRSWTsKCiNkZWZpbmUgTlRfVDFfQ09VTlQJMjAJLyogbnVtYmVyIG9mIDMuMTI1bXMgaW50ZXJydXB0cyBmb3IgRzIgdGltZW91dCAqLwojZGVmaW5lIENMS0RFTF9URQkweDBlCS8qIENMS0RFTCBpbiBURSBtb2RlICovCiNkZWZpbmUgQ0xLREVMX05UCTB4NmMJLyogQ0xLREVMIGluIE5UIG1vZGUgKi8KCnN0YXRpYyBjb25zdCBQQ0lfRU5UUlkgaWRfbGlzdFtdID0KewoJe1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF8yQkQwLCAiQ0NEL0JpbGxpb24vQXN1c2NvbSIsICIyQkQwIn0sCgl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDAsICJCaWxsaW9uIiwgIkIwMDAifSwKCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwNiwgIkJpbGxpb24iLCAiQjAwNiJ9LAoJe1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDA3LCAiQmlsbGlvbiIsICJCMDA3In0sCgl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDgsICJCaWxsaW9uIiwgIkIwMDgifSwKCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwOSwgIkJpbGxpb24iLCAiQjAwOSJ9LAoJe1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDBBLCAiQmlsbGlvbiIsICJCMDBBIn0sCgl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEIsICJCaWxsaW9uIiwgIkIwMEIifSwKCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwQywgIkJpbGxpb24iLCAiQjAwQyJ9LAoJe1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMTAwLCAiU2V5ZW9uIiwgIkIxMDAifSwKCXtQQ0lfVkVORE9SX0lEX0FCT0NPTSwgUENJX0RFVklDRV9JRF9BQk9DT01fMkJEMSwgIkFib2NvbS9NYWdpdGVrIiwgIjJCRDEifSwKCXtQQ0lfVkVORE9SX0lEX0FTVVNURUssIFBDSV9ERVZJQ0VfSURfQVNVU1RFS18wNjc1LCAiQXN1c2NvbS9Bc2tleSIsICI2NzUifSwKCXtQQ0lfVkVORE9SX0lEX0JFUktPTSwgUENJX0RFVklDRV9JRF9CRVJLT01fVF9DT05DRVBULCAiR2VybWFuIHRlbGVrb20iLCAiVC1Db25jZXB0In0sCgl7UENJX1ZFTkRPUl9JRF9CRVJLT00sIFBDSV9ERVZJQ0VfSURfQkVSS09NX0ExVCwgIkdlcm1hbiB0ZWxla29tIiwgIkExVCJ9LAoJe1BDSV9WRU5ET1JfSURfQU5JR01BLCBQQ0lfREVWSUNFX0lEX0FOSUdNQV9NQzE0NTU3NSwgIk1vdG9yb2xhIE1DMTQ1NTc1IiwgIk1DMTQ1NTc1In0sCgl7UENJX1ZFTkRPUl9JRF9aT0xUUklYLCBQQ0lfREVWSUNFX0lEX1pPTFRSSVhfMkJEMCwgIlpvbHRyaXgiLCAiMkJEMCJ9LAoJe1BDSV9WRU5ET1JfSURfRElHSSwgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fSU9NMl9FLCJEaWdpIEludGVybmF0aW9uYWwiLCAiRGlnaSBEYXRhRmlyZSBNaWNybyBWIElPTTIgKEV1cm9wZSkifSwKCXtQQ0lfVkVORE9SX0lEX0RJR0ksIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0UsIkRpZ2kgSW50ZXJuYXRpb25hbCIsICJEaWdpIERhdGFGaXJlIE1pY3JvIFYgKEV1cm9wZSkifSwKCXtQQ0lfVkVORE9SX0lEX0RJR0ksIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0lPTTJfQSwiRGlnaSBJbnRlcm5hdGlvbmFsIiwgIkRpZ2kgRGF0YUZpcmUgTWljcm8gViBJT00yIChOb3J0aCBBbWVyaWNhKSJ9LAoJe1BDSV9WRU5ET1JfSURfRElHSSwgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fQSwiRGlnaSBJbnRlcm5hdGlvbmFsIiwgIkRpZ2kgRGF0YUZpcmUgTWljcm8gViAoTm9ydGggQW1lcmljYSkifSwKCXswLCAwLCBOVUxMLCBOVUxMfSwKfTsKCgojaWZkZWYgQ09ORklHX1BDSQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgdXNlZCBieSBkcml2ZXIgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApyZWxlYXNlX2lvX2hmY3BjaShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCnsKCXByaW50ayhLRVJOX0lORk8gIkhpU2F4OiByZWxlYXNlIGhmY3BjaSBhdCAlcFxuIiwKCQljcy0+aHcuaGZjcGNpLnBjaV9pbyk7Cgljcy0+aHcuaGZjcGNpLmludF9tMiA9IDA7CQkJCQkvKiBpbnRlcnJ1cHQgb3V0cHV0IG9mZiAhICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTIsIGNzLT5ody5oZmNwY2kuaW50X20yKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0NJUk0sIEhGQ1BDSV9SRVNFVCk7CQkJLyogUmVzZXQgT24gKi8KCW1kZWxheSgxMCk7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DSVJNLCAwKTsJCQkJCS8qIFJlc2V0IE9mZiAqLwoJbWRlbGF5KDEwKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0lOVF9NMiwgY3MtPmh3LmhmY3BjaS5pbnRfbTIpOwoJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNzLT5ody5oZmNwY2kuZGV2LCBQQ0lfQ09NTUFORCwgMCk7CS8qIGRpc2FibGUgbWVtb3J5IG1hcHBlZCBwb3J0cyArIGJ1c21hc3RlciAqLwoJZGVsX3RpbWVyKCZjcy0+aHcuaGZjcGNpLnRpbWVyKTsKCWtmcmVlKGNzLT5ody5oZmNwY2kuc2hhcmVfc3RhcnQpOwoJY3MtPmh3LmhmY3BjaS5zaGFyZV9zdGFydCA9IE5VTEw7Cglpb3VubWFwKCh2b2lkICopY3MtPmh3LmhmY3BjaS5wY2lfaW8pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGZ1bmN0aW9uIGNhbGxlZCB0byByZXNldCB0aGUgSEZDIFBDSSBjaGlwLiBBIGNvbXBsZXRlIHNvZnR3YXJlIHJlc2V0IG9mIGNoaXAgKi8KLyogYW5kIGZpZm9zIGlzIGRvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCnJlc2V0X2hmY3BjaShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCnsKCXBjaV93cml0ZV9jb25maWdfd29yZChjcy0+aHcuaGZjcGNpLmRldiwgUENJX0NPTU1BTkQsIFBDSV9FTkFfTUVNSU8pOwkvKiBlbmFibGUgbWVtb3J5IG1hcHBlZCBwb3J0cywgZGlzYWJsZSBidXNtYXN0ZXIgKi8KCWNzLT5ody5oZmNwY2kuaW50X20yID0gMDsJLyogaW50ZXJydXB0IG91dHB1dCBvZmYgISAqLwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00yLCBjcy0+aHcuaGZjcGNpLmludF9tMik7CgoJcHJpbnRrKEtFUk5fSU5GTyAiSEZDX1BDSTogcmVzZXR0aW5nIGNhcmRcbiIpOwoJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNzLT5ody5oZmNwY2kuZGV2LCBQQ0lfQ09NTUFORCwgUENJX0VOQV9NRU1JTyArIFBDSV9FTkFfTUFTVEVSKTsJLyogZW5hYmxlIG1lbW9yeSBwb3J0cyArIGJ1c21hc3RlciAqLwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ0lSTSwgSEZDUENJX1JFU0VUKTsJLyogUmVzZXQgT24gKi8KCW1kZWxheSgxMCk7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DSVJNLCAwKTsJLyogUmVzZXQgT2ZmICovCgltZGVsYXkoMTApOwoJaWYgKFJlYWRfaGZjKGNzLCBIRkNQQ0lfU1RBVFVTKSAmIDIpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiSEZDLVBDSSBpbml0IGJpdCBidXN5XG4iKTsKCgljcy0+aHcuaGZjcGNpLmZpZm9fZW4gPSAweDMwOwkvKiBvbmx5IEQgZmlmb3MgZW5hYmxlZCAqLwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfRklGT19FTiwgY3MtPmh3LmhmY3BjaS5maWZvX2VuKTsKCgljcy0+aHcuaGZjcGNpLnRybSA9IDAgKyBIRkNQQ0lfQlRSQU5TX1RIUkVTTUFTSzsJLyogbm8gZWNobyBjb25uZWN0ICwgdGhyZXNob2xkICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9UUk0sIGNzLT5ody5oZmNwY2kudHJtKTsKCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DTEtERUwsIENMS0RFTF9URSk7IC8qIFNULUJpdCBkZWxheSBmb3IgVEUtTW9kZSAqLwoJY3MtPmh3LmhmY3BjaS5zY3RybF9lID0gSEZDUENJX0FVVE9fQVdBS0U7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TQ1RSTF9FLCBjcy0+aHcuaGZjcGNpLnNjdHJsX2UpOwkvKiBTL1QgQXV0byBhd2FrZSAqLwoJY3MtPmh3LmhmY3BjaS5ic3dhcHBlZCA9IDA7CS8qIG5vIGV4Y2hhbmdlICovCgljcy0+aHcuaGZjcGNpLm50X21vZGUgPSAwOwkvKiB3ZSBhcmUgaW4gVEUgbW9kZSAqLwoJY3MtPmh3LmhmY3BjaS5jdG10ID0gSEZDUENJX1RJTTNfMTI1IHwgSEZDUENJX0FVVE9fVElNRVI7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DVE1ULCBjcy0+aHcuaGZjcGNpLmN0bXQpOwoKCWNzLT5ody5oZmNwY2kuaW50X20xID0gSEZDUENJX0lOVFNfRFRSQU5TIHwgSEZDUENJX0lOVFNfRFJFQyB8CgkgICAgSEZDUENJX0lOVFNfTDFTVEFURSB8IEhGQ1BDSV9JTlRTX1RJTUVSOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00xLCBjcy0+aHcuaGZjcGNpLmludF9tMSk7CgoJLyogQ2xlYXIgYWxyZWFkeSBwZW5kaW5nIGludHMgKi8KCWlmIChSZWFkX2hmYyhjcywgSEZDUENJX0lOVF9TMSkpOwoKCVdyaXRlX2hmYyhjcywgSEZDUENJX1NUQVRFUywgSEZDUENJX0xPQURfU1RBVEUgfCAyKTsJLyogSEZDIFNUIDIgKi8KCXVkZWxheSgxMCk7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TVEFURVMsIDIpOwkvKiBIRkMgU1QgMiAqLwoJY3MtPmh3LmhmY3BjaS5tc3RfbSA9IEhGQ1BDSV9NQVNURVI7CS8qIEhGQyBNYXN0ZXIgTW9kZSAqLwoKCVdyaXRlX2hmYyhjcywgSEZDUENJX01TVF9NT0RFLCBjcy0+aHcuaGZjcGNpLm1zdF9tKTsKCWNzLT5ody5oZmNwY2kuc2N0cmwgPSAweDQwOwkvKiBzZXQgdHhfbG8gbW9kZSwgZXJyb3IgaW4gZGF0YXNoZWV0ICEgKi8KCVdyaXRlX2hmYyhjcywgSEZDUENJX1NDVFJMLCBjcy0+aHcuaGZjcGNpLnNjdHJsKTsKCWNzLT5ody5oZmNwY2kuc2N0cmxfciA9IDA7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TQ1RSTF9SLCBjcy0+aHcuaGZjcGNpLnNjdHJsX3IpOwoKCS8qIEluaXQgR0NJL0lPTTIgaW4gbWFzdGVyIG1vZGUgKi8KCS8qIFNsb3RzIDAgYW5kIDEgYXJlIHNldCBmb3IgQi1jaGFuIDEgYW5kIDIgKi8KCS8qIEQtIGFuZCBtb25pdG9yL0NJIGNoYW5uZWwgYXJlIG5vdCBlbmFibGVkICovCgkvKiBTVElPMSBpcyB1c2VkIGFzIG91dHB1dCBmb3IgZGF0YSwgQjErQjIgZnJvbSBTVC0+SU9NK0hGQyAqLwoJLyogU1RJTzIgaXMgdXNlZCBhcyBkYXRhIGlucHV0LCBCMStCMiBmcm9tIElPTS0+U1QgKi8KCS8qIFNUIEItY2hhbm5lbCBzZW5kIGRpc2FibGVkIC0+IGNvbnRpbm91cyAxcyAqLwoJLyogVGhlIElPTSBzbG90cyBhcmUgYWx3YXlzIGVuYWJsZWQgKi8KCWNzLT5ody5oZmNwY2kuY29ubiA9IDB4MzY7CS8qIHNldCBkYXRhIGZsb3cgZGlyZWN0aW9ucyAqLwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ09OTkVDVCwgY3MtPmh3LmhmY3BjaS5jb25uKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0IxX1NTTCwgMHg4MCk7CS8qIEIxLVNsb3QgMCBTVElPMSBvdXQgZW5hYmxlZCAqLwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQjJfU1NMLCAweDgxKTsJLyogQjItU2xvdCAxIFNUSU8xIG91dCBlbmFibGVkICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9CMV9SU0wsIDB4ODApOwkvKiBCMS1TbG90IDAgU1RJTzIgaW4gZW5hYmxlZCAqLwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQjJfUlNMLCAweDgxKTsJLyogQjItU2xvdCAxIFNUSU8yIGluIGVuYWJsZWQgKi8KCgkvKiBGaW5hbGx5IGVuYWJsZSBJUlEgb3V0cHV0ICovCgljcy0+aHcuaGZjcGNpLmludF9tMiA9IEhGQ1BDSV9JUlFfRU5BQkxFOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00yLCBjcy0+aHcuaGZjcGNpLmludF9tMik7CglpZiAoUmVhZF9oZmMoY3MsIEhGQ1BDSV9JTlRfUzEpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogVGltZXIgZnVuY3Rpb24gY2FsbGVkIHdoZW4ga2VybmVsIHRpbWVyIGV4cGlyZXMgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKaGZjcGNpX1RpbWVyKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKewoJY3MtPmh3LmhmY3BjaS50aW1lci5leHBpcmVzID0gamlmZmllcyArIDc1OwoJLyogV0QgUkVTRVQgKi8KLyogICAgICBXcml0ZVJlZyhjcywgSEZDRF9EQVRBLCBIRkNEX0NUTVQsIGNzLT5ody5oZmNwY2kuY3RtdCB8IDB4ODApOwogICBhZGRfdGltZXIoJmNzLT5ody5oZmNwY2kudGltZXIpOwogKi8KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHNjaGVkdWxlIGEgbmV3IEQtY2hhbm5lbCB0YXNrICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCnNjaGVkX2V2ZW50X0RfcGNpKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgaW50IGV2ZW50KQp7Cgl0ZXN0X2FuZF9zZXRfYml0KGV2ZW50LCAmY3MtPmV2ZW50KTsKCXNjaGVkdWxlX3dvcmsoJmNzLT50cXVldWUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBzY2hlZHVsZSBhIG5ldyBiX2NoYW5uZWwgdGFzayAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApoZmNwY2lfc2NoZWRfZXZlbnQoc3RydWN0IEJDU3RhdGUgKmJjcywgaW50IGV2ZW50KQp7Cgl0ZXN0X2FuZF9zZXRfYml0KGV2ZW50LCAmYmNzLT5ldmVudCk7CglzY2hlZHVsZV93b3JrKCZiY3MtPnRxdWV1ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHNlbGVjdCBhIGItY2hhbm5lbCBlbnRyeSBtYXRjaGluZyBhbmQgYWN0aXZlICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYwpzdHJ1Y3QgQkNTdGF0ZSAqClNlbF9CQ1Moc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgY2hhbm5lbCkKewoJaWYgKGNzLT5iY3NbMF0ubW9kZSAmJiAoY3MtPmJjc1swXS5jaGFubmVsID09IGNoYW5uZWwpKQoJCXJldHVybiAoJmNzLT5iY3NbMF0pOwoJZWxzZSBpZiAoY3MtPmJjc1sxXS5tb2RlICYmIChjcy0+YmNzWzFdLmNoYW5uZWwgPT0gY2hhbm5lbCkpCgkJcmV0dXJuICgmY3MtPmJjc1sxXSk7CgllbHNlCgkJcmV0dXJuIChOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogY2xlYXIgdGhlIGRlc2lyZWQgQi1jaGFubmVsIHJ4IGZpZm8gKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgaGZjcGNpX2NsZWFyX2ZpZm9fcngoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgZmlmbykKeyAgICAgICB1X2NoYXIgZmlmb19zdGF0ZTsKICAgICAgICBiemZpZm9fdHlwZSAqYnpyOwoKCWlmIChmaWZvKSB7CgkgICAgICAgIGJ6ciA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnJ4YnpfYjI7CgkJZmlmb19zdGF0ZSA9IGNzLT5ody5oZmNwY2kuZmlmb19lbiAmIEhGQ1BDSV9GSUZPRU5fQjJSWDsKCX0gZWxzZSB7CgkgICAgICAgIGJ6ciA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnJ4YnpfYjE7CgkJZmlmb19zdGF0ZSA9IGNzLT5ody5oZmNwY2kuZmlmb19lbiAmIEhGQ1BDSV9GSUZPRU5fQjFSWDsKCX0KCWlmIChmaWZvX3N0YXRlKQoJICAgICAgICBjcy0+aHcuaGZjcGNpLmZpZm9fZW4gXj0gZmlmb19zdGF0ZTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0ZJRk9fRU4sIGNzLT5ody5oZmNwY2kuZmlmb19lbik7Cgljcy0+aHcuaGZjcGNpLmxhc3RfYmZpZm9fY250W2ZpZm9dID0gMDsKCWJ6ci0+emFbTUFYX0JfRlJBTUVTXS56MSA9IEJfRklGT19TSVpFICsgQl9TVUJfVkFMIC0gMTsKCWJ6ci0+emFbTUFYX0JfRlJBTUVTXS56MiA9IGJ6ci0+emFbTUFYX0JfRlJBTUVTXS56MTsKCWJ6ci0+ZjEgPSBNQVhfQl9GUkFNRVM7CglienItPmYyID0gYnpyLT5mMTsJLyogaW5pdCBGIHBvaW50ZXJzIHRvIHJlbWFpbiBjb25zdGFudCAqLwoJaWYgKGZpZm9fc3RhdGUpCgkgICAgICAgIGNzLT5ody5oZmNwY2kuZmlmb19lbiB8PSBmaWZvX3N0YXRlOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfRklGT19FTiwgY3MtPmh3LmhmY3BjaS5maWZvX2VuKTsKfSAgIAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogY2xlYXIgdGhlIGRlc2lyZWQgQi1jaGFubmVsIHR4IGZpZm8gKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgaGZjcGNpX2NsZWFyX2ZpZm9fdHgoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgZmlmbykKeyAgICAgICB1X2NoYXIgZmlmb19zdGF0ZTsKICAgICAgICBiemZpZm9fdHlwZSAqYnp0OwoKCWlmIChmaWZvKSB7CgkgICAgICAgIGJ6dCA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnR4YnpfYjI7CgkJZmlmb19zdGF0ZSA9IGNzLT5ody5oZmNwY2kuZmlmb19lbiAmIEhGQ1BDSV9GSUZPRU5fQjJUWDsKCX0gZWxzZSB7CgkgICAgICAgIGJ6dCA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnR4YnpfYjE7CgkJZmlmb19zdGF0ZSA9IGNzLT5ody5oZmNwY2kuZmlmb19lbiAmIEhGQ1BDSV9GSUZPRU5fQjFUWDsKCX0KCWlmIChmaWZvX3N0YXRlKQoJICAgICAgICBjcy0+aHcuaGZjcGNpLmZpZm9fZW4gXj0gZmlmb19zdGF0ZTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0ZJRk9fRU4sIGNzLT5ody5oZmNwY2kuZmlmb19lbik7CglienQtPnphW01BWF9CX0ZSQU1FU10uejEgPSBCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCAtIDE7CglienQtPnphW01BWF9CX0ZSQU1FU10uejIgPSBienQtPnphW01BWF9CX0ZSQU1FU10uejE7CglienQtPmYxID0gTUFYX0JfRlJBTUVTOwoJYnp0LT5mMiA9IGJ6dC0+ZjE7CS8qIGluaXQgRiBwb2ludGVycyB0byByZW1haW4gY29uc3RhbnQgKi8KCWlmIChmaWZvX3N0YXRlKQoJICAgICAgICBjcy0+aHcuaGZjcGNpLmZpZm9fZW4gfD0gZmlmb19zdGF0ZTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0ZJRk9fRU4sIGNzLT5ody5oZmNwY2kuZmlmb19lbik7Cn0gICAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHJlYWQgYSBjb21wbGV0ZSBCLWZyYW1lIG91dCBvZiB0aGUgYnVmZmVyICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZgoqCmhmY3BjaV9lbXB0eV9maWZvKHN0cnVjdCBCQ1N0YXRlICpiY3MsIGJ6Zmlmb190eXBlICogYnosIHVfY2hhciAqIGJkYXRhLCBpbnQgY291bnQpCnsKCXVfY2hhciAqcHRyLCAqcHRyMSwgbmV3X2YyOwoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CglpbnQgdG90YWwsIG1heGxlbiwgbmV3X3oyOwoJel90eXBlICp6cDsKCglpZiAoKGNzLT5kZWJ1ZyAmIEwxX0RFQl9IU0NYKSAmJiAhKGNzLT5kZWJ1ZyAmIEwxX0RFQl9IU0NYX0ZJRk8pKQoJCWRlYnVnbDEoY3MsICJoZmNwY2lfZW1wdHlfZmlmbyIpOwoJenAgPSAmYnotPnphW2J6LT5mMl07CS8qIHBvaW50IHRvIFotUmVncyAqLwoJbmV3X3oyID0genAtPnoyICsgY291bnQ7CS8qIG5ldyBwb3NpdGlvbiBpbiBmaWZvICovCglpZiAobmV3X3oyID49IChCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCkpCgkJbmV3X3oyIC09IEJfRklGT19TSVpFOwkvKiBidWZmZXIgd3JhcCAqLwoJbmV3X2YyID0gKGJ6LT5mMiArIDEpICYgTUFYX0JfRlJBTUVTOwoJaWYgKChjb3VudCA+IEhTQ1hfQlVGTUFYICsgMykgfHwgKGNvdW50IDwgNCkgfHwKCSAgICAoKihiZGF0YSArICh6cC0+ejEgLSBCX1NVQl9WQUwpKSkpIHsKCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX1dBUk4pCgkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZW1wdHlfZmlmbzogaW5jb21pbmcgcGFja2V0IGludmFsaWQgbGVuZ3RoICVkIG9yIGNyYyIsIGNvdW50KTsKI2lmZGVmIEVSUk9SX1NUQVRJU1RJQwoJCWJjcy0+ZXJyX2ludisrOwojZW5kaWYKCQliei0+emFbbmV3X2YyXS56MiA9IG5ld196MjsKCQliei0+ZjIgPSBuZXdfZjI7CS8qIG5leHQgYnVmZmVyICovCgkJc2tiID0gTlVMTDsKCX0gZWxzZSBpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKGNvdW50IC0gMykpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhGQ1BDSTogcmVjZWl2ZSBvdXQgb2YgbWVtb3J5XG4iKTsKCWVsc2UgewoJCXRvdGFsID0gY291bnQ7CgkJY291bnQgLT0gMzsKCQlwdHIgPSBza2JfcHV0KHNrYiwgY291bnQpOwoKCQlpZiAoenAtPnoyICsgY291bnQgPD0gQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwpCgkJCW1heGxlbiA9IGNvdW50OwkJLyogY29tcGxldGUgdHJhbnNmZXIgKi8KCQllbHNlCgkJCW1heGxlbiA9IEJfRklGT19TSVpFICsgQl9TVUJfVkFMIC0genAtPnoyOwkvKiBtYXhpbXVtICovCgoJCXB0cjEgPSBiZGF0YSArICh6cC0+ejIgLSBCX1NVQl9WQUwpOwkvKiBzdGFydCBvZiBkYXRhICovCgkJbWVtY3B5KHB0ciwgcHRyMSwgbWF4bGVuKTsJLyogY29weSBkYXRhICovCgkJY291bnQgLT0gbWF4bGVuOwoKCQlpZiAoY291bnQpIHsJLyogcmVzdCByZW1haW5pbmcgKi8KCQkJcHRyICs9IG1heGxlbjsKCQkJcHRyMSA9IGJkYXRhOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KCQkJbWVtY3B5KHB0ciwgcHRyMSwgY291bnQpOwkvKiByZXN0ICovCgkJfQoJCWJ6LT56YVtuZXdfZjJdLnoyID0gbmV3X3oyOwoJCWJ6LT5mMiA9IG5ld19mMjsJLyogbmV4dCBidWZmZXIgKi8KCgl9CglyZXR1cm4gKHNrYik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBELWNoYW5uZWwgcmVjZWl2ZSBwcm9jZWR1cmUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYwppbnQKcmVjZWl2ZV9kbXNnKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCWludCBtYXhsZW47CglpbnQgcmNudCwgdG90YWw7CglpbnQgY291bnQgPSA1OwoJdV9jaGFyICpwdHIsICpwdHIxOwoJZGZpZm9fdHlwZSAqZGY7Cgl6X3R5cGUgKnpwOwoKCWRmID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmRfY2hhbi5kX3J4OwoJaWYgKHRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCWRlYnVnbDEoY3MsICJyZWNfZG1zZyBibG9ja2VkIik7CgkJcmV0dXJuICgxKTsKCX0KCXdoaWxlICgoKGRmLT5mMSAmIERfRlJFR19NQVNLKSAhPSAoZGYtPmYyICYgRF9GUkVHX01BU0spKSAmJiBjb3VudC0tKSB7CgkJenAgPSAmZGYtPnphW2RmLT5mMiAmIERfRlJFR19NQVNLXTsKCQlyY250ID0genAtPnoxIC0genAtPnoyOwoJCWlmIChyY250IDwgMCkKCQkJcmNudCArPSBEX0ZJRk9fU0laRTsKCQlyY250Kys7CgkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQoJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpIHJlY2QgZjEoJWQpIGYyKCVkKSB6MSgleCkgejIoJXgpIGNudCglZCkiLAoJCQkJZGYtPmYxLCBkZi0+ZjIsIHpwLT56MSwgenAtPnoyLCByY250KTsKCgkJaWYgKChyY250ID4gTUFYX0RGUkFNRV9MRU4gKyAzKSB8fCAocmNudCA8IDQpIHx8CgkJICAgIChkZi0+ZGF0YVt6cC0+ejFdKSkgewoJCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX1dBUk4pCgkJCQlkZWJ1Z2wxKGNzLCAiZW1wdHlfZmlmbyBoZmNwY2kgcGFrZXQgaW52LiBsZW4gJWQgb3IgY3JjICVkIiwgcmNudCwgZGYtPmRhdGFbenAtPnoxXSk7CiNpZmRlZiBFUlJPUl9TVEFUSVNUSUMKCQkJY3MtPmVycl9yeCsrOwojZW5kaWYKCQkJZGYtPmYyID0gKChkZi0+ZjIgKyAxKSAmIE1BWF9EX0ZSQU1FUykgfCAoTUFYX0RfRlJBTUVTICsgMSk7CS8qIG5leHQgYnVmZmVyICovCgkJCWRmLT56YVtkZi0+ZjIgJiBEX0ZSRUdfTUFTS10uejIgPSAoenAtPnoyICsgcmNudCkgJiAoRF9GSUZPX1NJWkUgLSAxKTsKCQl9IGVsc2UgaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKHJjbnQgLSAzKSkpIHsKCQkJdG90YWwgPSByY250OwoJCQlyY250IC09IDM7CgkJCXB0ciA9IHNrYl9wdXQoc2tiLCByY250KTsKCgkJCWlmICh6cC0+ejIgKyByY250IDw9IERfRklGT19TSVpFKQoJCQkJbWF4bGVuID0gcmNudDsJLyogY29tcGxldGUgdHJhbnNmZXIgKi8KCQkJZWxzZQoJCQkJbWF4bGVuID0gRF9GSUZPX1NJWkUgLSB6cC0+ejI7CS8qIG1heGltdW0gKi8KCgkJCXB0cjEgPSBkZi0+ZGF0YSArIHpwLT56MjsJLyogc3RhcnQgb2YgZGF0YSAqLwoJCQltZW1jcHkocHRyLCBwdHIxLCBtYXhsZW4pOwkvKiBjb3B5IGRhdGEgKi8KCQkJcmNudCAtPSBtYXhsZW47CgoJCQlpZiAocmNudCkgewkvKiByZXN0IHJlbWFpbmluZyAqLwoJCQkJcHRyICs9IG1heGxlbjsKCQkJCXB0cjEgPSBkZi0+ZGF0YTsJLyogc3RhcnQgb2YgYnVmZmVyICovCgkJCQltZW1jcHkocHRyLCBwdHIxLCByY250KTsJLyogcmVzdCAqLwoJCQl9CgkJCWRmLT5mMiA9ICgoZGYtPmYyICsgMSkgJiBNQVhfRF9GUkFNRVMpIHwgKE1BWF9EX0ZSQU1FUyArIDEpOwkvKiBuZXh0IGJ1ZmZlciAqLwoJCQlkZi0+emFbZGYtPmYyICYgRF9GUkVHX01BU0tdLnoyID0gKHpwLT56MiArIHRvdGFsKSAmIChEX0ZJRk9fU0laRSAtIDEpOwoKCQkJc2tiX3F1ZXVlX3RhaWwoJmNzLT5ycSwgc2tiKTsKCQkJc2NoZWRfZXZlbnRfRF9wY2koY3MsIERfUkNWQlVGUkVBRFkpOwoJCX0gZWxzZQoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJIRkMtUENJOiBEIHJlY2VpdmUgb3V0IG9mIG1lbW9yeVxuIik7Cgl9Cgl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKTsKCXJldHVybiAoMSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBjaGVjayBmb3IgdHJhbnNwYXJlbnQgcmVjZWl2ZSBkYXRhIGFuZCByZWFkIG1heCBvbmUgdGhyZXNob2xkIHNpemUgaWYgYXZhaWwgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoZmNwY2lfZW1wdHlfZmlmb190cmFucyhzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCBiemZpZm9fdHlwZSAqIGJ6LCB1X2NoYXIgKiBiZGF0YSkKewoJdW5zaWduZWQgc2hvcnQgKnoxciwgKnoycjsKCWludCBuZXdfejIsIGZjbnQsIG1heGxlbjsKCXN0cnVjdCBza19idWZmICpza2I7Cgl1X2NoYXIgKnB0ciwgKnB0cjE7CgoJejFyID0gJmJ6LT56YVtNQVhfQl9GUkFNRVNdLnoxOwkJLyogcG9pbnRlciB0byB6IHJlZyAqLwoJejJyID0gejFyICsgMTsKCglpZiAoIShmY250ID0gKnoxciAtICp6MnIpKQoJCXJldHVybiAoMCk7CS8qIG5vIGRhdGEgYXZhaWwgKi8KCglpZiAoZmNudCA8PSAwKQoJCWZjbnQgKz0gQl9GSUZPX1NJWkU7CS8qIGJ5dGVzIGFjdHVhbGx5IGJ1ZmZlcmVkICovCglpZiAoZmNudCA+IEhGQ1BDSV9CVFJBTlNfVEhSRVNIT0xEKQoJCWZjbnQgPSBIRkNQQ0lfQlRSQU5TX1RIUkVTSE9MRDsJCS8qIGxpbWl0IHNpemUgKi8KCgluZXdfejIgPSAqejJyICsgZmNudDsJLyogbmV3IHBvc2l0aW9uIGluIGZpZm8gKi8KCWlmIChuZXdfejIgPj0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSkKCQluZXdfejIgLT0gQl9GSUZPX1NJWkU7CS8qIGJ1ZmZlciB3cmFwICovCgoJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihmY250KSkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiSEZDUENJOiByZWNlaXZlIG91dCBvZiBtZW1vcnlcbiIpOwoJZWxzZSB7CgkJcHRyID0gc2tiX3B1dChza2IsIGZjbnQpOwoJCWlmICgqejJyICsgZmNudCA8PSBCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCkKCQkJbWF4bGVuID0gZmNudDsJLyogY29tcGxldGUgdHJhbnNmZXIgKi8KCQllbHNlCgkJCW1heGxlbiA9IEJfRklGT19TSVpFICsgQl9TVUJfVkFMIC0gKnoycjsJLyogbWF4aW11bSAqLwoKCQlwdHIxID0gYmRhdGEgKyAoKnoyciAtIEJfU1VCX1ZBTCk7CS8qIHN0YXJ0IG9mIGRhdGEgKi8KCQltZW1jcHkocHRyLCBwdHIxLCBtYXhsZW4pOwkvKiBjb3B5IGRhdGEgKi8KCQlmY250IC09IG1heGxlbjsKCgkJaWYgKGZjbnQpIHsJLyogcmVzdCByZW1haW5pbmcgKi8KCQkJcHRyICs9IG1heGxlbjsKCQkJcHRyMSA9IGJkYXRhOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KCQkJbWVtY3B5KHB0ciwgcHRyMSwgZmNudCk7CS8qIHJlc3QgKi8KCQl9CgkJc2tiX3F1ZXVlX3RhaWwoJmJjcy0+cnF1ZXVlLCBza2IpOwoJCWhmY3BjaV9zY2hlZF9ldmVudChiY3MsIEJfUkNWQlVGUkVBRFkpOwoJfQoKCSp6MnIgPSBuZXdfejI7CQkvKiBuZXcgcG9zaXRpb24gKi8KCXJldHVybiAoMSk7Cn0JCQkJLyogaGZjcGNpX2VtcHR5X2ZpZm9fdHJhbnMgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBCLWNoYW5uZWwgbWFpbiByZWNlaXZlIHJvdXRpbmUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKbWFpbl9yZWNfaGZjcGNpKHN0cnVjdCBCQ1N0YXRlICpiY3MpCnsKCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CglpbnQgcmNudCwgcmVhbF9maWZvOwoJaW50IHJlY2VpdmUsIGNvdW50ID0gNTsKCXN0cnVjdCBza19idWZmICpza2I7CgliemZpZm9fdHlwZSAqYno7Cgl1X2NoYXIgKmJkYXRhOwoJel90eXBlICp6cDsKCgoJaWYgKChiY3MtPmNoYW5uZWwpICYmICghY3MtPmh3LmhmY3BjaS5ic3dhcHBlZCkpIHsKCQlieiA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnJ4YnpfYjI7CgkJYmRhdGEgPSAoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnJ4ZGF0X2IyOwoJCXJlYWxfZmlmbyA9IDE7Cgl9IGVsc2UgewoJCWJ6ID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMucnhiel9iMTsKCQliZGF0YSA9ICgoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMucnhkYXRfYjE7CgkJcmVhbF9maWZvID0gMDsKCX0KICAgICAgQmVnaW46Cgljb3VudC0tOwoJaWYgKHRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCWRlYnVnbDEoY3MsICJyZWNfZGF0YSAlZCBibG9ja2VkIiwgYmNzLT5jaGFubmVsKTsKCQlyZXR1cm47Cgl9CglpZiAoYnotPmYxICE9IGJ6LT5mMikgewoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSFNDWCkKCQkJZGVidWdsMShjcywgImhmY3BjaSByZWMgJWQgZjEoJWQpIGYyKCVkKSIsCgkJCQliY3MtPmNoYW5uZWwsIGJ6LT5mMSwgYnotPmYyKTsKCQl6cCA9ICZiei0+emFbYnotPmYyXTsKCgkJcmNudCA9IHpwLT56MSAtIHpwLT56MjsKCQlpZiAocmNudCA8IDApCgkJCXJjbnQgKz0gQl9GSUZPX1NJWkU7CgkJcmNudCsrOwoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSFNDWCkKCQkJZGVidWdsMShjcywgImhmY3BjaSByZWMgJWQgejEoJXgpIHoyKCV4KSBjbnQoJWQpIiwKCQkJCWJjcy0+Y2hhbm5lbCwgenAtPnoxLCB6cC0+ejIsIHJjbnQpOwoJCWlmICgoc2tiID0gaGZjcGNpX2VtcHR5X2ZpZm8oYmNzLCBieiwgYmRhdGEsIHJjbnQpKSkgewoJCQlza2JfcXVldWVfdGFpbCgmYmNzLT5ycXVldWUsIHNrYik7CgkJCWhmY3BjaV9zY2hlZF9ldmVudChiY3MsIEJfUkNWQlVGUkVBRFkpOwoJCX0KCQlyY250ID0gYnotPmYxIC0gYnotPmYyOwoJCWlmIChyY250IDwgMCkKCQkJcmNudCArPSBNQVhfQl9GUkFNRVMgKyAxOwoJCWlmIChjcy0+aHcuaGZjcGNpLmxhc3RfYmZpZm9fY250W3JlYWxfZmlmb10gPiByY250ICsgMSkgewoJCSAgICAgICAgcmNudCA9IDA7CgkJCWhmY3BjaV9jbGVhcl9maWZvX3J4KGNzLCByZWFsX2ZpZm8pOwoJCX0KCQljcy0+aHcuaGZjcGNpLmxhc3RfYmZpZm9fY250W3JlYWxfZmlmb10gPSByY250OwoJCWlmIChyY250ID4gMSkKCQkJcmVjZWl2ZSA9IDE7CgkJZWxzZQoJCQlyZWNlaXZlID0gMDsKCX0gZWxzZSBpZiAoYmNzLT5tb2RlID09IEwxX01PREVfVFJBTlMpCgkJcmVjZWl2ZSA9IGhmY3BjaV9lbXB0eV9maWZvX3RyYW5zKGJjcywgYnosIGJkYXRhKTsKCWVsc2UKCQlyZWNlaXZlID0gMDsKCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJaWYgKGNvdW50ICYmIHJlY2VpdmUpCgkJZ290byBCZWdpbjsKCXJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBELWNoYW5uZWwgc2VuZCByb3V0aW5lICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKaGZjcGNpX2ZpbGxfZGZpZm8oc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7CglpbnQgZmNudDsKCWludCBjb3VudCwgbmV3X3oxLCBtYXhsZW47CglkZmlmb190eXBlICpkZjsKCXVfY2hhciAqc3JjLCAqZHN0LCBuZXdfZjE7CgoJaWYgKCFjcy0+dHhfc2tiKQoJCXJldHVybjsKCWlmIChjcy0+dHhfc2tiLT5sZW4gPD0gMCkKCQlyZXR1cm47CgoJZGYgPSAmKChmaWZvX2FyZWEgKikgKGNzLT5ody5oZmNwY2kuZmlmb3MpKS0+ZF9jaGFuLmRfdHg7CgoJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQoJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9EZmlmbyBmMSglZCkgZjIoJWQpIHoxKGYxKSgleCkiLAoJCQlkZi0+ZjEsIGRmLT5mMiwKCQkJZGYtPnphW2RmLT5mMSAmIERfRlJFR19NQVNLXS56MSk7CglmY250ID0gZGYtPmYxIC0gZGYtPmYyOwkvKiBmcmFtZSBjb3VudCBhY3R1YWxseSBidWZmZXJlZCAqLwoJaWYgKGZjbnQgPCAwKQoJCWZjbnQgKz0gKE1BWF9EX0ZSQU1FUyArIDEpOwkvKiBpZiB3cmFwIGFyb3VuZCAqLwoJaWYgKGZjbnQgPiAoTUFYX0RfRlJBTUVTIC0gMSkpIHsKCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9EZmlmbyBtb3JlIGFzIDE0IGZyYW1lcyIpOwojaWZkZWYgRVJST1JfU1RBVElTVElDCgkJY3MtPmVycl90eCsrOwojZW5kaWYKCQlyZXR1cm47Cgl9CgkvKiBub3cgZGV0ZXJtaW5lIGZyZWUgYnl0ZXMgaW4gRklGTyBidWZmZXIgKi8KCWNvdW50ID0gZGYtPnphW2RmLT5mMiAmIERfRlJFR19NQVNLXS56MiAtIGRmLT56YVtkZi0+ZjEgJiBEX0ZSRUdfTUFTS10uejEgLSAxOwoJaWYgKGNvdW50IDw9IDApCgkJY291bnQgKz0gRF9GSUZPX1NJWkU7CS8qIGNvdW50IG5vdyBjb250YWlucyBhdmFpbGFibGUgYnl0ZXMgKi8KCglpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX0RmaWZvIGNvdW50KCVsZC8lZCkiLAoJCQljcy0+dHhfc2tiLT5sZW4sIGNvdW50KTsKCWlmIChjb3VudCA8IGNzLT50eF9za2ItPmxlbikgewoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKCQkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX0RmaWZvIG5vIGZpZm8gbWVtIik7CgkJcmV0dXJuOwoJfQoJY291bnQgPSBjcy0+dHhfc2tiLT5sZW47CS8qIGdldCBmcmFtZSBsZW4gKi8KCW5ld196MSA9IChkZi0+emFbZGYtPmYxICYgRF9GUkVHX01BU0tdLnoxICsgY291bnQpICYgKERfRklGT19TSVpFIC0gMSk7CgluZXdfZjEgPSAoKGRmLT5mMSArIDEpICYgRF9GUkVHX01BU0spIHwgKERfRlJFR19NQVNLICsgMSk7CglzcmMgPSBjcy0+dHhfc2tiLT5kYXRhOwkvKiBzb3VyY2UgcG9pbnRlciAqLwoJZHN0ID0gZGYtPmRhdGEgKyBkZi0+emFbZGYtPmYxICYgRF9GUkVHX01BU0tdLnoxOwoJbWF4bGVuID0gRF9GSUZPX1NJWkUgLSBkZi0+emFbZGYtPmYxICYgRF9GUkVHX01BU0tdLnoxOwkJLyogZW5kIGZpZm8gKi8KCWlmIChtYXhsZW4gPiBjb3VudCkKCQltYXhsZW4gPSBjb3VudDsJLyogbGltaXQgc2l6ZSAqLwoJbWVtY3B5KGRzdCwgc3JjLCBtYXhsZW4pOwkvKiBmaXJzdCBjb3B5ICovCgoJY291bnQgLT0gbWF4bGVuOwkvKiByZW1haW5pbmcgYnl0ZXMgKi8KCWlmIChjb3VudCkgewoJCWRzdCA9IGRmLT5kYXRhOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KCQlzcmMgKz0gbWF4bGVuOwkvKiBuZXcgcG9zaXRpb24gKi8KCQltZW1jcHkoZHN0LCBzcmMsIGNvdW50KTsKCX0KCWRmLT56YVtuZXdfZjEgJiBEX0ZSRUdfTUFTS10uejEgPSBuZXdfejE7CS8qIGZvciBuZXh0IGJ1ZmZlciAqLwoJZGYtPnphW2RmLT5mMSAmIERfRlJFR19NQVNLXS56MSA9IG5ld196MTsJLyogbmV3IHBvcyBhY3R1YWwgYnVmZmVyICovCglkZi0+ZjEgPSBuZXdfZjE7CS8qIG5leHQgZnJhbWUgKi8KCglkZXZfa2ZyZWVfc2tiX2FueShjcy0+dHhfc2tiKTsKCWNzLT50eF9za2IgPSBOVUxMOwoJcmV0dXJuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEItY2hhbm5lbCBzZW5kIHJvdXRpbmUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApoZmNwY2lfZmlsbF9maWZvKHN0cnVjdCBCQ1N0YXRlICpiY3MpCnsKCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CglpbnQgbWF4bGVuLCBmY250OwoJaW50IGNvdW50LCBuZXdfejE7CgliemZpZm9fdHlwZSAqYno7Cgl1X2NoYXIgKmJkYXRhOwoJdV9jaGFyIG5ld19mMSwgKnNyYywgKmRzdDsKCXVuc2lnbmVkIHNob3J0ICp6MXQsICp6MnQ7CgoJaWYgKCFiY3MtPnR4X3NrYikKCQlyZXR1cm47CglpZiAoYmNzLT50eF9za2ItPmxlbiA8PSAwKQoJCXJldHVybjsKCglpZiAoKGJjcy0+Y2hhbm5lbCkgJiYgKCFjcy0+aHcuaGZjcGNpLmJzd2FwcGVkKSkgewoJCWJ6ID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMudHhiel9iMjsKCQliZGF0YSA9ICgoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMudHhkYXRfYjI7Cgl9IGVsc2UgewoJCWJ6ID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMudHhiel9iMTsKCQliZGF0YSA9ICgoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMudHhkYXRfYjE7Cgl9CgoJaWYgKGJjcy0+bW9kZSA9PSBMMV9NT0RFX1RSQU5TKSB7CgkJejF0ID0gJmJ6LT56YVtNQVhfQl9GUkFNRVNdLnoxOwoJCXoydCA9IHoxdCArIDE7CgkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9IU0NYKQoJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfZmlmb190cmFucyAlZCB6MSgleCkgejIoJXgpIiwKCQkJCWJjcy0+Y2hhbm5lbCwgKnoxdCwgKnoydCk7CgkJZmNudCA9ICp6MnQgLSAqejF0OwoJCWlmIChmY250IDw9IDApCgkJCWZjbnQgKz0gQl9GSUZPX1NJWkU7CS8qIGZjbnQgY29udGFpbnMgYXZhaWxhYmxlIGJ5dGVzIGluIGZpZm8gKi8KCQlmY250ID0gQl9GSUZPX1NJWkUgLSBmY250OwkvKiByZW1haW5pbmcgYnl0ZXMgdG8gc2VuZCAqLwoKCQl3aGlsZSAoKGZjbnQgPCAyICogSEZDUENJX0JUUkFOU19USFJFU0hPTEQpICYmIChiY3MtPnR4X3NrYikpIHsKCQkJaWYgKGJjcy0+dHhfc2tiLT5sZW4gPCBCX0ZJRk9fU0laRSAtIGZjbnQpIHsKCQkJCS8qIGRhdGEgaXMgc3VpdGFibGUgZm9yIGZpZm8gKi8KCQkJCWNvdW50ID0gYmNzLT50eF9za2ItPmxlbjsKCgkJCQluZXdfejEgPSAqejF0ICsgY291bnQ7CS8qIG5ldyBidWZmZXIgUG9zaXRpb24gKi8KCQkJCWlmIChuZXdfejEgPj0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSkKCQkJCQluZXdfejEgLT0gQl9GSUZPX1NJWkU7CS8qIGJ1ZmZlciB3cmFwICovCgkJCQlzcmMgPSBiY3MtPnR4X3NrYi0+ZGF0YTsJLyogc291cmNlIHBvaW50ZXIgKi8KCQkJCWRzdCA9IGJkYXRhICsgKCp6MXQgLSBCX1NVQl9WQUwpOwoJCQkJbWF4bGVuID0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSAtICp6MXQ7CS8qIGVuZCBvZiBmaWZvICovCgkJCQlpZiAobWF4bGVuID4gY291bnQpCgkJCQkJbWF4bGVuID0gY291bnQ7CQkvKiBsaW1pdCBzaXplICovCgkJCQltZW1jcHkoZHN0LCBzcmMsIG1heGxlbik7CS8qIGZpcnN0IGNvcHkgKi8KCgkJCQljb3VudCAtPSBtYXhsZW47CS8qIHJlbWFpbmluZyBieXRlcyAqLwoJCQkJaWYgKGNvdW50KSB7CgkJCQkJZHN0ID0gYmRhdGE7CS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLwoJCQkJCXNyYyArPSBtYXhsZW47CS8qIG5ldyBwb3NpdGlvbiAqLwoJCQkJCW1lbWNweShkc3QsIHNyYywgY291bnQpOwoJCQkJfQoJCQkJYmNzLT50eF9jbnQgLT0gYmNzLT50eF9za2ItPmxlbjsKCQkJCWZjbnQgKz0gYmNzLT50eF9za2ItPmxlbjsKCQkJCSp6MXQgPSBuZXdfejE7CS8qIG5vdyBzZW5kIGRhdGEgKi8KCQkJfSBlbHNlIGlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSFNDWCkKCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9maWZvX3RyYW5zICVkIGZyYW1lIGxlbmd0aCAlZCBkaXNjYXJkZWQiLAoJCQkJCWJjcy0+Y2hhbm5lbCwgYmNzLT50eF9za2ItPmxlbik7CgoJCQlpZiAodGVzdF9iaXQoRkxHX0xMSV9MMVdBS0VVUCwmYmNzLT5zdC0+bGxpLmZsYWcpICYmCgkJCQkoUEFDS0VUX05PQUNLICE9IGJjcy0+dHhfc2tiLT5wa3RfdHlwZSkpIHsKCQkJCXVfbG9uZwlmbGFnczsKCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZiY3MtPmFjbG9jaywgZmxhZ3MpOwoJCQkJYmNzLT5hY2tjbnQgKz0gYmNzLT50eF9za2ItPmxlbjsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjcy0+YWNsb2NrLCBmbGFncyk7CgkJCQlzY2hlZHVsZV9ldmVudChiY3MsIEJfQUNLUEVORElORyk7CgkJCX0KCgkJCWRldl9rZnJlZV9za2JfYW55KGJjcy0+dHhfc2tiKTsKCQkJYmNzLT50eF9za2IgPSBza2JfZGVxdWV1ZSgmYmNzLT5zcXVldWUpOwkvKiBmZXRjaCBuZXh0IGRhdGEgKi8KCQl9CgkJdGVzdF9hbmRfY2xlYXJfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKTsKCQlyZXR1cm47Cgl9CglpZiAoY3MtPmRlYnVnICYgTDFfREVCX0hTQ1gpCgkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX2ZpZm9faGRsYyAlZCBmMSglZCkgZjIoJWQpIHoxKGYxKSgleCkiLAoJCQliY3MtPmNoYW5uZWwsIGJ6LT5mMSwgYnotPmYyLAoJCQliei0+emFbYnotPmYxXS56MSk7CgoJZmNudCA9IGJ6LT5mMSAtIGJ6LT5mMjsJLyogZnJhbWUgY291bnQgYWN0dWFsbHkgYnVmZmVyZWQgKi8KCWlmIChmY250IDwgMCkKCQlmY250ICs9IChNQVhfQl9GUkFNRVMgKyAxKTsJLyogaWYgd3JhcCBhcm91bmQgKi8KCWlmIChmY250ID4gKE1BWF9CX0ZSQU1FUyAtIDEpKSB7CgkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9IU0NYKQoJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfQmZpZm8gbW9yZSBhcyAxNCBmcmFtZXMiKTsKCQlyZXR1cm47Cgl9CgkvKiBub3cgZGV0ZXJtaW5lIGZyZWUgYnl0ZXMgaW4gRklGTyBidWZmZXIgKi8KCWNvdW50ID0gYnotPnphW2J6LT5mMl0uejIgLSBiei0+emFbYnotPmYxXS56MSAtIDE7CglpZiAoY291bnQgPD0gMCkKCQljb3VudCArPSBCX0ZJRk9fU0laRTsJLyogY291bnQgbm93IGNvbnRhaW5zIGF2YWlsYWJsZSBieXRlcyAqLwoKCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSFNDWCkKCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfZmlmbyAlZCBjb3VudCglbGQvJWQpLCVseCIsCgkJCWJjcy0+Y2hhbm5lbCwgYmNzLT50eF9za2ItPmxlbiwKCQkJY291bnQsIGN1cnJlbnQtPnN0YXRlKTsKCglpZiAoY291bnQgPCBiY3MtPnR4X3NrYi0+bGVuKSB7CgkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9IU0NYKQoJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfZmlmbyBubyBmaWZvIG1lbSIpOwoJCXJldHVybjsKCX0KCWNvdW50ID0gYmNzLT50eF9za2ItPmxlbjsJLyogZ2V0IGZyYW1lIGxlbiAqLwoJbmV3X3oxID0gYnotPnphW2J6LT5mMV0uejEgKyBjb3VudDsJLyogbmV3IGJ1ZmZlciBQb3NpdGlvbiAqLwoJaWYgKG5ld196MSA+PSAoQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwpKQoJCW5ld196MSAtPSBCX0ZJRk9fU0laRTsJLyogYnVmZmVyIHdyYXAgKi8KCgluZXdfZjEgPSAoKGJ6LT5mMSArIDEpICYgTUFYX0JfRlJBTUVTKTsKCXNyYyA9IGJjcy0+dHhfc2tiLT5kYXRhOwkvKiBzb3VyY2UgcG9pbnRlciAqLwoJZHN0ID0gYmRhdGEgKyAoYnotPnphW2J6LT5mMV0uejEgLSBCX1NVQl9WQUwpOwoJbWF4bGVuID0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSAtIGJ6LT56YVtiei0+ZjFdLnoxOwkJLyogZW5kIGZpZm8gKi8KCWlmIChtYXhsZW4gPiBjb3VudCkKCQltYXhsZW4gPSBjb3VudDsJLyogbGltaXQgc2l6ZSAqLwoJbWVtY3B5KGRzdCwgc3JjLCBtYXhsZW4pOwkvKiBmaXJzdCBjb3B5ICovCgoJY291bnQgLT0gbWF4bGVuOwkvKiByZW1haW5pbmcgYnl0ZXMgKi8KCWlmIChjb3VudCkgewoJCWRzdCA9IGJkYXRhOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KCQlzcmMgKz0gbWF4bGVuOwkvKiBuZXcgcG9zaXRpb24gKi8KCQltZW1jcHkoZHN0LCBzcmMsIGNvdW50KTsKCX0KCWJjcy0+dHhfY250IC09IGJjcy0+dHhfc2tiLT5sZW47CglpZiAodGVzdF9iaXQoRkxHX0xMSV9MMVdBS0VVUCwmYmNzLT5zdC0+bGxpLmZsYWcpICYmCgkJKFBBQ0tFVF9OT0FDSyAhPSBiY3MtPnR4X3NrYi0+cGt0X3R5cGUpKSB7CgkJdV9sb25nCWZsYWdzOwoJCXNwaW5fbG9ja19pcnFzYXZlKCZiY3MtPmFjbG9jaywgZmxhZ3MpOwoJCWJjcy0+YWNrY250ICs9IGJjcy0+dHhfc2tiLT5sZW47CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmNzLT5hY2xvY2ssIGZsYWdzKTsKCQlzY2hlZHVsZV9ldmVudChiY3MsIEJfQUNLUEVORElORyk7Cgl9CgoJYnotPnphW25ld19mMV0uejEgPSBuZXdfejE7CS8qIGZvciBuZXh0IGJ1ZmZlciAqLwoJYnotPmYxID0gbmV3X2YxOwkvKiBuZXh0IGZyYW1lICovCgoJZGV2X2tmcmVlX3NrYl9hbnkoYmNzLT50eF9za2IpOwoJYmNzLT50eF9za2IgPSBOVUxMOwoJdGVzdF9hbmRfY2xlYXJfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKTsKCXJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEQtY2hhbm5lbCBsMSBzdGF0ZSBjYWxsIGZvciBsZWFzZWQgTlQtbW9kZSAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZGNoX250X2wybDEoc3RydWN0IFBTdGFjayAqc3QsIGludCBwciwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPSAoc3RydWN0IElzZG5DYXJkU3RhdGUgKikgc3QtPmwxLmhhcmR3YXJlOwoKCXN3aXRjaCAocHIpIHsKCQljYXNlIChQSF9EQVRBIHwgUkVRVUVTVCk6CgkJY2FzZSAoUEhfUFVMTCB8IFJFUVVFU1QpOgoJCWNhc2UgKFBIX1BVTEwgfCBJTkRJQ0FUSU9OKToKCQkJc3QtPmwxLmwxaHcoc3QsIHByLCBhcmcpOwoJCQlicmVhazsKCQljYXNlIChQSF9BQ1RJVkFURSB8IFJFUVVFU1QpOgoJCQlzdC0+bDEubDFsMihzdCwgUEhfQUNUSVZBVEUgfCBDT05GSVJNLCBOVUxMKTsKCQkJYnJlYWs7CgkJY2FzZSAoUEhfVEVTVExPT1AgfCBSRVFVRVNUKToKCQkJaWYgKDEgJiAobG9uZykgYXJnKQoJCQkJZGVidWdsMShjcywgIlBIX1RFU1RfTE9PUCBCMSIpOwoJCQlpZiAoMiAmIChsb25nKSBhcmcpCgkJCQlkZWJ1Z2wxKGNzLCAiUEhfVEVTVF9MT09QIEIyIik7CgkJCWlmICghKDMgJiAobG9uZykgYXJnKSkKCQkJCWRlYnVnbDEoY3MsICJQSF9URVNUX0xPT1AgRElTQUJMRUQiKTsKCQkJc3QtPmwxLmwxaHcoc3QsIEhXX1RFU1RMT09QIHwgUkVRVUVTVCwgYXJnKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJaWYgKGNzLT5kZWJ1ZykKCQkJCWRlYnVnbDEoY3MsICJkY2hfbnRfbDJsMSBtc2cgJTA0WCB1bmhhbmRsZWQiLCBwcik7CgkJCWJyZWFrOwoJfQp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKi8KLyogc2V0L3Jlc2V0IGVjaG8gbW9kZSAqLwovKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKaGZjcGNpX2F1eGNtZChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGlzZG5fY3RybCAqIGljKQp7Cgl1X2xvbmcJZmxhZ3M7CglpbnQJaSA9ICoodW5zaWduZWQgaW50ICopIGljLT5wYXJtLm51bTsKCglpZiAoKGljLT5hcmcgPT0gOTgpICYmCgkgICAgKCEoY3MtPmh3LmhmY3BjaS5pbnRfbTEgJiAoSEZDUENJX0lOVFNfQjJUUkFOUyArIEhGQ1BDSV9JTlRTX0IyUkVDICsgSEZDUENJX0lOVFNfQjFUUkFOUyArIEhGQ1BDSV9JTlRTX0IxUkVDKSkpKSB7CgkgICAgCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCVdyaXRlX2hmYyhjcywgSEZDUENJX0NMS0RFTCwgQ0xLREVMX05UKTsgLyogU1QtQml0IGRlbGF5IGZvciBOVC1Nb2RlICovCgkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU1RBVEVTLCBIRkNQQ0lfTE9BRF9TVEFURSB8IDApOwkvKiBIRkMgU1QgRzAgKi8KCQl1ZGVsYXkoMTApOwoJCWNzLT5ody5oZmNwY2kuc2N0cmwgfD0gU0NUUkxfTU9ERV9OVDsKCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TQ1RSTCwgY3MtPmh3LmhmY3BjaS5zY3RybCk7CS8qIHNldCBOVC1tb2RlICovCgkJdWRlbGF5KDEwKTsKCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TVEFURVMsIEhGQ1BDSV9MT0FEX1NUQVRFIHwgMSk7CS8qIEhGQyBTVCBHMSAqLwoJCXVkZWxheSgxMCk7CgkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU1RBVEVTLCAxIHwgSEZDUENJX0FDVElWQVRFIHwgSEZDUENJX0RPX0FDVElPTik7CgkJY3MtPmRjLmhmY3BjaS5waF9zdGF0ZSA9IDE7CgkJY3MtPmh3LmhmY3BjaS5udF9tb2RlID0gMTsKCQljcy0+aHcuaGZjcGNpLm50X3RpbWVyID0gMDsKCQljcy0+c3RsaXN0LT5sMi5sMmwxID0gZGNoX250X2wybDE7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQlkZWJ1Z2wxKGNzLCAiTlQgbW9kZSBhY3RpdmF0ZWQiKTsKCQlyZXR1cm4gKDApOwoJfQoJaWYgKChjcy0+Y2hhbmxpbWl0ID4gMSkgfHwgKGNzLT5ody5oZmNwY2kuYnN3YXBwZWQpIHx8CgkgICAgKGNzLT5ody5oZmNwY2kubnRfbW9kZSkgfHwgKGljLT5hcmcgIT0gMTIpKQoJCXJldHVybiAoLUVJTlZBTCk7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5sb2NrLCBmbGFncyk7CglpZiAoaSkgewoJCWNzLT5sb2dlY2hvID0gMTsKCQljcy0+aHcuaGZjcGNpLnRybSB8PSAweDIwOwkvKiBlbmFibGUgZWNobyBjaGFuICovCgkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgfD0gSEZDUENJX0lOVFNfQjJSRUM7CgkJY3MtPmh3LmhmY3BjaS5maWZvX2VuIHw9IEhGQ1BDSV9GSUZPRU5fQjJSWDsKCX0gZWxzZSB7CgkJY3MtPmxvZ2VjaG8gPSAwOwoJCWNzLT5ody5oZmNwY2kudHJtICY9IH4weDIwOwkvKiBkaXNhYmxlIGVjaG8gY2hhbiAqLwoJCWNzLT5ody5oZmNwY2kuaW50X20xICY9IH5IRkNQQ0lfSU5UU19CMlJFQzsKCQljcy0+aHcuaGZjcGNpLmZpZm9fZW4gJj0gfkhGQ1BDSV9GSUZPRU5fQjJSWDsKCX0KCWNzLT5ody5oZmNwY2kuc2N0cmxfciAmPSB+U0NUUkxfQjJfRU5BOwoJY3MtPmh3LmhmY3BjaS5zY3RybCAmPSB+U0NUUkxfQjJfRU5BOwoJY3MtPmh3LmhmY3BjaS5jb25uIHw9IDB4MTA7CS8qIEIyLUlPTSAtPiBCMi1TVCAqLwoJY3MtPmh3LmhmY3BjaS5jdG10ICY9IH4yOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ1RNVCwgY3MtPmh3LmhmY3BjaS5jdG10KTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX1NDVFJMX1IsIGNzLT5ody5oZmNwY2kuc2N0cmxfcik7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TQ1RSTCwgY3MtPmh3LmhmY3BjaS5zY3RybCk7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DT05ORUNULCBjcy0+aHcuaGZjcGNpLmNvbm4pOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfVFJNLCBjcy0+aHcuaGZjcGNpLnRybSk7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9GSUZPX0VOLCBjcy0+aHcuaGZjcGNpLmZpZm9fZW4pOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00xLCBjcy0+aHcuaGZjcGNpLmludF9tMSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuICgwKTsKfQkJCQkvKiBoZmNwY2lfYXV4Y21kICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEUtY2hhbm5lbCByZWNlaXZlIHJvdXRpbmUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApyZWNlaXZlX2Vtc2coc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7CglpbnQgcmNudDsKCWludCByZWNlaXZlLCBjb3VudCA9IDU7CgliemZpZm9fdHlwZSAqYno7Cgl1X2NoYXIgKmJkYXRhOwoJel90eXBlICp6cDsKCXVfY2hhciAqcHRyLCAqcHRyMSwgbmV3X2YyOwoJaW50IHRvdGFsLCBtYXhsZW4sIG5ld196MjsKCXVfY2hhciBlX2J1ZmZlclsyNTZdOwoKCWJ6ID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMucnhiel9iMjsKCWJkYXRhID0gKChmaWZvX2FyZWEgKikgKGNzLT5ody5oZmNwY2kuZmlmb3MpKS0+Yl9jaGFucy5yeGRhdF9iMjsKICAgICAgQmVnaW46Cgljb3VudC0tOwoJaWYgKHRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCWRlYnVnbDEoY3MsICJlY2hvX3JlY19kYXRhIGJsb2NrZWQiKTsKCQlyZXR1cm47Cgl9CglpZiAoYnotPmYxICE9IGJ6LT5mMikgewoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKCQkJZGVidWdsMShjcywgImhmY3BjaSBlX3JlYyBmMSglZCkgZjIoJWQpIiwKCQkJCWJ6LT5mMSwgYnotPmYyKTsKCQl6cCA9ICZiei0+emFbYnotPmYyXTsKCgkJcmNudCA9IHpwLT56MSAtIHpwLT56MjsKCQlpZiAocmNudCA8IDApCgkJCXJjbnQgKz0gQl9GSUZPX1NJWkU7CgkJcmNudCsrOwoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKCQkJZGVidWdsMShjcywgImhmY3BjaSBlX3JlYyB6MSgleCkgejIoJXgpIGNudCglZCkiLAoJCQkJenAtPnoxLCB6cC0+ejIsIHJjbnQpOwoJCW5ld196MiA9IHpwLT56MiArIHJjbnQ7CQkvKiBuZXcgcG9zaXRpb24gaW4gZmlmbyAqLwoJCWlmIChuZXdfejIgPj0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSkKCQkJbmV3X3oyIC09IEJfRklGT19TSVpFOwkvKiBidWZmZXIgd3JhcCAqLwoJCW5ld19mMiA9IChiei0+ZjIgKyAxKSAmIE1BWF9CX0ZSQU1FUzsKCQlpZiAoKHJjbnQgPiAyNTYgKyAzKSB8fCAoY291bnQgPCA0KSB8fAoJCSAgICAoKihiZGF0YSArICh6cC0+ejEgLSBCX1NVQl9WQUwpKSkpIHsKCQkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9XQVJOKQoJCQkJZGVidWdsMShjcywgImhmY3BjaV9lbXB0eV9lY2hhbjogaW5jb21pbmcgcGFja2V0IGludmFsaWQgbGVuZ3RoICVkIG9yIGNyYyIsIHJjbnQpOwoJCQliei0+emFbbmV3X2YyXS56MiA9IG5ld196MjsKCQkJYnotPmYyID0gbmV3X2YyOwkvKiBuZXh0IGJ1ZmZlciAqLwoJCX0gZWxzZSB7CgkJCXRvdGFsID0gcmNudDsKCQkJcmNudCAtPSAzOwoJCQlwdHIgPSBlX2J1ZmZlcjsKCgkJCWlmICh6cC0+ejIgPD0gQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwpCgkJCQltYXhsZW4gPSByY250OwkvKiBjb21wbGV0ZSB0cmFuc2ZlciAqLwoJCQllbHNlCgkJCQltYXhsZW4gPSBCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCAtIHpwLT56MjsJLyogbWF4aW11bSAqLwoKCQkJcHRyMSA9IGJkYXRhICsgKHpwLT56MiAtIEJfU1VCX1ZBTCk7CS8qIHN0YXJ0IG9mIGRhdGEgKi8KCQkJbWVtY3B5KHB0ciwgcHRyMSwgbWF4bGVuKTsJLyogY29weSBkYXRhICovCgkJCXJjbnQgLT0gbWF4bGVuOwoKCQkJaWYgKHJjbnQpIHsJLyogcmVzdCByZW1haW5pbmcgKi8KCQkJCXB0ciArPSBtYXhsZW47CgkJCQlwdHIxID0gYmRhdGE7CS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLwoJCQkJbWVtY3B5KHB0ciwgcHRyMSwgcmNudCk7CS8qIHJlc3QgKi8KCQkJfQoJCQliei0+emFbbmV3X2YyXS56MiA9IG5ld196MjsKCQkJYnotPmYyID0gbmV3X2YyOwkvKiBuZXh0IGJ1ZmZlciAqLwoJCQlpZiAoY3MtPmRlYnVnICYgREVCX0RMT0dfSEVYKSB7CgkJCQlwdHIgPSBjcy0+ZGxvZzsKCQkJCWlmICgodG90YWwgLSAzKSA8IE1BWF9ETE9HX1NQQUNFIC8gMyAtIDEwKSB7CgkJCQkJKnB0cisrID0gJ0UnOwoJCQkJCSpwdHIrKyA9ICdDJzsKCQkJCQkqcHRyKysgPSAnSCc7CgkJCQkJKnB0cisrID0gJ08nOwoJCQkJCSpwdHIrKyA9ICc6JzsKCQkJCQlwdHIgKz0gUXVpY2tIZXgocHRyLCBlX2J1ZmZlciwgdG90YWwgLSAzKTsKCQkJCQlwdHItLTsKCQkJCQkqcHRyKysgPSAnXG4nOwoJCQkJCSpwdHIgPSAwOwoJCQkJCUhpU2F4X3B1dHN0YXR1cyhjcywgTlVMTCwgY3MtPmRsb2cpOwoJCQkJfSBlbHNlCgkJCQkJSGlTYXhfcHV0c3RhdHVzKGNzLCAiTG9nRWNobzogIiwgIndhcm5pbmcgRnJhbWUgdG9vIGJpZyAoJWQpIiwgdG90YWwgLSAzKTsKCQkJfQoJCX0KCgkJcmNudCA9IGJ6LT5mMSAtIGJ6LT5mMjsKCQlpZiAocmNudCA8IDApCgkJCXJjbnQgKz0gTUFYX0JfRlJBTUVTICsgMTsKCQlpZiAocmNudCA+IDEpCgkJCXJlY2VpdmUgPSAxOwoJCWVsc2UKCQkJcmVjZWl2ZSA9IDA7Cgl9IGVsc2UKCQlyZWNlaXZlID0gMDsKCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJaWYgKGNvdW50ICYmIHJlY2VpdmUpCgkJZ290byBCZWdpbjsKCXJldHVybjsKfQkJCQkvKiByZWNlaXZlX2Vtc2cgKi8KCi8qKioqKioqKioqKioqKioqKioqKiovCi8qIEludGVycnVwdCBoYW5kbGVyICovCi8qKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpcnFyZXR1cm5fdApoZmNwY2lfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJdV9sb25nIGZsYWdzOwoJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gZGV2X2lkOwoJdV9jaGFyIGV4dmFsOwoJc3RydWN0IEJDU3RhdGUgKmJjczsKCWludCBjb3VudCA9IDE1OwoJdV9jaGFyIHZhbCwgc3RhdDsKCglpZiAoIShjcy0+aHcuaGZjcGNpLmludF9tMiAmIDB4MDgpKSB7CgkJZGVidWdsMShjcywgIkhGQy1QQ0k6IGludF9tMiAleCBub3QgaW5pdGlhbGlzZWQiLCBjcy0+aHcuaGZjcGNpLmludF9tMik7CgkJcmV0dXJuIElSUV9OT05FOwkvKiBub3QgaW5pdGlhbGlzZWQgKi8KCX0KCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJaWYgKEhGQ1BDSV9BTllJTlQgJiAoc3RhdCA9IFJlYWRfaGZjKGNzLCBIRkNQQ0lfU1RBVFVTKSkpIHsKCQl2YWwgPSBSZWFkX2hmYyhjcywgSEZDUENJX0lOVF9TMSk7CgkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQoJCQlkZWJ1Z2wxKGNzLCAiSEZDLVBDSTogc3RhdCglMDJ4KSBzMSglMDJ4KSIsIHN0YXQsIHZhbCk7Cgl9IGVsc2UgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIElSUV9OT05FOwoJfQoJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQoJCWRlYnVnbDEoY3MsICJIRkMtUENJIGlycSAleCAlcyIsIHZhbCwKCQkJdGVzdF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSA/CgkJCSJsb2NrZWQiIDogInVubG9ja2VkIik7Cgl2YWwgJj0gY3MtPmh3LmhmY3BjaS5pbnRfbTE7CglpZiAodmFsICYgMHg0MCkgewkvKiBzdGF0ZSBtYWNoaW5lIGlycSAqLwoJCWV4dmFsID0gUmVhZF9oZmMoY3MsIEhGQ1BDSV9TVEFURVMpICYgMHhmOwoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKCQkJZGVidWdsMShjcywgInBoX3N0YXRlIGNoZyAlZC0+JWQiLCBjcy0+ZGMuaGZjcGNpLnBoX3N0YXRlLAoJCQkJZXh2YWwpOwoJCWNzLT5kYy5oZmNwY2kucGhfc3RhdGUgPSBleHZhbDsKCQlzY2hlZF9ldmVudF9EX3BjaShjcywgRF9MMVNUQVRFQ0hBTkdFKTsKCQl2YWwgJj0gfjB4NDA7Cgl9CglpZiAodmFsICYgMHg4MCkgewkvKiB0aW1lciBpcnEgKi8KCQlpZiAoY3MtPmh3LmhmY3BjaS5udF9tb2RlKSB7CgkJCWlmICgoLS1jcy0+aHcuaGZjcGNpLm50X3RpbWVyKSA8IDApCgkJCQlzY2hlZF9ldmVudF9EX3BjaShjcywgRF9MMVNUQVRFQ0hBTkdFKTsKCQl9CgkJdmFsICY9IH4weDgwOwoJCVdyaXRlX2hmYyhjcywgSEZDUENJX0NUTVQsIGNzLT5ody5oZmNwY2kuY3RtdCB8IEhGQ1BDSV9DTFRJTUVSKTsKCX0KCXdoaWxlICh2YWwpIHsKCQlpZiAodGVzdF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCQljcy0+aHcuaGZjcGNpLmludF9zMSB8PSB2YWw7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCXJldHVybiBJUlFfSEFORExFRDsKCQl9CgkJaWYgKGNzLT5ody5oZmNwY2kuaW50X3MxICYgMHgxOCkgewoJCQlleHZhbCA9IHZhbDsKCQkJdmFsID0gY3MtPmh3LmhmY3BjaS5pbnRfczE7CgkJCWNzLT5ody5oZmNwY2kuaW50X3MxID0gZXh2YWw7CgkJfQoJCWlmICh2YWwgJiAweDA4KSB7CgkJCWlmICghKGJjcyA9IFNlbF9CQ1MoY3MsIGNzLT5ody5oZmNwY2kuYnN3YXBwZWQgPyAxIDogMCkpKSB7CgkJCQlpZiAoY3MtPmRlYnVnKQoJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2kgc3B1cmlvdXMgMHgwOCBJUlEiKTsKCQkJfSBlbHNlCgkJCQltYWluX3JlY19oZmNwY2koYmNzKTsKCQl9CgkJaWYgKHZhbCAmIDB4MTApIHsKCQkJaWYgKGNzLT5sb2dlY2hvKQoJCQkJcmVjZWl2ZV9lbXNnKGNzKTsKCQkJZWxzZSBpZiAoIShiY3MgPSBTZWxfQkNTKGNzLCAxKSkpIHsKCQkJCWlmIChjcy0+ZGVidWcpCgkJCQkJZGVidWdsMShjcywgImhmY3BjaSBzcHVyaW91cyAweDEwIElSUSIpOwoJCQl9IGVsc2UKCQkJCW1haW5fcmVjX2hmY3BjaShiY3MpOwoJCX0KCQlpZiAodmFsICYgMHgwMSkgewoJCQlpZiAoIShiY3MgPSBTZWxfQkNTKGNzLCBjcy0+aHcuaGZjcGNpLmJzd2FwcGVkID8gMSA6IDApKSkgewoJCQkJaWYgKGNzLT5kZWJ1ZykKCQkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpIHNwdXJpb3VzIDB4MDEgSVJRIik7CgkJCX0gZWxzZSB7CgkJCQlpZiAoYmNzLT50eF9za2IpIHsKCQkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCQkJCQloZmNwY2lfZmlsbF9maWZvKGJjcyk7CgkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCX0gZWxzZQoJCQkJCQlkZWJ1Z2wxKGNzLCAiZmlsbF9kYXRhICVkIGJsb2NrZWQiLCBiY3MtPmNoYW5uZWwpOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoKGJjcy0+dHhfc2tiID0gc2tiX2RlcXVldWUoJmJjcy0+c3F1ZXVlKSkpIHsKCQkJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQkJCQkJCWhmY3BjaV9maWxsX2ZpZm8oYmNzKTsKCQkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCQl9IGVsc2UKCQkJCQkJCWRlYnVnbDEoY3MsICJmaWxsX2RhdGEgJWQgYmxvY2tlZCIsIGJjcy0+Y2hhbm5lbCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaGZjcGNpX3NjaGVkX2V2ZW50KGJjcywgQl9YTVRCVUZSRUFEWSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWlmICh2YWwgJiAweDAyKSB7CgkJCWlmICghKGJjcyA9IFNlbF9CQ1MoY3MsIDEpKSkgewoJCQkJaWYgKGNzLT5kZWJ1ZykKCQkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpIHNwdXJpb3VzIDB4MDIgSVJRIik7CgkJCX0gZWxzZSB7CgkJCQlpZiAoYmNzLT50eF9za2IpIHsKCQkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCQkJCQloZmNwY2lfZmlsbF9maWZvKGJjcyk7CgkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCX0gZWxzZQoJCQkJCQlkZWJ1Z2wxKGNzLCAiZmlsbF9kYXRhICVkIGJsb2NrZWQiLCBiY3MtPmNoYW5uZWwpOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoKGJjcy0+dHhfc2tiID0gc2tiX2RlcXVldWUoJmJjcy0+c3F1ZXVlKSkpIHsKCQkJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQkJCQkJCWhmY3BjaV9maWxsX2ZpZm8oYmNzKTsKCQkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCQl9IGVsc2UKCQkJCQkJCWRlYnVnbDEoY3MsICJmaWxsX2RhdGEgJWQgYmxvY2tlZCIsIGJjcy0+Y2hhbm5lbCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaGZjcGNpX3NjaGVkX2V2ZW50KGJjcywgQl9YTVRCVUZSRUFEWSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWlmICh2YWwgJiAweDIwKSB7CS8qIHJlY2VpdmUgZGZyYW1lICovCgkJCXJlY2VpdmVfZG1zZyhjcyk7CgkJfQoJCWlmICh2YWwgJiAweDA0KSB7CS8qIGRmcmFtZSB0cmFuc21pdHRlZCAqLwoJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMR19EQlVTWV9USU1FUiwgJmNzLT5IV19GbGFncykpCgkJCQlkZWxfdGltZXIoJmNzLT5kYnVzeXRpbWVyKTsKCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDFfREJVU1ksICZjcy0+SFdfRmxhZ3MpKQoJCQkJc2NoZWRfZXZlbnRfRF9wY2koY3MsIERfQ0xFQVJCVVNZKTsKCQkJaWYgKGNzLT50eF9za2IpIHsKCQkJCWlmIChjcy0+dHhfc2tiLT5sZW4pIHsKCQkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCQkJCQloZmNwY2lfZmlsbF9kZmlmbyhjcyk7CgkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9kZmlmbyBpcnEgYmxvY2tlZCIpOwoJCQkJCX0KCQkJCQlnb3RvIGFmdGVyWFBSOwoJCQkJfSBlbHNlIHsKCQkJCQlkZXZfa2ZyZWVfc2tiX2lycShjcy0+dHhfc2tiKTsKCQkJCQljcy0+dHhfY250ID0gMDsKCQkJCQljcy0+dHhfc2tiID0gTlVMTDsKCQkJCX0KCQkJfQoJCQlpZiAoKGNzLT50eF9za2IgPSBza2JfZGVxdWV1ZSgmY3MtPnNxKSkpIHsKCQkJCWNzLT50eF9jbnQgPSAwOwoJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQkJCQloZmNwY2lfZmlsbF9kZmlmbyhjcyk7CgkJCQkJdGVzdF9hbmRfY2xlYXJfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncyk7CgkJCQl9IGVsc2UgewoJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9kZmlmbyBpcnEgYmxvY2tlZCIpOwoJCQkJfQoJCQl9IGVsc2UKCQkJCXNjaGVkX2V2ZW50X0RfcGNpKGNzLCBEX1hNVEJVRlJFQURZKTsKCQl9CgkgICAgICBhZnRlclhQUjoKCQlpZiAoY3MtPmh3LmhmY3BjaS5pbnRfczEgJiYgY291bnQtLSkgewoJCQl2YWwgPSBjcy0+aHcuaGZjcGNpLmludF9zMTsKCQkJY3MtPmh3LmhmY3BjaS5pbnRfczEgPSAwOwoJCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJCQlkZWJ1Z2wxKGNzLCAiSEZDLVBDSSBpcnEgJXggbG9vcCAlZCIsIHZhbCwgMTUgLSBjb3VudCk7CgkJfSBlbHNlCgkJCXZhbCA9IDA7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHRpbWVyIGNhbGxiYWNrIGZvciBELWNoYW4gYnVzeSByZXNvbHV0aW9uLiBDdXJyZW50bHkgbm8gZnVuY3Rpb24gKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApoZmNwY2lfZGJ1c3lfdGltZXIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBMYXllciAxIEQtY2hhbm5lbCBoYXJkd2FyZSBhY2Nlc3MgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCkhGQ1BDSV9sMWh3KHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgcHIsIHZvaWQgKmFyZykKewoJdV9sb25nIGZsYWdzOwoJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICopIHN0LT5sMS5oYXJkd2FyZTsKCXN0cnVjdCBza19idWZmICpza2IgPSBhcmc7CgoJc3dpdGNoIChwcikgewoJCWNhc2UgKFBIX0RBVEEgfCBSRVFVRVNUKToKCQkJaWYgKGNzLT5kZWJ1ZyAmIERFQl9ETE9HX0hFWCkKCQkJCUxvZ0ZyYW1lKGNzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKCQkJaWYgKGNzLT5kZWJ1ZyAmIERFQl9ETE9HX1ZFUkJPU0UpCgkJCQlkbG9nZnJhbWUoY3MsIHNrYiwgMCk7CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlpZiAoY3MtPnR4X3NrYikgewoJCQkJc2tiX3F1ZXVlX3RhaWwoJmNzLT5zcSwgc2tiKTsKI2lmZGVmIEwyRlJBTUVfREVCVUcJCS8qIHBzYSAqLwoJCQkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9MQVBEKQoJCQkJCUxvZ2wyRnJhbWUoY3MsIHNrYiwgIlBIX0RBVEEgUXVldWVkIiwgMCk7CiNlbmRpZgoJCQl9IGVsc2UgewoJCQkJY3MtPnR4X3NrYiA9IHNrYjsKCQkJCWNzLT50eF9jbnQgPSAwOwojaWZkZWYgTDJGUkFNRV9ERUJVRwkJLyogcHNhICovCgkJCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0xBUEQpCgkJCQkJTG9nbDJGcmFtZShjcywgc2tiLCAiUEhfREFUQSIsIDApOwojZW5kaWYKCQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpKSB7CgkJCQkJaGZjcGNpX2ZpbGxfZGZpZm8oY3MpOwoJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJfSBlbHNlCgkJCQkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX2RmaWZvIGJsb2NrZWQiKTsKCgkJCX0KCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSAoUEhfUFVMTCB8IElORElDQVRJT04pOgoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJaWYgKGNzLT50eF9za2IpIHsKCQkJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfV0FSTikKCQkJCQlkZWJ1Z2wxKGNzLCAiIGwybDEgdHhfc2tiIGV4aXN0IHRoaXMgc2hvdWxkbid0IGhhcHBlbiIpOwoJCQkJc2tiX3F1ZXVlX3RhaWwoJmNzLT5zcSwgc2tiKTsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoY3MtPmRlYnVnICYgREVCX0RMT0dfSEVYKQoJCQkJTG9nRnJhbWUoY3MsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwoJCQlpZiAoY3MtPmRlYnVnICYgREVCX0RMT0dfVkVSQk9TRSkKCQkJCWRsb2dmcmFtZShjcywgc2tiLCAwKTsKCQkJY3MtPnR4X3NrYiA9IHNrYjsKCQkJY3MtPnR4X2NudCA9IDA7CiNpZmRlZiBMMkZSQU1FX0RFQlVHCQkvKiBwc2EgKi8KCQkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9MQVBEKQoJCQkJTG9nbDJGcmFtZShjcywgc2tiLCAiUEhfREFUQV9QVUxMRUQiLCAwKTsKI2VuZGlmCgkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpKSB7CgkJCQloZmNwY2lfZmlsbF9kZmlmbyhjcyk7CgkJCQl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKTsKCQkJfSBlbHNlCgkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfZGZpZm8gYmxvY2tlZCIpOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIChQSF9QVUxMIHwgUkVRVUVTVCk6CiNpZmRlZiBMMkZSQU1FX0RFQlVHCQkvKiBwc2EgKi8KCQkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9MQVBEKQoJCQkJZGVidWdsMShjcywgIi0+IFBIX1JFUVVFU1RfUFVMTCIpOwojZW5kaWYKCQkJaWYgKCFjcy0+dHhfc2tiKSB7CgkJCQl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0wxX1BVTExfUkVRLCAmc3QtPmwxLkZsYWdzKTsKCQkJCXN0LT5sMS5sMWwyKHN0LCBQSF9QVUxMIHwgQ09ORklSTSwgTlVMTCk7CgkJCX0gZWxzZQoJCQkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTDFfUFVMTF9SRVEsICZzdC0+bDEuRmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIChIV19SRVNFVCB8IFJFUVVFU1QpOgoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU1RBVEVTLCBIRkNQQ0lfTE9BRF9TVEFURSB8IDMpOwkvKiBIRkMgU1QgMyAqLwoJCQl1ZGVsYXkoNik7CgkJCVdyaXRlX2hmYyhjcywgSEZDUENJX1NUQVRFUywgMyk7CS8qIEhGQyBTVCAyICovCgkJCWNzLT5ody5oZmNwY2kubXN0X20gfD0gSEZDUENJX01BU1RFUjsKCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfTVNUX01PREUsIGNzLT5ody5oZmNwY2kubXN0X20pOwoJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TVEFURVMsIEhGQ1BDSV9BQ1RJVkFURSB8IEhGQ1BDSV9ET19BQ1RJT04pOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlsMV9tc2coY3MsIEhXX1BPV0VSVVAgfCBDT05GSVJNLCBOVUxMKTsKCQkJYnJlYWs7CgkJY2FzZSAoSFdfRU5BQkxFIHwgUkVRVUVTVCk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TVEFURVMsIEhGQ1BDSV9ET19BQ1RJT04pOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIChIV19ERUFDVElWQVRFIHwgUkVRVUVTVCk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQljcy0+aHcuaGZjcGNpLm1zdF9tICY9IH5IRkNQQ0lfTUFTVEVSOwoJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9NU1RfTU9ERSwgY3MtPmh3LmhmY3BjaS5tc3RfbSk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgKEhXX0lORk8zIHwgUkVRVUVTVCk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQljcy0+aHcuaGZjcGNpLm1zdF9tIHw9IEhGQ1BDSV9NQVNURVI7CgkJCVdyaXRlX2hmYyhjcywgSEZDUENJX01TVF9NT0RFLCBjcy0+aHcuaGZjcGNpLm1zdF9tKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSAoSFdfVEVTVExPT1AgfCBSRVFVRVNUKToKCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCXN3aXRjaCAoKGludCkgYXJnKSB7CgkJCQljYXNlICgxKToKCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9CMV9TU0wsIDB4ODApOwkvKiB0eCBzbG90ICovCgkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQjFfUlNMLCAweDgwKTsJLyogcnggc2xvdCAqLwoJCQkJCWNzLT5ody5oZmNwY2kuY29ubiA9IChjcy0+aHcuaGZjcGNpLmNvbm4gJiB+NykgfCAxOwoJCQkJCVdyaXRlX2hmYyhjcywgSEZDUENJX0NPTk5FQ1QsIGNzLT5ody5oZmNwY2kuY29ubik7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAoMik6CgkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQjJfU1NMLCAweDgxKTsJLyogdHggc2xvdCAqLwoJCQkJCVdyaXRlX2hmYyhjcywgSEZDUENJX0IyX1JTTCwgMHg4MSk7CS8qIHJ4IHNsb3QgKi8KCQkJCQljcy0+aHcuaGZjcGNpLmNvbm4gPSAoY3MtPmh3LmhmY3BjaS5jb25uICYgfjB4MzgpIHwgMHgwODsKCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DT05ORUNULCBjcy0+aHcuaGZjcGNpLmNvbm4pOwoJCQkJCWJyZWFrOwoKCQkJCWRlZmF1bHQ6CgkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX1dBUk4pCgkJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfbDFodyBsb29wIGludmFsaWQgJTR4IiwgKGludCkgYXJnKTsKCQkJCQlyZXR1cm47CgkJCX0KCQkJY3MtPmh3LmhmY3BjaS50cm0gfD0gMHg4MDsJLyogZW5hYmxlIElPTS1sb29wICovCgkJCVdyaXRlX2hmYyhjcywgSEZDUENJX1RSTSwgY3MtPmh3LmhmY3BjaS50cm0pOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX1dBUk4pCgkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2wxaHcgdW5rbm93biBwciAlNHgiLCBwcik7CgkJCWJyZWFrOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGNhbGxlZCBkdXJpbmcgaW5pdCBzZXR0aW5nIGwxIHN0YWNrIHBvaW50ZXIgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCnNldHN0YWNrX2hmY3BjaShzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7CglzdC0+bDEubDFodyA9IEhGQ1BDSV9sMWh3Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHNlbmQgQi1jaGFubmVsIGRhdGEgaWYgbm90IGJsb2NrZWQgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApoZmNwY2lfc2VuZF9kYXRhKHN0cnVjdCBCQ1N0YXRlICpiY3MpCnsKCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CgoJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQloZmNwY2lfZmlsbF9maWZvKGJjcyk7CgkJdGVzdF9hbmRfY2xlYXJfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncyk7Cgl9IGVsc2UKCQlkZWJ1Z2wxKGNzLCAic2VuZF9kYXRhICVkIGJsb2NrZWQiLCBiY3MtPmNoYW5uZWwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBhY3RpdmF0ZS9kZWFjdGl2YXRlIGhhcmR3YXJlIGZvciBzZWxlY3RlZCBjaGFubmVscyBhbmQgbW9kZSAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCm1vZGVfaGZjcGNpKHN0cnVjdCBCQ1N0YXRlICpiY3MsIGludCBtb2RlLCBpbnQgYmMpCnsKCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CglpbnQgZmlmbzI7CgoJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9IU0NYKQoJCWRlYnVnbDEoY3MsICJIRkNQQ0kgYmNoYW5uZWwgbW9kZSAlZCBiY2hhbiAlZC8lZCIsCgkJCW1vZGUsIGJjLCBiY3MtPmNoYW5uZWwpOwoJYmNzLT5tb2RlID0gbW9kZTsKCWJjcy0+Y2hhbm5lbCA9IGJjOwoJZmlmbzIgPSBiYzsKCWlmIChjcy0+Y2hhbmxpbWl0ID4gMSkgewoJCWNzLT5ody5oZmNwY2kuYnN3YXBwZWQgPSAwOwkvKiBCMSBhbmQgQjIgbm9ybWFsIG1vZGUgKi8KCQljcy0+aHcuaGZjcGNpLnNjdHJsX2UgJj0gfjB4ODA7Cgl9IGVsc2UgewoJCWlmIChiYykgewoJCQlpZiAobW9kZSAhPSBMMV9NT0RFX05VTEwpIHsKCQkJCWNzLT5ody5oZmNwY2kuYnN3YXBwZWQgPSAxOwkvKiBCMSBhbmQgQjIgZXhjaGFuZ2VkICovCgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsX2UgfD0gMHg4MDsKCQkJfSBlbHNlIHsKCQkJCWNzLT5ody5oZmNwY2kuYnN3YXBwZWQgPSAwOwkvKiBCMSBhbmQgQjIgbm9ybWFsIG1vZGUgKi8KCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfZSAmPSB+MHg4MDsKCQkJfQoJCQlmaWZvMiA9IDA7CgkJfSBlbHNlIHsKCQkJY3MtPmh3LmhmY3BjaS5ic3dhcHBlZCA9IDA7CS8qIEIxIGFuZCBCMiBub3JtYWwgbW9kZSAqLwoJCQljcy0+aHcuaGZjcGNpLnNjdHJsX2UgJj0gfjB4ODA7CgkJfQoJfQoJc3dpdGNoIChtb2RlKSB7CgkJY2FzZSAoTDFfTU9ERV9OVUxMKToKCQkJaWYgKGJjKSB7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsICY9IH5TQ1RSTF9CMl9FTkE7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsX3IgJj0gflNDVFJMX0IyX0VOQTsKCQkJfSBlbHNlIHsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmwgJj0gflNDVFJMX0IxX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfciAmPSB+U0NUUkxfQjFfRU5BOwoJCQl9CgkJCWlmIChmaWZvMikgewoJCQkJY3MtPmh3LmhmY3BjaS5maWZvX2VuICY9IH5IRkNQQ0lfRklGT0VOX0IyOwoJCQkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgJj0gfihIRkNQQ0lfSU5UU19CMlRSQU5TICsgSEZDUENJX0lOVFNfQjJSRUMpOwoJCQl9IGVsc2UgewoJCQkJY3MtPmh3LmhmY3BjaS5maWZvX2VuICY9IH5IRkNQQ0lfRklGT0VOX0IxOwoJCQkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgJj0gfihIRkNQQ0lfSU5UU19CMVRSQU5TICsgSEZDUENJX0lOVFNfQjFSRUMpOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgKEwxX01PREVfVFJBTlMpOgoJCSAgICAgICAgaGZjcGNpX2NsZWFyX2ZpZm9fcngoY3MsIGZpZm8yKTsKCQkgICAgICAgIGhmY3BjaV9jbGVhcl9maWZvX3R4KGNzLCBmaWZvMik7CgkJCWlmIChiYykgewoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybCB8PSBTQ1RSTF9CMl9FTkE7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsX3IgfD0gU0NUUkxfQjJfRU5BOwoJCQl9IGVsc2UgewoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybCB8PSBTQ1RSTF9CMV9FTkE7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsX3IgfD0gU0NUUkxfQjFfRU5BOwoJCQl9CgkJCWlmIChmaWZvMikgewoJCQkJY3MtPmh3LmhmY3BjaS5maWZvX2VuIHw9IEhGQ1BDSV9GSUZPRU5fQjI7CgkJCQljcy0+aHcuaGZjcGNpLmludF9tMSB8PSAoSEZDUENJX0lOVFNfQjJUUkFOUyArIEhGQ1BDSV9JTlRTX0IyUkVDKTsKCQkJCWNzLT5ody5oZmNwY2kuY3RtdCB8PSAyOwoJCQkJY3MtPmh3LmhmY3BjaS5jb25uICY9IH4weDE4OwoJCQl9IGVsc2UgewoJCQkJY3MtPmh3LmhmY3BjaS5maWZvX2VuIHw9IEhGQ1BDSV9GSUZPRU5fQjE7CgkJCQljcy0+aHcuaGZjcGNpLmludF9tMSB8PSAoSEZDUENJX0lOVFNfQjFUUkFOUyArIEhGQ1BDSV9JTlRTX0IxUkVDKTsKCQkJCWNzLT5ody5oZmNwY2kuY3RtdCB8PSAxOwoJCQkJY3MtPmh3LmhmY3BjaS5jb25uICY9IH4weDAzOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgKEwxX01PREVfSERMQyk6CgkJICAgICAgICBoZmNwY2lfY2xlYXJfZmlmb19yeChjcywgZmlmbzIpOwoJCSAgICAgICAgaGZjcGNpX2NsZWFyX2ZpZm9fdHgoY3MsIGZpZm8yKTsKCQkJaWYgKGJjKSB7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsIHw9IFNDVFJMX0IyX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfciB8PSBTQ1RSTF9CMl9FTkE7CgkJCX0gZWxzZSB7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsIHw9IFNDVFJMX0IxX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfciB8PSBTQ1RSTF9CMV9FTkE7CgkJCX0KCQkJaWYgKGZpZm8yKSB7CgkJCSAgICAgICAgY3MtPmh3LmhmY3BjaS5sYXN0X2JmaWZvX2NudFsxXSA9IDA7ICAKCQkJCWNzLT5ody5oZmNwY2kuZmlmb19lbiB8PSBIRkNQQ0lfRklGT0VOX0IyOwoJCQkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgfD0gKEhGQ1BDSV9JTlRTX0IyVFJBTlMgKyBIRkNQQ0lfSU5UU19CMlJFQyk7CgkJCQljcy0+aHcuaGZjcGNpLmN0bXQgJj0gfjI7CgkJCQljcy0+aHcuaGZjcGNpLmNvbm4gJj0gfjB4MTg7CgkJCX0gZWxzZSB7CgkJCSAgICAgICAgY3MtPmh3LmhmY3BjaS5sYXN0X2JmaWZvX2NudFswXSA9IDA7ICAKCQkJCWNzLT5ody5oZmNwY2kuZmlmb19lbiB8PSBIRkNQQ0lfRklGT0VOX0IxOwoJCQkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgfD0gKEhGQ1BDSV9JTlRTX0IxVFJBTlMgKyBIRkNQQ0lfSU5UU19CMVJFQyk7CgkJCQljcy0+aHcuaGZjcGNpLmN0bXQgJj0gfjE7CgkJCQljcy0+aHcuaGZjcGNpLmNvbm4gJj0gfjB4MDM7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSAoTDFfTU9ERV9FWFRSTik6CgkJCWlmIChiYykgewoJCQkJY3MtPmh3LmhmY3BjaS5jb25uIHw9IDB4MTA7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsIHw9IFNDVFJMX0IyX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfciB8PSBTQ1RSTF9CMl9FTkE7CgkJCQljcy0+aHcuaGZjcGNpLmZpZm9fZW4gJj0gfkhGQ1BDSV9GSUZPRU5fQjI7CgkJCQljcy0+aHcuaGZjcGNpLmludF9tMSAmPSB+KEhGQ1BDSV9JTlRTX0IyVFJBTlMgKyBIRkNQQ0lfSU5UU19CMlJFQyk7CgkJCX0gZWxzZSB7CgkJCQljcy0+aHcuaGZjcGNpLmNvbm4gfD0gMHgwMjsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmwgfD0gU0NUUkxfQjFfRU5BOwoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybF9yIHw9IFNDVFJMX0IxX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuZmlmb19lbiAmPSB+SEZDUENJX0ZJRk9FTl9CMTsKCQkJCWNzLT5ody5oZmNwY2kuaW50X20xICY9IH4oSEZDUENJX0lOVFNfQjFUUkFOUyArIEhGQ1BDSV9JTlRTX0IxUkVDKTsKCQkJfQoJCQlicmVhazsKCX0KCVdyaXRlX2hmYyhjcywgSEZDUENJX1NDVFJMX0UsIGNzLT5ody5oZmNwY2kuc2N0cmxfZSk7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTEsIGNzLT5ody5oZmNwY2kuaW50X20xKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0ZJRk9fRU4sIGNzLT5ody5oZmNwY2kuZmlmb19lbik7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TQ1RSTCwgY3MtPmh3LmhmY3BjaS5zY3RybCk7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TQ1RSTF9SLCBjcy0+aHcuaGZjcGNpLnNjdHJsX3IpOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ1RNVCwgY3MtPmh3LmhmY3BjaS5jdG10KTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0NPTk5FQ1QsIGNzLT5ody5oZmNwY2kuY29ubik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIExheWVyMiAtPiBMYXllciAxIFRyYW5zZmVyICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmhmY3BjaV9sMmwxKHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgcHIsIHZvaWQgKmFyZykKewoJc3RydWN0IEJDU3RhdGUJKmJjcyA9IHN0LT5sMS5iY3M7Cgl1X2xvbmcJCWZsYWdzOwoJc3RydWN0IHNrX2J1ZmYJKnNrYiA9IGFyZzsKCglzd2l0Y2ggKHByKSB7CgkJY2FzZSAoUEhfREFUQSB8IFJFUVVFU1QpOgoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmNzLT5jcy0+bG9jaywgZmxhZ3MpOwoJCQlpZiAoYmNzLT50eF9za2IpIHsKCQkJCXNrYl9xdWV1ZV90YWlsKCZiY3MtPnNxdWV1ZSwgc2tiKTsKCQkJfSBlbHNlIHsKCQkJCWJjcy0+dHhfc2tiID0gc2tiOwovLwkJCQl0ZXN0X2FuZF9zZXRfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKTsKIAkJCQliY3MtPmNzLT5CQ19TZW5kX0RhdGEoYmNzKTsKCQkJfQoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgKFBIX1BVTEwgfCBJTkRJQ0FUSU9OKToKCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQkJaWYgKGJjcy0+dHhfc2tiKSB7CgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZmNfbDJsMTogdGhpcyBzaG91bGRuJ3QgaGFwcGVuXG4iKTsKCQkJCWJyZWFrOwoJCQl9Ci8vCQkJdGVzdF9hbmRfc2V0X2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZyk7CgkJCWJjcy0+dHhfc2tiID0gc2tiOwoJCQliY3MtPmNzLT5CQ19TZW5kX0RhdGEoYmNzKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmNzLT5jcy0+bG9jaywgZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIChQSF9QVUxMIHwgUkVRVUVTVCk6CgkJCWlmICghYmNzLT50eF9za2IpIHsKCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDFfUFVMTF9SRVEsICZzdC0+bDEuRmxhZ3MpOwoJCQkJc3QtPmwxLmwxbDIoc3QsIFBIX1BVTEwgfCBDT05GSVJNLCBOVUxMKTsKCQkJfSBlbHNlCgkJCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MMV9QVUxMX1JFUSwgJnN0LT5sMS5GbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgKFBIX0FDVElWQVRFIHwgUkVRVUVTVCk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJCXRlc3RfYW5kX3NldF9iaXQoQkNfRkxHX0FDVElWLCAmYmNzLT5GbGFnKTsKCQkJbW9kZV9oZmNwY2koYmNzLCBzdC0+bDEubW9kZSwgc3QtPmwxLmJjKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmNzLT5jcy0+bG9jaywgZmxhZ3MpOwoJCQlsMV9tc2dfYihzdCwgcHIsIGFyZyk7CgkJCWJyZWFrOwoJCWNhc2UgKFBIX0RFQUNUSVZBVEUgfCBSRVFVRVNUKToKCQkJbDFfbXNnX2Ioc3QsIHByLCBhcmcpOwoJCQlicmVhazsKCQljYXNlIChQSF9ERUFDVElWQVRFIHwgQ09ORklSTSk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJCXRlc3RfYW5kX2NsZWFyX2JpdChCQ19GTEdfQUNUSVYsICZiY3MtPkZsYWcpOwoJCQl0ZXN0X2FuZF9jbGVhcl9iaXQoQkNfRkxHX0JVU1ksICZiY3MtPkZsYWcpOwoJCQltb2RlX2hmY3BjaShiY3MsIDAsIHN0LT5sMS5iYyk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQkJc3QtPmwxLmwxbDIoc3QsIFBIX0RFQUNUSVZBVEUgfCBDT05GSVJNLCBOVUxMKTsKCQkJYnJlYWs7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGRlYWN0aXZhdGUgQi1jaGFubmVsIGFjY2VzcyBhbmQgcXVldWVzICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmNsb3NlX2hmY3BjaShzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQp7Cgltb2RlX2hmY3BjaShiY3MsIDAsIGJjcy0+Y2hhbm5lbCk7CglpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJDX0ZMR19JTklULCAmYmNzLT5GbGFnKSkgewoJCXNrYl9xdWV1ZV9wdXJnZSgmYmNzLT5ycXVldWUpOwoJCXNrYl9xdWV1ZV9wdXJnZSgmYmNzLT5zcXVldWUpOwoJCWlmIChiY3MtPnR4X3NrYikgewoJCQlkZXZfa2ZyZWVfc2tiX2FueShiY3MtPnR4X3NrYik7CgkJCWJjcy0+dHhfc2tiID0gTlVMTDsKCQkJdGVzdF9hbmRfY2xlYXJfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKTsKCQl9Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBpbml0IEItY2hhbm5lbCBxdWV1ZXMgYW5kIGNvbnRyb2wgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKb3Blbl9oZmNwY2lzdGF0ZShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHN0cnVjdCBCQ1N0YXRlICpiY3MpCnsKCWlmICghdGVzdF9hbmRfc2V0X2JpdChCQ19GTEdfSU5JVCwgJmJjcy0+RmxhZykpIHsKCQlza2JfcXVldWVfaGVhZF9pbml0KCZiY3MtPnJxdWV1ZSk7CgkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYmNzLT5zcXVldWUpOwoJfQoJYmNzLT50eF9za2IgPSBOVUxMOwoJdGVzdF9hbmRfY2xlYXJfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKTsKCWJjcy0+ZXZlbnQgPSAwOwoJYmNzLT50eF9jbnQgPSAwOwoJcmV0dXJuICgwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogaW5pdHMgdGhlIHN0YWNrIGZvciBCLWNoYW5uZWwgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludApzZXRzdGFja18yYihzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IEJDU3RhdGUgKmJjcykKewoJYmNzLT5jaGFubmVsID0gc3QtPmwxLmJjOwoJaWYgKG9wZW5faGZjcGNpc3RhdGUoc3QtPmwxLmhhcmR3YXJlLCBiY3MpKQoJCXJldHVybiAoLTEpOwoJc3QtPmwxLmJjcyA9IGJjczsKCXN0LT5sMi5sMmwxID0gaGZjcGNpX2wybDE7CglzZXRzdGFja19tYW5hZ2VyKHN0KTsKCWJjcy0+c3QgPSBzdDsKCXNldHN0YWNrX2wxX0Ioc3QpOwoJcmV0dXJuICgwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogaGFuZGxlIEwxIHN0YXRlIGNoYW5nZXMgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKaGZjcGNpX2JoKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKewoJdV9sb25nCWZsYWdzOwovLyAgICAgIHN0cnVjdCBQU3RhY2sgKnN0cHRyOwoKCWlmICghY3MpCgkJcmV0dXJuOwoJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEX0wxU1RBVEVDSEFOR0UsICZjcy0+ZXZlbnQpKSB7CgkJaWYgKCFjcy0+aHcuaGZjcGNpLm50X21vZGUpCgkJCXN3aXRjaCAoY3MtPmRjLmhmY3BjaS5waF9zdGF0ZSkgewoJCQkJY2FzZSAoMCk6CgkJCQkJbDFfbXNnKGNzLCBIV19SRVNFVCB8IElORElDQVRJT04sIE5VTEwpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAoMyk6CgkJCQkJbDFfbXNnKGNzLCBIV19ERUFDVElWQVRFIHwgSU5ESUNBVElPTiwgTlVMTCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICg4KToKCQkJCQlsMV9tc2coY3MsIEhXX1JTWU5DIHwgSU5ESUNBVElPTiwgTlVMTCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICg2KToKCQkJCQlsMV9tc2coY3MsIEhXX0lORk8yIHwgSU5ESUNBVElPTiwgTlVMTCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICg3KToKCQkJCQlsMV9tc2coY3MsIEhXX0lORk80X1A4IHwgSU5ESUNBVElPTiwgTlVMTCk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCX0gZWxzZSB7CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlzd2l0Y2ggKGNzLT5kYy5oZmNwY2kucGhfc3RhdGUpIHsKCQkJCWNhc2UgKDIpOgoJCQkJCWlmIChjcy0+aHcuaGZjcGNpLm50X3RpbWVyIDwgMCkgewoJCQkJCQljcy0+aHcuaGZjcGNpLm50X3RpbWVyID0gMDsKCQkJCQkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgJj0gfkhGQ1BDSV9JTlRTX1RJTUVSOwoJCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTEsIGNzLT5ody5oZmNwY2kuaW50X20xKTsKCQkJCQkJLyogQ2xlYXIgYWxyZWFkeSBwZW5kaW5nIGludHMgKi8KCQkJCQkJaWYgKFJlYWRfaGZjKGNzLCBIRkNQQ0lfSU5UX1MxKSk7CgkJCQkJCVdyaXRlX2hmYyhjcywgSEZDUENJX1NUQVRFUywgNCB8IEhGQ1BDSV9MT0FEX1NUQVRFKTsKCQkJCQkJdWRlbGF5KDEwKTsKCQkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU1RBVEVTLCA0KTsKCQkJCQkJY3MtPmRjLmhmY3BjaS5waF9zdGF0ZSA9IDQ7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgfD0gSEZDUENJX0lOVFNfVElNRVI7CgkJCQkJCVdyaXRlX2hmYyhjcywgSEZDUENJX0lOVF9NMSwgY3MtPmh3LmhmY3BjaS5pbnRfbTEpOwoJCQkJCQljcy0+aHcuaGZjcGNpLmN0bXQgJj0gfkhGQ1BDSV9BVVRPX1RJTUVSOwoJCQkJCQljcy0+aHcuaGZjcGNpLmN0bXQgfD0gSEZDUENJX1RJTTNfMTI1OwoJCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DVE1ULCBjcy0+aHcuaGZjcGNpLmN0bXQgfCBIRkNQQ0lfQ0xUSU1FUik7CgkJCQkJCVdyaXRlX2hmYyhjcywgSEZDUENJX0NUTVQsIGNzLT5ody5oZmNwY2kuY3RtdCB8IEhGQ1BDSV9DTFRJTUVSKTsKCQkJCQkJY3MtPmh3LmhmY3BjaS5udF90aW1lciA9IE5UX1QxX0NPVU5UOwoJCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TVEFURVMsIDIgfCBIRkNQQ0lfTlRfRzJfRzMpOwkvKiBhbGxvdyBHMiAtPiBHMyB0cmFuc2l0aW9uICovCgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAoMSk6CgkJCQljYXNlICgzKToKCQkJCWNhc2UgKDQpOgoJCQkJCWNzLT5ody5oZmNwY2kubnRfdGltZXIgPSAwOwoJCQkJCWNzLT5ody5oZmNwY2kuaW50X20xICY9IH5IRkNQQ0lfSU5UU19USU1FUjsKCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTEsIGNzLT5ody5oZmNwY2kuaW50X20xKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCX0KCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQl9Cgl9CglpZiAodGVzdF9hbmRfY2xlYXJfYml0KERfUkNWQlVGUkVBRFksICZjcy0+ZXZlbnQpKQoJCURDaGFubmVsX3Byb2NfcmN2KGNzKTsKCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRF9YTVRCVUZSRUFEWSwgJmNzLT5ldmVudCkpCgkJRENoYW5uZWxfcHJvY194bXQoY3MpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBjYWxsZWQgZm9yIGNhcmQgaW5pdCBtZXNzYWdlICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBfX2luaXQKaW5pdGhmY3BjaShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCnsKCWNzLT5iY3NbMF0uQkNfU2V0U3RhY2sgPSBzZXRzdGFja18yYjsKCWNzLT5iY3NbMV0uQkNfU2V0U3RhY2sgPSBzZXRzdGFja18yYjsKCWNzLT5iY3NbMF0uQkNfQ2xvc2UgPSBjbG9zZV9oZmNwY2k7Cgljcy0+YmNzWzFdLkJDX0Nsb3NlID0gY2xvc2VfaGZjcGNpOwoJY3MtPmRidXN5dGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSBoZmNwY2lfZGJ1c3lfdGltZXI7Cgljcy0+ZGJ1c3l0aW1lci5kYXRhID0gKGxvbmcpIGNzOwoJaW5pdF90aW1lcigmY3MtPmRidXN5dGltZXIpOwoJbW9kZV9oZmNwY2koY3MtPmJjcywgMCwgMCk7Cgltb2RlX2hmY3BjaShjcy0+YmNzICsgMSwgMCwgMSk7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGhhbmRsZSBjYXJkIG1lc3NhZ2VzIGZyb20gY29udHJvbCBsYXllciAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludApoZmNwY2lfY2FyZF9tc2coc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgbXQsIHZvaWQgKmFyZykKewoJdV9sb25nIGZsYWdzOwoKCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKCQlkZWJ1Z2wxKGNzLCAiSEZDUENJOiBjYXJkX21zZyAleCIsIG10KTsKCXN3aXRjaCAobXQpIHsKCQljYXNlIENBUkRfUkVTRVQ6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlyZXNldF9oZmNwY2koY3MpOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlyZXR1cm4gKDApOwoJCWNhc2UgQ0FSRF9SRUxFQVNFOgoJCQlyZWxlYXNlX2lvX2hmY3BjaShjcyk7CgkJCXJldHVybiAoMCk7CgkJY2FzZSBDQVJEX0lOSVQ6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlpbml0aGZjcGNpKGNzKTsKCQkJcmVzZXRfaGZjcGNpKGNzKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJbXNsZWVwKDgwKTsJCQkJLyogVGltZW91dCA4MG1zICovCgkJCS8qIG5vdyBzd2l0Y2ggdGltZXIgaW50ZXJydXB0IG9mZiAqLwoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgJj0gfkhGQ1BDSV9JTlRTX1RJTUVSOwoJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTEsIGNzLT5ody5oZmNwY2kuaW50X20xKTsKCQkJLyogcmVpbml0IG1vZGUgcmVnICovCgkJCVdyaXRlX2hmYyhjcywgSEZDUENJX01TVF9NT0RFLCBjcy0+aHcuaGZjcGNpLm1zdF9tKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJcmV0dXJuICgwKTsKCQljYXNlIENBUkRfVEVTVDoKCQkJcmV0dXJuICgwKTsKCX0KCXJldHVybiAoMCk7Cn0KCgovKiB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYXMgY2FyZCBpbmRleCB3aGVuIG1vcmUgdGhhbiBvbmUgY2FyZHMgYXJlIHByZXNlbnQgKi8Kc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpkZXZfaGZjcGNpIF9faW5pdGRhdGEgPSBOVUxMOwoKI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KCmludCBfX2luaXQKc2V0dXBfaGZjcGNpKHN0cnVjdCBJc2RuQ2FyZCAqY2FyZCkKewoJdV9sb25nIGZsYWdzOwoJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gY2FyZC0+Y3M7CgljaGFyIHRtcFs2NF07CglpbnQgaTsKCXN0cnVjdCBwY2lfZGV2ICp0bXBfaGZjcGNpID0gTlVMTDsKCiNpZmRlZiBfX0JJR19FTkRJQU4KI2Vycm9yICJub3QgcnVubmluZyBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzIG5vdyIKI2VuZGlmCglzdHJjcHkodG1wLCBoZmNwY2lfcmV2aXNpb24pOwoJcHJpbnRrKEtFUk5fSU5GTyAiSGlTYXg6IEhGQy1QQ0kgZHJpdmVyIFJldi4gJXNcbiIsIEhpU2F4X2dldHJldih0bXApKTsKI2lmZGVmIENPTkZJR19QQ0kKCWNzLT5ody5oZmNwY2kuaW50X3MxID0gMDsKCWNzLT5kYy5oZmNwY2kucGhfc3RhdGUgPSAwOwoJY3MtPmh3LmhmY3BjaS5maWZvID0gMjU1OwoJaWYgKGNzLT50eXAgPT0gSVNETl9DVFlQRV9IRkNfUENJKSB7CgkJaSA9IDA7CgkJd2hpbGUgKGlkX2xpc3RbaV0udmVuZG9yX2lkKSB7CgkJCXRtcF9oZmNwY2kgPSBwY2lfZmluZF9kZXZpY2UoaWRfbGlzdFtpXS52ZW5kb3JfaWQsCgkJCQkJCSAgICAgaWRfbGlzdFtpXS5kZXZpY2VfaWQsCgkJCQkJCSAgICAgZGV2X2hmY3BjaSk7CgkJCWkrKzsKCQkJaWYgKHRtcF9oZmNwY2kpIHsKCQkJCWlmIChwY2lfZW5hYmxlX2RldmljZSh0bXBfaGZjcGNpKSkKCQkJCQljb250aW51ZTsKCQkJCXBjaV9zZXRfbWFzdGVyKHRtcF9oZmNwY2kpOwoJCQkJaWYgKChjYXJkLT5wYXJhWzBdKSAmJiAoY2FyZC0+cGFyYVswXSAhPSAodG1wX2hmY3BjaS0+cmVzb3VyY2VbIDBdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLKSkpCgkJCQkJY29udGludWU7CgkJCQllbHNlCgkJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlmICh0bXBfaGZjcGNpKSB7CgkJCWktLTsKCQkJZGV2X2hmY3BjaSA9IHRtcF9oZmNwY2k7CS8qIG9sZCBkZXZpY2UgKi8KCQkJY3MtPmh3LmhmY3BjaS5kZXYgPSBkZXZfaGZjcGNpOwoJCQljcy0+aXJxID0gZGV2X2hmY3BjaS0+aXJxOwoJCQlpZiAoIWNzLT5pcnEpIHsKCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhGQy1QQ0k6IE5vIElSUSBmb3IgUENJIGNhcmQgZm91bmRcbiIpOwoJCQkJcmV0dXJuICgwKTsKCQkJfQoJCQljcy0+aHcuaGZjcGNpLnBjaV9pbyA9IChjaGFyICopIGRldl9oZmNwY2ktPnJlc291cmNlWyAxXS5zdGFydDsKCQkJcHJpbnRrKEtFUk5fSU5GTyAiSGlTYXg6IEhGQy1QQ0kgY2FyZCBtYW51ZmFjdHVyZXI6ICVzIGNhcmQgbmFtZTogJXNcbiIsIGlkX2xpc3RbaV0udmVuZG9yX25hbWUsIGlkX2xpc3RbaV0uY2FyZF9uYW1lKTsKCQl9IGVsc2UgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJIRkMtUENJOiBObyBQQ0kgY2FyZCBmb3VuZFxuIik7CgkJCXJldHVybiAoMCk7CgkJfQoJCWlmICghY3MtPmh3LmhmY3BjaS5wY2lfaW8pIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSEZDLVBDSTogTm8gSU8tTWVtIGZvciBQQ0kgY2FyZCBmb3VuZFxuIik7CgkJCXJldHVybiAoMCk7CgkJfQoJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgRklGT1MgKi8KCQkvKiBCZWNhdXNlIHRoZSBIRkMtUENJIG5lZWRzIGEgMzJLIHBoeXNpY2FsIGFsaWdubWVudCwgd2UgKi8KCQkvKiBuZWVkIHRvIGFsbG9jYXRlIHRoZSBkb3VibGUgbWVtIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyAqLwoJCWlmICghKGNzLT5ody5oZmNwY2kuc2hhcmVfc3RhcnQgPSBrbWFsbG9jKDY1NTM2LCBHRlBfS0VSTkVMKSkpIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSEZDLVBDSTogRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIEZJRk8hXG4iKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWNzLT5ody5oZmNwY2kuZmlmb3MgPSAodm9pZCAqKQoJCSAgICAoKCh1bG9uZykgY3MtPmh3LmhmY3BjaS5zaGFyZV9zdGFydCkgJiB+MHg3RkZGKSArIDB4ODAwMDsKCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNzLT5ody5oZmNwY2kuZGV2LCAweDgwLCAodV9pbnQpIHZpcnRfdG9fYnVzKGNzLT5ody5oZmNwY2kuZmlmb3MpKTsKCQljcy0+aHcuaGZjcGNpLnBjaV9pbyA9IGlvcmVtYXAoKHVsb25nKSBjcy0+aHcuaGZjcGNpLnBjaV9pbywgMjU2KTsKCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJIRkMtUENJOiBkZWZpbmVkIGF0IG1lbSAlI3ggZmlmbyAlI3goJSN4KSBJUlEgJWQgSFogJWRcbiIsCgkJICAgICAgICh1X2ludCkgY3MtPmh3LmhmY3BjaS5wY2lfaW8sCgkJICAgICAgICh1X2ludCkgY3MtPmh3LmhmY3BjaS5maWZvcywKCQkgICAgICAgKHVfaW50KSB2aXJ0X3RvX2J1cyhjcy0+aHcuaGZjcGNpLmZpZm9zKSwKCQkgICAgICAgY3MtPmlycSwgSFopOwoJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCXBjaV93cml0ZV9jb25maWdfd29yZChjcy0+aHcuaGZjcGNpLmRldiwgUENJX0NPTU1BTkQsIFBDSV9FTkFfTUVNSU8pOwkvKiBlbmFibGUgbWVtb3J5IG1hcHBlZCBwb3J0cywgZGlzYWJsZSBidXNtYXN0ZXIgKi8KCQljcy0+aHcuaGZjcGNpLmludF9tMiA9IDA7CS8qIGRpc2FibGUgYWxsZSBpbnRlcnJ1cHRzICovCgkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgPSAwOwoJCVdyaXRlX2hmYyhjcywgSEZDUENJX0lOVF9NMSwgY3MtPmh3LmhmY3BjaS5pbnRfbTEpOwoJCVdyaXRlX2hmYyhjcywgSEZDUENJX0lOVF9NMiwgY3MtPmh3LmhmY3BjaS5pbnRfbTIpOwoJCS8qIEF0IHRoaXMgcG9pbnQgdGhlIG5lZWRlZCBQQ0kgY29uZmlnIGlzIGRvbmUgKi8KCQkvKiBmaWZvcyBhcmUgc3RpbGwgbm90IGVuYWJsZWQgKi8KCQlJTklUX1dPUksoJmNzLT50cXVldWUsICh2b2lkICopKHZvaWQgKikgaGZjcGNpX2JoLCBjcyk7CgkJY3MtPnNldHN0YWNrX2QgPSBzZXRzdGFja19oZmNwY2k7CgkJY3MtPkJDX1NlbmRfRGF0YSA9ICZoZmNwY2lfc2VuZF9kYXRhOwoJCWNzLT5yZWFkaXNhYyA9IE5VTEw7CgkJY3MtPndyaXRlaXNhYyA9IE5VTEw7CgkJY3MtPnJlYWRpc2FjZmlmbyA9IE5VTEw7CgkJY3MtPndyaXRlaXNhY2ZpZm8gPSBOVUxMOwoJCWNzLT5CQ19SZWFkX1JlZyA9IE5VTEw7CgkJY3MtPkJDX1dyaXRlX1JlZyA9IE5VTEw7CgkJY3MtPmlycV9mdW5jID0gJmhmY3BjaV9pbnRlcnJ1cHQ7CgkJY3MtPmlycV9mbGFncyB8PSBTQV9TSElSUTsKCQljcy0+aHcuaGZjcGNpLnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikgaGZjcGNpX1RpbWVyOwoJCWNzLT5ody5oZmNwY2kudGltZXIuZGF0YSA9IChsb25nKSBjczsKCQlpbml0X3RpbWVyKCZjcy0+aHcuaGZjcGNpLnRpbWVyKTsKCQljcy0+Y2FyZG1zZyA9ICZoZmNwY2lfY2FyZF9tc2c7CgkJY3MtPmF1eGNtZCA9ICZoZmNwY2lfYXV4Y21kOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJcmV0dXJuICgxKTsKCX0gZWxzZQoJCXJldHVybiAoMCk7CS8qIG5vIHZhbGlkIGNhcmQgdHlwZSAqLwojZWxzZQoJcHJpbnRrKEtFUk5fV0FSTklORyAiSEZDLVBDSTogTk9fUENJX0JJT1NcbiIpOwoJcmV0dXJuICgwKTsKI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KfQo=