LyoKICogVGVycmFUZWMgQ2luZXJneSBUsi9xYW51IFVTQjIgRFZCLVQgYWRhcHRlci4KICoKICogQ29weXJpZ2h0IChDKSAyMDA0IERhbmllbCBNYWNrIDxkYW5pZWxAcWFudS5kZT4gYW5kCiAqCQkgICAgSG9sZ2VyIFdhZWNodGxlciA8aG9sZ2VyQHFhbnUuZGU+CiAqCiAqICBQcm90b2NvbCBTcGVjIHB1Ymxpc2hlZCBvbiBodHRwOi8vcWFudS5kZS9zcGVjcy90ZXJyYXRlY19jaW5lcmd5VDIucGRmCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgojaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgoKI2luY2x1ZGUgImRteGRldi5oIgojaW5jbHVkZSAiZHZiX2RlbXV4LmgiCiNpbmNsdWRlICJkdmJfbmV0LmgiCgojaWZkZWYgQ09ORklHX0RWQl9DSU5FUkdZVDJfVFVOSU5HCgkjZGVmaW5lIFNUUkVBTV9VUkJfQ09VTlQgKENPTkZJR19EVkJfQ0lORVJHWVQyX1NUUkVBTV9VUkJfQ09VTlQpCgkjZGVmaW5lIFNUUkVBTV9CVUZfU0laRSAoQ09ORklHX0RWQl9DSU5FUkdZVDJfU1RSRUFNX0JVRl9TSVpFKQoJI2RlZmluZSBRVUVSWV9JTlRFUlZBTCAoQ09ORklHX0RWQl9DSU5FUkdZVDJfUVVFUllfSU5URVJWQUwpCgkjaWZkZWYgQ09ORklHX0RWQl9DSU5FUkdZVDJfRU5BQkxFX1JDX0lOUFVUX0RFVklDRQoJCSNkZWZpbmUgUkNfUVVFUllfSU5URVJWQUwgKENPTkZJR19EVkJfQ0lORVJHWVQyX1JDX1FVRVJZX0lOVEVSVkFMKQoJCSNkZWZpbmUgRU5BQkxFX1JDICgxKQoJI2VuZGlmCiNlbHNlCgkjZGVmaW5lIFNUUkVBTV9VUkJfQ09VTlQgKDMyKQoJI2RlZmluZSBTVFJFQU1fQlVGX1NJWkUgKDUxMikJLyogYnl0ZXMgKi8KCSNkZWZpbmUgRU5BQkxFX1JDICgxKQoJI2RlZmluZSBSQ19RVUVSWV9JTlRFUlZBTCAoNTApCS8qIG1pbGxpc2Vjb25kcyAqLwoJI2RlZmluZSBRVUVSWV9JTlRFUlZBTCAoMzMzKQkvKiBtaWxsaXNlY29uZHMgKi8KI2VuZGlmCgojZGVmaW5lIERSSVZFUl9OQU1FICJUZXJyYVRlYy9xYW51IFVTQjIuMCBIaWdoc3BlZWQgRFZCLVQgUmVjZWl2ZXIiCgpzdGF0aWMgaW50IGRlYnVnOwptb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRlYnVnLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CgojZGVmaW5lIGRwcmludGsobGV2ZWwsIGFyZ3MuLi4pCQkJCQkJXApkbyB7CQkJCQkJCQkJXAoJaWYgKChkZWJ1ZyAmIGxldmVsKSkgewkJCQkJCVwKCQlwcmludGsoIiVzOiAlcygpOiAiLCBLQlVJTERfTU9ETkFNRSwJCQlcCgkJICAgICAgIF9fRlVOQ1RJT05fXyk7CQkJCQlcCgkJcHJpbnRrKGFyZ3MpOyB9CQkJCQkJXAp9IHdoaWxlICgwKQoKZW51bSBjaW5lcmd5dDJfZXAxX2NtZCB7CglDSU5FUkdZVDJfRVAxX1BJRF9UQUJMRV9SRVNFVAkJPSAweDAxLAoJQ0lORVJHWVQyX0VQMV9QSURfU0VUVVAJCQk9IDB4MDIsCglDSU5FUkdZVDJfRVAxX0NPTlRST0xfU1RSRUFNX1RSQU5TRkVSCT0gMHgwMywKCUNJTkVSR1lUMl9FUDFfU0VUX1RVTkVSX1BBUkFNRVRFUlMJPSAweDA0LAoJQ0lORVJHWVQyX0VQMV9HRVRfVFVORVJfU1RBVFVTCQk9IDB4MDUsCglDSU5FUkdZVDJfRVAxX1NUQVJUX1NDQU4JCT0gMHgwNiwKCUNJTkVSR1lUMl9FUDFfQ09OVElOVUVfU0NBTgkJPSAweDA3LAoJQ0lORVJHWVQyX0VQMV9HRVRfUkNfRVZFTlRTCQk9IDB4MDgsCglDSU5FUkdZVDJfRVAxX1NMRUVQX01PREUJCT0gMHgwOQp9OwoKc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnIHsKCXVpbnQ4X3QgY21kOwoJdWludDMyX3QgZnJlcTsKCXVpbnQ4X3QgYmFuZHdpZHRoOwoJdWludDE2X3QgdHBzOwoJdWludDhfdCBmbGFnczsKfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKCnN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHsKCXVpbnQzMl90IGZyZXE7Cgl1aW50OF90IGJhbmR3aWR0aDsKCXVpbnQxNl90IHRwczsKCXVpbnQ4X3QgZmxhZ3M7Cgl1aW50MTZfdCBnYWluOwoJdWludDhfdCBzbnI7Cgl1aW50MzJfdCB2aXRlcmJpX2Vycm9yX3JhdGU7Cgl1aW50MzJfdCByc19lcnJvcl9yYXRlOwoJdWludDMyX3QgdW5jb3JyZWN0ZWRfYmxvY2tfY291bnQ7Cgl1aW50OF90IGxvY2tfYml0czsKCXVpbnQ4X3QgcHJldl9sb2NrX2JpdHM7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgpzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvIGNpbmVyZ3l0Ml9mZV9pbmZvID0gewoJLm5hbWUgPSBEUklWRVJfTkFNRSwKCS50eXBlID0gRkVfT0ZETSwKCS5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwLAoJLmZyZXF1ZW5jeV9tYXggPSA4NjIwMDAwMDAsCgkuZnJlcXVlbmN5X3N0ZXBzaXplID0gMTY2NjY3LAoJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfCBGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwKCQlGRV9DQU5fRkVDXzNfNCB8IEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfAoJCUZFX0NBTl9GRUNfQVVUTyB8CgkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8IEZFX0NBTl9RQU1fQVVUTyB8CgkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfCBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8CgkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPIHwgRkVfQ0FOX1JFQ09WRVIgfCBGRV9DQU5fTVVURV9UUwp9OwoKc3RydWN0IGNpbmVyZ3l0MiB7CglzdHJ1Y3QgZHZiX2RlbXV4IGRlbXV4OwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CglzdHJ1Y3QgbXV0ZXggc2VtOwoJc3RydWN0IGR2Yl9hZGFwdGVyIGFkYXB0ZXI7CglzdHJ1Y3QgZHZiX2RldmljZSAqZmVkZXY7CglzdHJ1Y3QgZG14ZGV2IGRteGRldjsKCXN0cnVjdCBkdmJfbmV0IGR2Ym5ldDsKCglpbnQgc3RyZWFtaW5nOwoJaW50IHNsZWVwaW5nOwoKCXN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyBwYXJhbTsKCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHN0YXR1czsKCXN0cnVjdCB3b3JrX3N0cnVjdCBxdWVyeV93b3JrOwoKCXdhaXRfcXVldWVfaGVhZF90IHBvbGxfd3E7CglpbnQgcGVuZGluZ19mZV9ldmVudHM7CglpbnQgZGlzY29ubmVjdF9wZW5kaW5nOwoJYXRvbWljX3QgaW51c2U7CgoJdm9pZCAqc3RyZWFtYnVmOwoJZG1hX2FkZHJfdCBzdHJlYW1idWZfZG1haGFuZGxlOwoJc3RydWN0IHVyYiAqc3RyZWFtX3VyYiBbU1RSRUFNX1VSQl9DT1VOVF07CgojaWZkZWYgRU5BQkxFX1JDCglzdHJ1Y3QgaW5wdXRfZGV2ICpyY19pbnB1dF9kZXY7CgljaGFyIHBoeXNbNjRdOwoJc3RydWN0IHdvcmtfc3RydWN0IHJjX3F1ZXJ5X3dvcms7CglpbnQgcmNfaW5wdXRfZXZlbnQ7Cgl1MzIgcmNfbGFzdF9jb2RlOwoJdW5zaWduZWQgbG9uZyBsYXN0X2V2ZW50X2ppZmZpZXM7CiNlbmRpZgp9OwoKZW51bSB7CglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9OT05FID0gMHgwMCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQyAgPSAweDAxLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfUkM1ICA9IDB4MDIKfTsKCnN0cnVjdCBjaW5lcmd5dDJfcmNfZXZlbnQgewoJY2hhciB0eXBlOwoJdWludDMyX3QgdmFsdWU7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgpzdGF0aWMgY29uc3QgdWludDMyX3QgcmNfa2V5c1tdID0gewoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGZlMDFlYjA0LAlLRVlfUE9XRVIsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmQwMmViMDQsCUtFWV8xLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGZjMDNlYjA0LAlLRVlfMiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmYjA0ZWIwNCwJS0VZXzMsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmEwNWViMDQsCUtFWV80LAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY5MDZlYjA0LAlLRVlfNSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmODA3ZWIwNCwJS0VZXzYsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjcwOGViMDQsCUtFWV83LAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY2MDllYjA0LAlLRVlfOCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmNTBhZWIwNCwJS0VZXzksCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjMwY2ViMDQsCUtFWV8wLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY0MGJlYjA0LAlLRVlfVklERU8sCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjIwZGViMDQsCUtFWV9SRUZSRVNILAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGYxMGVlYjA0LAlLRVlfU0VMRUNULAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGYwMGZlYjA0LAlLRVlfRVBHLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGVmMTBlYjA0LAlLRVlfVVAsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWIxNGViMDQsCUtFWV9ET1dOLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGVlMTFlYjA0LAlLRVlfTEVGVCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlYzEzZWIwNCwJS0VZX1JJR0hULAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGVkMTJlYjA0LAlLRVlfT0ssCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWExNWViMDQsCUtFWV9URVhULAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU5MTZlYjA0LAlLRVlfSU5GTywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlODE3ZWIwNCwJS0VZX1JFRCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlNzE4ZWIwNCwJS0VZX0dSRUVOLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU2MTllYjA0LAlLRVlfWUVMTE9XLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU1MWFlYjA0LAlLRVlfQkxVRSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlMzFjZWIwNCwJS0VZX1ZPTFVNRVVQLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGUxMWVlYjA0LAlLRVlfVk9MVU1FRE9XTiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlMjFkZWIwNCwJS0VZX01VVEUsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTQxYmViMDQsCUtFWV9DSEFOTkVMVVAsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTAxZmViMDQsCUtFWV9DSEFOTkVMRE9XTiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhiZjQwZWIwNCwJS0VZX1BBVVNFLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGIzNGNlYjA0LAlLRVlfUExBWSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhhNzU4ZWIwNCwJS0VZX1JFQ09SRCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhhYjU0ZWIwNCwJS0VZX1BSRVZJT1VTLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGI3NDhlYjA0LAlLRVlfU1RPUCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhhMzVjZWIwNCwJS0VZX05FWFQKfTsKCnN0YXRpYyBpbnQgY2luZXJneXQyX2NvbW1hbmQgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiwKCQkJICAgICAgY2hhciAqc2VuZF9idWYsIGludCBzZW5kX2J1Zl9sZW4sCgkJCSAgICAgIGNoYXIgKnJlY3ZfYnVmLCBpbnQgcmVjdl9idWZfbGVuKQp7CglpbnQgYWN0dWFsX2xlbjsKCWNoYXIgZHVtbXk7CglpbnQgcmV0OwoKCXJldCA9IHVzYl9idWxrX21zZyhjaW5lcmd5dDItPnVkZXYsIHVzYl9zbmRidWxrcGlwZShjaW5lcmd5dDItPnVkZXYsIDEpLAoJCQkgICBzZW5kX2J1Ziwgc2VuZF9idWZfbGVuLCAmYWN0dWFsX2xlbiwgMTAwMCk7CgoJaWYgKHJldCkKCQlkcHJpbnRrKDEsICJ1c2JfYnVsa19tc2cgKHNlbmQpIGZhaWxlZCwgZXJyICVpXG4iLCByZXQpOwoKCWlmICghcmVjdl9idWYpCgkJcmVjdl9idWYgPSAmZHVtbXk7CgoJcmV0ID0gdXNiX2J1bGtfbXNnKGNpbmVyZ3l0Mi0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGNpbmVyZ3l0Mi0+dWRldiwgMSksCgkJCSAgIHJlY3ZfYnVmLCByZWN2X2J1Zl9sZW4sICZhY3R1YWxfbGVuLCAxMDAwKTsKCglpZiAocmV0KQoJCWRwcmludGsoMSwgInVzYl9idWxrX21zZyAocmVhZCkgZmFpbGVkLCBlcnIgJWlcbiIsIHJldCk7CgoJcmV0dXJuIHJldCA/IHJldCA6IGFjdHVhbF9sZW47Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9jb250cm9sX3N0cmVhbV90cmFuc2ZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyLCBpbnQgZW5hYmxlKQp7CgljaGFyIGJ1ZiBbXSA9IHsgQ0lORVJHWVQyX0VQMV9DT05UUk9MX1NUUkVBTV9UUkFOU0ZFUiwgZW5hYmxlID8gMSA6IDAgfTsKCWNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9zbGVlcCAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyLCBpbnQgc2xlZXApCnsKCWNoYXIgYnVmIFtdID0geyBDSU5FUkdZVDJfRVAxX1NMRUVQX01PREUsIHNsZWVwID8gMSA6IDAgfTsKCWNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7CgljaW5lcmd5dDItPnNsZWVwaW5nID0gc2xlZXA7Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9zdHJlYW1faXJxIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKCnN0YXRpYyBpbnQgY2luZXJneXQyX3N1Ym1pdF9zdHJlYW1fdXJiIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIsIHN0cnVjdCB1cmIgKnVyYikKewoJaW50IGVycjsKCgl1c2JfZmlsbF9idWxrX3VyYih1cmIsCgkJCSAgY2luZXJneXQyLT51ZGV2LAoJCQkgIHVzYl9yY3ZidWxrcGlwZShjaW5lcmd5dDItPnVkZXYsIDB4MiksCgkJCSAgdXJiLT50cmFuc2Zlcl9idWZmZXIsCgkJCSAgU1RSRUFNX0JVRl9TSVpFLAoJCQkgIGNpbmVyZ3l0Ml9zdHJlYW1faXJxLAoJCQkgIGNpbmVyZ3l0Mik7CgoJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSkKCQlkcHJpbnRrKDEsICJ1cmIgc3VibWlzc2lvbiBmYWlsZWQgKGVyciA9ICVpKSFcbiIsIGVycik7CgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3N0cmVhbV9pcnEgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVyYi0+Y29udGV4dDsKCglpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkKCQlkdmJfZG14X3N3ZmlsdGVyKCZjaW5lcmd5dDItPmRlbXV4LAoJCQkJIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwoKCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZykKCQljaW5lcmd5dDJfc3VibWl0X3N0cmVhbV91cmIoY2luZXJneXQyLCB1cmIpOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfZnJlZV9zdHJlYW1fdXJicyAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglpbnQgaTsKCglmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspCgkJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSkKCQkJdXNiX2ZyZWVfdXJiKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSk7CgoJdXNiX2J1ZmZlcl9mcmVlKGNpbmVyZ3l0Mi0+dWRldiwgU1RSRUFNX1VSQl9DT1VOVCpTVFJFQU1fQlVGX1NJWkUsCgkJCSAgICBjaW5lcmd5dDItPnN0cmVhbWJ1ZiwgY2luZXJneXQyLT5zdHJlYW1idWZfZG1haGFuZGxlKTsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfYWxsb2Nfc3RyZWFtX3VyYnMgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKewoJaW50IGk7CgoJY2luZXJneXQyLT5zdHJlYW1idWYgPSB1c2JfYnVmZmVyX2FsbG9jKGNpbmVyZ3l0Mi0+dWRldiwgU1RSRUFNX1VSQl9DT1VOVCpTVFJFQU1fQlVGX1NJWkUsCgkJCQkJICAgICAgU0xBQl9LRVJORUwsICZjaW5lcmd5dDItPnN0cmVhbWJ1Zl9kbWFoYW5kbGUpOwoJaWYgKCFjaW5lcmd5dDItPnN0cmVhbWJ1ZikgewoJCWRwcmludGsoMSwgImZhaWxlZCB0byBhbGxvYyBjb25zaXN0ZW50IHN0cmVhbSBtZW1vcnkgYXJlYSwgYmFpbGluZyBvdXQhXG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgltZW1zZXQoY2luZXJneXQyLT5zdHJlYW1idWYsIDAsIFNUUkVBTV9VUkJfQ09VTlQqU1RSRUFNX0JVRl9TSVpFKTsKCglmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspIHsKCQlzdHJ1Y3QgdXJiICp1cmI7CgoJCWlmICghKHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQykpKSB7CgkJCWRwcmludGsoMSwgImZhaWxlZCB0byBhbGxvYyBjb25zaXN0ZW50IHN0cmVhbSB1cmJzLCBiYWlsaW5nIG91dCFcbiIpOwoJCQljaW5lcmd5dDJfZnJlZV9zdHJlYW1fdXJicyhjaW5lcmd5dDIpOwoJCQlyZXR1cm4gLUVOT01FTTsKCQl9CgoJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gY2luZXJneXQyLT5zdHJlYW1idWYgKyBpICogU1RSRUFNX0JVRl9TSVpFOwoJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFNUUkVBTV9CVUZfU0laRTsKCgkJY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldID0gdXJiOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglpbnQgaTsKCgljaW5lcmd5dDJfY29udHJvbF9zdHJlYW1fdHJhbnNmZXIoY2luZXJneXQyLCAwKTsKCglmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspCgkJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSkKCQkJdXNiX2tpbGxfdXJiKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSk7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3N0YXJ0X3N0cmVhbV94ZmVyIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWludCBpLCBlcnI7CgoJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKSB7CgkJaWYgKChlcnIgPSBjaW5lcmd5dDJfc3VibWl0X3N0cmVhbV91cmIoY2luZXJneXQyLCBjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pKSkgewoJCQljaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoJCQlkcHJpbnRrKDEsICJmYWlsZWQgdXJiIHN1Ym1pc3Npb24gKCVpOiBlcnIgPSAlaSkhXG4iLCBpLCBlcnIpOwoJCQlyZXR1cm4gZXJyOwoJCX0KCX0KCgljaW5lcmd5dDJfY29udHJvbF9zdHJlYW1fdHJhbnNmZXIoY2luZXJneXQyLCAxKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKewoJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBkdmJkbXhmZWVkLT5kZW11eDsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGRlbXV4LT5wcml2OwoKCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZyA9PSAwKQoJCWNpbmVyZ3l0Ml9zdGFydF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoKCWNpbmVyZ3l0Mi0+c3RyZWFtaW5nKys7CgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQp7CglzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGR2YmRteGZlZWQtPmRlbXV4OwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZGVtdXgtPnByaXY7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJaWYgKC0tY2luZXJneXQyLT5zdHJlYW1pbmcgPT0gMCkKCQljaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiAgY29udmVydCBsaW51eC1kdmIgZnJvbnRlbmQgcGFyYW1ldGVyIHNldCBpbnRvIFRQUy4KICogIFNlZSBFVFNJIEVUUy0zMDA3NDQsIHNlY3Rpb24gNC42LjIsIHRhYmxlIDkgZm9yIGRldGFpbHMuCiAqCiAqICBUaGlzIGZ1bmN0aW9uIGlzIHByb2JhYmx5IHJldXNhYmxlIGFuZCBtYXkgYmV0dGVyIGdldCBwbGFjZWQgaW4gYSBzdXBwb3J0CiAqICBsaWJyYXJ5LgogKgogKiAgV2UgcmVwbGFjZSBlcnJvcm5vdXMgZmllbGRzIGJ5IGRlZmF1bHQgVFBTIGZpZWxkcyAodGhlIG9uZXMgd2l0aCB2YWx1ZSAwKS4KICovCnN0YXRpYyB1aW50MTZfdCBjb21wdXRlX3RwcyAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQp7CglzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyAqb3AgPSAmcC0+dS5vZmRtOwoJdWludDE2X3QgdHBzID0gMDsKCglzd2l0Y2ggKG9wLT5jb2RlX3JhdGVfSFApIHsKCQljYXNlIEZFQ18yXzM6CgkJCXRwcyB8PSAoMSA8PCA3KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfM180OgoJCQl0cHMgfD0gKDIgPDwgNyk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzVfNjoKCQkJdHBzIHw9ICgzIDw8IDcpOwoJCQlicmVhazsKCQljYXNlIEZFQ183Xzg6CgkJCXRwcyB8PSAoNCA8PCA3KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfMV8yOgoJCWNhc2UgRkVDX0FVVE86CgkJZGVmYXVsdDoKCQkJLyogdHBzIHw9ICgwIDw8IDcpICovOwoJfQoKCXN3aXRjaCAob3AtPmNvZGVfcmF0ZV9MUCkgewoJCWNhc2UgRkVDXzJfMzoKCQkJdHBzIHw9ICgxIDw8IDQpOwoJCQlicmVhazsKCQljYXNlIEZFQ18zXzQ6CgkJCXRwcyB8PSAoMiA8PCA0KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfNV82OgoJCQl0cHMgfD0gKDMgPDwgNCk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzdfODoKCQkJdHBzIHw9ICg0IDw8IDQpOwoJCQlicmVhazsKCQljYXNlIEZFQ18xXzI6CgkJY2FzZSBGRUNfQVVUTzoKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgNCkgKi87Cgl9CgoJc3dpdGNoIChvcC0+Y29uc3RlbGxhdGlvbikgewoJCWNhc2UgUUFNXzE2OgoJCQl0cHMgfD0gKDEgPDwgMTMpOwoJCQlicmVhazsKCQljYXNlIFFBTV82NDoKCQkJdHBzIHw9ICgyIDw8IDEzKTsKCQkJYnJlYWs7CgkJY2FzZSBRUFNLOgoJCWRlZmF1bHQ6CgkJCS8qIHRwcyB8PSAoMCA8PCAxMykgKi87Cgl9CgoJc3dpdGNoIChvcC0+dHJhbnNtaXNzaW9uX21vZGUpIHsKCQljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzhLOgoJCQl0cHMgfD0gKDEgPDwgMCk7CgkJCWJyZWFrOwoJCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfMks6CgkJZGVmYXVsdDoKCQkJLyogdHBzIHw9ICgwIDw8IDApICovOwoJfQoKCXN3aXRjaCAob3AtPmd1YXJkX2ludGVydmFsKSB7CgkJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzE2OgoJCQl0cHMgfD0gKDEgPDwgMik7CgkJCWJyZWFrOwoJCWNhc2UgR1VBUkRfSU5URVJWQUxfMV84OgoJCQl0cHMgfD0gKDIgPDwgMik7CgkJCWJyZWFrOwoJCWNhc2UgR1VBUkRfSU5URVJWQUxfMV80OgoJCQl0cHMgfD0gKDMgPDwgMik7CgkJCWJyZWFrOwoJCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8zMjoKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgMikgKi87Cgl9CgoJc3dpdGNoIChvcC0+aGllcmFyY2h5X2luZm9ybWF0aW9uKSB7CgkJY2FzZSBISUVSQVJDSFlfMToKCQkJdHBzIHw9ICgxIDw8IDEwKTsKCQkJYnJlYWs7CgkJY2FzZSBISUVSQVJDSFlfMjoKCQkJdHBzIHw9ICgyIDw8IDEwKTsKCQkJYnJlYWs7CgkJY2FzZSBISUVSQVJDSFlfNDoKCQkJdHBzIHw9ICgzIDw8IDEwKTsKCQkJYnJlYWs7CgkJY2FzZSBISUVSQVJDSFlfTk9ORToKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgMTApICovOwoJfQoKCXJldHVybiB0cHM7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwoJaW50IGVyciA9IC1FUkVTVEFSVFNZUzsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglpZiAoKGVyciA9IGR2Yl9nZW5lcmljX29wZW4oaW5vZGUsIGZpbGUpKSkgewoJCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoJCXJldHVybiBlcnI7Cgl9CgoKCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpIHsKCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAwKTsKCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yaywgSFovMik7Cgl9CgoJYXRvbWljX2luYygmY2luZXJneXQyLT5pbnVzZSk7CgoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3VucmVnaXN0ZXIoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglkdmJfbmV0X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZHZibmV0KTsKCWR2Yl9kbXhkZXZfcmVsZWFzZSgmY2luZXJneXQyLT5kbXhkZXYpOwoJZHZiX2RteF9yZWxlYXNlKCZjaW5lcmd5dDItPmRlbXV4KTsKCWR2Yl91bnJlZ2lzdGVyX2RldmljZShjaW5lcmd5dDItPmZlZGV2KTsKCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmNpbmVyZ3l0Mi0+YWRhcHRlcik7CgoJY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMoY2luZXJneXQyKTsKCWtmcmVlKGNpbmVyZ3l0Mik7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwoKCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmICghY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7CgkJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrKTsKCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwoJCWNpbmVyZ3l0Ml9zbGVlcChjaW5lcmd5dDIsIDEpOwoJfQoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoKCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjaW5lcmd5dDItPmludXNlKSAmJiBjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZykgewoJCXdhcm4oImRlbGF5ZWQgdW5yZWdpc3RlciBpbiByZWxlYXNlIik7CgkJY2luZXJneXQyX3VucmVnaXN0ZXIoY2luZXJneXQyKTsKCX0KCglyZXR1cm4gZHZiX2dlbmVyaWNfcmVsZWFzZShpbm9kZSwgZmlsZSk7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2luZXJneXQyX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCnsKCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7CiAgICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJcG9sbF93YWl0KGZpbGUsICZjaW5lcmd5dDItPnBvbGxfd3EsIHdhaXQpOwoKICAgICAgIGlmIChjaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzICE9IDApCgkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExQUkkpOwoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoKICAgICAgIHJldHVybiBtYXNrOwp9CgoKc3RhdGljIGludCBjaW5lcmd5dDJfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAoJCSAgICAgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnICpzdGF0ID0gJmNpbmVyZ3l0Mi0+c3RhdHVzOwoJZmVfc3RhdHVzX3Qgc3RhdHVzID0gMDsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBGRV9HRVRfSU5GTzoKCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciopIGFyZywgJmNpbmVyZ3l0Ml9mZV9pbmZvLAoJCQkJICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8pKTsKCgljYXNlIEZFX1JFQURfU1RBVFVTOgoJCWlmICgweGZmZmYgLSBsZTE2X3RvX2NwdShzdGF0LT5nYWluKSA+IDMwKQoJCQlzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgNikpCgkJCXN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgNSkpCgkJCXN0YXR1cyB8PSBGRV9IQVNfU1lOQzsKCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgNCkpCgkJCXN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgMSkpCgkJCXN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKCgkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAgX191c2VyKikgYXJnLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7CgoJY2FzZSBGRV9SRUFEX0JFUjoKCQlyZXR1cm4gcHV0X3VzZXIobGUzMl90b19jcHUoc3RhdC0+dml0ZXJiaV9lcnJvcl9yYXRlKSwKCQkJCShfX3UzMiBfX3VzZXIgKikgYXJnKTsKCgljYXNlIEZFX1JFQURfU0lHTkFMX1NUUkVOR1RIOgoJCXJldHVybiBwdXRfdXNlcigweGZmZmYgLSBsZTE2X3RvX2NwdShzdGF0LT5nYWluKSwKCQkJCShfX3UxNiBfX3VzZXIgKikgYXJnKTsKCgljYXNlIEZFX1JFQURfU05SOgoJCXJldHVybiBwdXRfdXNlcigoc3RhdC0+c25yIDw8IDgpIHwgc3RhdC0+c25yLAoJCQkJKF9fdTE2IF9fdXNlciAqKSBhcmcpOwoKCWNhc2UgRkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1M6Cgl7CgkJdWludDMyX3QgdW5jX2NvdW50OwoKCQl1bmNfY291bnQgPSBzdGF0LT51bmNvcnJlY3RlZF9ibG9ja19jb3VudDsKCQlzdGF0LT51bmNvcnJlY3RlZF9ibG9ja19jb3VudCA9IDA7CgoJCS8qIFVOQyBhcmUgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gaG9zdCBieXRlIG9yZGVyLi4uICovCgkJcmV0dXJuIHB1dF91c2VyKHVuY19jb3VudCwoX191MzIgX191c2VyICopIGFyZyk7Cgl9CgljYXNlIEZFX1NFVF9GUk9OVEVORDoKCXsKCQlzdHJ1Y3QgZHZidF9zZXRfcGFyYW1ldGVyc19tc2cgKnBhcmFtID0gJmNpbmVyZ3l0Mi0+cGFyYW07CgkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHA7CgkJaW50IGVycjsKCgkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKCQkJcmV0dXJuIC1FUEVSTTsKCgkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCAodm9pZCAgX191c2VyKikgYXJnLCBzaXplb2YocCkpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCgkJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCQlwYXJhbS0+Y21kID0gQ0lORVJHWVQyX0VQMV9TRVRfVFVORVJfUEFSQU1FVEVSUzsKCQlwYXJhbS0+dHBzID0gY3B1X3RvX2xlMTYoY29tcHV0ZV90cHMoJnApKTsKCQlwYXJhbS0+ZnJlcSA9IGNwdV90b19sZTMyKHAuZnJlcXVlbmN5IC8gMTAwMCk7CgkJcGFyYW0tPmJhbmR3aWR0aCA9IDggLSBwLnUub2ZkbS5iYW5kd2lkdGggLSBCQU5EV0lEVEhfOF9NSFo7CgoJCXN0YXQtPmxvY2tfYml0cyA9IDA7CgkJY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cysrOwoJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5wb2xsX3dxKTsKCgkJZXJyID0gY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLAoJCQkJCShjaGFyICopIHBhcmFtLCBzaXplb2YoKnBhcmFtKSwKCQkJCQlOVUxMLCAwKTsKCgkJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7CgoJCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwoJfQoKCWNhc2UgRkVfR0VUX0ZST05URU5EOgoJCS8qKgoJCSAqICB0cml2aWFsIHRvIGltcGxlbWVudCAoc2VlIHN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnKS4KCQkgKiAgZXF1aXZhbGVudCB0byBGRV9SRUFEIGlvY3RscywgYnV0IG5lZWRzCgkJICogIFRQUyAtPiBsaW51eC1kdmIgcGFyYW1ldGVyIHNldCBjb252ZXJzaW9uLiBGZWVsIGZyZWUKCQkgKiAgdG8gaW1wbGVtZW50IHRoaXMgYW5kIHNlbmQgdXMgYSBwYXRjaCBpZiB5b3UgbmVlZCB0aGlzCgkJICogIGZ1bmN0aW9uYWxpdHkuCgkJICovCgkJYnJlYWs7CgoJY2FzZSBGRV9HRVRfRVZFTlQ6Cgl7CgkJLyoqCgkJICogIGZvciBub3cgd2Ugb25seSBmaWxsIHRoZSBzdGF0dXMgZmllbGQuIHRoZSBwYXJhbWV0ZXJzCgkJICogIGFyZSB0cml2aWFsIHRvIGZpbGwgYXMgc29vbiBGRV9HRVRfRlJPTlRFTkQgaXMgZG9uZS4KCQkgKi8KCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50IF9fdXNlciAqZSA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CgkJaWYgKGNpbmVyZ3l0Mi0+cGVuZGluZ19mZV9ldmVudHMgPT0gMCkgewoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCgkJCQlyZXR1cm4gLUVXT1VMREJMT0NLOwoJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2luZXJneXQyLT5wb2xsX3dxLAoJCQkJCQkgY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cyA+IDApOwoJCX0KCQljaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzID0gMDsKCQlyZXR1cm4gY2luZXJneXQyX2lvY3RsKGlub2RlLCBmaWxlLCBGRV9SRUFEX1NUQVRVUywKCQkJCQkodW5zaWduZWQgbG9uZykgJmUtPnN0YXR1cyk7Cgl9CgoJZGVmYXVsdDoKCQk7Cgl9CgoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQp7CglzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwoJaW50IHJldCA9IDA7CgoJbG9ja19rZXJuZWwoKTsKCglpZiAodm1hLT52bV9mbGFncyAmIChWTV9XUklURSB8IFZNX0VYRUMpKSB7CgkJcmV0ID0gLUVQRVJNOwoJCWdvdG8gYmFpbG91dDsKCX0KCglpZiAodm1hLT52bV9lbmQgPiB2bWEtPnZtX3N0YXJ0ICsgU1RSRUFNX1VSQl9DT1VOVCAqIFNUUkVBTV9CVUZfU0laRSkgewoJCXJldCA9IC1FSU5WQUw7CgkJZ290byBiYWlsb3V0OwoJfQoKCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX0lPIHwgVk1fRE9OVENPUFkpOwoJdm1hLT52bV9maWxlID0gZmlsZTsKCglyZXQgPSByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAoJCQkgICAgICB2aXJ0X3RvX3BoeXMoY2luZXJneXQyLT5zdHJlYW1idWYpID4+IFBBR0VfU0hJRlQsCgkJCSAgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKCQkJICAgICAgdm1hLT52bV9wYWdlX3Byb3QpID8gLUVBR0FJTiA6IDA7CmJhaWxvdXQ6Cgl1bmxvY2tfa2VybmVsKCk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaW5lcmd5dDJfZm9wcyA9IHsKCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAoJLmlvY3RsCQk9IGNpbmVyZ3l0Ml9pb2N0bCwKCS5wb2xsICAgICAgICAgICA9IGNpbmVyZ3l0Ml9wb2xsLAoJLm9wZW4gICAgICAgICAgID0gY2luZXJneXQyX29wZW4sCgkucmVsZWFzZSAgICAgICAgPSBjaW5lcmd5dDJfcmVsZWFzZSwKCS5tbWFwCQk9IGNpbmVyZ3l0Ml9tbWFwCn07CgpzdGF0aWMgc3RydWN0IGR2Yl9kZXZpY2UgY2luZXJneXQyX2ZlX3RlbXBsYXRlID0gewoJLnVzZXJzID0gfjAsCgkud3JpdGVycyA9IDEsCgkucmVhZGVycyA9ICh+MCktMSwKCS5mb3BzID0gJmNpbmVyZ3l0Ml9mb3BzCn07CgojaWZkZWYgRU5BQkxFX1JDCgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnlfcmMgKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGRhdGE7CgljaGFyIGJ1ZlsxXSA9IHsgQ0lORVJHWVQyX0VQMV9HRVRfUkNfRVZFTlRTIH07CglzdHJ1Y3QgY2luZXJneXQyX3JjX2V2ZW50IHJjX2V2ZW50c1sxMl07CglpbnQgbiwgbGVuLCBpOwoKCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm47CgoJbGVuID0gY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCBidWYsIHNpemVvZihidWYpLAoJCQkJKGNoYXIgKikgcmNfZXZlbnRzLCBzaXplb2YocmNfZXZlbnRzKSk7CglpZiAobGVuIDwgMCkKCQlnb3RvIG91dDsKCWlmIChsZW4gPT0gMCkgewoJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGNpbmVyZ3l0Mi0+bGFzdF9ldmVudF9qaWZmaWVzICsKCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTUwKSkpIHsKCQkJLyogc3RvcCBrZXkgcmVwZWF0ICovCgkJCWlmIChjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ICE9IEtFWV9NQVgpIHsKCQkJCWRwcmludGsoMSwgInJjX2lucHV0X2V2ZW50PSVkIFVwXG4iLCBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50KTsKCQkJCWlucHV0X3JlcG9ydF9rZXkoY2luZXJneXQyLT5yY19pbnB1dF9kZXYsCgkJCQkJCSBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAwKTsKCQkJCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSBLRVlfTUFYOwoJCQl9CgkJCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gfjA7CgkJfQoJCWdvdG8gb3V0OwoJfQoJY2luZXJneXQyLT5sYXN0X2V2ZW50X2ppZmZpZXMgPSBqaWZmaWVzOwoKCWZvciAobiA9IDA7IG4gPCAobGVuIC8gc2l6ZW9mKHJjX2V2ZW50c1swXSkpOyBuKyspIHsKCQlkcHJpbnRrKDEsICJyY19ldmVudHNbJWRdLnZhbHVlID0gJXgsIHR5cGU9JXhcbiIsCgkJCW4sIGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSksIHJjX2V2ZW50c1tuXS50eXBlKTsKCgkJaWYgKHJjX2V2ZW50c1tuXS50eXBlID09IENJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQyAmJgoJCSAgICByY19ldmVudHNbbl0udmFsdWUgPT0gfjApIHsKCQkJLyoga2V5cmVwZWF0IGJpdCAtPiBqdXN0IHJlcGVhdCBsYXN0IHJjX2lucHV0X2V2ZW50ICovCgkJfSBlbHNlIHsKCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7CgkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJjX2tleXMpOyBpICs9IDMpIHsKCQkJCWlmIChyY19rZXlzW2kgKyAwXSA9PSByY19ldmVudHNbbl0udHlwZSAmJgoJCQkJICAgIHJjX2tleXNbaSArIDFdID09IGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSkpIHsKCQkJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gcmNfa2V5c1tpICsgMl07CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ICE9IEtFWV9NQVgpIHsKCQkJaWYgKHJjX2V2ZW50c1tuXS52YWx1ZSA9PSBjaW5lcmd5dDItPnJjX2xhc3RfY29kZSAmJgoJCQkgICAgY2luZXJneXQyLT5yY19sYXN0X2NvZGUgIT0gfjApIHsKCQkJCS8qIGVtaXQgYSBrZXktdXAgc28gdGhlIGRvdWJsZSBldmVudCBpcyByZWNvZ25pemVkICovCgkJCQlkcHJpbnRrKDEsICJyY19pbnB1dF9ldmVudD0lZCBVUFxuIiwgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCk7CgkJCQlpbnB1dF9yZXBvcnRfa2V5KGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAoJCQkJCQkgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCwgMCk7CgkJCX0KCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWRcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOwoJCQlpbnB1dF9yZXBvcnRfa2V5KGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAoJCQkJCSBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAxKTsKCQkJY2luZXJneXQyLT5yY19sYXN0X2NvZGUgPSByY19ldmVudHNbbl0udmFsdWU7CgkJfQoJfQoKb3V0OgoJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssCgkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUkNfUVVFUllfSU5URVJWQUwpKTsKCgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfcmVnaXN0ZXJfcmMoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CglpbnQgaTsKCgljaW5lcmd5dDItPnJjX2lucHV0X2RldiA9IGlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwoJaWYgKCFpbnB1dF9kZXYpCgkJcmV0dXJuIC1FTk9NRU07CgoJdXNiX21ha2VfcGF0aChjaW5lcmd5dDItPnVkZXYsIGNpbmVyZ3l0Mi0+cGh5cywgc2l6ZW9mKGNpbmVyZ3l0Mi0+cGh5cykpOwoJc3RybGNhdChjaW5lcmd5dDItPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGNpbmVyZ3l0Mi0+cGh5cykpOwoJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7CgljaW5lcmd5dDItPnJjX2xhc3RfY29kZSA9IH4wOwoJSU5JVF9XT1JLKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIGNpbmVyZ3l0Ml9xdWVyeV9yYywgY2luZXJneXQyKTsKCglpbnB1dF9kZXYtPm5hbWUgPSBEUklWRVJfTkFNRSAiIHJlbW90ZSBjb250cm9sIjsKCWlucHV0X2Rldi0+cGh5cyA9IGNpbmVyZ3l0Mi0+cGh5czsKCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRVApOwoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmNfa2V5cyk7IGkgKz0gMykKCQlzZXRfYml0KHJjX2tleXNbaSArIDJdLCBpbnB1dF9kZXYtPmtleWJpdCk7CglpbnB1dF9kZXYtPmtleWNvZGVzaXplID0gMDsKCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IDA7CgoJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLCBIWi8yKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3VucmVnaXN0ZXJfcmMoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CgljYW5jZWxfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmspOwoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoY2luZXJneXQyLT5yY19pbnB1dF9kZXYpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY2luZXJneXQyX3N1c3BlbmRfcmMoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CgljYW5jZWxfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmspOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY2luZXJneXQyX3Jlc3VtZV9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLCBIWi8yKTsKfQoKI2Vsc2UKCnN0YXRpYyBpbmxpbmUgaW50IGNpbmVyZ3l0Ml9yZWdpc3Rlcl9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpIHsgcmV0dXJuIDA7IH0Kc3RhdGljIGlubGluZSB2b2lkIGNpbmVyZ3l0Ml91bnJlZ2lzdGVyX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikgeyB9CnN0YXRpYyBpbmxpbmUgdm9pZCBjaW5lcmd5dDJfc3VzcGVuZF9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpIHsgfQpzdGF0aWMgaW5saW5lIHZvaWQgY2luZXJneXQyX3Jlc3VtZV9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpIHsgfQoKI2VuZGlmIC8qIEVOQUJMRV9SQyAqLwoKc3RhdGljIHZvaWQgY2luZXJneXQyX3F1ZXJ5ICh2b2lkICpkYXRhKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSAoc3RydWN0IGNpbmVyZ3l0MiAqKSBkYXRhOwoJY2hhciBjbWQgW10gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1RVTkVSX1NUQVRVUyB9OwoJc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgKnMgPSAmY2luZXJneXQyLT5zdGF0dXM7Cgl1aW50OF90IGxvY2tfYml0czsKCXVpbnQzMl90IHVuYzsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuOwoKCXVuYyA9IHMtPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50OwoJbG9ja19iaXRzID0gcy0+bG9ja19iaXRzOwoKCWNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgY21kLCBzaXplb2YoY21kKSwgKGNoYXIgKikgcywgc2l6ZW9mKCpzKSk7CgoJdW5jICs9IGxlMzJfdG9fY3B1KHMtPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50KTsKCXMtPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50ID0gdW5jOwoKCWlmIChsb2NrX2JpdHMgIT0gcy0+bG9ja19iaXRzKSB7CgkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnBvbGxfd3EpOwoJCWNpbmVyZ3l0Mi0+cGVuZGluZ19mZV9ldmVudHMrKzsKCX0KCglzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yaywKCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhRVUVSWV9JTlRFUlZBTCkpOwoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCgkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MjsKCWludCBlcnI7CgoJaWYgKCEoY2luZXJneXQyID0ga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCBjaW5lcmd5dDIpLCBHRlBfS0VSTkVMKSkpIHsKCQlkcHJpbnRrKDEsICJvdXQgb2YgbWVtb3J5PyE/XG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgltZW1zZXQgKGNpbmVyZ3l0MiwgMCwgc2l6ZW9mIChzdHJ1Y3QgY2luZXJneXQyKSk7Cgl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCAodm9pZCAqKSBjaW5lcmd5dDIpOwoKCW11dGV4X2luaXQoJmNpbmVyZ3l0Mi0+c2VtKTsKCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZjaW5lcmd5dDItPnBvbGxfd3EpOwoJSU5JVF9XT1JLKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmssIGNpbmVyZ3l0Ml9xdWVyeSwgY2luZXJneXQyKTsKCgljaW5lcmd5dDItPnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwoJY2luZXJneXQyLT5wYXJhbS5jbWQgPSBDSU5FUkdZVDJfRVAxX1NFVF9UVU5FUl9QQVJBTUVURVJTOwoKCWlmIChjaW5lcmd5dDJfYWxsb2Nfc3RyZWFtX3VyYnMgKGNpbmVyZ3l0MikgPCAwKSB7CgkJZHByaW50aygxLCAidW5hYmxlIHRvIGFsbG9jYXRlIHN0cmVhbSB1cmJzXG4iKTsKCQlrZnJlZShjaW5lcmd5dDIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWlmICgoZXJyID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgRFJJVkVSX05BTUUsIFRISVNfTU9EVUxFLCAmY2luZXJneXQyLT51ZGV2LT5kZXYpKSA8IDApIHsKCQlrZnJlZShjaW5lcmd5dDIpOwoJCXJldHVybiBlcnI7Cgl9CgoJY2luZXJneXQyLT5kZW11eC5wcml2ID0gY2luZXJneXQyOwoJY2luZXJneXQyLT5kZW11eC5maWx0ZXJudW0gPSAyNTY7CgljaW5lcmd5dDItPmRlbXV4LmZlZWRudW0gPSAyNTY7CgljaW5lcmd5dDItPmRlbXV4LnN0YXJ0X2ZlZWQgPSBjaW5lcmd5dDJfc3RhcnRfZmVlZDsKCWNpbmVyZ3l0Mi0+ZGVtdXguc3RvcF9mZWVkID0gY2luZXJneXQyX3N0b3BfZmVlZDsKCWNpbmVyZ3l0Mi0+ZGVtdXguZG14LmNhcGFiaWxpdGllcyA9IERNWF9UU19GSUxURVJJTkcgfAoJCQkJCSAgICBETVhfU0VDVElPTl9GSUxURVJJTkcgfAoJCQkJCSAgICBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORzsKCglpZiAoKGVyciA9IGR2Yl9kbXhfaW5pdCgmY2luZXJneXQyLT5kZW11eCkpIDwgMCkgewoJCWRwcmludGsoMSwgImR2Yl9kbXhfaW5pdCgpIGZhaWxlZCAoZXJyID0gJWQpXG4iLCBlcnIpOwoJCWdvdG8gYmFpbG91dDsKCX0KCgljaW5lcmd5dDItPmRteGRldi5maWx0ZXJudW0gPSBjaW5lcmd5dDItPmRlbXV4LmZpbHRlcm51bTsKCWNpbmVyZ3l0Mi0+ZG14ZGV2LmRlbXV4ID0gJmNpbmVyZ3l0Mi0+ZGVtdXguZG14OwoJY2luZXJneXQyLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKCglpZiAoKGVyciA9IGR2Yl9kbXhkZXZfaW5pdCgmY2luZXJneXQyLT5kbXhkZXYsICZjaW5lcmd5dDItPmFkYXB0ZXIpKSA8IDApIHsKCQlkcHJpbnRrKDEsICJkdmJfZG14ZGV2X2luaXQoKSBmYWlsZWQgKGVyciA9ICVkKVxuIiwgZXJyKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CgoJaWYgKGR2Yl9uZXRfaW5pdCgmY2luZXJneXQyLT5hZGFwdGVyLCAmY2luZXJneXQyLT5kdmJuZXQsICZjaW5lcmd5dDItPmRlbXV4LmRteCkpCgkJZHByaW50aygxLCAiZHZiX25ldF9pbml0KCkgZmFpbGVkIVxuIik7CgoJZHZiX3JlZ2lzdGVyX2RldmljZSgmY2luZXJneXQyLT5hZGFwdGVyLCAmY2luZXJneXQyLT5mZWRldiwKCQkJICAgICZjaW5lcmd5dDJfZmVfdGVtcGxhdGUsIGNpbmVyZ3l0MiwKCQkJICAgIERWQl9ERVZJQ0VfRlJPTlRFTkQpOwoKCWVyciA9IGNpbmVyZ3l0Ml9yZWdpc3Rlcl9yYyhjaW5lcmd5dDIpOwoJaWYgKGVycikKCQlnb3RvIGJhaWxvdXQ7CgoJcmV0dXJuIDA7CgpiYWlsb3V0OgoJZHZiX25ldF9yZWxlYXNlKCZjaW5lcmd5dDItPmR2Ym5ldCk7CglkdmJfZG14ZGV2X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZG14ZGV2KTsKCWR2Yl9kbXhfcmVsZWFzZSgmY2luZXJneXQyLT5kZW11eCk7CglkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZjaW5lcmd5dDItPmFkYXB0ZXIpOwoJY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMoY2luZXJneXQyKTsKCWtmcmVlKGNpbmVyZ3l0Mik7CglyZXR1cm4gLUVOT01FTTsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX2Rpc2Nvbm5lY3QgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKCglmbHVzaF9zY2hlZHVsZWRfd29yaygpOwoKCWNpbmVyZ3l0Ml91bnJlZ2lzdGVyX3JjKGNpbmVyZ3l0Mik7CgoJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrKTsKCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5wb2xsX3dxKTsKCgljaW5lcmd5dDItPmRlbXV4LmRteC5jbG9zZSgmY2luZXJneXQyLT5kZW11eC5kbXgpOwoJY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgPSAxOwoKCWlmICghYXRvbWljX3JlYWQoJmNpbmVyZ3l0Mi0+aW51c2UpKQoJCWNpbmVyZ3l0Ml91bnJlZ2lzdGVyKGNpbmVyZ3l0Mik7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3N1c3BlbmQgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwoKCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmICgxKSB7CgkJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CgoJCWNpbmVyZ3l0Ml9zdXNwZW5kX3JjKGNpbmVyZ3l0Mik7CgkJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrKTsKCQlpZiAoY2luZXJneXQyLT5zdHJlYW1pbmcpCgkJCWNpbmVyZ3l0Ml9zdG9wX3N0cmVhbV94ZmVyKGNpbmVyZ3l0Mik7CgkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAxKTsKCX0KCgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKCXN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyAqcGFyYW0gPSAmY2luZXJneXQyLT5wYXJhbTsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglpZiAoIWNpbmVyZ3l0Mi0+c2xlZXBpbmcpIHsKCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAwKTsKCQljaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsIChjaGFyICopIHBhcmFtLCBzaXplb2YoKnBhcmFtKSwgTlVMTCwgMCk7CgkJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtaW5nKQoJCQljaW5lcmd5dDJfc3RhcnRfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yaywgSFovMik7Cgl9CgoJY2luZXJneXQyX3Jlc3VtZV9yYyhjaW5lcmd5dDIpOwoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBjaW5lcmd5dDJfdGFibGUgW10gX19kZXZpbml0ZGF0YSA9IHsKCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDAzOCkgfSwKCXsgMCB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgY2luZXJneXQyX3RhYmxlKTsKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBjaW5lcmd5dDJfZHJpdmVyID0gewoJLm5hbWUJPSAiY2luZXJneVQyIiwKCS5wcm9iZQk9IGNpbmVyZ3l0Ml9wcm9iZSwKCS5kaXNjb25uZWN0CT0gY2luZXJneXQyX2Rpc2Nvbm5lY3QsCgkuc3VzcGVuZAk9IGNpbmVyZ3l0Ml9zdXNwZW5kLAoJLnJlc3VtZQkJPSBjaW5lcmd5dDJfcmVzdW1lLAoJLmlkX3RhYmxlCT0gY2luZXJneXQyX3RhYmxlCn07CgpzdGF0aWMgaW50IF9faW5pdCBjaW5lcmd5dDJfaW5pdCAodm9pZCkKewoJaW50IGVycjsKCglpZiAoKGVyciA9IHVzYl9yZWdpc3RlcigmY2luZXJneXQyX2RyaXZlcikpIDwgMCkKCQlkcHJpbnRrKDEsICJ1c2JfcmVnaXN0ZXIoKSBmYWlsZWQhIChlcnIgJWkpXG4iLCBlcnIpOwoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBjaW5lcmd5dDJfZXhpdCAodm9pZCkKewoJdXNiX2RlcmVnaXN0ZXIoJmNpbmVyZ3l0Ml9kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdCAoY2luZXJneXQyX2luaXQpOwptb2R1bGVfZXhpdCAoY2luZXJneXQyX2V4aXQpOwoKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQVVUSE9SKCJIb2xnZXIgV2FlY2h0bGVyLCBEYW5pZWwgTWFjayIpOwo=