LyoKICogVGVycmFUZWMgQ2luZXJneSBUsi9xYW51IFVTQjIgRFZCLVQgYWRhcHRlci4KICoKICogQ29weXJpZ2h0IChDKSAyMDA0IERhbmllbCBNYWNrIDxkYW5pZWxAcWFudS5kZT4gYW5kCiAqCQkgICAgSG9sZ2VyIFdhZWNodGxlciA8aG9sZ2VyQHFhbnUuZGU+CiAqCiAqICBQcm90b2NvbCBTcGVjIHB1Ymxpc2hlZCBvbiBodHRwOi8vcWFudS5kZS9zcGVjcy90ZXJyYXRlY19jaW5lcmd5VDIucGRmCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgojaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgojaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCiNpbmNsdWRlICJkbXhkZXYuaCIKI2luY2x1ZGUgImR2Yl9kZW11eC5oIgojaW5jbHVkZSAiZHZiX25ldC5oIgoKI2lmZGVmIENPTkZJR19EVkJfQ0lORVJHWVQyX1RVTklORwoJI2RlZmluZSBTVFJFQU1fVVJCX0NPVU5UIChDT05GSUdfRFZCX0NJTkVSR1lUMl9TVFJFQU1fVVJCX0NPVU5UKQoJI2RlZmluZSBTVFJFQU1fQlVGX1NJWkUgKENPTkZJR19EVkJfQ0lORVJHWVQyX1NUUkVBTV9CVUZfU0laRSkKCSNkZWZpbmUgUVVFUllfSU5URVJWQUwgKENPTkZJR19EVkJfQ0lORVJHWVQyX1FVRVJZX0lOVEVSVkFMKQoJI2lmZGVmIENPTkZJR19EVkJfQ0lORVJHWVQyX0VOQUJMRV9SQ19JTlBVVF9ERVZJQ0UKCQkjZGVmaW5lIFJDX1FVRVJZX0lOVEVSVkFMIChDT05GSUdfRFZCX0NJTkVSR1lUMl9SQ19RVUVSWV9JTlRFUlZBTCkKCQkjZGVmaW5lIEVOQUJMRV9SQyAoMSkKCSNlbmRpZgojZWxzZQoJI2RlZmluZSBTVFJFQU1fVVJCX0NPVU5UICgzMikKCSNkZWZpbmUgU1RSRUFNX0JVRl9TSVpFICg1MTIpCS8qIGJ5dGVzICovCgkjZGVmaW5lIEVOQUJMRV9SQyAoMSkKCSNkZWZpbmUgUkNfUVVFUllfSU5URVJWQUwgKDUwKQkvKiBtaWxsaXNlY29uZHMgKi8KCSNkZWZpbmUgUVVFUllfSU5URVJWQUwgKDMzMykJLyogbWlsbGlzZWNvbmRzICovCiNlbmRpZgoKI2RlZmluZSBEUklWRVJfTkFNRSAiVGVycmFUZWMvcWFudSBVU0IyLjAgSGlnaHNwZWVkIERWQi1UIFJlY2VpdmVyIgoKc3RhdGljIGludCBkZWJ1ZzsKbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkZWJ1ZywgaW50LCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOwoKI2RlZmluZSBkcHJpbnRrKGxldmVsLCBhcmdzLi4uKQkJCQkJCVwKZG8gewkJCQkJCQkJCVwKCWlmICgoZGVidWcgJiBsZXZlbCkpIHsJCQkJCQlcCgkJcHJpbnRrKCIlczogJXMoKTogIiwgS0JVSUxEX01PRE5BTUUsCQkJXAoJCSAgICAgICBfX0ZVTkNUSU9OX18pOwkJCQkJXAoJCXByaW50ayhhcmdzKTsgfQkJCQkJCVwKfSB3aGlsZSAoMCkKCmVudW0gY2luZXJneXQyX2VwMV9jbWQgewoJQ0lORVJHWVQyX0VQMV9QSURfVEFCTEVfUkVTRVQJCT0gMHgwMSwKCUNJTkVSR1lUMl9FUDFfUElEX1NFVFVQCQkJPSAweDAyLAoJQ0lORVJHWVQyX0VQMV9DT05UUk9MX1NUUkVBTV9UUkFOU0ZFUgk9IDB4MDMsCglDSU5FUkdZVDJfRVAxX1NFVF9UVU5FUl9QQVJBTUVURVJTCT0gMHgwNCwKCUNJTkVSR1lUMl9FUDFfR0VUX1RVTkVSX1NUQVRVUwkJPSAweDA1LAoJQ0lORVJHWVQyX0VQMV9TVEFSVF9TQ0FOCQk9IDB4MDYsCglDSU5FUkdZVDJfRVAxX0NPTlRJTlVFX1NDQU4JCT0gMHgwNywKCUNJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUwkJPSAweDA4LAoJQ0lORVJHWVQyX0VQMV9TTEVFUF9NT0RFCQk9IDB4MDkKfTsKCnN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyB7Cgl1aW50OF90IGNtZDsKCXVpbnQzMl90IGZyZXE7Cgl1aW50OF90IGJhbmR3aWR0aDsKCXVpbnQxNl90IHRwczsKCXVpbnQ4X3QgZmxhZ3M7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgpzdHJ1Y3QgZHZidF9nZXRfc3RhdHVzX21zZyB7Cgl1aW50MzJfdCBmcmVxOwoJdWludDhfdCBiYW5kd2lkdGg7Cgl1aW50MTZfdCB0cHM7Cgl1aW50OF90IGZsYWdzOwoJdWludDE2X3QgZ2FpbjsKCXVpbnQ4X3Qgc25yOwoJdWludDMyX3Qgdml0ZXJiaV9lcnJvcl9yYXRlOwoJdWludDMyX3QgcnNfZXJyb3JfcmF0ZTsKCXVpbnQzMl90IHVuY29ycmVjdGVkX2Jsb2NrX2NvdW50OwoJdWludDhfdCBsb2NrX2JpdHM7Cgl1aW50OF90IHByZXZfbG9ja19iaXRzOwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbyBjaW5lcmd5dDJfZmVfaW5mbyA9IHsKCS5uYW1lID0gRFJJVkVSX05BTUUsCgkudHlwZSA9IEZFX09GRE0sCgkuZnJlcXVlbmN5X21pbiA9IDE3NDAwMDAwMCwKCS5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwLAoJLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDE2NjY2NywKCS5jYXBzID0gRkVfQ0FOX0lOVkVSU0lPTl9BVVRPIHwgRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8CgkJRkVfQ0FOX0ZFQ18zXzQgfCBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwKCQlGRV9DQU5fRkVDX0FVVE8gfAoJCUZFX0NBTl9RUFNLIHwgRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAoJCUZFX0NBTl9UUkFOU01JU1NJT05fTU9ERV9BVVRPIHwgRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAoJCUZFX0NBTl9ISUVSQVJDSFlfQVVUTyB8IEZFX0NBTl9SRUNPVkVSIHwgRkVfQ0FOX01VVEVfVFMKfTsKCnN0cnVjdCBjaW5lcmd5dDIgewoJc3RydWN0IGR2Yl9kZW11eCBkZW11eDsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwoJc3RydWN0IG11dGV4IHNlbTsKCXN0cnVjdCBtdXRleCB3cV9zZW07CglzdHJ1Y3QgZHZiX2FkYXB0ZXIgYWRhcHRlcjsKCXN0cnVjdCBkdmJfZGV2aWNlICpmZWRldjsKCXN0cnVjdCBkbXhkZXYgZG14ZGV2OwoJc3RydWN0IGR2Yl9uZXQgZHZibmV0OwoKCWludCBzdHJlYW1pbmc7CglpbnQgc2xlZXBpbmc7CgoJc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnIHBhcmFtOwoJc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgc3RhdHVzOwoJc3RydWN0IGRlbGF5ZWRfd29yayBxdWVyeV93b3JrOwoKCXdhaXRfcXVldWVfaGVhZF90IHBvbGxfd3E7CglpbnQgcGVuZGluZ19mZV9ldmVudHM7CglpbnQgZGlzY29ubmVjdF9wZW5kaW5nOwoJYXRvbWljX3QgaW51c2U7CgoJdm9pZCAqc3RyZWFtYnVmOwoJZG1hX2FkZHJfdCBzdHJlYW1idWZfZG1haGFuZGxlOwoJc3RydWN0IHVyYiAqc3RyZWFtX3VyYiBbU1RSRUFNX1VSQl9DT1VOVF07CgojaWZkZWYgRU5BQkxFX1JDCglzdHJ1Y3QgaW5wdXRfZGV2ICpyY19pbnB1dF9kZXY7CgljaGFyIHBoeXNbNjRdOwoJc3RydWN0IGRlbGF5ZWRfd29yayByY19xdWVyeV93b3JrOwoJaW50IHJjX2lucHV0X2V2ZW50OwoJdTMyIHJjX2xhc3RfY29kZTsKCXVuc2lnbmVkIGxvbmcgbGFzdF9ldmVudF9qaWZmaWVzOwojZW5kaWYKfTsKCmVudW0gewoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTk9ORSA9IDB4MDAsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMgID0gMHgwMSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX1JDNSAgPSAweDAyCn07CgpzdHJ1Y3QgY2luZXJneXQyX3JjX2V2ZW50IHsKCWNoYXIgdHlwZTsKCXVpbnQzMl90IHZhbHVlOwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKc3RhdGljIGNvbnN0IHVpbnQzMl90IHJjX2tleXNbXSA9IHsKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmZTAxZWIwNCwJS0VZX1BPV0VSLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGZkMDJlYjA0LAlLRVlfMSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmYzAzZWIwNCwJS0VZXzIsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmIwNGViMDQsCUtFWV8zLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGZhMDVlYjA0LAlLRVlfNCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmOTA2ZWIwNCwJS0VZXzUsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjgwN2ViMDQsCUtFWV82LAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY3MDhlYjA0LAlLRVlfNywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmNjA5ZWIwNCwJS0VZXzgsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjUwYWViMDQsCUtFWV85LAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGYzMGNlYjA0LAlLRVlfMCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmNDBiZWIwNCwJS0VZX1ZJREVPLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGYyMGRlYjA0LAlLRVlfUkVGUkVTSCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmMTBlZWIwNCwJS0VZX1NFTEVDVCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmMDBmZWIwNCwJS0VZX0VQRywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlZjEwZWIwNCwJS0VZX1VQLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGViMTRlYjA0LAlLRVlfRE9XTiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlZTExZWIwNCwJS0VZX0xFRlQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWMxM2ViMDQsCUtFWV9SSUdIVCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlZDEyZWIwNCwJS0VZX09LLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGVhMTVlYjA0LAlLRVlfVEVYVCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlOTE2ZWIwNCwJS0VZX0lORk8sCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTgxN2ViMDQsCUtFWV9SRUQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTcxOGViMDQsCUtFWV9HUkVFTiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlNjE5ZWIwNCwJS0VZX1lFTExPVywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlNTFhZWIwNCwJS0VZX0JMVUUsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTMxY2ViMDQsCUtFWV9WT0xVTUVVUCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlMTFlZWIwNCwJS0VZX1ZPTFVNRURPV04sCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTIxZGViMDQsCUtFWV9NVVRFLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU0MWJlYjA0LAlLRVlfQ0hBTk5FTFVQLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGUwMWZlYjA0LAlLRVlfQ0hBTk5FTERPV04sCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4YmY0MGViMDQsCUtFWV9QQVVTRSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhiMzRjZWIwNCwJS0VZX1BMQVksCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4YTc1OGViMDQsCUtFWV9SRUNPUkQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4YWI1NGViMDQsCUtFWV9QUkVWSU9VUywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhiNzQ4ZWIwNCwJS0VZX1NUT1AsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4YTM1Y2ViMDQsCUtFWV9ORVhUCn07CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9jb21tYW5kIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIsCgkJCSAgICAgIGNoYXIgKnNlbmRfYnVmLCBpbnQgc2VuZF9idWZfbGVuLAoJCQkgICAgICBjaGFyICpyZWN2X2J1ZiwgaW50IHJlY3ZfYnVmX2xlbikKewoJaW50IGFjdHVhbF9sZW47CgljaGFyIGR1bW15OwoJaW50IHJldDsKCglyZXQgPSB1c2JfYnVsa19tc2coY2luZXJneXQyLT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoY2luZXJneXQyLT51ZGV2LCAxKSwKCQkJICAgc2VuZF9idWYsIHNlbmRfYnVmX2xlbiwgJmFjdHVhbF9sZW4sIDEwMDApOwoKCWlmIChyZXQpCgkJZHByaW50aygxLCAidXNiX2J1bGtfbXNnIChzZW5kKSBmYWlsZWQsIGVyciAlaVxuIiwgcmV0KTsKCglpZiAoIXJlY3ZfYnVmKQoJCXJlY3ZfYnVmID0gJmR1bW15OwoKCXJldCA9IHVzYl9idWxrX21zZyhjaW5lcmd5dDItPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShjaW5lcmd5dDItPnVkZXYsIDEpLAoJCQkgICByZWN2X2J1ZiwgcmVjdl9idWZfbGVuLCAmYWN0dWFsX2xlbiwgMTAwMCk7CgoJaWYgKHJldCkKCQlkcHJpbnRrKDEsICJ1c2JfYnVsa19tc2cgKHJlYWQpIGZhaWxlZCwgZXJyICVpXG4iLCByZXQpOwoKCXJldHVybiByZXQgPyByZXQgOiBhY3R1YWxfbGVuOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfY29udHJvbF9zdHJlYW1fdHJhbnNmZXIgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiwgaW50IGVuYWJsZSkKewoJY2hhciBidWYgW10gPSB7IENJTkVSR1lUMl9FUDFfQ09OVFJPTF9TVFJFQU1fVFJBTlNGRVIsIGVuYWJsZSA/IDEgOiAwIH07CgljaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDApOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfc2xlZXAgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiwgaW50IHNsZWVwKQp7CgljaGFyIGJ1ZiBbXSA9IHsgQ0lORVJHWVQyX0VQMV9TTEVFUF9NT0RFLCBzbGVlcCA/IDEgOiAwIH07CgljaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDApOwoJY2luZXJneXQyLT5zbGVlcGluZyA9IHNsZWVwOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfc3RyZWFtX2lycSAoc3RydWN0IHVyYiAqdXJiKTsKCnN0YXRpYyBpbnQgY2luZXJneXQyX3N1Ym1pdF9zdHJlYW1fdXJiIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIsIHN0cnVjdCB1cmIgKnVyYikKewoJaW50IGVycjsKCgl1c2JfZmlsbF9idWxrX3VyYih1cmIsCgkJCSAgY2luZXJneXQyLT51ZGV2LAoJCQkgIHVzYl9yY3ZidWxrcGlwZShjaW5lcmd5dDItPnVkZXYsIDB4MiksCgkJCSAgdXJiLT50cmFuc2Zlcl9idWZmZXIsCgkJCSAgU1RSRUFNX0JVRl9TSVpFLAoJCQkgIGNpbmVyZ3l0Ml9zdHJlYW1faXJxLAoJCQkgIGNpbmVyZ3l0Mik7CgoJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSkKCQlkcHJpbnRrKDEsICJ1cmIgc3VibWlzc2lvbiBmYWlsZWQgKGVyciA9ICVpKSFcbiIsIGVycik7CgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3N0cmVhbV9pcnEgKHN0cnVjdCB1cmIgKnVyYikKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXJiLT5jb250ZXh0OwoKCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKQoJCWR2Yl9kbXhfc3dmaWx0ZXIoJmNpbmVyZ3l0Mi0+ZGVtdXgsCgkJCQkgdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CgoJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtaW5nKQoJCWNpbmVyZ3l0Ml9zdWJtaXRfc3RyZWFtX3VyYihjaW5lcmd5dDIsIHVyYik7Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWludCBpOwoKCWZvciAoaT0wOyBpPFNUUkVBTV9VUkJfQ09VTlQ7IGkrKykKCQl1c2JfZnJlZV91cmIoY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKTsKCgl1c2JfYnVmZmVyX2ZyZWUoY2luZXJneXQyLT51ZGV2LCBTVFJFQU1fVVJCX0NPVU5UKlNUUkVBTV9CVUZfU0laRSwKCQkJICAgIGNpbmVyZ3l0Mi0+c3RyZWFtYnVmLCBjaW5lcmd5dDItPnN0cmVhbWJ1Zl9kbWFoYW5kbGUpOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9hbGxvY19zdHJlYW1fdXJicyAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglpbnQgaTsKCgljaW5lcmd5dDItPnN0cmVhbWJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoY2luZXJneXQyLT51ZGV2LCBTVFJFQU1fVVJCX0NPVU5UKlNUUkVBTV9CVUZfU0laRSwKCQkJCQkgICAgICBHRlBfS0VSTkVMLCAmY2luZXJneXQyLT5zdHJlYW1idWZfZG1haGFuZGxlKTsKCWlmICghY2luZXJneXQyLT5zdHJlYW1idWYpIHsKCQlkcHJpbnRrKDEsICJmYWlsZWQgdG8gYWxsb2MgY29uc2lzdGVudCBzdHJlYW0gbWVtb3J5IGFyZWEsIGJhaWxpbmcgb3V0IVxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJbWVtc2V0KGNpbmVyZ3l0Mi0+c3RyZWFtYnVmLCAwLCBTVFJFQU1fVVJCX0NPVU5UKlNUUkVBTV9CVUZfU0laRSk7CgoJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKSB7CgkJc3RydWN0IHVyYiAqdXJiOwoKCQlpZiAoISh1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpKSkgewoJCQlkcHJpbnRrKDEsICJmYWlsZWQgdG8gYWxsb2MgY29uc2lzdGVudCBzdHJlYW0gdXJicywgYmFpbGluZyBvdXQhXG4iKTsKCQkJY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMoY2luZXJneXQyKTsKCQkJcmV0dXJuIC1FTk9NRU07CgkJfQoKCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGNpbmVyZ3l0Mi0+c3RyZWFtYnVmICsgaSAqIFNUUkVBTV9CVUZfU0laRTsKCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTVFJFQU1fQlVGX1NJWkU7CgoJCWNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSA9IHVyYjsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKewoJaW50IGk7CgoJY2luZXJneXQyX2NvbnRyb2xfc3RyZWFtX3RyYW5zZmVyKGNpbmVyZ3l0MiwgMCk7CgoJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKQoJCXVzYl9raWxsX3VyYihjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdGFydF9zdHJlYW1feGZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglpbnQgaSwgZXJyOwoKCWZvciAoaT0wOyBpPFNUUkVBTV9VUkJfQ09VTlQ7IGkrKykgewoJCWlmICgoZXJyID0gY2luZXJneXQyX3N1Ym1pdF9zdHJlYW1fdXJiKGNpbmVyZ3l0MiwgY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKSkpIHsKCQkJY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKCQkJZHByaW50aygxLCAiZmFpbGVkIHVyYiBzdWJtaXNzaW9uICglaTogZXJyID0gJWkpIVxuIiwgaSwgZXJyKTsKCQkJcmV0dXJuIGVycjsKCQl9Cgl9CgoJY2luZXJneXQyX2NvbnRyb2xfc3RyZWFtX3RyYW5zZmVyKGNpbmVyZ3l0MiwgMSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCnsKCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkZW11eC0+cHJpdjsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglpZiAoY2luZXJneXQyLT5zdHJlYW1pbmcgPT0gMCkKCQljaW5lcmd5dDJfc3RhcnRfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKCgljaW5lcmd5dDItPnN0cmVhbWluZysrOwoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKewoJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBkdmJkbXhmZWVkLT5kZW11eDsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGRlbXV4LT5wcml2OwoKCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmICgtLWNpbmVyZ3l0Mi0+c3RyZWFtaW5nID09IDApCgkJY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKCgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKCXJldHVybiAwOwp9CgovKioKICogIGNvbnZlcnQgbGludXgtZHZiIGZyb250ZW5kIHBhcmFtZXRlciBzZXQgaW50byBUUFMuCiAqICBTZWUgRVRTSSBFVFMtMzAwNzQ0LCBzZWN0aW9uIDQuNi4yLCB0YWJsZSA5IGZvciBkZXRhaWxzLgogKgogKiAgVGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJseSByZXVzYWJsZSBhbmQgbWF5IGJldHRlciBnZXQgcGxhY2VkIGluIGEgc3VwcG9ydAogKiAgbGlicmFyeS4KICoKICogIFdlIHJlcGxhY2UgZXJyb3Jub3VzIGZpZWxkcyBieSBkZWZhdWx0IFRQUyBmaWVsZHMgKHRoZSBvbmVzIHdpdGggdmFsdWUgMCkuCiAqLwpzdGF0aWMgdWludDE2X3QgY29tcHV0ZV90cHMgKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKewoJc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgKm9wID0gJnAtPnUub2ZkbTsKCXVpbnQxNl90IHRwcyA9IDA7CgoJc3dpdGNoIChvcC0+Y29kZV9yYXRlX0hQKSB7CgkJY2FzZSBGRUNfMl8zOgoJCQl0cHMgfD0gKDEgPDwgNyk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzNfNDoKCQkJdHBzIHw9ICgyIDw8IDcpOwoJCQlicmVhazsKCQljYXNlIEZFQ181XzY6CgkJCXRwcyB8PSAoMyA8PCA3KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfN184OgoJCQl0cHMgfD0gKDQgPDwgNyk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzFfMjoKCQljYXNlIEZFQ19BVVRPOgoJCWRlZmF1bHQ6CgkJCS8qIHRwcyB8PSAoMCA8PCA3KSAqLzsKCX0KCglzd2l0Y2ggKG9wLT5jb2RlX3JhdGVfTFApIHsKCQljYXNlIEZFQ18yXzM6CgkJCXRwcyB8PSAoMSA8PCA0KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfM180OgoJCQl0cHMgfD0gKDIgPDwgNCk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzVfNjoKCQkJdHBzIHw9ICgzIDw8IDQpOwoJCQlicmVhazsKCQljYXNlIEZFQ183Xzg6CgkJCXRwcyB8PSAoNCA8PCA0KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfMV8yOgoJCWNhc2UgRkVDX0FVVE86CgkJZGVmYXVsdDoKCQkJLyogdHBzIHw9ICgwIDw8IDQpICovOwoJfQoKCXN3aXRjaCAob3AtPmNvbnN0ZWxsYXRpb24pIHsKCQljYXNlIFFBTV8xNjoKCQkJdHBzIHw9ICgxIDw8IDEzKTsKCQkJYnJlYWs7CgkJY2FzZSBRQU1fNjQ6CgkJCXRwcyB8PSAoMiA8PCAxMyk7CgkJCWJyZWFrOwoJCWNhc2UgUVBTSzoKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgMTMpICovOwoJfQoKCXN3aXRjaCAob3AtPnRyYW5zbWlzc2lvbl9tb2RlKSB7CgkJY2FzZSBUUkFOU01JU1NJT05fTU9ERV84SzoKCQkJdHBzIHw9ICgxIDw8IDApOwoJCQlicmVhazsKCQljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzJLOgoJCWRlZmF1bHQ6CgkJCS8qIHRwcyB8PSAoMCA8PCAwKSAqLzsKCX0KCglzd2l0Y2ggKG9wLT5ndWFyZF9pbnRlcnZhbCkgewoJCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8xNjoKCQkJdHBzIHw9ICgxIDw8IDIpOwoJCQlicmVhazsKCQljYXNlIEdVQVJEX0lOVEVSVkFMXzFfODoKCQkJdHBzIHw9ICgyIDw8IDIpOwoJCQlicmVhazsKCQljYXNlIEdVQVJEX0lOVEVSVkFMXzFfNDoKCQkJdHBzIHw9ICgzIDw8IDIpOwoJCQlicmVhazsKCQljYXNlIEdVQVJEX0lOVEVSVkFMXzFfMzI6CgkJZGVmYXVsdDoKCQkJLyogdHBzIHw9ICgwIDw8IDIpICovOwoJfQoKCXN3aXRjaCAob3AtPmhpZXJhcmNoeV9pbmZvcm1hdGlvbikgewoJCWNhc2UgSElFUkFSQ0hZXzE6CgkJCXRwcyB8PSAoMSA8PCAxMCk7CgkJCWJyZWFrOwoJCWNhc2UgSElFUkFSQ0hZXzI6CgkJCXRwcyB8PSAoMiA8PCAxMCk7CgkJCWJyZWFrOwoJCWNhc2UgSElFUkFSQ0hZXzQ6CgkJCXRwcyB8PSAoMyA8PCAxMCk7CgkJCWJyZWFrOwoJCWNhc2UgSElFUkFSQ0hZX05PTkU6CgkJZGVmYXVsdDoKCQkJLyogdHBzIHw9ICgwIDw8IDEwKSAqLzsKCX0KCglyZXR1cm4gdHBzOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKCWludCBlcnIgPSAtRVJFU1RBUlRTWVM7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT53cV9zZW0pKQoJCWdvdG8gb3V0OwoKCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlnb3RvIG91dF91bmxvY2sxOwoKCWlmICgoZXJyID0gZHZiX2dlbmVyaWNfb3Blbihpbm9kZSwgZmlsZSkpKQoJCWdvdG8gb3V0X3VubG9jazI7CgoJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkgewoJCWNpbmVyZ3l0Ml9zbGVlcChjaW5lcmd5dDIsIDApOwoJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrLCBIWi8yKTsKCX0KCglhdG9taWNfaW5jKCZjaW5lcmd5dDItPmludXNlKTsKCm91dF91bmxvY2syOgoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7Cm91dF91bmxvY2sxOgoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPndxX3NlbSk7Cm91dDoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml91bnJlZ2lzdGVyKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKewoJZHZiX25ldF9yZWxlYXNlKCZjaW5lcmd5dDItPmR2Ym5ldCk7CglkdmJfZG14ZGV2X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZG14ZGV2KTsKCWR2Yl9kbXhfcmVsZWFzZSgmY2luZXJneXQyLT5kZW11eCk7CglkdmJfdW5yZWdpc3Rlcl9kZXZpY2UoY2luZXJneXQyLT5mZWRldik7CglkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZjaW5lcmd5dDItPmFkYXB0ZXIpOwoKCWNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzKGNpbmVyZ3l0Mik7CglrZnJlZShjaW5lcmd5dDIpOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKCgltdXRleF9sb2NrKCZjaW5lcmd5dDItPndxX3NlbSk7CgoJaWYgKCFjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyAmJiAoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpIHsKCQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmspOwoKCQltdXRleF9sb2NrKCZjaW5lcmd5dDItPnNlbSk7CgkJY2luZXJneXQyX3NsZWVwKGNpbmVyZ3l0MiwgMSk7CgkJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7Cgl9CgoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPndxX3NlbSk7CgoJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNpbmVyZ3l0Mi0+aW51c2UpICYmIGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nKSB7CgkJd2FybigiZGVsYXllZCB1bnJlZ2lzdGVyIGluIHJlbGVhc2UiKTsKCQljaW5lcmd5dDJfdW5yZWdpc3RlcihjaW5lcmd5dDIpOwoJfQoKCXJldHVybiBkdmJfZ2VuZXJpY19yZWxlYXNlKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIHVuc2lnbmVkIGludCBjaW5lcmd5dDJfcG9sbCAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKewoJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKICAgICAgIHVuc2lnbmVkIGludCBtYXNrID0gMDsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglwb2xsX3dhaXQoZmlsZSwgJmNpbmVyZ3l0Mi0+cG9sbF93cSwgd2FpdCk7CgogICAgICAgaWYgKGNpbmVyZ3l0Mi0+cGVuZGluZ19mZV9ldmVudHMgIT0gMCkKCQltYXNrIHw9IChQT0xMSU4gfCBQT0xMUkROT1JNIHwgUE9MTFBSSSk7CgoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7CgogICAgICAgcmV0dXJuIG1hc2s7Cn0KCgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCgkJICAgICB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwoJc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgKnN0YXQgPSAmY2luZXJneXQyLT5zdGF0dXM7CglmZV9zdGF0dXNfdCBzdGF0dXMgPSAwOwoKCXN3aXRjaCAoY21kKSB7CgljYXNlIEZFX0dFVF9JTkZPOgoJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyKikgYXJnLCAmY2luZXJneXQyX2ZlX2luZm8sCgkJCQkgICAgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbykpOwoKCWNhc2UgRkVfUkVBRF9TVEFUVVM6CgkJaWYgKDB4ZmZmZiAtIGxlMTZfdG9fY3B1KHN0YXQtPmdhaW4pID4gMzApCgkJCXN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOwoJCWlmIChzdGF0LT5sb2NrX2JpdHMgJiAoMSA8PCA2KSkKCQkJc3RhdHVzIHw9IEZFX0hBU19MT0NLOwoJCWlmIChzdGF0LT5sb2NrX2JpdHMgJiAoMSA8PCA1KSkKCQkJc3RhdHVzIHw9IEZFX0hBU19TWU5DOwoJCWlmIChzdGF0LT5sb2NrX2JpdHMgJiAoMSA8PCA0KSkKCQkJc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOwoJCWlmIChzdGF0LT5sb2NrX2JpdHMgJiAoMSA8PCAxKSkKCQkJc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJOwoKCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICBfX3VzZXIqKSBhcmcsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKCgljYXNlIEZFX1JFQURfQkVSOgoJCXJldHVybiBwdXRfdXNlcihsZTMyX3RvX2NwdShzdGF0LT52aXRlcmJpX2Vycm9yX3JhdGUpLAoJCQkJKF9fdTMyIF9fdXNlciAqKSBhcmcpOwoKCWNhc2UgRkVfUkVBRF9TSUdOQUxfU1RSRU5HVEg6CgkJcmV0dXJuIHB1dF91c2VyKDB4ZmZmZiAtIGxlMTZfdG9fY3B1KHN0YXQtPmdhaW4pLAoJCQkJKF9fdTE2IF9fdXNlciAqKSBhcmcpOwoKCWNhc2UgRkVfUkVBRF9TTlI6CgkJcmV0dXJuIHB1dF91c2VyKChzdGF0LT5zbnIgPDwgOCkgfCBzdGF0LT5zbnIsCgkJCQkoX191MTYgX191c2VyICopIGFyZyk7CgoJY2FzZSBGRV9SRUFEX1VOQ09SUkVDVEVEX0JMT0NLUzoKCXsKCQl1aW50MzJfdCB1bmNfY291bnQ7CgoJCXVuY19jb3VudCA9IHN0YXQtPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50OwoJCXN0YXQtPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50ID0gMDsKCgkJLyogVU5DIGFyZSBhbHJlYWR5IGNvbnZlcnRlZCB0byBob3N0IGJ5dGUgb3JkZXIuLi4gKi8KCQlyZXR1cm4gcHV0X3VzZXIodW5jX2NvdW50LChfX3UzMiBfX3VzZXIgKikgYXJnKTsKCX0KCWNhc2UgRkVfU0VUX0ZST05URU5EOgoJewoJCXN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyAqcGFyYW0gPSAmY2luZXJneXQyLT5wYXJhbTsKCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgcDsKCQlpbnQgZXJyOwoKCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQoJCQlyZXR1cm4gLUVQRVJNOwoKCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsICh2b2lkICBfX3VzZXIqKSBhcmcsIHNpemVvZihwKSkpCgkJCXJldHVybiAtRUZBVUxUOwoKCQlpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJCXBhcmFtLT5jbWQgPSBDSU5FUkdZVDJfRVAxX1NFVF9UVU5FUl9QQVJBTUVURVJTOwoJCXBhcmFtLT50cHMgPSBjcHVfdG9fbGUxNihjb21wdXRlX3RwcygmcCkpOwoJCXBhcmFtLT5mcmVxID0gY3B1X3RvX2xlMzIocC5mcmVxdWVuY3kgLyAxMDAwKTsKCQlwYXJhbS0+YmFuZHdpZHRoID0gOCAtIHAudS5vZmRtLmJhbmR3aWR0aCAtIEJBTkRXSURUSF84X01IWjsKCgkJc3RhdC0+bG9ja19iaXRzID0gMDsKCQljaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzKys7CgkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnBvbGxfd3EpOwoKCQllcnIgPSBjaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsCgkJCQkJKGNoYXIgKikgcGFyYW0sIHNpemVvZigqcGFyYW0pLAoJCQkJCU5VTEwsIDApOwoKCQltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKCgkJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cgl9CgoJY2FzZSBGRV9HRVRfRlJPTlRFTkQ6CgkJLyoqCgkJICogIHRyaXZpYWwgdG8gaW1wbGVtZW50IChzZWUgc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cpLgoJCSAqICBlcXVpdmFsZW50IHRvIEZFX1JFQUQgaW9jdGxzLCBidXQgbmVlZHMKCQkgKiAgVFBTIC0+IGxpbnV4LWR2YiBwYXJhbWV0ZXIgc2V0IGNvbnZlcnNpb24uIEZlZWwgZnJlZQoJCSAqICB0byBpbXBsZW1lbnQgdGhpcyBhbmQgc2VuZCB1cyBhIHBhdGNoIGlmIHlvdSBuZWVkIHRoaXMKCQkgKiAgZnVuY3Rpb25hbGl0eS4KCQkgKi8KCQlicmVhazsKCgljYXNlIEZFX0dFVF9FVkVOVDoKCXsKCQkvKioKCQkgKiAgZm9yIG5vdyB3ZSBvbmx5IGZpbGwgdGhlIHN0YXR1cyBmaWVsZC4gdGhlIHBhcmFtZXRlcnMKCQkgKiAgYXJlIHRyaXZpYWwgdG8gZmlsbCBhcyBzb29uIEZFX0dFVF9GUk9OVEVORCBpcyBkb25lLgoJCSAqLwoJCXN0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQgX191c2VyICplID0gKHZvaWQgX191c2VyICopIGFyZzsKCQlpZiAoY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cyA9PSAwKSB7CgkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKCQkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CgkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjaW5lcmd5dDItPnBvbGxfd3EsCgkJCQkJCSBjaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzID4gMCk7CgkJfQoJCWNpbmVyZ3l0Mi0+cGVuZGluZ19mZV9ldmVudHMgPSAwOwoJCXJldHVybiBjaW5lcmd5dDJfaW9jdGwoaW5vZGUsIGZpbGUsIEZFX1JFQURfU1RBVFVTLAoJCQkJCSh1bnNpZ25lZCBsb25nKSAmZS0+c3RhdHVzKTsKCX0KCglkZWZhdWx0OgoJCTsKCX0KCglyZXR1cm4gLUVJTlZBTDsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCnsKCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7CglpbnQgcmV0ID0gMDsKCglsb2NrX2tlcm5lbCgpOwoKCWlmICh2bWEtPnZtX2ZsYWdzICYgKFZNX1dSSVRFIHwgVk1fRVhFQykpIHsKCQlyZXQgPSAtRVBFUk07CgkJZ290byBiYWlsb3V0OwoJfQoKCWlmICh2bWEtPnZtX2VuZCA+IHZtYS0+dm1fc3RhcnQgKyBTVFJFQU1fVVJCX0NPVU5UICogU1RSRUFNX0JVRl9TSVpFKSB7CgkJcmV0ID0gLUVJTlZBTDsKCQlnb3RvIGJhaWxvdXQ7Cgl9CgoJdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9ET05UQ09QWSk7Cgl2bWEtPnZtX2ZpbGUgPSBmaWxlOwoKCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCgkJCSAgICAgIHZpcnRfdG9fcGh5cyhjaW5lcmd5dDItPnN0cmVhbWJ1ZikgPj4gUEFHRV9TSElGVCwKCQkJICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAoJCQkgICAgICB2bWEtPnZtX3BhZ2VfcHJvdCkgPyAtRUFHQUlOIDogMDsKYmFpbG91dDoKCXVubG9ja19rZXJuZWwoKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpbmVyZ3l0Ml9mb3BzID0gewoJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCgkuaW9jdGwJCT0gY2luZXJneXQyX2lvY3RsLAoJLnBvbGwgICAgICAgICAgID0gY2luZXJneXQyX3BvbGwsCgkub3BlbiAgICAgICAgICAgPSBjaW5lcmd5dDJfb3BlbiwKCS5yZWxlYXNlICAgICAgICA9IGNpbmVyZ3l0Ml9yZWxlYXNlLAoJLm1tYXAJCT0gY2luZXJneXQyX21tYXAKfTsKCnN0YXRpYyBzdHJ1Y3QgZHZiX2RldmljZSBjaW5lcmd5dDJfZmVfdGVtcGxhdGUgPSB7CgkudXNlcnMgPSB+MCwKCS53cml0ZXJzID0gMSwKCS5yZWFkZXJzID0gKH4wKS0xLAoJLmZvcHMgPSAmY2luZXJneXQyX2ZvcHMKfTsKCiNpZmRlZiBFTkFCTEVfUkMKCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9xdWVyeV9yYyAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPQoJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2luZXJneXQyLCByY19xdWVyeV93b3JrLndvcmspOwoJY2hhciBidWZbMV0gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUyB9OwoJc3RydWN0IGNpbmVyZ3l0Ml9yY19ldmVudCByY19ldmVudHNbMTJdOwoJaW50IG4sIGxlbiwgaTsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuOwoKCWxlbiA9IGNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgYnVmLCBzaXplb2YoYnVmKSwKCQkJCShjaGFyICopIHJjX2V2ZW50cywgc2l6ZW9mKHJjX2V2ZW50cykpOwoJaWYgKGxlbiA8IDApCgkJZ290byBvdXQ7CglpZiAobGVuID09IDApIHsKCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBjaW5lcmd5dDItPmxhc3RfZXZlbnRfamlmZmllcyArCgkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKDE1MCkpKSB7CgkJCS8qIHN0b3Aga2V5IHJlcGVhdCAqLwoJCQlpZiAoY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCAhPSBLRVlfTUFYKSB7CgkJCQlkcHJpbnRrKDEsICJyY19pbnB1dF9ldmVudD0lZCBVcFxuIiwgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCk7CgkJCQlpbnB1dF9yZXBvcnRfa2V5KGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAoJCQkJCQkgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCwgMCk7CgkJCQlpbnB1dF9zeW5jKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKCQkJCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSBLRVlfTUFYOwoJCQl9CgkJCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gfjA7CgkJfQoJCWdvdG8gb3V0OwoJfQoJY2luZXJneXQyLT5sYXN0X2V2ZW50X2ppZmZpZXMgPSBqaWZmaWVzOwoKCWZvciAobiA9IDA7IG4gPCAobGVuIC8gc2l6ZW9mKHJjX2V2ZW50c1swXSkpOyBuKyspIHsKCQlkcHJpbnRrKDEsICJyY19ldmVudHNbJWRdLnZhbHVlID0gJXgsIHR5cGU9JXhcbiIsCgkJCW4sIGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSksIHJjX2V2ZW50c1tuXS50eXBlKTsKCgkJaWYgKHJjX2V2ZW50c1tuXS50eXBlID09IENJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQyAmJgoJCSAgICByY19ldmVudHNbbl0udmFsdWUgPT0gfjApIHsKCQkJLyoga2V5cmVwZWF0IGJpdCAtPiBqdXN0IHJlcGVhdCBsYXN0IHJjX2lucHV0X2V2ZW50ICovCgkJfSBlbHNlIHsKCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7CgkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJjX2tleXMpOyBpICs9IDMpIHsKCQkJCWlmIChyY19rZXlzW2kgKyAwXSA9PSByY19ldmVudHNbbl0udHlwZSAmJgoJCQkJICAgIHJjX2tleXNbaSArIDFdID09IGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSkpIHsKCQkJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gcmNfa2V5c1tpICsgMl07CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ICE9IEtFWV9NQVgpIHsKCQkJaWYgKHJjX2V2ZW50c1tuXS52YWx1ZSA9PSBjaW5lcmd5dDItPnJjX2xhc3RfY29kZSAmJgoJCQkgICAgY2luZXJneXQyLT5yY19sYXN0X2NvZGUgIT0gfjApIHsKCQkJCS8qIGVtaXQgYSBrZXktdXAgc28gdGhlIGRvdWJsZSBldmVudCBpcyByZWNvZ25pemVkICovCgkJCQlkcHJpbnRrKDEsICJyY19pbnB1dF9ldmVudD0lZCBVUFxuIiwgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCk7CgkJCQlpbnB1dF9yZXBvcnRfa2V5KGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAoJCQkJCQkgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCwgMCk7CgkJCX0KCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWRcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOwoJCQlpbnB1dF9yZXBvcnRfa2V5KGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAoJCQkJCSBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAxKTsKCQkJaW5wdXRfc3luYyhjaW5lcmd5dDItPnJjX2lucHV0X2Rldik7CgkJCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gcmNfZXZlbnRzW25dLnZhbHVlOwoJCX0KCX0KCm91dDoKCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLAoJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFJDX1FVRVJZX0lOVEVSVkFMKSk7CgoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3JlZ2lzdGVyX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKewoJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwoJaW50IGk7CglpbnQgZXJyOwoKCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwoJaWYgKCFpbnB1dF9kZXYpCgkJcmV0dXJuIC1FTk9NRU07CgoJdXNiX21ha2VfcGF0aChjaW5lcmd5dDItPnVkZXYsIGNpbmVyZ3l0Mi0+cGh5cywgc2l6ZW9mKGNpbmVyZ3l0Mi0+cGh5cykpOwoJc3RybGNhdChjaW5lcmd5dDItPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGNpbmVyZ3l0Mi0+cGh5cykpOwoJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7CgljaW5lcmd5dDItPnJjX2xhc3RfY29kZSA9IH4wOwoJSU5JVF9ERUxBWUVEX1dPUksoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yaywgY2luZXJneXQyX3F1ZXJ5X3JjKTsKCglpbnB1dF9kZXYtPm5hbWUgPSBEUklWRVJfTkFNRSAiIHJlbW90ZSBjb250cm9sIjsKCWlucHV0X2Rldi0+cGh5cyA9IGNpbmVyZ3l0Mi0+cGh5czsKCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRVApOwoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmNfa2V5cyk7IGkgKz0gMykKCQlzZXRfYml0KHJjX2tleXNbaSArIDJdLCBpbnB1dF9kZXYtPmtleWJpdCk7CglpbnB1dF9kZXYtPmtleWNvZGVzaXplID0gMDsKCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IDA7CglpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfVVNCOwoJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBjaW5lcmd5dDItPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3I7CglpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBjaW5lcmd5dDItPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0OwoJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMTsKCWlucHV0X2Rldi0+Y2Rldi5kZXYgPSAmY2luZXJneXQyLT51ZGV2LT5kZXY7CgoJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CglpZiAoZXJyKSB7CgkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKCQlyZXR1cm4gZXJyOwoJfQoKCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2ID0gaW5wdXRfZGV2OwoJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIEhaLzIpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfdW5yZWdpc3Rlcl9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yayk7CglpbnB1dF91bnJlZ2lzdGVyX2RldmljZShjaW5lcmd5dDItPnJjX2lucHV0X2Rldik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjaW5lcmd5dDJfc3VzcGVuZF9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yayk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjaW5lcmd5dDJfcmVzdW1lX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKewoJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIEhaLzIpOwp9CgojZWxzZQoKc3RhdGljIGlubGluZSBpbnQgY2luZXJneXQyX3JlZ2lzdGVyX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikgeyByZXR1cm4gMDsgfQpzdGF0aWMgaW5saW5lIHZvaWQgY2luZXJneXQyX3VucmVnaXN0ZXJfcmMoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKSB7IH0Kc3RhdGljIGlubGluZSB2b2lkIGNpbmVyZ3l0Ml9zdXNwZW5kX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikgeyB9CnN0YXRpYyBpbmxpbmUgdm9pZCBjaW5lcmd5dDJfcmVzdW1lX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikgeyB9CgojZW5kaWYgLyogRU5BQkxFX1JDICovCgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnkgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0KCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNpbmVyZ3l0MiwgcXVlcnlfd29yay53b3JrKTsKCWNoYXIgY21kIFtdID0geyBDSU5FUkdZVDJfRVAxX0dFVF9UVU5FUl9TVEFUVVMgfTsKCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnICpzID0gJmNpbmVyZ3l0Mi0+c3RhdHVzOwoJdWludDhfdCBsb2NrX2JpdHM7Cgl1aW50MzJfdCB1bmM7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybjsKCgl1bmMgPSBzLT51bmNvcnJlY3RlZF9ibG9ja19jb3VudDsKCWxvY2tfYml0cyA9IHMtPmxvY2tfYml0czsKCgljaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsIGNtZCwgc2l6ZW9mKGNtZCksIChjaGFyICopIHMsIHNpemVvZigqcykpOwoKCXVuYyArPSBsZTMyX3RvX2NwdShzLT51bmNvcnJlY3RlZF9ibG9ja19jb3VudCk7CglzLT51bmNvcnJlY3RlZF9ibG9ja19jb3VudCA9IHVuYzsKCglpZiAobG9ja19iaXRzICE9IHMtPmxvY2tfYml0cykgewoJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5wb2xsX3dxKTsKCQljaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzKys7Cgl9CgoJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmssCgkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUVVFUllfSU5URVJWQUwpKTsKCgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAoJCSAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDI7CglpbnQgZXJyOwoKCWlmICghKGNpbmVyZ3l0MiA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgY2luZXJneXQyKSwgR0ZQX0tFUk5FTCkpKSB7CgkJZHByaW50aygxLCAib3V0IG9mIG1lbW9yeT8hP1xuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJbWVtc2V0IChjaW5lcmd5dDIsIDAsIHNpemVvZiAoc3RydWN0IGNpbmVyZ3l0MikpOwoJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgKHZvaWQgKikgY2luZXJneXQyKTsKCgltdXRleF9pbml0KCZjaW5lcmd5dDItPnNlbSk7CgltdXRleF9pbml0KCZjaW5lcmd5dDItPndxX3NlbSk7Cglpbml0X3dhaXRxdWV1ZV9oZWFkICgmY2luZXJneXQyLT5wb2xsX3dxKTsKCUlOSVRfREVMQVlFRF9XT1JLKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmssIGNpbmVyZ3l0Ml9xdWVyeSk7CgoJY2luZXJneXQyLT51ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKCWNpbmVyZ3l0Mi0+cGFyYW0uY21kID0gQ0lORVJHWVQyX0VQMV9TRVRfVFVORVJfUEFSQU1FVEVSUzsKCglpZiAoY2luZXJneXQyX2FsbG9jX3N0cmVhbV91cmJzIChjaW5lcmd5dDIpIDwgMCkgewoJCWRwcmludGsoMSwgInVuYWJsZSB0byBhbGxvY2F0ZSBzdHJlYW0gdXJic1xuIik7CgkJa2ZyZWUoY2luZXJneXQyKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCglpZiAoKGVyciA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZjaW5lcmd5dDItPmFkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSwgJmNpbmVyZ3l0Mi0+dWRldi0+ZGV2KSkgPCAwKSB7CgkJa2ZyZWUoY2luZXJneXQyKTsKCQlyZXR1cm4gZXJyOwoJfQoKCWNpbmVyZ3l0Mi0+ZGVtdXgucHJpdiA9IGNpbmVyZ3l0MjsKCWNpbmVyZ3l0Mi0+ZGVtdXguZmlsdGVybnVtID0gMjU2OwoJY2luZXJneXQyLT5kZW11eC5mZWVkbnVtID0gMjU2OwoJY2luZXJneXQyLT5kZW11eC5zdGFydF9mZWVkID0gY2luZXJneXQyX3N0YXJ0X2ZlZWQ7CgljaW5lcmd5dDItPmRlbXV4LnN0b3BfZmVlZCA9IGNpbmVyZ3l0Ml9zdG9wX2ZlZWQ7CgljaW5lcmd5dDItPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwKCQkJCQkgICAgRE1YX1NFQ1RJT05fRklMVEVSSU5HIHwKCQkJCQkgICAgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkc7CgoJaWYgKChlcnIgPSBkdmJfZG14X2luaXQoJmNpbmVyZ3l0Mi0+ZGVtdXgpKSA8IDApIHsKCQlkcHJpbnRrKDEsICJkdmJfZG14X2luaXQoKSBmYWlsZWQgKGVyciA9ICVkKVxuIiwgZXJyKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CgoJY2luZXJneXQyLT5kbXhkZXYuZmlsdGVybnVtID0gY2luZXJneXQyLT5kZW11eC5maWx0ZXJudW07CgljaW5lcmd5dDItPmRteGRldi5kZW11eCA9ICZjaW5lcmd5dDItPmRlbXV4LmRteDsKCWNpbmVyZ3l0Mi0+ZG14ZGV2LmNhcGFiaWxpdGllcyA9IDA7CgoJaWYgKChlcnIgPSBkdmJfZG14ZGV2X2luaXQoJmNpbmVyZ3l0Mi0+ZG14ZGV2LCAmY2luZXJneXQyLT5hZGFwdGVyKSkgPCAwKSB7CgkJZHByaW50aygxLCAiZHZiX2RteGRldl9pbml0KCkgZmFpbGVkIChlcnIgPSAlZClcbiIsIGVycik7CgkJZ290byBiYWlsb3V0OwoJfQoKCWlmIChkdmJfbmV0X2luaXQoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgJmNpbmVyZ3l0Mi0+ZHZibmV0LCAmY2luZXJneXQyLT5kZW11eC5kbXgpKQoJCWRwcmludGsoMSwgImR2Yl9uZXRfaW5pdCgpIGZhaWxlZCFcbiIpOwoKCWR2Yl9yZWdpc3Rlcl9kZXZpY2UoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgJmNpbmVyZ3l0Mi0+ZmVkZXYsCgkJCSAgICAmY2luZXJneXQyX2ZlX3RlbXBsYXRlLCBjaW5lcmd5dDIsCgkJCSAgICBEVkJfREVWSUNFX0ZST05URU5EKTsKCgllcnIgPSBjaW5lcmd5dDJfcmVnaXN0ZXJfcmMoY2luZXJneXQyKTsKCWlmIChlcnIpCgkJZ290byBiYWlsb3V0OwoKCXJldHVybiAwOwoKYmFpbG91dDoKCWR2Yl9uZXRfcmVsZWFzZSgmY2luZXJneXQyLT5kdmJuZXQpOwoJZHZiX2RteGRldl9yZWxlYXNlKCZjaW5lcmd5dDItPmRteGRldik7CglkdmJfZG14X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZGVtdXgpOwoJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmY2luZXJneXQyLT5hZGFwdGVyKTsKCWNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzKGNpbmVyZ3l0Mik7CglrZnJlZShjaW5lcmd5dDIpOwoJcmV0dXJuIC1FTk9NRU07Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CgoJY2luZXJneXQyX3VucmVnaXN0ZXJfcmMoY2luZXJneXQyKTsKCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yayk7Cgl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+cG9sbF93cSk7CgoJY2luZXJneXQyLT5kZW11eC5kbXguY2xvc2UoJmNpbmVyZ3l0Mi0+ZGVtdXguZG14KTsKCWNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nID0gMTsKCglpZiAoIWF0b21pY19yZWFkKCZjaW5lcmd5dDItPmludXNlKSkKCQljaW5lcmd5dDJfdW5yZWdpc3RlcihjaW5lcmd5dDIpOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPndxX3NlbSkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglpZiAoMSkgewoJCWNpbmVyZ3l0Ml9zdXNwZW5kX3JjKGNpbmVyZ3l0Mik7CgkJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrKTsKCgkJbXV0ZXhfbG9jaygmY2luZXJneXQyLT5zZW0pOwoJCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZykKCQkJY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAxKTsKCQltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKCX0KCgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+d3Ffc2VtKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKCXN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyAqcGFyYW0gPSAmY2luZXJneXQyLT5wYXJhbTsKCWludCBlcnIgPSAtRVJFU1RBUlRTWVM7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT53cV9zZW0pKQoJCWdvdG8gb3V0OwoKCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlnb3RvIG91dF91bmxvY2sxOwoKCWVyciA9IDA7CgoJaWYgKCFjaW5lcmd5dDItPnNsZWVwaW5nKSB7CgkJY2luZXJneXQyX3NsZWVwKGNpbmVyZ3l0MiwgMCk7CgkJY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCAoY2hhciAqKSBwYXJhbSwgc2l6ZW9mKCpwYXJhbSksIE5VTEwsIDApOwoJCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZykKCQkJY2luZXJneXQyX3N0YXJ0X3N0cmVhbV94ZmVyKGNpbmVyZ3l0Mik7CgkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmssIEhaLzIpOwoJfQoKCWNpbmVyZ3l0Ml9yZXN1bWVfcmMoY2luZXJneXQyKTsKCgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKb3V0X3VubG9jazE6CgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+d3Ffc2VtKTsKb3V0OgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGNpbmVyZ3l0Ml90YWJsZSBbXSBfX2RldmluaXRkYXRhID0gewoJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMDM4KSB9LAoJeyAwIH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBjaW5lcmd5dDJfdGFibGUpOwoKc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGNpbmVyZ3l0Ml9kcml2ZXIgPSB7CgkubmFtZQk9ICJjaW5lcmd5VDIiLAoJLnByb2JlCT0gY2luZXJneXQyX3Byb2JlLAoJLmRpc2Nvbm5lY3QJPSBjaW5lcmd5dDJfZGlzY29ubmVjdCwKCS5zdXNwZW5kCT0gY2luZXJneXQyX3N1c3BlbmQsCgkucmVzdW1lCQk9IGNpbmVyZ3l0Ml9yZXN1bWUsCgkuaWRfdGFibGUJPSBjaW5lcmd5dDJfdGFibGUKfTsKCnN0YXRpYyBpbnQgX19pbml0IGNpbmVyZ3l0Ml9pbml0ICh2b2lkKQp7CglpbnQgZXJyOwoKCWlmICgoZXJyID0gdXNiX3JlZ2lzdGVyKCZjaW5lcmd5dDJfZHJpdmVyKSkgPCAwKQoJCWRwcmludGsoMSwgInVzYl9yZWdpc3RlcigpIGZhaWxlZCEgKGVyciAlaSlcbiIsIGVycik7CgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgX19leGl0IGNpbmVyZ3l0Ml9leGl0ICh2b2lkKQp7Cgl1c2JfZGVyZWdpc3RlcigmY2luZXJneXQyX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0IChjaW5lcmd5dDJfaW5pdCk7Cm1vZHVsZV9leGl0IChjaW5lcmd5dDJfZXhpdCk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIkhvbGdlciBXYWVjaHRsZXIsIERhbmllbCBNYWNrIik7Cg==