LyoKICogU2FtcGxlIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgogKgogKiBDb3B5cmlnaHQgMjAwOS0yMDEwIEVYQ0VMSUFOQ0UsIEVtZXJpYyBCcnVuIDxlYnJ1bkBleGNlbGlhbmNlLmZyPgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlIDx0eXBlcy9nbG9iYWwuaD4KCiNpbmNsdWRlIDxjb21tb24vY2h1bmsuaD4KI2luY2x1ZGUgPGNvbW1vbi9oYXNoLmg+CiNpbmNsdWRlIDxjb21tb24vc3RhbmRhcmQuaD4KI2luY2x1ZGUgPGNvbW1vbi91cmlfYXV0aC5oPgojaW5jbHVkZSA8Y29tbW9uL2Jhc2U2NC5oPgoKI2luY2x1ZGUgPHByb3RvL2FyZy5oPgojaW5jbHVkZSA8cHJvdG8vYXV0aC5oPgojaW5jbHVkZSA8cHJvdG8vbG9nLmg+CiNpbmNsdWRlIDxwcm90by9wcm90b19odHRwLmg+CiNpbmNsdWRlIDxwcm90by9wcm94eS5oPgojaW5jbHVkZSA8cHJvdG8vc2FtcGxlLmg+CiNpbmNsdWRlIDxwcm90by9zdGlja190YWJsZS5oPgoKLyogc2FtcGxlIHR5cGUgbmFtZXMgKi8KY29uc3QgY2hhciAqc21wX3RvX3R5cGVbU01QX1RZUEVTXSA9IHsKCVtTTVBfVF9CT09MXSA9ICJib29sIiwKCVtTTVBfVF9VSU5UXSA9ICJ1aW50IiwKCVtTTVBfVF9TSU5UXSA9ICJzaW50IiwKCVtTTVBfVF9BRERSXSA9ICJhZGRyIiwKCVtTTVBfVF9JUFY0XSA9ICJpcHY0IiwKCVtTTVBfVF9JUFY2XSA9ICJpcHY2IiwKCVtTTVBfVF9TVFJdICA9ICJzdHIiLAoJW1NNUF9UX0JJTl0gID0gImJpbiIsCn07CgovKiBzdGF0aWMgc2FtcGxlIHVzZWQgaW4gc2FtcGxlX3Byb2Nlc3MoKSB3aGVuIDxwPiBpcyBOVUxMICovCnN0YXRpYyBzdHJ1Y3Qgc2FtcGxlIHRlbXBfc21wOwoKLyogbGlzdCBoZWFkIG9mIGFsbCBrbm93biBzYW1wbGUgZmV0Y2gga2V5d29yZHMgKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCBzYW1wbGVfZmV0Y2hlcyA9IHsKCS5saXN0ID0gTElTVF9IRUFEX0lOSVQoc2FtcGxlX2ZldGNoZXMubGlzdCkKfTsKCi8qIGxpc3QgaGVhZCBvZiBhbGwga25vd24gc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uIGtleXdvcmRzICovCnN0YXRpYyBzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCBzYW1wbGVfY29udnMgPSB7CgkubGlzdCA9IExJU1RfSEVBRF9JTklUKHNhbXBsZV9jb252cy5saXN0KQp9OwoKY29uc3QgdW5zaWduZWQgaW50IGZldGNoX2NhcFtTTVBfU1JDX0VOVFJJRVNdID0gewoJW1NNUF9TUkNfSU5UUk5dID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTElTVE5dID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfRlRFTkRdID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDRDTEldID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDVDTEldID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfVFJBQ0tdID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDZSRVFdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfSFJRSFZdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfSFJRSFBdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfSFJRQk9dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfQktFTkRdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfU0VSVlJdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDRTUlZdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDVTUlZdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDZSRVNdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfSFJTSFZdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfSFJTSFBdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfSFJTQk9dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfUlFGSU5dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfUlNGSU5dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfVFhGSU5dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfU1NGSU5dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCn07CgpzdGF0aWMgY29uc3QgY2hhciAqZmV0Y2hfc3JjX25hbWVzW1NNUF9TUkNfRU5UUklFU10gPSB7CglbU01QX1NSQ19JTlRSTl0gPSAiaW50ZXJuYWwgc3RhdGUiLAoJW1NNUF9TUkNfTElTVE5dID0gImxpc3RlbmVyIiwKCVtTTVBfU1JDX0ZURU5EXSA9ICJmcm9udGVuZCIsCglbU01QX1NSQ19MNENMSV0gPSAiY2xpZW50IGFkZHJlc3MiLAoJW1NNUF9TUkNfTDVDTEldID0gImNsaWVudC1zaWRlIGNvbm5lY3Rpb24iLAoJW1NNUF9TUkNfVFJBQ0tdID0gInRyYWNrIGNvdW50ZXJzIiwKCVtTTVBfU1JDX0w2UkVRXSA9ICJyZXF1ZXN0IGJ1ZmZlciIsCglbU01QX1NSQ19IUlFIVl0gPSAiSFRUUCByZXF1ZXN0IGhlYWRlcnMiLAoJW1NNUF9TUkNfSFJRSFBdID0gIkhUVFAgcmVxdWVzdCIsCglbU01QX1NSQ19IUlFCT10gPSAiSFRUUCByZXF1ZXN0IGJvZHkiLAoJW1NNUF9TUkNfQktFTkRdID0gImJhY2tlbmQiLAoJW1NNUF9TUkNfU0VSVlJdID0gInNlcnZlciIsCglbU01QX1NSQ19MNFNSVl0gPSAic2VydmVyIGFkZHJlc3MiLAoJW1NNUF9TUkNfTDVTUlZdID0gInNlcnZlci1zaWRlIGNvbm5lY3Rpb24iLAoJW1NNUF9TUkNfTDZSRVNdID0gInJlc3BvbnNlIGJ1ZmZlciIsCglbU01QX1NSQ19IUlNIVl0gPSAiSFRUUCByZXNwb25zZSBoZWFkZXJzIiwKCVtTTVBfU1JDX0hSU0hQXSA9ICJIVFRQIHJlc3BvbnNlIiwKCVtTTVBfU1JDX0hSU0JPXSA9ICJIVFRQIHJlc3BvbnNlIGJvZHkiLAoJW1NNUF9TUkNfUlFGSU5dID0gInJlcXVlc3QgYnVmZmVyIHN0YXRpc3RpY3MiLAoJW1NNUF9TUkNfUlNGSU5dID0gInJlc3BvbnNlIGJ1ZmZlciBzdGF0aXN0aWNzIiwKCVtTTVBfU1JDX1RYRklOXSA9ICJ0cmFuc2FjdGlvbiBzdGF0aXN0aWNzIiwKCVtTTVBfU1JDX1NTRklOXSA9ICJzZXNzaW9uIHN0YXRpc3RpY3MiLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgKmZldGNoX2NrcF9uYW1lc1tTTVBfQ0tQX0VOVFJJRVNdID0gewoJW1NNUF9DS1BfRkVfQ09OX0FDQ10gPSAiZnJvbnRlbmQgdGNwLXJlcXVlc3QgY29ubmVjdGlvbiBydWxlIiwKCVtTTVBfQ0tQX0ZFX1NFU19BQ0NdID0gImZyb250ZW5kIHRjcC1yZXF1ZXN0IHNlc3Npb24gcnVsZSIsCglbU01QX0NLUF9GRV9SRVFfQ05UXSA9ICJmcm9udGVuZCB0Y3AtcmVxdWVzdCBjb250ZW50IHJ1bGUiLAoJW1NNUF9DS1BfRkVfSFJRX0hEUl0gPSAiZnJvbnRlbmQgaHR0cC1yZXF1ZXN0IGhlYWRlciBydWxlIiwKCVtTTVBfQ0tQX0ZFX0hSUV9CRFldID0gImZyb250ZW5kIGh0dHAtcmVxdWVzdCBib2R5IHJ1bGUiLAoJW1NNUF9DS1BfRkVfU0VUX0JDS10gPSAiZnJvbnRlbmQgdXNlLWJhY2tlbmQgcnVsZSIsCglbU01QX0NLUF9CRV9SRVFfQ05UXSA9ICJiYWNrZW5kIHRjcC1yZXF1ZXN0IGNvbnRlbnQgcnVsZSIsCglbU01QX0NLUF9CRV9IUlFfSERSXSA9ICJiYWNrZW5kIGh0dHAtcmVxdWVzdCBoZWFkZXIgcnVsZSIsCglbU01QX0NLUF9CRV9IUlFfQkRZXSA9ICJiYWNrZW5kIGh0dHAtcmVxdWVzdCBib2R5IHJ1bGUiLAoJW1NNUF9DS1BfQkVfU0VUX1NSVl0gPSAiYmFja2VuZCB1c2Utc2VydmVyLCBiYWxhbmNlIG9yIHN0aWNrLW1hdGNoIHJ1bGUiLAoJW1NNUF9DS1BfQkVfU1JWX0NPTl0gPSAic2VydmVyIHNvdXJjZSBzZWxlY3Rpb24iLAoJW1NNUF9DS1BfQkVfUkVTX0NOVF0gPSAiYmFja2VuZCB0Y3AtcmVzcG9uc2UgY29udGVudCBydWxlIiwKCVtTTVBfQ0tQX0JFX0hSU19IRFJdID0gImJhY2tlbmQgaHR0cC1yZXNwb25zZSBoZWFkZXIgcnVsZSIsCglbU01QX0NLUF9CRV9IUlNfQkRZXSA9ICJiYWNrZW5kIGh0dHAtcmVzcG9uc2UgYm9keSBydWxlIiwKCVtTTVBfQ0tQX0JFX1NUT19SVUxdID0gImJhY2tlbmQgc3RpY2stc3RvcmUgcnVsZSIsCglbU01QX0NLUF9GRV9SRVNfQ05UXSA9ICJmcm9udGVuZCB0Y3AtcmVzcG9uc2UgY29udGVudCBydWxlIiwKCVtTTVBfQ0tQX0ZFX0hSU19IRFJdID0gImZyb250ZW5kIGh0dHAtcmVzcG9uc2UgaGVhZGVyIHJ1bGUiLAoJW1NNUF9DS1BfRkVfSFJTX0JEWV0gPSAiZnJvbnRlbmQgaHR0cC1yZXNwb25zZSBib2R5IHJ1bGUiLAoJW1NNUF9DS1BfRkVfTE9HX0VORF0gPSAibG9ncyIsCn07CgovKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHNhbXBsZV9leHByLgogKiBJdCBhc3N1bWVzIHRoYXQgdGhlIDxleHByPiBhbmQgYWxsIG9mIGl0cyBjb252ZXJ0ZXJzIGFyZSBwcm9wZXJseQogKiBpbml0aWFsaXplZC4KICovCmlubGluZQppbnQgc21wX2V4cHJfb3V0cHV0X3R5cGUoc3RydWN0IHNhbXBsZV9leHByICpleHByKQp7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwciAqc21wX2V4cHI7CgoJaWYgKCFMSVNUX0lTRU1QVFkoJmV4cHItPmNvbnZfZXhwcnMpKSB7CgkJc21wX2V4cHIgPSBMSVNUX1BSRVYoJmV4cHItPmNvbnZfZXhwcnMsIHN0cnVjdCBzYW1wbGVfY29udl9leHByICosIGxpc3QpOwoJCXJldHVybiBzbXBfZXhwci0+Y29udi0+b3V0X3R5cGU7Cgl9CglyZXR1cm4gZXhwci0+ZmV0Y2gtPm91dF90eXBlOwp9CgoKLyogZmlsbCB0aGUgdHJhc2ggd2l0aCBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHNvdXJjZSBuYW1lcyBmb3IgdGhlIDx1c2U+IGJpdAogKiBmaWVsZCB3aGljaCBtdXN0IGJlIGNvbXBvc2VkIG9mIGEgbm9uLW51bGwgc2V0IG9mIFNNUF9VU0VfKiBmbGFncy4gVGhlIHJldHVybgogKiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIGluIHRoZSB0cmFzaCBidWZmZXIuCiAqLwpjb25zdCBjaGFyICpzYW1wbGVfc3JjX25hbWVzKHVuc2lnbmVkIGludCB1c2UpCnsKCWludCBiaXQ7CgoJdHJhc2gubGVuID0gMDsKCXRyYXNoLnN0clswXSA9ICdcMCc7Cglmb3IgKGJpdCA9IDA7IGJpdCA8IFNNUF9TUkNfRU5UUklFUzsgYml0KyspIHsKCQlpZiAoISh1c2UgJiB+KCgxIDw8IGJpdCkgLSAxKSkpCgkJCWJyZWFrOyAvKiBubyBtb3JlIGJpdHMgKi8KCgkJaWYgKCEodXNlICYgKDEgPDwgYml0KSkpCgkJCWNvbnRpbnVlOyAvKiBiaXQgbm90IHNldCAqLwoKCQl0cmFzaC5sZW4gKz0gc25wcmludGYodHJhc2guc3RyICsgdHJhc2gubGVuLCB0cmFzaC5zaXplIC0gdHJhc2gubGVuLCAiJXMlcyIsCgkJCQkgICAgICAodXNlICYgKCgxIDw8IGJpdCkgLSAxKSkgPyAiLCIgOiAiIiwKCQkgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hfc3JjX25hbWVzW2JpdF0pOwoJfQoJcmV0dXJuIHRyYXNoLnN0cjsKfQoKLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29ycmVjdCBzYW1wbGUgY2hlY2twb2ludCBuYW1lLCBvciAidW5rbm93biIgd2hlbgogKiB0aGUgZmxhZ3MgYXJlIGludmFsaWQuIE9ubHkgdGhlIGxvd2VzdCBiaXQgaXMgdXNlZCwgaGlnaGVyIGJpdHMgYXJlIGlnbm9yZWQKICogaWYgc2V0LgogKi8KY29uc3QgY2hhciAqc2FtcGxlX2NrcF9uYW1lcyh1bnNpZ25lZCBpbnQgdXNlKQp7CglpbnQgYml0OwoKCWZvciAoYml0ID0gMDsgYml0IDwgU01QX0NLUF9FTlRSSUVTOyBiaXQrKykKCQlpZiAodXNlICYgKDEgPDwgYml0KSkKCQkJcmV0dXJuIGZldGNoX2NrcF9uYW1lc1tiaXRdOwoJcmV0dXJuICJ1bmtub3duIHNhbXBsZSBjaGVjayBwbGFjZSwgcGxlYXNlIHJlcG9ydCB0aGlzIGJ1ZyI7Cn0KCi8qCiAqIFJlZ2lzdGVycyB0aGUgc2FtcGxlIGZldGNoIGtleXdvcmQgbGlzdCA8a3dsPiBhcyBhIGxpc3Qgb2YgdmFsaWQga2V5d29yZHMKICogZm9yIG5leHQgcGFyc2luZyBzZXNzaW9ucy4gVGhlIGZldGNoIGtleXdvcmRzIGNhcGFiaWxpdGllcyBhcmUgYWxzbyBjb21wdXRlZAogKiBmcm9tIHRoZWlyIC0+dXNlIGZpZWxkLgogKi8Kdm9pZCBzYW1wbGVfcmVnaXN0ZXJfZmV0Y2hlcyhzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3QgKmt3bCkKewoJc3RydWN0IHNhbXBsZV9mZXRjaCAqc2Y7CglpbnQgYml0OwoKCWZvciAoc2YgPSBrd2wtPmt3OyBzZi0+a3cgIT0gTlVMTDsgc2YrKykgewoJCWZvciAoYml0ID0gMDsgYml0IDwgU01QX1NSQ19FTlRSSUVTOyBiaXQrKykKCQkJaWYgKHNmLT51c2UgJiAoMSA8PCBiaXQpKQoJCQkJc2YtPnZhbCB8PSBmZXRjaF9jYXBbYml0XTsKCX0KCUxJU1RfQUREUSgmc2FtcGxlX2ZldGNoZXMubGlzdCwgJmt3bC0+bGlzdCk7Cn0KCi8qCiAqIFJlZ2lzdGVycyB0aGUgc2FtcGxlIGZvcm1hdCBjb3ZlcnN0aW9uIGtleXdvcmQgbGlzdCA8cGNrbD4gYXMgYSBsaXN0IG9mIHZhbGlkIGtleXdvcmRzIGZvciBuZXh0CiAqIHBhcnNpbmcgc2Vzc2lvbnMuCiAqLwp2b2lkIHNhbXBsZV9yZWdpc3Rlcl9jb252cyhzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCAqcGNrbCkKewoJTElTVF9BRERRKCZzYW1wbGVfY29udnMubGlzdCwgJnBja2wtPmxpc3QpOwp9CgovKgogKiBSZXR1cm5zIHRoZSBwb2ludGVyIG9uIHNhbXBsZSBmZXRjaCBrZXl3b3JkIHN0cnVjdHVyZSBpZGVudGlmaWVkIGJ5CiAqIHN0cmluZyBvZiA8bGVuPiBpbiBidWZmZXIgPGt3Pi4KICoKICovCnN0cnVjdCBzYW1wbGVfZmV0Y2ggKmZpbmRfc2FtcGxlX2ZldGNoKGNvbnN0IGNoYXIgKmt3LCBpbnQgbGVuKQp7CglpbnQgaW5kZXg7CglzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3QgKmt3bDsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KGt3bCwgJnNhbXBsZV9mZXRjaGVzLmxpc3QsIGxpc3QpIHsKCQlmb3IgKGluZGV4ID0gMDsga3dsLT5rd1tpbmRleF0ua3cgIT0gTlVMTDsgaW5kZXgrKykgewoJCQlpZiAoc3RybmNtcChrd2wtPmt3W2luZGV4XS5rdywga3csIGxlbikgPT0gMCAmJgoJCQkgICAga3dsLT5rd1tpbmRleF0ua3dbbGVuXSA9PSAnXDAnKQoJCQkJcmV0dXJuICZrd2wtPmt3W2luZGV4XTsKCQl9Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyogVGhpcyBmdWNudGlvbiBicm93c2UgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHNhcGxlIGZldGNoLiA8Y3VycmVudD4gaXMKICogdGhlIGxhc3QgdXNlZCBzYW1wbGUgZmV0Y2guIElmIGl0IGlzIHRoZSBmaXJzdCBjYWxsLCBpdCBtdXN0IHNldCB0byBOVUxMLgogKiA8aWR4PiBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2FtcGxl6GZldGNoIGVudHJ5LiBJdCBpcyB1c2VkIGFzIHByaXZhdGUKICogdmFsdWUuIEl0IGlzIHVzZWxlcyB0byBpbml0aWF0ZSBpdC4KICoKICogSXQgcmV0dXJucyBhbHdheXMgdGhlIG5ld3QgZmV0Y2hfc2FtcGxlIGVudHJ5LCBhbmQgTlVMTCB3aGVuIHRoZSBlbmQgb2YKICogdGhlIGxpc3QgaXMgcmVhY2hlZC4KICovCnN0cnVjdCBzYW1wbGVfZmV0Y2ggKnNhbXBsZV9mZXRjaF9nZXRuZXh0KHN0cnVjdCBzYW1wbGVfZmV0Y2ggKmN1cnJlbnQsIGludCAqaWR4KQp7CglzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3QgKmt3bDsKCXN0cnVjdCBzYW1wbGVfZmV0Y2ggKmJhc2U7CgoJaWYgKCFjdXJyZW50KSB7CgkJLyogR2V0IGZpcnN0IGt3bCBlbnRyeS4gKi8KCQlrd2wgPSBMSVNUX05FWFQoJnNhbXBsZV9mZXRjaGVzLmxpc3QsIHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCAqLCBsaXN0KTsKCQkoKmlkeCkgPSAwOwoJfSBlbHNlIHsKCQkvKiBHZXQga3dsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJldCBlbnRyeS4gKi8KCQliYXNlID0gY3VycmVudCArIDEgLSAoKmlkeCk7CgkJa3dsID0gY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCwga3cpOwoJfQoKCXdoaWxlICgxKSB7CgoJCS8qIENoZWNrIGlmIGt3bCBpcyB0aGUgbGFzdCBlbnRyeS4gKi8KCQlpZiAoJmt3bC0+bGlzdCA9PSAmc2FtcGxlX2ZldGNoZXMubGlzdCkKCQkJcmV0dXJuIE5VTEw7CgoJCS8qIGlkeCBjb250YWluIHRoZSBuZXh0IGtleXdvcmQuIElmIGl0IGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0LiAqLwoJCWlmIChrd2wtPmt3WyppZHhdLmt3KSB7CgkJCSgqaWR4KSsrOwoJCQlyZXR1cm4gJmt3bC0+a3dbKCppZHgpLTFdOwoJCX0KCgkJLyogZ2V0IG5leHQgZW50cnkgaW4gdGhlIG1haW4gbGlzdCwgYW5kIHJldHVybiBOVUxMIGlmIHRoZSBlbmQgaXMgcmVhY2hlZC4gKi8KCQlrd2wgPSBMSVNUX05FWFQoJmt3bC0+bGlzdCwgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0ICosIGxpc3QpOwoKCQkvKiBTZXQgaW5kZXggdG8gMCwgYW5zIGRvIG9uZSBvdGhlciBsb29wLiAqLwoJCSgqaWR4KSA9IDA7Cgl9Cn0KCi8qIFRoaXMgZnVuY3Rpb24gYnJvd3NlcyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29udmVydGVycy4gPGN1cnJlbnQ+IGlzCiAqIHRoZSBsYXN0IHVzZWQgY29udmVydGVyLiBJZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCwgaXQgbXVzdCBzZXQgdG8gTlVMTC4KICogPGlkeD4gaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNvbnZlcnRlciBlbnRyeS4gSXQgaXMgdXNlZCBhcyBwcml2YXRlCiAqIHZhbHVlLiBJdCBpcyB1c2VsZXNzIHRvIGluaXRpYXRlIGl0LgogKgogKiBJdCByZXR1cm5zIGFsd2F5cyB0aGUgbmV4dCBzYW1wbGVfY29udiBlbnRyeSwgYW5kIE5VTEwgd2hlbiB0aGUgZW5kIG9mCiAqIHRoZSBsaXN0IGlzIHJlYWNoZWQuCiAqLwpzdHJ1Y3Qgc2FtcGxlX2NvbnYgKnNhbXBsZV9jb252X2dldG5leHQoc3RydWN0IHNhbXBsZV9jb252ICpjdXJyZW50LCBpbnQgKmlkeCkKewoJc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3QgKmt3bDsKCXN0cnVjdCBzYW1wbGVfY29udiAqYmFzZTsKCglpZiAoIWN1cnJlbnQpIHsKCQkvKiBHZXQgZmlyc3Qga3dsIGVudHJ5LiAqLwoJCWt3bCA9IExJU1RfTkVYVCgmc2FtcGxlX2NvbnZzLmxpc3QsIHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0ICosIGxpc3QpOwoJCSgqaWR4KSA9IDA7Cgl9IGVsc2UgewoJCS8qIEdldCBrd2wgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmV0IGVudHJ5LiAqLwoJCWJhc2UgPSBjdXJyZW50ICsgMSAtICgqaWR4KTsKCQlrd2wgPSBjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3QsIGt3KTsKCX0KCgl3aGlsZSAoMSkgewoJCS8qIENoZWNrIGlmIGt3bCBpcyB0aGUgbGFzdCBlbnRyeS4gKi8KCQlpZiAoJmt3bC0+bGlzdCA9PSAmc2FtcGxlX2NvbnZzLmxpc3QpCgkJCXJldHVybiBOVUxMOwoKCQkvKiBpZHggY29udGFpbiB0aGUgbmV4dCBrZXl3b3JkLiBJZiBpdCBpcyBhdmFpbGFibGUsIHJldHVybiBpdC4gKi8KCQlpZiAoa3dsLT5rd1sqaWR4XS5rdykgewoJCQkoKmlkeCkrKzsKCQkJcmV0dXJuICZrd2wtPmt3WygqaWR4KS0xXTsKCQl9CgoJCS8qIGdldCBuZXh0IGVudHJ5IGluIHRoZSBtYWluIGxpc3QsIGFuZCByZXR1cm4gTlVMTCBpZiB0aGUgZW5kIGlzIHJlYWNoZWQuICovCgkJa3dsID0gTElTVF9ORVhUKCZrd2wtPmxpc3QsIHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0ICosIGxpc3QpOwoKCQkvKiBTZXQgaW5kZXggdG8gMCwgYW5zIGRvIG9uZSBvdGhlciBsb29wLiAqLwoJCSgqaWR4KSA9IDA7Cgl9Cn0KCi8qCiAqIFJldHVybnMgdGhlIHBvaW50ZXIgb24gc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uIGtleXdvcmQgc3RydWN0dXJlIGlkZW50aWZpZWQgYnkKICogc3RyaW5nIG9mIDxsZW4+IGluIGJ1ZmZlciA8a3c+LgogKgogKi8Kc3RydWN0IHNhbXBsZV9jb252ICpmaW5kX3NhbXBsZV9jb252KGNvbnN0IGNoYXIgKmt3LCBpbnQgbGVuKQp7CglpbnQgaW5kZXg7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCAqa3dsOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoa3dsLCAmc2FtcGxlX2NvbnZzLmxpc3QsIGxpc3QpIHsKCQlmb3IgKGluZGV4ID0gMDsga3dsLT5rd1tpbmRleF0ua3cgIT0gTlVMTDsgaW5kZXgrKykgewoJCQlpZiAoc3RybmNtcChrd2wtPmt3W2luZGV4XS5rdywga3csIGxlbikgPT0gMCAmJgoJCQkgICAga3dsLT5rd1tpbmRleF0ua3dbbGVuXSA9PSAnXDAnKQoJCQkJcmV0dXJuICZrd2wtPmt3W2luZGV4XTsKCQl9Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgU2FtcGxlIGNhc3RzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICBOb3RlOiB0aGVzZSBmdW5jdGlvbnMgZG8gKk5PVCogc2V0IHRoZSBvdXRwdXQgdHlwZSBvbiB0aGUgICAgKi8KLyogICBzYW1wbGUsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRvaW5nIHRoaXMgb24gcmV0dXJuLiAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQgY19pcDJpbnQoc3RydWN0IHNhbXBsZSAqc21wKQp7CglzbXAtPmRhdGEudWludCA9IG50b2hsKHNtcC0+ZGF0YS5pcHY0LnNfYWRkcik7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pcDJzdHIoc3RydWN0IHNhbXBsZSAqc21wKQp7CglzdHJ1Y3QgY2h1bmsgKnRyYXNoID0gZ2V0X3RyYXNoX2NodW5rKCk7CgoJaWYgKCFpbmV0X250b3AoQUZfSU5FVCwgKHZvaWQgKikmc21wLT5kYXRhLmlwdjQsIHRyYXNoLT5zdHIsIHRyYXNoLT5zaXplKSkKCQlyZXR1cm4gMDsKCgl0cmFzaC0+bGVuID0gc3RybGVuKHRyYXNoLT5zdHIpOwoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfaXAyaXB2NihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXY0dG92Nigmc21wLT5kYXRhLmlwdjYsICZzbXAtPmRhdGEuaXB2NCk7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY2OwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pcHY2MnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCglpZiAoIWluZXRfbnRvcChBRl9JTkVUNiwgKHZvaWQgKikmc21wLT5kYXRhLmlwdjYsIHRyYXNoLT5zdHIsIHRyYXNoLT5zaXplKSkKCQlyZXR1cm4gMDsKCgl0cmFzaC0+bGVuID0gc3RybGVuKHRyYXNoLT5zdHIpOwoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCi8qCnN0YXRpYyBpbnQgY19pcHY2MmlwKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJcmV0dXJuIHY2dG92NCgmc21wLT5kYXRhLmlwdjQsICZzbXAtPmRhdGEuaXB2Nik7Cn0KKi8KCnN0YXRpYyBpbnQgY19pbnQyaXAoc3RydWN0IHNhbXBsZSAqc21wKQp7CglzbXAtPmRhdGEuaXB2NC5zX2FkZHIgPSBodG9ubChzbXAtPmRhdGEudWludCk7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY0OwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19zdHIyYWRkcihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWlmICghYnVmMmlwKHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbiwgJnNtcC0+ZGF0YS5pcHY0KSkgewoJCWlmICghYnVmMmlwNihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4sICZzbXAtPmRhdGEuaXB2NikpCgkJCXJldHVybiAwOwoJCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjY7CgkJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CgkJcmV0dXJuIDE7Cgl9CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY0OwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX3N0cjJpcChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWlmICghYnVmMmlwKHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbiwgJnNtcC0+ZGF0YS5pcHY0KSkKCQlyZXR1cm4gMDsKCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjQ7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfc3RyMmlwdjYoc3RydWN0IHNhbXBsZSAqc21wKQp7CglpZiAoIWJ1ZjJpcDYoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuLCAmc21wLT5kYXRhLmlwdjYpKQoJCXJldHVybiAwOwoJc21wLT50eXBlID0gU01QX1RfSVBWNjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCi8qCiAqIFRoZSBOVUxMIGNoYXIgYWx3YXlzIGVuZm9yY2VzIHRoZSBlbmQgb2Ygc3RyaW5nIGlmIGl0IGlzIG1ldC4KICogRGF0YSBpcyBuZXZlciBjaGFuZ2VkLCBzbyB3ZSBjYW4gaWdub3JlIHRoZSBDT05TVCBjYXNlCiAqLwpzdGF0aWMgaW50IGNfYmluMnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBzbXAtPmRhdGEuc3RyLmxlbjsgaSsrKSB7CgkJaWYgKCFzbXAtPmRhdGEuc3RyLnN0cltpXSkgewoJCQlzbXAtPmRhdGEuc3RyLmxlbiA9IGk7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfaW50MnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCWNoYXIgKnBvczsKCglwb3MgPSB1bHRvYV9yKHNtcC0+ZGF0YS51aW50LCB0cmFzaC0+c3RyLCB0cmFzaC0+c2l6ZSk7CgoJaWYgKCFwb3MpCgkJcmV0dXJuIDA7CgoJdHJhc2gtPnNpemUgPSB0cmFzaC0+c2l6ZSAtIChwb3MgLSB0cmFzaC0+c3RyKTsKCXRyYXNoLT5zdHIgPSBwb3M7Cgl0cmFzaC0+bGVuID0gc3RybGVuKHBvcyk7CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKLyogVGhpcyBmdW5jdGlvbiBkdXBsaWNhdGVzIGRhdGEgYW5kIHJlbW92ZXMgdGhlIGZsYWcgImNvbnN0Ii4gKi8KaW50IHNtcF9kdXAoc3RydWN0IHNhbXBsZSAqc21wKQp7CglzdHJ1Y3QgY2h1bmsgKnRyYXNoOwoKCS8qIElmIHRoZSBjb25zdCBmbGFnIGlzIG5vdCBzZXQsIHdlIGRvbid0IG5lZWQgdG8gZHVwbGljYXRlIHRoZQoJICogcGF0dGVybiBhcyBpdCBjYW4gYmUgbW9kaWZpZWQgaW4gcGxhY2UuCgkgKi8KCWlmICghKHNtcC0+ZmxhZ3MgJiBTTVBfRl9DT05TVCkpCgkJcmV0dXJuIDE7CgoJc3dpdGNoIChzbXAtPnR5cGUpIHsKCWNhc2UgU01QX1RfQk9PTDoKCWNhc2UgU01QX1RfVUlOVDoKCWNhc2UgU01QX1RfU0lOVDoKCWNhc2UgU01QX1RfQUREUjoKCWNhc2UgU01QX1RfSVBWNDoKCWNhc2UgU01QX1RfSVBWNjoKCQkvKiBUaGVzZSB0eXBlIGFyZSBub3QgY29uc3QuICovCgkJYnJlYWs7CgljYXNlIFNNUF9UX1NUUjoKCWNhc2UgU01QX1RfQklOOgoJCS8qIER1cGxpY2F0ZSBkYXRhLiAqLwoJCXRyYXNoID0gZ2V0X3RyYXNoX2NodW5rKCk7CgkJdHJhc2gtPmxlbiA9IHNtcC0+ZGF0YS5zdHIubGVuIDwgdHJhc2gtPnNpemUgPyBzbXAtPmRhdGEuc3RyLmxlbiA6IHRyYXNoLT5zaXplOwoJCW1lbWNweSh0cmFzaC0+c3RyLCBzbXAtPmRhdGEuc3RyLnN0ciwgdHJhc2gtPmxlbik7CgkJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJLyogT3RoZXIgY2FzZXMgYXJlIHVuZXhwZWN0ZWQuICovCgkJcmV0dXJuIDA7Cgl9CgoJLyogcmVtb3ZlIGNvbnN0IGZsYWcgKi8KCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCmludCBjX25vbmUoc3RydWN0IHNhbXBsZSAqc21wKQp7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX3N0cjJpbnQoc3RydWN0IHNhbXBsZSAqc21wKQp7CglpbnQgaTsKCXVpbnQzMl90IHJldCA9IDA7CgoJaWYgKHNtcC0+ZGF0YS5zdHIubGVuID09IDApCgkJcmV0dXJuIDA7CgoJZm9yIChpID0gMDsgaSA8IHNtcC0+ZGF0YS5zdHIubGVuOyBpKyspIHsKCQl1aW50MzJfdCB2YWwgPSBzbXAtPmRhdGEuc3RyLnN0cltpXSAtICcwJzsKCgkJaWYgKHZhbCA+IDkpIHsKCQkJaWYgKGkgPT0gMCkKCQkJCXJldHVybiAwOwoJCQlicmVhazsKCQl9CgoJCXJldCA9IHJldCAqIDEwICsgdmFsOwoJfQoKCXNtcC0+ZGF0YS51aW50ID0gcmV0OwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19zdHIybWV0aChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWVudW0gaHR0cF9tZXRoX3QgbWV0aDsKCWludCBsZW47CgoJbWV0aCA9IGZpbmRfaHR0cF9tZXRoKHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbik7CglpZiAobWV0aCA9PSBIVFRQX01FVEhfT1RIRVIpIHsKCQlsZW4gPSBzbXAtPmRhdGEuc3RyLmxlbjsKCQlzbXAtPmRhdGEubWV0aC5zdHIuc3RyID0gc21wLT5kYXRhLnN0ci5zdHI7CgkJc21wLT5kYXRhLm1ldGguc3RyLmxlbiA9IGxlbjsKCX0KCWVsc2UKCQlzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXNtcC0+ZGF0YS5tZXRoLm1ldGggPSBtZXRoOwoJc21wLT50eXBlID0gU01QX1RfTUVUSDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfbWV0aDJzdHIoc3RydWN0IHNhbXBsZSAqc21wKQp7CglpbnQgbGVuOwoJZW51bSBodHRwX21ldGhfdCBtZXRoOwoKCWlmIChzbXAtPmRhdGEubWV0aC5tZXRoID09IEhUVFBfTUVUSF9PVEhFUikgewoJCS8qIFRoZSBtZXRob2QgaXMgdW5rbm93bi4gQ29weSB0aGUgb3JpZ2luYWwgcG9pbnRlci4gKi8KCQlsZW4gPSBzbXAtPmRhdGEubWV0aC5zdHIubGVuOwoJCXNtcC0+ZGF0YS5zdHIuc3RyID0gc21wLT5kYXRhLm1ldGguc3RyLnN0cjsKCQlzbXAtPmRhdGEuc3RyLmxlbiA9IGxlbjsKCQlzbXAtPnR5cGUgPSBTTVBfVF9TVFI7Cgl9CgllbHNlIGlmIChzbXAtPmRhdGEubWV0aC5tZXRoIDwgSFRUUF9NRVRIX09USEVSKSB7CgkJLyogVGhlIG1ldGhvZCBpcyBrbm93biwgY29weSB0aGUgcG9pbnRlciBjb250YWluaW5nIHRoZSBzdHJpbmcuICovCgkJbWV0aCA9IHNtcC0+ZGF0YS5tZXRoLm1ldGg7CgkJc21wLT5kYXRhLnN0ci5zdHIgPSBodHRwX2tub3duX21ldGhvZHNbbWV0aF0ubmFtZTsKCQlzbXAtPmRhdGEuc3RyLmxlbiA9IGh0dHBfa25vd25fbWV0aG9kc1ttZXRoXS5sZW47CgkJc21wLT5mbGFncyB8PSBTTVBfRl9DT05TVDsKCQlzbXAtPnR5cGUgPSBTTVBfVF9TVFI7Cgl9CgllbHNlIHsKCQkvKiBVbmtub3duIG1ldGhvZCAqLwoJCXJldHVybiAwOwoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19hZGRyMmJpbihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqY2hrID0gZ2V0X3RyYXNoX2NodW5rKCk7CgoJaWYgKHNtcC0+dHlwZSA9PSBTTVBfVF9JUFY0KSB7CgkJY2hrLT5sZW4gPSA0OwoJCW1lbWNweShjaGstPnN0ciwgJnNtcC0+ZGF0YS5pcHY0LCBjaGstPmxlbik7Cgl9CgllbHNlIGlmIChzbXAtPnR5cGUgPT0gU01QX1RfSVBWNikgewoJCWNoay0+bGVuID0gMTY7CgkJbWVtY3B5KGNoay0+c3RyLCAmc21wLT5kYXRhLmlwdjYsIGNoay0+bGVuKTsKCX0KCWVsc2UKCQlyZXR1cm4gMDsKCglzbXAtPmRhdGEuc3RyID0gKmNoazsKCXNtcC0+dHlwZSA9IFNNUF9UX0JJTjsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfaW50MmJpbihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqY2hrID0gZ2V0X3RyYXNoX2NodW5rKCk7CgoJKih1bnNpZ25lZCBpbnQgKiljaGstPnN0ciA9IGh0b25sKHNtcC0+ZGF0YS51aW50KTsKCWNoay0+bGVuID0gNDsKCglzbXAtPmRhdGEuc3RyID0gKmNoazsKCXNtcC0+dHlwZSA9IFNNUF9UX0JJTjsKCXJldHVybiAxOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgIFNhbXBsZSBjYXN0cyBtYXRyaXg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICBzYW1wbGVfY2FzdHNbZnJvbSB0eXBlXVt0byB0eXBlXSAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgIE5VTEwgcG9pbnRlciB1c2VkIGZvciBpbXBvc3NpYmxlIHNhbXBsZSBjYXN0cyAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzYW1wbGVfY2FzdF9mY3Qgc2FtcGxlX2Nhc3RzW1NNUF9UWVBFU11bU01QX1RZUEVTXSA9IHsKLyogICAgICAgICAgICB0bzogIEJPT0wgICAgICAgVUlOVCAgICAgICBTSU5UICAgICAgIEFERFIgICAgICAgIElQVjQgICAgICBJUFY2ICAgICAgICBTVFIgICAgICAgICBCSU4gICAgICAgICBNRVRIICovCi8qIGZyb206IEJPT0wgKi8geyBjX25vbmUsICAgIGNfbm9uZSwgICAgY19ub25lLCAgICBOVUxMLCAgICAgICBOVUxMLCAgICAgTlVMTCwgICAgICAgY19pbnQyc3RyLCAgTlVMTCwgICAgICAgTlVMTCwgICAgICAgfSwKLyogICAgICAgVUlOVCAqLyB7IGNfbm9uZSwgICAgY19ub25lLCAgICBjX25vbmUsICAgIGNfaW50MmlwLCAgIGNfaW50MmlwLCBOVUxMLCAgICAgICBjX2ludDJzdHIsICBjX2ludDJiaW4sICBOVUxMLCAgICAgICB9LAovKiAgICAgICBTSU5UICovIHsgY19ub25lLCAgICBjX25vbmUsICAgIGNfbm9uZSwgICAgY19pbnQyaXAsICAgY19pbnQyaXAsIE5VTEwsICAgICAgIGNfaW50MnN0ciwgIGNfaW50MmJpbiwgIE5VTEwsICAgICAgIH0sCi8qICAgICAgIEFERFIgKi8geyBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgICBOVUxMLCAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgICAgfSwKLyogICAgICAgSVBWNCAqLyB7IE5VTEwsICAgICAgY19pcDJpbnQsICBjX2lwMmludCwgIGNfbm9uZSwgICAgIGNfbm9uZSwgICBjX2lwMmlwdjYsICBjX2lwMnN0ciwgICBjX2FkZHIyYmluLCBOVUxMLCAgICAgICB9LAovKiAgICAgICBJUFY2ICovIHsgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgY19ub25lLCAgICAgTlVMTCwgICAgIGNfbm9uZSwgICAgIGNfaXB2NjJzdHIsIGNfYWRkcjJiaW4sIE5VTEwsICAgICAgIH0sCi8qICAgICAgICBTVFIgKi8geyBjX3N0cjJpbnQsIGNfc3RyMmludCwgY19zdHIyaW50LCBjX3N0cjJhZGRyLCBjX3N0cjJpcCwgY19zdHIyaXB2NiwgY19ub25lLCAgICAgY19ub25lLCAgICAgY19zdHIybWV0aCwgfSwKLyogICAgICAgIEJJTiAqLyB7IE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICBOVUxMLCAgICAgICBjX2JpbjJzdHIsICBjX25vbmUsICAgICBjX3N0cjJtZXRoLCB9LAovKiAgICAgICBNRVRIICovIHsgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgIE5VTEwsICAgICAgIGNfbWV0aDJzdHIsIGNfbWV0aDJzdHIsIGNfbm9uZSwgICAgIH0sCn07CgovKgogKiBQYXJzZSBhIHNhbXBsZSBleHByZXNzaW9uIGNvbmZpZ3VyYXRpb246CiAqICAgICAgICBmZXRjaCBrZXl3b3JkIGZvbGxvd2VkIGJ5IGZvcm1hdCBjb252ZXJzaW9uIGtleXdvcmRzLgogKiBSZXR1cm5zIGEgcG9pbnRlciBvbiBhbGxvY2F0ZWQgc2FtcGxlIGV4cHJlc3Npb24gc3RydWN0dXJlLgogKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBzZXQgYWwtPmN0eC4KICovCnN0cnVjdCBzYW1wbGVfZXhwciAqc2FtcGxlX3BhcnNlX2V4cHIoY2hhciAqKnN0ciwgaW50ICppZHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjaGFyICoqZXJyX21zZywgc3RydWN0IGFyZ19saXN0ICphbCkKewoJY29uc3QgY2hhciAqYmVndzsgLyogYmVnaW5uaW5nIG9mIHdvcmQgKi8KCWNvbnN0IGNoYXIgKmVuZHc7IC8qIGVuZCBvZiB3b3JkICovCgljb25zdCBjaGFyICplbmR0OyAvKiBlbmQgb2YgdGVybSAqLwoJc3RydWN0IHNhbXBsZV9leHByICpleHByOwoJc3RydWN0IHNhbXBsZV9mZXRjaCAqZmV0Y2g7CglzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmNvbnY7Cgl1bnNpZ25lZCBsb25nIHByZXZfdHlwZTsKCWNoYXIgKmZrdyA9IE5VTEw7CgljaGFyICpja3cgPSBOVUxMOwoJaW50IGVycl9hcmc7CgoJYmVndyA9IHN0clsqaWR4XTsKCWZvciAoZW5kdyA9IGJlZ3c7ICplbmR3ICYmICplbmR3ICE9ICcoJyAmJiAqZW5kdyAhPSAnLCc7IGVuZHcrKyk7CgoJaWYgKGVuZHcgPT0gYmVndykgewoJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBmZXRjaCBtZXRob2QiKTsKCQlnb3RvIG91dF9lcnJvcjsKCX0KCgkvKiBrZWVwIGEgY29weSBvZiB0aGUgY3VycmVudCBmZXRjaCBrZXl3b3JkIGZvciBlcnJvciByZXBvcnRpbmcgKi8KCWZrdyA9IG15X3N0cm5kdXAoYmVndywgZW5kdyAtIGJlZ3cpOwoKCWZldGNoID0gZmluZF9zYW1wbGVfZmV0Y2goYmVndywgZW5kdyAtIGJlZ3cpOwoJaWYgKCFmZXRjaCkgewoJCW1lbXByaW50ZihlcnJfbXNnLCAidW5rbm93biBmZXRjaCBtZXRob2QgJyVzJyIsIGZrdyk7CgkJZ290byBvdXRfZXJyb3I7Cgl9CgoJZW5kdCA9IGVuZHc7CglpZiAoKmVuZHQgPT0gJygnKSB7CgkJLyogbG9vayBmb3IgdGhlIGVuZCBvZiB0aGlzIHRlcm0gYW5kIHNraXAgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgKi8KCQllbmR0ID0gKytlbmR3OwoJCXdoaWxlICgqZW5kdCAmJiAqZW5kdCAhPSAnKScpCgkJCWVuZHQrKzsKCQlpZiAoKmVuZHQgIT0gJyknKSB7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBjbG9zaW5nICcpJyBhZnRlciBhcmd1bWVudHMgdG8gZmV0Y2gga2V5d29yZCAnJXMnIiwgZmt3KTsKCQkJZ290byBvdXRfZXJyb3I7CgkJfQoJfQoKCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgOgoJICogICAtIGJlZ3cgOiBiZWdpbm5pbmcgb2YgdGhlIGtleXdvcmQKCSAqICAgLSBlbmR3IDogZW5kIG9mIHRoZSBrZXl3b3JkLCBmaXJzdCBjaGFyYWN0ZXIgbm90IHBhcnQgb2Yga2V5d29yZAoJICogICAgICAgICAgICBub3IgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgKHNvIGZpcnN0IGNoYXJhY3RlciBvZiBhcmdzCgkgKiAgICAgICAgICAgIGlmIHByZXNlbnQpLgoJICogICAtIGVuZHQgOiBlbmQgb2YgdGhlIHRlcm0gKD1lbmR3IG9yIGxhc3QgcGFyZW50aGVzaXMgaWYgYXJncyBhcmUgcHJlc2VudCkKCSAqLwoKCWlmIChmZXRjaC0+b3V0X3R5cGUgPj0gU01QX1RZUEVTKSB7CgkJbWVtcHJpbnRmKGVycl9tc2csICJyZXR1cm5zIHR5cGUgb2YgZmV0Y2ggbWV0aG9kICclcycgaXMgdW5rbm93biIsIGZrdyk7CgkJZ290byBvdXRfZXJyb3I7Cgl9CglwcmV2X3R5cGUgPSBmZXRjaC0+b3V0X3R5cGU7CgoJZXhwciA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHNhbXBsZV9leHByKSk7CglpZiAoIWV4cHIpCgkJZ290byBvdXRfZXJyb3I7CgoJTElTVF9JTklUKCYoZXhwci0+Y29udl9leHBycykpOwoJZXhwci0+ZmV0Y2ggPSBmZXRjaDsKCWV4cHItPmFyZ19wID0gZW1wdHlfYXJnX2xpc3Q7CgoJLyogTm90ZSB0aGF0IHdlIGNhbGwgdGhlIGFyZ3VtZW50IHBhcnNlciBldmVuIHdpdGggYW4gZW1wdHkgc3RyaW5nLAoJICogdGhpcyBhbGxvd3MgaXQgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgZW50cmllcyBmb3IgbWFuZGF0b3J5CgkgKiBpbXBsaWNpdCBhcmd1bWVudHMgKGVnOiBsb2NhbCBwcm94eSBuYW1lKS4KCSAqLwoJYWwtPmt3ID0gZXhwci0+ZmV0Y2gtPmt3OwoJYWwtPmNvbnYgPSBOVUxMOwoJaWYgKG1ha2VfYXJnX2xpc3QoZW5kdywgZW5kdCAtIGVuZHcsIGZldGNoLT5hcmdfbWFzaywgJmV4cHItPmFyZ19wLCBlcnJfbXNnLCBOVUxMLCAmZXJyX2FyZywgYWwpIDwgMCkgewoJCW1lbXByaW50ZihlcnJfbXNnLCAiZmV0Y2ggbWV0aG9kICclcycgOiAlcyIsIGZrdywgKmVycl9tc2cpOwoJCWdvdG8gb3V0X2Vycm9yOwoJfQoKCWlmICghZXhwci0+YXJnX3ApIHsKCQlleHByLT5hcmdfcCA9IGVtcHR5X2FyZ19saXN0OwoJfQoJZWxzZSBpZiAoZmV0Y2gtPnZhbF9hcmdzICYmICFmZXRjaC0+dmFsX2FyZ3MoZXhwci0+YXJnX3AsIGVycl9tc2cpKSB7CgkJbWVtcHJpbnRmKGVycl9tc2csICJpbnZhbGlkIGFyZ3MgaW4gZmV0Y2ggbWV0aG9kICclcycgOiAlcyIsIGZrdywgKmVycl9tc2cpOwoJCWdvdG8gb3V0X2Vycm9yOwoJfQoKCS8qIE5vdyBwcm9jZXNzIHRoZSBjb252ZXJ0ZXJzIGlmIGFueS4gV2UgaGF2ZSB0d28gc3VwcG9ydGVkIHN5bnRheGVzCgkgKiBmb3IgdGhlIGNvbnZlcnRlcnMsIHdoaWNoIGNhbiBiZSBjb21iaW5lZCA6CgkgKiAgLSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBjb252ZXJ0ZXJzIGp1c3QgYWZ0ZXIgdGhlIGtleXdvcmQgYW5kIGFyZ3MgOwoJICogIC0gb25lIGNvbnZlcnRlciBwZXIga2V5d29yZAoJICogVGhlIGNvbWJpbmF0aW9uIGFsbG93cyB0byBoYXZlIGVhY2gga2V5d29yZCBiZWluZyBhIGNvbW1hLWRlbGltaXRlZAoJICogc2VyaWVzIG9mIGNvbnZlcnRlcnMuCgkgKgoJICogV2Ugd2FudCB0byBwcm9jZXNzIHRoZSBmb3JtZXIgZmlyc3QsIHRoZW4gdGhlIGxhdHRlci4gRm9yIHRoaXMgd2Ugc3RhcnQKCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3VwcG9zZWQgcGxhY2UgaW4gdGhlIGV4aXRpbmcgY29udiBjaGFpbiwgd2hpY2gKCSAqIHN0YXJ0cyBhdCB0aGUgbGFzdCBjb21tYSAoZW5kdCkuCgkgKi8KCgl3aGlsZSAoMSkgewoJCXN0cnVjdCBzYW1wbGVfY29udl9leHByICpjb252X2V4cHI7CgoJCWlmICgqZW5kdCA9PSAnKScpIC8qIHNraXAgbGFzdCBjbG9zaW5nIHBhcmVudGhlc2lzICovCgkJCWVuZHQrKzsKCgkJaWYgKCplbmR0ICYmICplbmR0ICE9ICcsJykgewoJCQlpZiAoY2t3KQoJCQkJbWVtcHJpbnRmKGVycl9tc2csICJtaXNzaW5nIGNvbW1hIGFmdGVyIGNvbnYga2V5d29yZCAnJXMnIiwgY2t3KTsKCQkJZWxzZQoJCQkJbWVtcHJpbnRmKGVycl9tc2csICJtaXNzaW5nIGNvbW1hIGFmdGVyIGZldGNoIGtleXdvcmQgJyVzJyIsIGZrdyk7CgkJCWdvdG8gb3V0X2Vycm9yOwoJCX0KCgkJd2hpbGUgKCplbmR0ID09ICcsJykgLyogdGhlbiB0cmFpbGluZyBjb21tYXMgKi8KCQkJZW5kdCsrOwoKCQliZWd3ID0gZW5kdDsgLyogc3RhcnQgb2YgY29udiBrZXl3b3JkICovCgoJCWlmICghKmJlZ3cpIHsKCQkJLyogbm9uZSA/IHNraXAgdG8gbmV4dCBzdHJpbmcgKi8KCQkJKCppZHgpKys7CgkJCWJlZ3cgPSBzdHJbKmlkeF07CgkJCWlmICghYmVndyB8fCAhKmJlZ3cpCgkJCQlicmVhazsKCQl9CgoJCWZvciAoZW5kdyA9IGJlZ3c7ICplbmR3ICYmICplbmR3ICE9ICcoJyAmJiAqZW5kdyAhPSAnLCc7IGVuZHcrKyk7CgoJCWZyZWUoY2t3KTsKCQlja3cgPSBteV9zdHJuZHVwKGJlZ3csIGVuZHcgLSBiZWd3KTsKCgkJY29udiA9IGZpbmRfc2FtcGxlX2NvbnYoYmVndywgZW5kdyAtIGJlZ3cpOwoJCWlmICghY29udikgewoJCQkvKiB3ZSBmb3VuZCBhbiBpc29sYXRlZCBrZXl3b3JkIHRoYXQgd2UgZG9uJ3Qga25vdywgaXQncyBub3Qgb3VycyAqLwoJCQlpZiAoYmVndyA9PSBzdHJbKmlkeF0pCgkJCQlicmVhazsKCQkJbWVtcHJpbnRmKGVycl9tc2csICJ1bmtub3duIGNvbnYgbWV0aG9kICclcyciLCBja3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9CgoJCWVuZHQgPSBlbmR3OwoJCWlmICgqZW5kdCA9PSAnKCcpIHsKCQkJLyogbG9vayBmb3IgdGhlIGVuZCBvZiB0aGlzIHRlcm0gKi8KCQkJd2hpbGUgKCplbmR0ICYmICplbmR0ICE9ICcpJykKCQkJCWVuZHQrKzsKCQkJaWYgKCplbmR0ICE9ICcpJykgewoJCQkJbWVtcHJpbnRmKGVycl9tc2csICJzeW50YXggZXJyb3I6IG1pc3NpbmcgJyknIGFmdGVyIGNvbnYga2V5d29yZCAnJXMnIiwgY2t3KTsKCQkJCWdvdG8gb3V0X2Vycm9yOwoJCQl9CgkJfQoKCQlpZiAoY29udi0+aW5fdHlwZSA+PSBTTVBfVFlQRVMgfHwgY29udi0+b3V0X3R5cGUgPj0gU01QX1RZUEVTKSB7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAicmV0dXJucyB0eXBlIG9mIGNvbnYgbWV0aG9kICclcycgaXMgdW5rbm93biIsIGNrdyk7CgkJCWdvdG8gb3V0X2Vycm9yOwoJCX0KCgkJLyogSWYgaW1wb3NzaWJsZSB0eXBlIGNvbnZlcnNpb24gKi8KCQlpZiAoIXNhbXBsZV9jYXN0c1twcmV2X3R5cGVdW2NvbnYtPmluX3R5cGVdKSB7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAiY29udiBtZXRob2QgJyVzJyBjYW5ub3QgYmUgYXBwbGllZCIsIGNrdyk7CgkJCWdvdG8gb3V0X2Vycm9yOwoJCX0KCgkJcHJldl90eXBlID0gY29udi0+b3V0X3R5cGU7CgkJY29udl9leHByID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwcikpOwoJCWlmICghY29udl9leHByKQoJCQlnb3RvIG91dF9lcnJvcjsKCgkJTElTVF9BRERRKCYoZXhwci0+Y29udl9leHBycyksICYoY29udl9leHByLT5saXN0KSk7CgkJY29udl9leHByLT5jb252ID0gY29udjsKCgkJaWYgKGVuZHQgIT0gZW5kdykgewoJCQlpbnQgZXJyX2FyZzsKCgkJCWlmICghY29udi0+YXJnX21hc2spIHsKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAiY29udiBtZXRob2QgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBhcmdzIiwgY2t3KTsKCQkJCWdvdG8gb3V0X2Vycm9yOwoJCQl9CgoJCQlhbC0+a3cgPSBleHByLT5mZXRjaC0+a3c7CgkJCWFsLT5jb252ID0gY29udl9leHByLT5jb252LT5rdzsKCQkJaWYgKG1ha2VfYXJnX2xpc3QoZW5kdyArIDEsIGVuZHQgLSBlbmR3IC0gMSwgY29udi0+YXJnX21hc2ssICZjb252X2V4cHItPmFyZ19wLCBlcnJfbXNnLCBOVUxMLCAmZXJyX2FyZywgYWwpIDwgMCkgewoJCQkJbWVtcHJpbnRmKGVycl9tc2csICJpbnZhbGlkIGFyZyAlZCBpbiBjb252IG1ldGhvZCAnJXMnIDogJXMiLCBlcnJfYXJnKzEsIGNrdywgKmVycl9tc2cpOwoJCQkJZ290byBvdXRfZXJyb3I7CgkJCX0KCgkJCWlmICghY29udl9leHByLT5hcmdfcCkKCQkJCWNvbnZfZXhwci0+YXJnX3AgPSBlbXB0eV9hcmdfbGlzdDsKCgkJCWlmIChjb252LT52YWxfYXJncyAmJiAhY29udi0+dmFsX2FyZ3MoY29udl9leHByLT5hcmdfcCwgY29udiwgZmlsZSwgbGluZSwgZXJyX21zZykpIHsKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAiaW52YWxpZCBhcmdzIGluIGNvbnYgbWV0aG9kICclcycgOiAlcyIsIGNrdywgKmVycl9tc2cpOwoJCQkJZ290byBvdXRfZXJyb3I7CgkJCX0KCQl9CgkJZWxzZSBpZiAoQVJHTShjb252LT5hcmdfbWFzaykpIHsKCQkJbWVtcHJpbnRmKGVycl9tc2csICJtaXNzaW5nIGFyZ3MgZm9yIGNvbnYgbWV0aG9kICclcyciLCBja3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9Cgl9Cgogb3V0OgoJZnJlZShma3cpOwoJZnJlZShja3cpOwoJcmV0dXJuIGV4cHI7CgpvdXRfZXJyb3I6CgkvKiBUT0RPOiBwcnVuZV9zYW1wbGVfZXhwcihleHByKTsgKi8KCWV4cHIgPSBOVUxMOwoJZ290byBvdXQ7Cn0KCi8qCiAqIFByb2Nlc3MgYSBmZXRjaCArIGZvcm1hdCBjb252ZXJzaW9uIG9mIGRlZmluZWQgYnkgdGhlIHNhbXBsZSBleHByZXNzaW9uIDxleHByPgogKiBvbiByZXF1ZXN0IG9yIHJlc3BvbnNlIGNvbnNpZGVyaW5nIHRoZSA8b3B0PiBwYXJhbWV0ZXIuCiAqIFJldHVybnMgYSBwb2ludGVyIG9uIGEgdHlwZWQgc2FtcGxlIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSByZXN1bHQgb3IgTlVMTCBpZgogKiBzYW1wbGUgaXMgbm90IGZvdW5kIG9yIHdoZW4gZm9ybWF0IGNvbnZlcnNpb24gZmFpbGVkLgogKiAgSWYgPHA+IGlzIG5vdCBudWxsLCBmdW5jdGlvbiByZXR1cm5zIHJlc3VsdHMgaW4gc3RydWN0dXJlIHBvaW50ZWQgYnkgPHA+LgogKiAgSWYgPHA+IGlzIG51bGwsIGZ1bmN0aW9ucyByZXR1cm5zIGEgcG9pbnRlciBvbiBhIHN0YXRpYyBzYW1wbGUgc3RydWN0dXJlLgogKgogKiBOb3RlOiB0aGUgZmV0Y2ggZnVuY3Rpb25zIGFyZSByZXF1aXJlZCB0byBwcm9wZXJseSBzZXQgdGhlIHJldHVybiB0eXBlLiBUaGUKICogY29udmVyc2lvbiBmdW5jdGlvbnMgbXVzdCBkbyBzbyB0b28uIEhvd2V2ZXIgdGhlIGNhc3QgZnVuY3Rpb25zIGRvIG5vdCBuZWVkCiAqIHRvIHNpbmNlIHRoZXkncmUgbWFkZSB0byBjYXN0IG11dGlwbGUgdHlwZXMgYWNjb3JkaW5nIHRvIHdoYXQgaXMgcmVxdWlyZWQuCiAqCiAqIFRoZSBjYWxsZXIgbWF5IGluZGljYXRlIGluIDxvcHQ+IGlmIGl0IGNvbnNpZGVycyB0aGUgcmVzdWx0IGZpbmFsIG9yIG5vdC4KICogVGhlIGNhbGxlciBuZWVkcyB0byBjaGVjayB0aGUgU01QX0ZfTUFZX0NIQU5HRSBmbGFnIGluIHAtPmZsYWdzIHRvIHZlcmlmeQogKiBpZiB0aGUgcmVzdWx0IGlzIHN0YWJsZSBvciBub3QsIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlIDoKICoKICogcmV0dXJuIE1BWV9DSEFOR0UgRklOQUwgICBNZWFuaW5nIGZvciB0aGUgc2FtcGxlCiAqICBOVUxMICAgICAgMCAgICAgICAgKiAgICAgTm90IHByZXNlbnQgYW5kIHdpbGwgbmV2ZXIgYmUgKGVnOiBoZWFkZXIpCiAqICBOVUxMICAgICAgMSAgICAgICAgMCAgICAgTm90IHByZXNlbnQgeWV0LCBjb3VsZCBjaGFuZ2UgKGVnOiBQT1NUIHBhcmFtKQogKiAgTlVMTCAgICAgIDEgICAgICAgIDEgICAgIE5vdCBwcmVzZW50IHlldCwgd2lsbCBub3QgY2hhbmdlIGFueW1vcmUKICogICBzbXAgICAgICAwICAgICAgICAqICAgICBQcmVzZW50IGFuZCB3aWxsIG5vdCBjaGFuZ2UgKGVnOiBoZWFkZXIpCiAqICAgc21wICAgICAgMSAgICAgICAgMCAgICAgUHJlc2VudCwgbWF5IGNoYW5nZSAoZWc6IHJlcXVlc3QgbGVuZ3RoKQogKiAgIHNtcCAgICAgIDEgICAgICAgIDEgICAgIFByZXNlbnQsIGxhc3Qga25vd24gdmFsdWUgKGVnOiByZXF1ZXN0IGxlbmd0aCkKICovCnN0cnVjdCBzYW1wbGUgKnNhbXBsZV9wcm9jZXNzKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzZXNzaW9uICpzZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RyZWFtICpzdHJtLCB1bnNpZ25lZCBpbnQgb3B0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlX2V4cHIgKmV4cHIsIHN0cnVjdCBzYW1wbGUgKnApCnsKCXN0cnVjdCBzYW1wbGVfY29udl9leHByICpjb252X2V4cHI7CgoJaWYgKHAgPT0gTlVMTCkgewoJCXAgPSAmdGVtcF9zbXA7CgkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOwoJfQoKCXAtPnB4ICAgPSBweDsKCXAtPnNlc3MgPSBzZXNzOwoJcC0+c3RybSA9IHN0cm07CglwLT5vcHQgID0gb3B0OwoJaWYgKCFleHByLT5mZXRjaC0+cHJvY2VzcyhleHByLT5hcmdfcCwgcCwgZXhwci0+ZmV0Y2gtPmt3LCBleHByLT5mZXRjaC0+cHJpdmF0ZSkpCgkJcmV0dXJuIE5VTEw7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShjb252X2V4cHIsICZleHByLT5jb252X2V4cHJzLCBsaXN0KSB7CgkJLyogd2Ugd2FudCB0byBlbnN1cmUgdGhhdCBwLT50eXBlIGNhbiBiZSBjYXN0ZWQgaW50bwoJCSAqIGNvbnZfZXhwci0+Y29udi0+aW5fdHlwZS4gV2UgaGF2ZSAzIHBvc3NpYmlsaXRpZXMgOgoJCSAqICAtIE5VTEwgICA9PiBub3QgY2FzdGFibGUuCgkJICogIC0gY19ub25lID0+IG5vdGhpbmcgdG8gZG8gKGxldCdzIG9wdGltaXplIGl0KQoJCSAqICAtIG90aGVyICA9PiBhcHBseSBjYXN0IGFuZCBwcmVwYXJlIHRvIGZhaWwKCQkgKi8KCQlpZiAoIXNhbXBsZV9jYXN0c1twLT50eXBlXVtjb252X2V4cHItPmNvbnYtPmluX3R5cGVdKQoJCQlyZXR1cm4gTlVMTDsKCgkJaWYgKHNhbXBsZV9jYXN0c1twLT50eXBlXVtjb252X2V4cHItPmNvbnYtPmluX3R5cGVdICE9IGNfbm9uZSAmJgoJCSAgICAhc2FtcGxlX2Nhc3RzW3AtPnR5cGVdW2NvbnZfZXhwci0+Y29udi0+aW5fdHlwZV0ocCkpCgkJCXJldHVybiBOVUxMOwoKCQkvKiBPSyBjYXN0IHN1Y2NlZWRlZCAqLwoKCQlpZiAoIWNvbnZfZXhwci0+Y29udi0+cHJvY2Vzcyhjb252X2V4cHItPmFyZ19wLCBwLCBjb252X2V4cHItPmNvbnYtPnByaXZhdGUpKQoJCQlyZXR1cm4gTlVMTDsKCX0KCXJldHVybiBwOwp9CgovKgogKiBSZXNvbHZlIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGluIHByb3h5IDxwPi4gUmV0dXJucyB0aGUgbnVtYmVyIG9mCiAqIGVycm9ycyBvciAwIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZS4KICovCmludCBzbXBfcmVzb2x2ZV9hcmdzKHN0cnVjdCBwcm94eSAqcCkKewoJc3RydWN0IGFyZ19saXN0ICpjdXIsICpiYWs7Cgljb25zdCBjaGFyICpjdHgsICp3aGVyZTsKCWNvbnN0IGNoYXIgKmNvbnZfY3R4LCAqY29udl9wcmUsICpjb252X3BvczsKCXN0cnVjdCB1c2VybGlzdCAqdWw7CglzdHJ1Y3QgbXlfcmVnZXggKnJlZzsKCXN0cnVjdCBhcmcgKmFyZzsKCWludCBjZmdlcnIgPSAwOwoJaW50IHJmbGFnczsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3VyLCBiYWssICZwLT5jb25mLmFyZ3MubGlzdCwgbGlzdCkgewoJCXN0cnVjdCBwcm94eSAqcHg7CgkJc3RydWN0IHNlcnZlciAqc3J2OwoJCWNoYXIgKnBuYW1lLCAqc25hbWU7CgkJY2hhciAqZXJyOwoKCQlhcmcgPSBjdXItPmFyZzsKCgkJLyogcHJlcGFyZSBvdXRwdXQgbWVzc2FnZXMgKi8KCQljb252X3ByZSA9IGNvbnZfcG9zID0gY29udl9jdHggPSAiIjsKCQlpZiAoY3VyLT5jb252KSB7CgkJCWNvbnZfY3R4ID0gY3VyLT5jb252OwoJCQljb252X3ByZSA9ICJjb252ZXJzaW9uIGtleXdvcmQgJyI7CgkJCWNvbnZfcG9zID0gIicgZm9yICI7CgkJfQoKCQl3aGVyZSA9ICJpbiI7CgkJY3R4ID0gInNhbXBsZSBmZXRjaCBrZXl3b3JkIjsKCQlzd2l0Y2ggKGN1ci0+Y3R4KSB7CgkJY2FzZSBBUkdDX1NUSzogd2hlcmUgPSAiaW4gc3RpY2sgcnVsZSBpbiI7IGJyZWFrOwoJCWNhc2UgQVJHQ19UUks6IHdoZXJlID0gImluIHRyYWNraW5nIHJ1bGUgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfTE9HOiB3aGVyZSA9ICJpbiBsb2ctZm9ybWF0IHN0cmluZyBpbiI7IGJyZWFrOwoJCWNhc2UgQVJHQ19IUlE6IHdoZXJlID0gImluIGh0dHAtcmVxdWVzdCBoZWFkZXIgZm9ybWF0IHN0cmluZyBpbiI7IGJyZWFrOwoJCWNhc2UgQVJHQ19IUlM6IHdoZXJlID0gImluIGh0dHAtcmVzcG9uc2UgaGVhZGVyIGZvcm1hdCBzdHJpbmcgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfVUlGOiB3aGVyZSA9ICJpbiB1bmlxdWUtaWQtZm9ybWF0IHN0cmluZyBpbiI7IGJyZWFrOwoJCWNhc2UgQVJHQ19SRFI6IHdoZXJlID0gImluIHJlZGlyZWN0IGZvcm1hdCBzdHJpbmcgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfQ0FQOiB3aGVyZSA9ICJpbiBjYXB0dXJlIHJ1bGUgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfQUNMOiBjdHggPSAiQUNMIGtleXdvcmQiOyBicmVhazsKCQl9CgoJCS8qIHNldCBhIGZldyBkZWZhdWx0IHNldHRpbmdzICovCgkJcHggPSBwOwoJCXBuYW1lID0gcC0+aWQ7CgoJCXN3aXRjaCAoYXJnLT50eXBlKSB7CgkJY2FzZSBBUkdUX1NSVjoKCQkJaWYgKCFhcmctPmRhdGEuc3RyLmxlbikgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IG1pc3Npbmcgc2VydmVyIG5hbWUgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJY29udGludWU7CgkJCX0KCgkJCS8qIHdlIHN1cHBvcnQgdHdvIGZvcm1hdHMgOiAiYmNrL3NydiIgYW5kICJzcnYiICovCgkJCXNuYW1lID0gc3RycmNocihhcmctPmRhdGEuc3RyLnN0ciwgJy8nKTsKCgkJCWlmIChzbmFtZSkgewoJCQkJKnNuYW1lKysgPSAnXDAnOwoJCQkJcG5hbWUgPSBhcmctPmRhdGEuc3RyLnN0cjsKCgkJCQlweCA9IHByb3h5X2JlX2J5X25hbWUocG5hbWUpOwoJCQkJaWYgKCFweCkgewoJCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCBwcm94eSAnJXMnIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCQljZmdlcnIrKzsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCQlzbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoKCQkJc3J2ID0gZmluZHNlcnZlcihweCwgc25hbWUpOwoJCQlpZiAoIXNydikgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHVuYWJsZSB0byBmaW5kIHNlcnZlciAnJXMnIGluIHByb3h5ICclcycsIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgc25hbWUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJZnJlZShhcmctPmRhdGEuc3RyLnN0cik7CgkJCWFyZy0+ZGF0YS5zdHIuc3RyID0gTlVMTDsKCQkJYXJnLT51bnJlc29sdmVkID0gMDsKCQkJYXJnLT5kYXRhLnNydiA9IHNydjsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9GRToKCQkJaWYgKGFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlwbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoJCQkJcHggPSBwcm94eV9mZV9ieV9uYW1lKHBuYW1lKTsKCQkJfQoKCQkJaWYgKCFweCkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHVuYWJsZSB0byBmaW5kIGZyb250ZW5kICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICghKHB4LT5jYXAgJiBQUl9DQVBfRkUpKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogcHJveHkgJyVzJywgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLCBoYXMgbm90IGZyb250ZW5kIGNhcGFiaWxpdHkuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJZnJlZShhcmctPmRhdGEuc3RyLnN0cik7CgkJCWFyZy0+ZGF0YS5zdHIuc3RyID0gTlVMTDsKCQkJYXJnLT51bnJlc29sdmVkID0gMDsKCQkJYXJnLT5kYXRhLnByeCA9IHB4OwoJCQlicmVhazsKCgkJY2FzZSBBUkdUX0JFOgoJCQlpZiAoYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCXBuYW1lID0gYXJnLT5kYXRhLnN0ci5zdHI7CgkJCQlweCA9IHByb3h5X2JlX2J5X25hbWUocG5hbWUpOwoJCQl9CgoJCQlpZiAoIXB4KSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogdW5hYmxlIHRvIGZpbmQgYmFja2VuZCAnJXMnIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlpZiAoIShweC0+Y2FwICYgUFJfQ0FQX0JFKSkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHByb3h5ICclcycsIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJywgaGFzIG5vdCBiYWNrZW5kIGNhcGFiaWxpdHkuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJZnJlZShhcmctPmRhdGEuc3RyLnN0cik7CgkJCWFyZy0+ZGF0YS5zdHIuc3RyID0gTlVMTDsKCQkJYXJnLT51bnJlc29sdmVkID0gMDsKCQkJYXJnLT5kYXRhLnByeCA9IHB4OwoJCQlicmVhazsKCgkJY2FzZSBBUkdUX1RBQjoKCQkJaWYgKGFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlwbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoJCQkJcHggPSBwcm94eV90YmxfYnlfbmFtZShwbmFtZSk7CgkJCX0KCgkJCWlmICghcHgpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCB0YWJsZSAnJXMnIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlpZiAoIXB4LT50YWJsZS5zaXplKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogbm8gdGFibGUgaW4gcHJveHkgJyVzJyByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJZnJlZShhcmctPmRhdGEuc3RyLnN0cik7CgkJCWFyZy0+ZGF0YS5zdHIuc3RyID0gTlVMTDsKCQkJYXJnLT51bnJlc29sdmVkID0gMDsKCQkJYXJnLT5kYXRhLnByeCA9IHB4OwoJCQlicmVhazsKCgkJY2FzZSBBUkdUX1VTUjoKCQkJaWYgKCFhcmctPmRhdGEuc3RyLmxlbikgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IG1pc3NpbmcgdXNlcmxpc3QgbmFtZSBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJaWYgKHAtPnVyaV9hdXRoICYmIHAtPnVyaV9hdXRoLT51c2VybGlzdCAmJgoJCQkgICAgIXN0cmNtcChwLT51cmlfYXV0aC0+dXNlcmxpc3QtPm5hbWUsIGFyZy0+ZGF0YS5zdHIuc3RyKSkKCQkJCXVsID0gcC0+dXJpX2F1dGgtPnVzZXJsaXN0OwoJCQllbHNlCgkJCQl1bCA9IGF1dGhfZmluZF91c2VybGlzdChhcmctPmRhdGEuc3RyLnN0cik7CgoJCQlpZiAoIXVsKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogdW5hYmxlIHRvIGZpbmQgdXNlcmxpc3QgJyVzJyByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIGFyZy0+ZGF0YS5zdHIuc3RyLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJZnJlZShhcmctPmRhdGEuc3RyLnN0cik7CgkJCWFyZy0+ZGF0YS5zdHIuc3RyID0gTlVMTDsKCQkJYXJnLT51bnJlc29sdmVkID0gMDsKCQkJYXJnLT5kYXRhLnVzciA9IHVsOwoJCQlicmVhazsKCgkJY2FzZSBBUkdUX1JFRzoKCQkJaWYgKCFhcmctPmRhdGEuc3RyLmxlbikgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IG1pc3NpbmcgcmVnZXggaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXJlZyA9IGNhbGxvYygxLCBzaXplb2YoKnJlZykpOwoJCQlpZiAoIXJlZykgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGJ1aWxkIHJlZ2V4IGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlyZmxhZ3MgPSAwOwoJCQlyZmxhZ3MgfD0gKGFyZy0+dHlwZV9mbGFncyAmIEFSR0ZfUkVHX0lDQVNFKSA/IFJFR19JQ0FTRSA6IDA7CgkJCWVyciA9IE5VTEw7CgoJCQlpZiAoIXJlZ2V4X2NvbXAoYXJnLT5kYXRhLnN0ci5zdHIsIHJlZywgIShyZmxhZ3MgJiBSRUdfSUNBU0UpLCAxIC8qIGNhcHR1cmUgc3Vic3RyICovLCAmZXJyKSkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IGVycm9yIGluIHJlZ2V4ICclcycgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJyA6ICVzLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLAoJCQkJICAgICAgYXJnLT5kYXRhLnN0ci5zdHIsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCwgZXJyKTsKCQkJCWNmZ2VycisrOwoJCQkJY29udGludWU7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS5yZWcgPSByZWc7CgkJCWJyZWFrOwoKCgkJfQoKCQlMSVNUX0RFTCgmY3VyLT5saXN0KTsKCQlmcmVlKGN1cik7Cgl9IC8qIGVuZCBvZiBhcmdzIHByb2Nlc3NpbmcgKi8KCglyZXR1cm4gY2ZnZXJyOwp9CgovKgogKiBQcm9jZXNzIGEgZmV0Y2ggKyBmb3JtYXQgY29udmVyc2lvbiBhcyBkZWZpbmVkIGJ5IHRoZSBzYW1wbGUgZXhwcmVzc2lvbgogKiA8ZXhwcj4gb24gcmVxdWVzdCBvciByZXNwb25zZSBjb25zaWRlcmluZyB0aGUgPG9wdD4gcGFyYW1ldGVyLiBUaGUgb3V0cHV0IGlzCiAqIGFsd2F5cyBvZiB0eXBlIHN0cmluZy4gSWYgYSBzdGFibGUgc2FtcGxlIGNhbiBiZSBmZXRjaGVkLCBvciBhbiB1bnN0YWJsZSBvbmUKICogd2hlbiA8b3B0PiBjb250YWlucyBTTVBfT1BUX0ZJTkFMLCB0aGUgc2FtcGxlIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBhbmQKICogcmV0dXJuZWQgd2l0aG91dCB0aGUgU01QX0ZfTUFZX0NIQU5HRSBmbGFnLiBJZiBhbiB1bnN0YWJsZSBzYW1wbGUgaXMgZm91bmQKICogYW5kIDxvcHQ+IGRvZXMgbm90IGNvbnRhaW4gU01QX09QVF9GSU5BTCwgdGhlbiB0aGUgc2FtcGxlIGlzIHJldHVybmVkIGFzLWlzCiAqIHdpdGggaXRzIFNNUF9GX01BWV9DSEFOR0UgZmxhZyBzbyB0aGF0IHRoZSBjYWxsZXIgY2FuIGNoZWNrIGl0IGFuZCBkZWNpZGUgdG8KICogdGFrZSBhY3Rpb25zIChlZzogd2FpdCBsb25nZXIpLiBJZiBhIHNhbXBsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgY291bGQgbm90CiAqIGJlIGNvbnZlcnRlZCwgTlVMTCBpcyByZXR1cm5lZC4gVGhlIGNhbGxlciBNVVNUIE5PVCB1c2UgdGhlIHNhbXBsZSBpZiB0aGUKICogU01QX0ZfTUFZX0NIQU5HRSBmbGFnIGlzIHByZXNlbnQsIGFzIGl0IGlzIHVzZWQgb25seSBhcyBhIGhpbnQgdGhhdCB0aGVyZSBpcwogKiBzdGlsbCBob3BlIHRvIGdldCBpdCBhZnRlciB3YWl0aW5nIGxvbmdlciwgYW5kIGlzIG5vdCBjb252ZXJ0ZWQgdG8gc3RyaW5nLgogKiBUaGUgcG9zc2libGUgb3V0cHV0IGNvbWJpbmF0aW9ucyBhcmUgdGhlIGZvbGxvd2luZyA6CiAqCiAqIHJldHVybiBNQVlfQ0hBTkdFIEZJTkFMICAgTWVhbmluZyBmb3IgdGhlIHNhbXBsZQogKiAgTlVMTCAgICAgICogICAgICAgICogICAgIE5vdCBwcmVzZW50IGFuZCB3aWxsIG5ldmVyIGJlIChlZzogaGVhZGVyKQogKiAgIHNtcCAgICAgIDAgICAgICAgICogICAgIEZpbmFsIHZhbHVlIGNvbnZlcnRlZCAoZWc6IGhlYWRlcikKICogICBzbXAgICAgICAxICAgICAgICAwICAgICBOb3QgcHJlc2VudCB5ZXQsIG1heSBhcHBlYXIgbGF0ZXIgKGVnOiBoZWFkZXIpCiAqICAgc21wICAgICAgMSAgICAgICAgMSAgICAgbmV2ZXIgaGFwcGVucyAoZWl0aGVyIGZsYWcgaXMgY2xlYXJlZCBvbiBvdXRwdXQpCiAqLwpzdHJ1Y3Qgc2FtcGxlICpzYW1wbGVfZmV0Y2hfc3RyaW5nKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzZXNzaW9uICpzZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdHJlYW0gKnN0cm0sIHVuc2lnbmVkIGludCBvcHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZV9leHByICpleHByKQp7CglzdHJ1Y3Qgc2FtcGxlICpzbXAgPSAmdGVtcF9zbXA7CgoJbWVtc2V0KHNtcCwgMCwgc2l6ZW9mKCpzbXApKTsKCglpZiAoIXNhbXBsZV9wcm9jZXNzKHB4LCBzZXNzLCBzdHJtLCBvcHQsIGV4cHIsIHNtcCkpIHsKCQlpZiAoKHNtcC0+ZmxhZ3MgJiBTTVBfRl9NQVlfQ0hBTkdFKSAmJiAhKG9wdCAmIFNNUF9PUFRfRklOQUwpKQoJCQlyZXR1cm4gc21wOwoJCXJldHVybiBOVUxMOwoJfQoKCWlmICghc2FtcGxlX2Nhc3RzW3NtcC0+dHlwZV1bU01QX1RfU1RSXSkKCQlyZXR1cm4gTlVMTDsKCglpZiAoIXNhbXBsZV9jYXN0c1tzbXAtPnR5cGVdW1NNUF9UX1NUUl0oc21wKSkKCQlyZXR1cm4gTlVMTDsKCglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9NQVlfQ0hBTkdFOwoJcmV0dXJuIHNtcDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICBTYW1wbGUgZm9ybWF0IGNvbnZlcnQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIFRoZXNlIGZ1bmN0aW9ucyBzZXQgdGhlIGRhdGEgdHlwZSBvbiByZXR1cm4uICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludCBzYW1wbGVfY29udl9iaW4yYmFzZTY0KGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCWludCBiNjRfbGVuOwoKCXRyYXNoLT5sZW4gPSAwOwoJYjY0X2xlbiA9IGEyYmFzZTY0KHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbiwgdHJhc2gtPnN0ciwgdHJhc2gtPnNpemUpOwoJaWYgKGI2NF9sZW4gPCAwKQoJCXJldHVybiAwOwoKCXRyYXNoLT5sZW4gPSBiNjRfbGVuOwoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYmluMmhleChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzdHJ1Y3QgY2h1bmsgKnRyYXNoID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl1bnNpZ25lZCBjaGFyIGM7CglpbnQgcHRyID0gMDsKCgl0cmFzaC0+bGVuID0gMDsKCXdoaWxlIChwdHIgPCBzbXAtPmRhdGEuc3RyLmxlbiAmJiB0cmFzaC0+bGVuIDw9IHRyYXNoLT5zaXplIC0gMikgewoJCWMgPSBzbXAtPmRhdGEuc3RyLnN0cltwdHIrK107CgkJdHJhc2gtPnN0clt0cmFzaC0+bGVuKytdID0gaGV4dGFiWyhjID4+IDQpICYgMHhGXTsKCQl0cmFzaC0+c3RyW3RyYXNoLT5sZW4rK10gPSBoZXh0YWJbYyAmIDB4Rl07Cgl9CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKLyogaGFzaGVzIHRoZSBiaW5hcnkgaW5wdXQgaW50byBhIDMyLWJpdCB1bnNpZ25lZCBpbnQgKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9kamIyKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gaGFzaF9kamIyKHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbik7CglpZiAoYXJnX3AgJiYgYXJnX3AtPmRhdGEudWludCkKCQlzbXAtPmRhdGEudWludCA9IGZ1bGxfaGFzaChzbXAtPmRhdGEudWludCk7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfc3RyMmxvd2VyKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCWludCBpOwoKCWlmICghc21wX2R1cChzbXApKQoJCXJldHVybiAwOwoKCWlmICghc21wLT5kYXRhLnN0ci5zaXplKQoJCXJldHVybiAwOwoKCWZvciAoaSA9IDA7IGkgPCBzbXAtPmRhdGEuc3RyLmxlbjsgaSsrKSB7CgkJaWYgKChzbXAtPmRhdGEuc3RyLnN0cltpXSA+PSAnQScpICYmIChzbXAtPmRhdGEuc3RyLnN0cltpXSA8PSAnWicpKQoJCQlzbXAtPmRhdGEuc3RyLnN0cltpXSArPSAnYScgLSAnQSc7Cgl9CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9zdHIydXBwZXIoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJaW50IGk7CgoJaWYgKCFzbXBfZHVwKHNtcCkpCgkJcmV0dXJuIDA7CgoJaWYgKCFzbXAtPmRhdGEuc3RyLnNpemUpCgkJcmV0dXJuIDA7CgoJZm9yIChpID0gMDsgaSA8IHNtcC0+ZGF0YS5zdHIubGVuOyBpKyspIHsKCQlpZiAoKHNtcC0+ZGF0YS5zdHIuc3RyW2ldID49ICdhJykgJiYgKHNtcC0+ZGF0YS5zdHIuc3RyW2ldIDw9ICd6JykpCgkJCXNtcC0+ZGF0YS5zdHIuc3RyW2ldICs9ICdBJyAtICdhJzsKCX0KCXJldHVybiAxOwp9CgovKiB0YWtlcyB0aGUgbmV0bWFzayBpbiBhcmdfcCAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2lwbWFzayhjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEuaXB2NC5zX2FkZHIgJj0gYXJnX3AtPmRhdGEuaXB2NC5zX2FkZHI7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY0OwoJcmV0dXJuIDE7Cn0KCi8qIHRha2VzIGFuIFVJTlQgdmFsdWUgb24gaW5wdXQgc3VwcG9zZWQgdG8gcmVwcmVzZW50IHRoZSB0aW1lIHNpbmNlIEVQT0NILAogKiBhZGRzIGFuIG9wdGlvbmFsIG9mZnNldCBmb3VuZCBpbiBhcmdzWzFdIGFuZCBlbWl0cyBhIHN0cmluZyByZXByZXNlbnRpbmcKICogdGhlIGxvY2FsIHRpbWUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gYXJnc1sxXSB1c2luZyBzdHJmdGltZSgpLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9sdGltZShjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdGVtcDsKCXRpbWVfdCBjdXJyX2RhdGUgPSBzbXAtPmRhdGEudWludDsKCgkvKiBhZGQgb2Zmc2V0ICovCglpZiAoYXJnc1sxXS50eXBlID09IEFSR1RfU0lOVCB8fCBhcmdzWzFdLnR5cGUgPT0gQVJHVF9VSU5UKQoJCWN1cnJfZGF0ZSArPSBhcmdzWzFdLmRhdGEuc2ludDsKCgl0ZW1wID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl0ZW1wLT5sZW4gPSBzdHJmdGltZSh0ZW1wLT5zdHIsIHRlbXAtPnNpemUsIGFyZ3NbMF0uZGF0YS5zdHIuc3RyLCBsb2NhbHRpbWUoJmN1cnJfZGF0ZSkpOwoJc21wLT5kYXRhLnN0ciA9ICp0ZW1wOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJcmV0dXJuIDE7Cn0KCi8qIGhhc2hlcyB0aGUgYmluYXJ5IGlucHV0IGludG8gYSAzMi1iaXQgdW5zaWduZWQgaW50ICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfc2RibShjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IGhhc2hfc2RibShzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgovKiB0YWtlcyBhbiBVSU5UIHZhbHVlIG9uIGlucHV0IHN1cHBvc2VkIHRvIHJlcHJlc2VudCB0aGUgdGltZSBzaW5jZSBFUE9DSCwKICogYWRkcyBhbiBvcHRpb25hbCBvZmZzZXQgZm91bmQgaW4gYXJnc1sxXSBhbmQgZW1pdHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nCiAqIHRoZSBVVEMgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbiBhcmdzWzFdIHVzaW5nIHN0cmZ0aW1lKCkuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X3V0aW1lKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc3RydWN0IGNodW5rICp0ZW1wOwoJdGltZV90IGN1cnJfZGF0ZSA9IHNtcC0+ZGF0YS51aW50OwoKCS8qIGFkZCBvZmZzZXQgKi8KCWlmIChhcmdzWzFdLnR5cGUgPT0gQVJHVF9TSU5UIHx8IGFyZ3NbMV0udHlwZSA9PSBBUkdUX1VJTlQpCgkJY3Vycl9kYXRlICs9IGFyZ3NbMV0uZGF0YS5zaW50OwoKCXRlbXAgPSBnZXRfdHJhc2hfY2h1bmsoKTsKCXRlbXAtPmxlbiA9IHN0cmZ0aW1lKHRlbXAtPnN0ciwgdGVtcC0+c2l6ZSwgYXJnc1swXS5kYXRhLnN0ci5zdHIsIGdtdGltZSgmY3Vycl9kYXRlKSk7CglzbXAtPmRhdGEuc3RyID0gKnRlbXA7CglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglyZXR1cm4gMTsKfQoKLyogaGFzaGVzIHRoZSBiaW5hcnkgaW5wdXQgaW50byBhIDMyLWJpdCB1bnNpZ25lZCBpbnQgKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl93dDYoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSBoYXNoX3d0NihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgovKiBoYXNoZXMgdGhlIGJpbmFyeSBpbnB1dCBpbnRvIGEgMzItYml0IHVuc2lnbmVkIGludCAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2NyYzMyKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gaGFzaF9jcmMzMihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgovKiBUaGlzIGZ1bmN0aW9uIGVzY2FwZSBzcGVjaWFsIGpzb24gY2hhcmFjdGVycy4gVGhlIHJldHVybmVkIHN0cmluZyBjYW4gYmUKICogc2FmZWx5IHNldCBiZXR3ZWVuIHR3byAnIicgYW5kIHVzZWQgYXMganNvbiBzdHJpbmcuIFRoZSBqc29uIHN0cmluZyBpcwogKiBkZWZpbmVkIGxpa2UgdGhpczoKICoKICogICAgYW55IFVuaWNvZGUgY2hhcmFjdGVyIGV4Y2VwdCAnIicgb3IgJ1wnIG9yIGNvbnRyb2wgY2hhcmFjdGVyCiAqICAgIFwiLCBcXCwgXC8sIFxiLCBcZiwgXG4sIFxyLCBcdCwgXHUgKyBmb3VyLWhleC1kaWdpdHMKICoKICogVGhlIGVudW0gaW5wdXRfdHlwZSBjb250YWluIGFsbCB0aGUgYWxsb3dlZCBtb2RlIGZvciBkZWNvZGluZyB0aGUgaW5wdXQKICogc3RyaW5nLgogKi8KZW51bSBpbnB1dF90eXBlIHsKCUlUX0FTQ0lJID0gMCwKCUlUX1VURjgsCglJVF9VVEY4UywKCUlUX1VURjhQLAoJSVRfVVRGOFBTLAp9OwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2pzb25fY2hlY2soc3RydWN0IGFyZyAqYXJnLCBzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmNvbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqKmVycikKewoJaWYgKCFhcmcpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCBlbXB0eSBhcmcgbGlzdCIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChhcmctPnR5cGUgIT0gQVJHVF9TVFIpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCBhcmcgdHlwZSIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChzdHJjbXAoYXJnLT5kYXRhLnN0ci5zdHIsICIiKSA9PSAwKSB7CgkJYXJnLT50eXBlID0gQVJHVF9VSU5UOwoJCWFyZy0+ZGF0YS51aW50ID0gSVRfQVNDSUk7CgkJcmV0dXJuIDE7Cgl9CgoJZWxzZSBpZiAoc3RyY21wKGFyZy0+ZGF0YS5zdHIuc3RyLCAiYXNjaWkiKSA9PSAwKSB7CgkJYXJnLT50eXBlID0gQVJHVF9VSU5UOwoJCWFyZy0+ZGF0YS51aW50ID0gSVRfQVNDSUk7CgkJcmV0dXJuIDE7Cgl9CgoJZWxzZSBpZiAoc3RyY21wKGFyZy0+ZGF0YS5zdHIuc3RyLCAidXRmOCIpID09IDApIHsKCQlhcmctPnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnLT5kYXRhLnVpbnQgPSBJVF9VVEY4OwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgInV0ZjhzIikgPT0gMCkgewoJCWFyZy0+dHlwZSA9IEFSR1RfVUlOVDsKCQlhcmctPmRhdGEudWludCA9IElUX1VURjhTOwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgInV0ZjhwIikgPT0gMCkgewoJCWFyZy0+dHlwZSA9IEFSR1RfVUlOVDsKCQlhcmctPmRhdGEudWludCA9IElUX1VURjhQOwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgInV0ZjhwcyIpID09IDApIHsKCQlhcmctPnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnLT5kYXRhLnVpbnQgPSBJVF9VVEY4UFM7CgkJcmV0dXJuIDE7Cgl9CgoJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgaW5wdXQgY29kZSB0eXBlIGF0IGZpbGUgJyVzJywgbGluZSAlZC4gIgoJICAgICAgICAgICAgICAgIkFsbG93ZWQgdmFsdWUgYXJlICdhc2NpaScsICd1dGY4JywgJ3V0ZjhwJyBhbmQgJ3V0ZjhwcCciLCBmaWxlLCBsaW5lKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNhbXBsZV9jb252X2pzb24oY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc3RydWN0IGNodW5rICp0ZW1wOwoJY2hhciBfc3RyWzddOyAvKiBcdSArIDQgaGV4IGRpZ2l0ICsgbnVsbCBjaGFyIGZvciBzcHJpbnRmLiAqLwoJY29uc3QgY2hhciAqc3RyOwoJaW50IGxlbjsKCWVudW0gaW5wdXRfdHlwZSBpbnB1dF90eXBlID0gSVRfQVNDSUk7Cgl1bnNpZ25lZCBpbnQgYzsKCXVuc2lnbmVkIGludCByZXQ7CgljaGFyICpwOwoKCWlmIChhcmdfcCkKCQlpbnB1dF90eXBlID0gYXJnX3AtPmRhdGEudWludDsKCgl0ZW1wID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl0ZW1wLT5sZW4gPSAwOwoKCXAgPSBzbXAtPmRhdGEuc3RyLnN0cjsKCXdoaWxlIChwIDwgc21wLT5kYXRhLnN0ci5zdHIgKyBzbXAtPmRhdGEuc3RyLmxlbikgewoKCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9BU0NJSSkgewoJCQkvKiBSZWFkIGlucHV0IGFzIEFTQ0lJLiAqLwoJCQljID0gKih1bnNpZ25lZCBjaGFyICopcDsKCQkJcCsrOwoJCX0KCQllbHNlIHsKCQkJLyogUmVhZCBpbnB1dCBhcyBVVEY4LiAqLwoJCQlyZXQgPSB1dGY4X25leHQocCwgc21wLT5kYXRhLnN0ci5sZW4gLSAoIHAgLSBzbXAtPmRhdGEuc3RyLnN0ciApLCAmYyk7CgkJCXAgKz0gdXRmOF9yZXR1cm5fbGVuZ3RoKHJldCk7CgoJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4ICYmIHV0ZjhfcmV0dXJuX2NvZGUocmV0KSAhPSBVVEY4X0NPREVfT0spCgkJCQkJcmV0dXJuIDA7CgkJCWlmIChpbnB1dF90eXBlID09IElUX1VURjhTICYmIHV0ZjhfcmV0dXJuX2NvZGUocmV0KSAhPSBVVEY4X0NPREVfT0spCgkJCQkJY29udGludWU7CgkJCWlmIChpbnB1dF90eXBlID09IElUX1VURjhQICYmIHV0ZjhfcmV0dXJuX2NvZGUocmV0KSAmIChVVEY4X0NPREVfSU5WUkFOR0V8VVRGOF9DT0RFX0JBRFNFUSkpCgkJCQkJcmV0dXJuIDA7CgkJCWlmIChpbnB1dF90eXBlID09IElUX1VURjhQUyAmJiB1dGY4X3JldHVybl9jb2RlKHJldCkgJiAoVVRGOF9DT0RFX0lOVlJBTkdFfFVURjhfQ09ERV9CQURTRVEpKQoJCQkJCWNvbnRpbnVlOwoKCQkJLyogQ2hlY2sgdG9vIGJpZyB2YWx1ZXMuICovCgkJCWlmICgodW5zaWduZWQgaW50KWMgPiAweGZmZmYpIHsKCQkJCWlmIChpbnB1dF90eXBlID09IElUX1VURjggfHwgaW5wdXRfdHlwZSA9PSBJVF9VVEY4UCkKCQkJCQlyZXR1cm4gMDsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoKCQkvKiBDb252ZXJ0IGNoYXJhY3Rlci4gKi8KCQlpZiAoYyA9PSAnIicpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcXCIiOwoJCX0KCQllbHNlIGlmIChjID09ICdcXCcpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcXFwiOwoJCX0KCQllbHNlIGlmIChjID09ICcvJykgewoJCQlsZW4gPSAyOwoJCQlzdHIgPSAiXFwvIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXGInKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXGIiOwoJCX0KCQllbHNlIGlmIChjID09ICdcZicpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcZiI7CgkJfQoJCWVsc2UgaWYgKGMgPT0gJ1xyJykgewoJCQlsZW4gPSAyOwoJCQlzdHIgPSAiXFxyIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXG4nKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXG4iOwoJCX0KCQllbHNlIGlmIChjID09ICdcdCcpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcdCI7CgkJfQoJCWVsc2UgaWYgKGMgPiAweGZmIHx8ICFpc3ByaW50KGMpKSB7CgkJCS8qIGlzcHJpbnQgZ2VuZXJhdGUgYSBzZWdmYXVsdCBpZiBjIGlzIHRvbyBiaWcuIFRoZSBtYW4gc2F5cyB0aGF0CgkJCSAqIGMgbXVzdCBoYXZlIHRoZSB2YWx1ZSBvZiBhbiB1bnNpZ25lZCBjaGFyIG9yIEVPRi4KCQkJICovCgkJCWxlbiA9IDY7CgkJCV9zdHJbMF0gPSAnXFwnOwoJCQlfc3RyWzFdID0gJ3UnOwoJCQlzbnByaW50ZigmX3N0clsyXSwgNSwgIiUwNHgiLCAodW5zaWduZWQgc2hvcnQpYyk7CgkJCXN0ciA9IF9zdHI7CgkJfQoJCWVsc2UgewoJCQlsZW4gPSAxOwoJCQlzdHIgPSAoY2hhciAqKSZjOwoJCX0KCgkJLyogQ2hlY2sgbGVuZ3RoICovCgkJaWYgKHRlbXAtPmxlbiArIGxlbiA+IHRlbXAtPnNpemUpCgkJCXJldHVybiAwOwoKCQkvKiBDb3B5IHN0cmluZy4gKi8KCQltZW1jcHkodGVtcC0+c3RyICsgdGVtcC0+bGVuLCBzdHIsIGxlbik7CgkJdGVtcC0+bGVuICs9IGxlbjsKCX0KCglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXNtcC0+ZGF0YS5zdHIgPSAqdGVtcDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCglyZXR1cm4gMTsKfQoKLyogVGhpcyBzYW1wbGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZXh0cmFjdCBzb21lIGJ5dGVzIGZyb20gYW4gaW5wdXQgYnVmZmVyLgogKiBGaXJzdCBhcmcgaXMgdGhlIG9mZnNldC4KICogT3B0aW9uYWwgc2Vjb25kIGFyZyBpcyB0aGUgbGVuZ3RoIHRvIHRydW5jYXRlICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYnl0ZXMoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJaWYgKHNtcC0+ZGF0YS5zdHIubGVuIDw9IGFyZ19wWzBdLmRhdGEudWludCkgewoJCXNtcC0+ZGF0YS5zdHIubGVuID0gMDsKCQlyZXR1cm4gMTsKCX0KCglpZiAoc21wLT5kYXRhLnN0ci5zaXplKQoJCQlzbXAtPmRhdGEuc3RyLnNpemUgLT0gYXJnX3BbMF0uZGF0YS51aW50OwoJc21wLT5kYXRhLnN0ci5sZW4gLT0gYXJnX3BbMF0uZGF0YS51aW50OwoJc21wLT5kYXRhLnN0ci5zdHIgKz0gYXJnX3BbMF0uZGF0YS51aW50OwoKCWlmICgoYXJnX3BbMV0udHlwZSA9PSBBUkdUX1VJTlQpICYmIChhcmdfcFsxXS5kYXRhLnVpbnQgPCBzbXAtPmRhdGEuc3RyLmxlbikpCgkJc21wLT5kYXRhLnN0ci5sZW4gPSBhcmdfcFsxXS5kYXRhLnVpbnQ7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfZmllbGRfY2hlY2soc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZV9jb252ICpjb252LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKiplcnIpCnsKCXN0cnVjdCBhcmcgKmFyZyA9IGFyZ3M7CgoJaWYgKCFhcmcpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCBlbXB0eSBhcmcgbGlzdCIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChhcmctPnR5cGUgIT0gQVJHVF9VSU5UKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgYXJnIHR5cGUiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoIWFyZy0+ZGF0YS51aW50KSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgdmFsdWUgMCBmb3IgaW5kZXgiKTsKCQlyZXR1cm4gMDsKCX0KCglhcmcrKzsKCglpZiAoYXJnLT50eXBlICE9IEFSR1RfU1RSKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgYXJnIHR5cGUiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoIWFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJbWVtcHJpbnRmKGVyciwgIkVtcHR5IHNlcGFyYXRvcnMgbGlzdCIpOwoJCXJldHVybiAwOwoJfQoKCXJldHVybiAxOwp9CgovKiBUaGlzIHNhbXBsZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBhIHJldHVybiBzZWxlY3RlZCBwYXJ0IG9mIGEgc3RyaW5nIChmaWVsZCkuCiAqIEZpcnN0IGFyZyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpZWxkIChzdGFydCBhdCAxKQogKiBTZWNvbmQgYXJnIGlzIGEgY2hhciBsaXN0IG9mIHNlcGFyYXRvcnMgKHR5cGUgc3RyaW5nKQogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9maWVsZChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7Cgl1bnNpZ25lZCBpbnQgZmllbGQ7CgljaGFyICpzdGFydCwgKmVuZDsKCWludCBpOwoKCWlmICghYXJnX3BbMF0uZGF0YS51aW50KQoJCXJldHVybiAwOwoKCWZpZWxkID0gMTsKCWVuZCA9IHN0YXJ0ID0gc21wLT5kYXRhLnN0ci5zdHI7Cgl3aGlsZSAoZW5kIC0gc21wLT5kYXRhLnN0ci5zdHIgPCBzbXAtPmRhdGEuc3RyLmxlbikgewoKCQlmb3IgKGkgPSAwIDsgaSA8IGFyZ19wWzFdLmRhdGEuc3RyLmxlbiA7IGkrKykgewoJCQlpZiAoKmVuZCA9PSBhcmdfcFsxXS5kYXRhLnN0ci5zdHJbaV0pIHsKCQkJCWlmIChmaWVsZCA9PSBhcmdfcFswXS5kYXRhLnVpbnQpCgkJCQkJZ290byBmb3VuZDsKCQkJCXN0YXJ0ID0gZW5kKzE7CgkJCQlmaWVsZCsrOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJZW5kKys7Cgl9CgoJLyogRmllbGQgbm90IGZvdW5kICovCglpZiAoZmllbGQgIT0gYXJnX3BbMF0uZGF0YS51aW50KSB7CgkJc21wLT5kYXRhLnN0ci5sZW4gPSAwOwoJCXJldHVybiAxOwoJfQpmb3VuZDoKCXNtcC0+ZGF0YS5zdHIubGVuID0gZW5kIC0gc3RhcnQ7CgkvKiBJZiByZXQgc3RyaW5nIGlzIGxlbiAwLCBubyBuZWVkIHRvCiAgICAgICAgICAgY2hhbmdlIHBvaW50ZXJzIG9yIHRvIHVwZGF0ZSBzaXplICovCglpZiAoIXNtcC0+ZGF0YS5zdHIubGVuKQoJCXJldHVybiAxOwoKCXNtcC0+ZGF0YS5zdHIuc3RyID0gc3RhcnQ7CgoJLyogQ29tcHV0ZSByZW1haW5pbmcgc2l6ZSBpZiBuZWVkZWQKICAgICAgICAgICBOb3RlOiBzbXAtPmRhdGEuc3RyLnNpemUgY2Fubm90IGJlIHNldCB0byAwICovCglpZiAoc21wLT5kYXRhLnN0ci5zaXplKQoJCXNtcC0+ZGF0YS5zdHIuc2l6ZSAtPSBzdGFydCAtIHNtcC0+ZGF0YS5zdHIuc3RyOwoKCXJldHVybiAxOwp9CgovKiBUaGlzIHNhbXBsZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byByZXR1cm4gYSB3b3JkIGZyb20gYSBzdHJpbmcuCiAqIEZpcnN0IGFyZyBpcyB0aGUgaW5kZXggb2YgdGhlIHdvcmQgKHN0YXJ0IGF0IDEpCiAqIFNlY29uZCBhcmcgaXMgYSBjaGFyIGxpc3Qgb2Ygd29yZHMgc2VwYXJhdG9ycyAodHlwZSBzdHJpbmcpCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X3dvcmQoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJdW5zaWduZWQgaW50IHdvcmQ7CgljaGFyICpzdGFydCwgKmVuZDsKCWludCBpLCBpc3NlcCwgaW53b3JkOwoKCWlmICghYXJnX3BbMF0uZGF0YS51aW50KQoJCXJldHVybiAwOwoKCXdvcmQgPSAwOwoJaW53b3JkID0gMDsKCWVuZCA9IHN0YXJ0ID0gc21wLT5kYXRhLnN0ci5zdHI7Cgl3aGlsZSAoZW5kIC0gc21wLT5kYXRhLnN0ci5zdHIgPCBzbXAtPmRhdGEuc3RyLmxlbikgewoJCWlzc2VwID0gMDsKCQlmb3IgKGkgPSAwIDsgaSA8IGFyZ19wWzFdLmRhdGEuc3RyLmxlbiA7IGkrKykgewoJCQlpZiAoKmVuZCA9PSBhcmdfcFsxXS5kYXRhLnN0ci5zdHJbaV0pIHsKCQkJCWlzc2VwID0gMTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmICghaW53b3JkKSB7CgkJCWlmICghaXNzZXApIHsKCQkJCXdvcmQrKzsKCQkJCXN0YXJ0ID0gZW5kOwoJCQkJaW53b3JkID0gMTsKCQkJfQoJCX0KCQllbHNlIGlmIChpc3NlcCkgewoJCQlpZiAod29yZCA9PSBhcmdfcFswXS5kYXRhLnVpbnQpCgkJCQlnb3RvIGZvdW5kOwoJCQlpbndvcmQgPSAwOwoJCX0KCQllbmQrKzsKCX0KCgkvKiBGaWVsZCBub3QgZm91bmQgKi8KCWlmICh3b3JkICE9IGFyZ19wWzBdLmRhdGEudWludCkgewoJCXNtcC0+ZGF0YS5zdHIubGVuID0gMDsKCQlyZXR1cm4gMTsKCX0KZm91bmQ6CglzbXAtPmRhdGEuc3RyLmxlbiA9IGVuZCAtIHN0YXJ0OwoJLyogSWYgcmV0IHN0cmluZyBpcyBsZW4gMCwgbm8gbmVlZCB0bwogICAgICAgICAgIGNoYW5nZSBwb2ludGVycyBvciB0byB1cGRhdGUgc2l6ZSAqLwoJaWYgKCFzbXAtPmRhdGEuc3RyLmxlbikKCQlyZXR1cm4gMTsKCglzbXAtPmRhdGEuc3RyLnN0ciA9IHN0YXJ0OwoKCS8qIENvbXB1dGUgcmVtYWluaW5nIHNpemUgaWYgbmVlZGVkCiAgICAgICAgICAgTm90ZTogc21wLT5kYXRhLnN0ci5zaXplIGNhbm5vdCBiZSBzZXQgdG8gMCAqLwoJaWYgKHNtcC0+ZGF0YS5zdHIuc2l6ZSkKCQlzbXAtPmRhdGEuc3RyLnNpemUgLT0gc3RhcnQgLSBzbXAtPmRhdGEuc3RyLnN0cjsKCglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9yZWdzdWJfY2hlY2soc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZV9jb252ICpjb252LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqKmVycikKewoJc3RydWN0IGFyZyAqYXJnID0gYXJnczsKCWNoYXIgKnA7CglpbnQgbGVuOwoKCS8qIGFyZzAgaXMgYSByZWdleCwgaXQgdXNlcyB0eXBlX2ZsYWcgZm9yIElDQVNFIGFuZCBnbG9iYWwgbWF0Y2ggKi8KCWFyZ1swXS50eXBlX2ZsYWdzID0gMDsKCglpZiAoYXJnWzJdLnR5cGUgIT0gQVJHVF9TVFIpCgkJcmV0dXJuIDE7CgoJcCA9IGFyZ1syXS5kYXRhLnN0ci5zdHI7CglsZW4gPSBhcmdbMl0uZGF0YS5zdHIubGVuOwoJd2hpbGUgKGxlbikgewoJCWlmICgqcCA9PSAnaScpIHsKCQkJYXJnWzBdLnR5cGVfZmxhZ3MgfD0gQVJHRl9SRUdfSUNBU0U7CgkJfQoJCWVsc2UgaWYgKCpwID09ICdnJykgewoJCQlhcmdbMF0udHlwZV9mbGFncyB8PSBBUkdGX1JFR19HTE9COwoJCX0KCQllbHNlIHsKCQkJbWVtcHJpbnRmKGVyciwgImludmFsaWQgcmVnZXggZmxhZyAnJWMnLCBvbmx5ICdpJyBhbmQgJ2cnIGFyZSBzdXBwb3J0ZWQiLCAqcCk7CgkJCXJldHVybiAwOwoJCX0KCQlwKys7CgkJbGVuLS07Cgl9CglyZXR1cm4gMTsKfQoKLyogVGhpcyBzYW1wbGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZG8gdGhlIGVxdWl2YWxlbnQgb2Ygcy9tYXRjaC9yZXBsYWNlLyBvbgogKiB0aGUgaW5wdXQgc3RyaW5nLiBJdCBhcHBsaWVzIGEgcmVnZXggYW5kIHJlc3RhcnRzIGZyb20gdGhlIGxhc3QgbWF0Y2hlZAogKiBsb2NhdGlvbiB1bnRpbCBub3RoaW5nIG1hdGNoZXMgYW55bW9yZS4gRmlyc3QgYXJnIGlzIHRoZSByZWdleCB0byBhcHBseSB0bwogKiB0aGUgaW5wdXQgc3RyaW5nLCBzZWNvbmQgYXJnIGlzIHRoZSByZXBsYWNlbWVudCBleHByZXNzaW9uLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9yZWdzdWIoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJY2hhciAqc3RhcnQsICplbmQ7CglzdHJ1Y3QgbXlfcmVnZXggKnJlZyA9IGFyZ19wWzBdLmRhdGEucmVnOwoJcmVnbWF0Y2hfdCBwbWF0Y2hbTUFYX01BVENIXTsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCWludCBmbGFnLCBtYXg7CglpbnQgZm91bmQ7CgoJc3RhcnQgPSBzbXAtPmRhdGEuc3RyLnN0cjsKCWVuZCA9IHN0YXJ0ICsgc21wLT5kYXRhLnN0ci5sZW47CgoJZmxhZyA9IDA7Cgl3aGlsZSAoMSkgewoJCS8qIGNoZWNrIGZvciBsYXN0IHJvdW5kIHdoaWNoIGlzIHVzZWQgdG8gY29weSByZW1haW5pbmcgcGFydHMKCQkgKiB3aGVuIG5vdCBydW5uaW5nIGluIGdsb2JhbCByZXBsYWNlbWVudCBtb2RlLgoJCSAqLwoJCWZvdW5kID0gMDsKCQlpZiAoKGFyZ19wWzBdLnR5cGVfZmxhZ3MgJiBBUkdGX1JFR19HTE9CKSB8fCAhKGZsYWcgJiBSRUdfTk9UQk9MKSkgewoJCQkvKiBOb3RlOiB3ZSBjYW4gaGF2ZSBzdGFydCA9PSBlbmQgb24gZW1wdHkgc3RyaW5ncyBvciBhdCB0aGUgZW5kICovCgkJCWZvdW5kID0gcmVnZXhfZXhlY19tYXRjaDIocmVnLCBzdGFydCwgZW5kIC0gc3RhcnQsIE1BWF9NQVRDSCwgcG1hdGNoLCBmbGFnKTsKCQl9CgoJCWlmICghZm91bmQpCgkJCXBtYXRjaFswXS5ybV9zbyA9IGVuZCAtIHN0YXJ0OwoKCQkvKiBjb3B5IHRoZSBoZWFkaW5nIG5vbi1tYXRjaGluZyBwYXJ0ICh3aGljaCBtYXkgYWxzbyBiZSB0aGUgdGFpbCBpZiBub3RoaW5nIG1hdGNoZXMpICovCgkJbWF4ID0gdHJhc2gtPnNpemUgLSB0cmFzaC0+bGVuOwoJCWlmIChtYXggJiYgcG1hdGNoWzBdLnJtX3NvID4gMCkgewoJCQlpZiAobWF4ID4gcG1hdGNoWzBdLnJtX3NvKQoJCQkJbWF4ID0gcG1hdGNoWzBdLnJtX3NvOwoJCQltZW1jcHkodHJhc2gtPnN0ciArIHRyYXNoLT5sZW4sIHN0YXJ0LCBtYXgpOwoJCQl0cmFzaC0+bGVuICs9IG1heDsKCQl9CgoJCWlmICghZm91bmQpCgkJCWJyZWFrOwoKCQkvKiByZXBsYWNlIHRoZSBtYXRjaGluZyBwYXJ0ICovCgkJbWF4ID0gdHJhc2gtPnNpemUgLSB0cmFzaC0+bGVuOwoJCWlmIChtYXgpIHsKCQkJaWYgKG1heCA+IGFyZ19wWzFdLmRhdGEuc3RyLmxlbikKCQkJCW1heCA9IGFyZ19wWzFdLmRhdGEuc3RyLmxlbjsKCQkJbWVtY3B5KHRyYXNoLT5zdHIgKyB0cmFzaC0+bGVuLCBhcmdfcFsxXS5kYXRhLnN0ci5zdHIsIG1heCk7CgkJCXRyYXNoLT5sZW4gKz0gbWF4OwoJCX0KCgkJLyogc3RvcCBoZXJlIGlmIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIHN0cmluZyAqLwoJCWlmIChzdGFydCA+PSBlbmQpCgkJCWJyZWFrOwoKCQkvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIGZvciBtYXRjaGVzIG9mIGxlbmd0aCAwIChlZzogIngqeSoiKS4KCQkgKiBUaGVzZSBvbmVzIGFyZSBjb25zaWRlcmVkIHRvIG1hdGNoIGluIGZyb250IG9mIGEgY2hhcmFjdGVyLAoJCSAqIHNvIHdlIGhhdmUgdG8gY29weSB0aGF0IGNoYXJhY3RlciBhbmQgc2tpcCB0byB0aGUgbmV4dCBvbmUuCgkJICovCgkJaWYgKCFwbWF0Y2hbMF0ucm1fZW8pIHsKCQkJaWYgKHRyYXNoLT5sZW4gPCB0cmFzaC0+c2l6ZSkKCQkJCXRyYXNoLT5zdHJbdHJhc2gtPmxlbisrXSA9IHN0YXJ0W3BtYXRjaFswXS5ybV9lb107CgkJCXBtYXRjaFswXS5ybV9lbysrOwoJCX0KCgkJc3RhcnQgKz0gcG1hdGNoWzBdLnJtX2VvOwoJCWZsYWcgfD0gUkVHX05PVEJPTDsKCX0KCglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhIGJpbmFyeSB0d29zIGNvbXBsZW1lbnQgYW5kIHJldHVybnMgdGhlIFVJTlQKICogcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9iaW5hcnlfY3BsKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gfnNtcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhIGJpbmFyeSAiYW5kIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLCBhbmQKICogcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbmFyeV9hbmQoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgJj0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYSBiaW5hcnkgIm9yIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLCBhbmQKICogcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbmFyeV9vcihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCB8PSBhcmdfcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhIGJpbmFyeSAieG9yIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLCBhbmQKICogcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbmFyeV94b3IoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgXj0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYW4gYXJpdGhtZXRpYyAiYWRkIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLAogKiBhbmQgcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX2FkZChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCArPSBhcmdfcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhbiBhcml0aG1ldGljICJzdWIiIHdpdGggdGhlIFVJTlQgaW4gYXJnX3AsCiAqIGFuZCByZXR1cm5zIHRoZSBVSU5UIHJlc3VsdC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfc3ViKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50IC09IGFyZ19wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgIm11bCIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9tdWwoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgKj0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYW4gYXJpdGhtZXRpYyAiZGl2IiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLAogKiBhbmQgcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuIElmIGFyZ19wIG1ha2VzIHRoZSByZXN1bHQgb3ZlcmZsb3csIHRoZW4gdGhlCiAqIGxhcmdlc3QgcG9zc2libGUgcXVhbnRpdHkgaXMgcmV0dXJuZWQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX2Rpdihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpZiAoYXJnX3AtPmRhdGEudWludCkKCQlzbXAtPmRhdGEudWludCAvPSBhcmdfcC0+ZGF0YS51aW50OwoJZWxzZQoJCXNtcC0+ZGF0YS51aW50ID0gfjA7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgIm1vZCIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LiBJZiBhcmdfcCBtYWtlcyB0aGUgcmVzdWx0IG92ZXJmbG93LCB0aGVuIHplcm8KICogaXMgcmV0dXJuZWQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX21vZChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpZiAoYXJnX3AtPmRhdGEudWludCkKCQlzbXAtPmRhdGEudWludCAlPSBhcmdfcC0+ZGF0YS51aW50OwoJZWxzZQoJCXNtcC0+ZGF0YS51aW50ID0gMDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhbiBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgIm5lZyIgYW5kIHJldHVybnMgdGhlIFVJTlQKICogcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9uZWcoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSAtc21wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCByZXR1cm5zIHRydWUgaXMgdGhlIHZhbHVlIGlzIG5vbi1udWxsLCBvdGhlcndpc2UKICogZmFsc2UuIFRoZSBvdXRwdXQgaXMgYSBCT09MLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9ib29sKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9ICEhc21wLT5kYXRhLnVpbnQ7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgcmV0dXJucyBmYWxzZSBpcyB0aGUgdmFsdWUgaXMgbm9uLW51bGwsIG90aGVyd2lzZQogKiB0cnVlZS4gVGhlIG91dHB1dCBpcyBhIEJPT0wuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX25vdChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9ICFzbXAtPmRhdGEudWludDsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCByZXR1cm5zIHRydWUgaXMgdGhlIHZhbHVlIGlzIG9kZCwgb3RoZXJ3aXNlIGZhbHNlLgogKiBUaGUgb3V0cHV0IGlzIGEgQk9PTC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfb2RkKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gc21wLT5kYXRhLnVpbnQgJiAxOwoJc21wLT50eXBlID0gU01QX1RfQk9PTDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIHJldHVybnMgdHJ1ZSBpcyB0aGUgdmFsdWUgaXMgZXZlbiwgb3RoZXJ3aXNlIGZhbHNlLgogKiBUaGUgb3V0cHV0IGlzIGEgQk9PTC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfZXZlbihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSAhKHNtcC0+ZGF0YS51aW50ICYgMSk7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgIEFsbCBzdXBwb3J0ZWQgc2FtcGxlIGZldGNoIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIGhlcmUgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBmb3JjZSBUUlVFIHRvIGJlIHJldHVybmVkIGF0IHRoZSBmZXRjaCBsZXZlbCAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF90cnVlKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglzbXAtPmRhdGEudWludCA9IDE7CglyZXR1cm4gMTsKfQoKLyogZm9yY2UgRkFMU0UgdG8gYmUgcmV0dXJuZWQgYXQgdGhlIGZldGNoIGxldmVsICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX2ZhbHNlKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglzbXAtPmRhdGEudWludCA9IDA7CglyZXR1cm4gMTsKfQoKLyogcmV0cmlldmUgZW52aXJvbm1lbnQgdmFyaWFibGUgJDEgYXMgYSBzdHJpbmcgKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfZW52KGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCWNoYXIgKmVudjsKCglpZiAoIWFyZ3MgfHwgYXJnc1swXS50eXBlICE9IEFSR1RfU1RSKQoJCXJldHVybiAwOwoKCWVudiA9IGdldGVudihhcmdzWzBdLmRhdGEuc3RyLnN0cik7CglpZiAoIWVudikKCQlyZXR1cm4gMDsKCglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglzbXAtPmZsYWdzID0gU01QX0ZfQ09OU1Q7CglzbXAtPmRhdGEuc3RyLnN0ciA9IGVudjsKCXNtcC0+ZGF0YS5zdHIubGVuID0gc3RybGVuKGVudik7CglyZXR1cm4gMTsKfQoKLyogcmV0cmlldmUgdGhlIGN1cnJlbnQgbG9jYWwgZGF0ZSBpbiBlcG9jaCB0aW1lLCBhbmQgYXBwbGllcyBhbiBvcHRpb25hbCBvZmZzZXQKICogb2YgYXJnc1swXSBzZWNvbmRzLgogKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfZGF0ZShjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IGRhdGUudHZfc2VjOwoKCS8qIGFkZCBvZmZzZXQgKi8KCWlmIChhcmdzICYmIChhcmdzWzBdLnR5cGUgPT0gQVJHVF9TSU5UIHx8IGFyZ3NbMF0udHlwZSA9PSBBUkdUX1VJTlQpKQoJCXNtcC0+ZGF0YS51aW50ICs9IGFyZ3NbMF0uZGF0YS5zaW50OwoKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglzbXAtPmZsYWdzIHw9IFNNUF9GX1ZPTF9URVNUIHwgU01QX0ZfTUFZX0NIQU5HRTsKCXJldHVybiAxOwp9CgovKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX25icHJvYyhjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJc21wLT5kYXRhLnVpbnQgPSBnbG9iYWwubmJwcm9jOwoJcmV0dXJuIDE7Cn0KCi8qIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY3VycmVudCBwcm9jZXNzIChiZXR3ZWVuIDEgYW5kIG5icHJvYyAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9wcm9jKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglzbXAtPmRhdGEudWludCA9IHJlbGF0aXZlX3BpZDsKCXJldHVybiAxOwp9CgovKiBnZW5lcmF0ZSBhIHJhbmRvbSAzMi1iaXQgaW50ZWdlciBmb3Igd2hhdGV2ZXIgcHVycG9zZSwgd2l0aCBhbiBvcHRpb25hbAogKiByYW5nZSBzcGVjaWZpZWQgaW4gYXJndW1lbnQuCiAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9yYW5kKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gcmFuZG9tKCk7CgoJLyogcmVkdWNlIGlmIG5lZWRlZC4gRG9uJ3QgZG8gYSBtb2R1bG8sIHVzZSBhbGwgYml0cyEgKi8KCWlmIChhcmdzICYmIGFyZ3NbMF0udHlwZSA9PSBBUkdUX1VJTlQpCgkJc21wLT5kYXRhLnVpbnQgPSAoKHVpbnQ2NF90KXNtcC0+ZGF0YS51aW50ICogYXJnc1swXS5kYXRhLnVpbnQpIC8gKCh1NjQpUkFORF9NQVgrMSk7CgoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZmxhZ3MgfD0gU01QX0ZfVk9MX1RFU1QgfCBTTVBfRl9NQVlfQ0hBTkdFOwoJcmV0dXJuIDE7Cn0KCi8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIHN0b3BwaW5nICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX3N0b3BwaW5nKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglzbXAtPmRhdGEudWludCA9IHN0b3BwaW5nOwoJcmV0dXJuIDE7Cn0KCi8qIE5vdGU6IG11c3Qgbm90IGJlIGRlY2xhcmVkIDxjb25zdD4gYXMgaXRzIGxpc3Qgd2lsbCBiZSBvdmVyd3JpdHRlbi4KICogTm90ZTogZmV0Y2hlcyB0aGF0IG1heSByZXR1cm4gbXVsdGlwbGUgdHlwZXMgbXVzdCBiZSBkZWNsYXJlZCBhcyB0aGUgbG93ZXN0CiAqIGNvbW1vbiBkZW5vbWluYXRvciwgdGhlIHR5cGUgdGhhdCBjYW4gYmUgY2FzdGVkIGludG8gYWxsIG90aGVyIG9uZXMuIEZvcgogKiBpbnN0YW5jZSBJUHY0L0lQdjYgbXVzdCBiZSBkZWNsYXJlZCBJUHY0LgogKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCBzbXBfa3dzID0ge0lMSCwgewoJeyAiYWx3YXlzX2ZhbHNlIiwgc21wX2ZldGNoX2ZhbHNlLCAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX0JPT0wsIFNNUF9VU0VfSU5UUk4gfSwKCXsgImFsd2F5c190cnVlIiwgIHNtcF9mZXRjaF90cnVlLCAgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9CT09MLCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJlbnYiLCAgICAgICAgICBzbXBfZmV0Y2hfZW52LCAgIEFSRzEoMSxTVFIpLCAgTlVMTCwgU01QX1RfU1RSLCAgU01QX1VTRV9JTlRSTiB9LAoJeyAiZGF0ZSIsICAgICAgICAgc21wX2ZldGNoX2RhdGUsICBBUkcxKDAsU0lOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9VU0VfSU5UUk4gfSwKCXsgIm5icHJvYyIsICAgICAgIHNtcF9mZXRjaF9uYnByb2MsMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJwcm9jIiwgICAgICAgICBzbXBfZmV0Y2hfcHJvYywgIDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfVUlOVCwgU01QX1VTRV9JTlRSTiB9LAoJeyAicmFuZCIsICAgICAgICAgc21wX2ZldGNoX3JhbmQsICBBUkcxKDAsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9VU0VfSU5UUk4gfSwKCXsgInN0b3BwaW5nIiwgICAgIHNtcF9mZXRjaF9zdG9wcGluZywgMCwgICAgICAgICBOVUxMLCBTTVBfVF9CT09MLCBTTVBfVVNFX0lOVFJOIH0sCgl7IC8qIEVORCAqLyB9LAp9fTsKCi8qIE5vdGU6IG11c3Qgbm90IGJlIGRlY2xhcmVkIDxjb25zdD4gYXMgaXRzIGxpc3Qgd2lsbCBiZSBvdmVyd3JpdHRlbiAqLwpzdGF0aWMgc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3Qgc2FtcGxlX2NvbnZfa3dzID0ge0lMSCwgewoJeyAiYmFzZTY0Iiwgc2FtcGxlX2NvbnZfYmluMmJhc2U2NCwwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1NUUiAgfSwKCXsgInVwcGVyIiwgIHNhbXBsZV9jb252X3N0cjJ1cHBlciwgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9TVFIsICBTTVBfVF9TVFIgIH0sCgl7ICJsb3dlciIsICBzYW1wbGVfY29udl9zdHIybG93ZXIsIDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfU1RSLCAgU01QX1RfU1RSICB9LAoJeyAiaGV4IiwgICAgc2FtcGxlX2NvbnZfYmluMmhleCwgICAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1NUUiAgfSwKCXsgImlwbWFzayIsIHNhbXBsZV9jb252X2lwbWFzaywgICAgQVJHMSgxLE1TSzQpLCBOVUxMLCBTTVBfVF9JUFY0LCBTTVBfVF9JUFY0IH0sCgl7ICJsdGltZSIsICBzYW1wbGVfY29udl9sdGltZSwgICAgIEFSRzIoMSxTVFIsU0lOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1NUUiB9LAoJeyAidXRpbWUiLCAgc2FtcGxlX2NvbnZfdXRpbWUsICAgICBBUkcyKDEsU1RSLFNJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9TVFIgfSwKCXsgImNyYzMyIiwgIHNhbXBsZV9jb252X2NyYzMyLCAgICAgQVJHMSgwLFVJTlQpLCBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9VSU5UIH0sCgl7ICJkamIyIiwgICBzYW1wbGVfY29udl9kamIyLCAgICAgIEFSRzEoMCxVSU5UKSwgTlVMTCwgU01QX1RfQklOLCAgU01QX1RfVUlOVCB9LAoJeyAic2RibSIsICAgc2FtcGxlX2NvbnZfc2RibSwgICAgICBBUkcxKDAsVUlOVCksIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1VJTlQgfSwKCXsgInd0NiIsICAgIHNhbXBsZV9jb252X3d0NiwgICAgICAgQVJHMSgwLFVJTlQpLCBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9VSU5UIH0sCgl7ICJqc29uIiwgICBzYW1wbGVfY29udl9qc29uLCAgICAgIEFSRzEoMSxTVFIpLCAgc2FtcGxlX2NvbnZfanNvbl9jaGVjaywgU01QX1RfU1RSLCAgU01QX1RfU1RSIH0sCgl7ICJieXRlcyIsICBzYW1wbGVfY29udl9ieXRlcywgICAgIEFSRzIoMSxVSU5ULFVJTlQpLCBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9CSU4gfSwKCXsgImZpZWxkIiwgIHNhbXBsZV9jb252X2ZpZWxkLCAgICAgQVJHMigyLFVJTlQsU1RSKSwgc2FtcGxlX2NvbnZfZmllbGRfY2hlY2ssIFNNUF9UX1NUUiwgIFNNUF9UX1NUUiB9LAoJeyAid29yZCIsICAgc2FtcGxlX2NvbnZfd29yZCwgICAgICBBUkcyKDIsVUlOVCxTVFIpLCBzYW1wbGVfY29udl9maWVsZF9jaGVjaywgU01QX1RfU1RSLCAgU01QX1RfU1RSIH0sCgl7ICJyZWdzdWIiLCBzYW1wbGVfY29udl9yZWdzdWIsICAgIEFSRzMoMixSRUcsU1RSLFNUUiksIHNhbXBsZV9jb252X3JlZ3N1Yl9jaGVjaywgU01QX1RfU1RSLCBTTVBfVF9TVFIgfSwKCgl7ICJhbmQiLCAgICBzYW1wbGVfY29udl9iaW5hcnlfYW5kLCBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgIm9yIiwgICAgIHNhbXBsZV9jb252X2JpbmFyeV9vciwgIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAieG9yIiwgICAgc2FtcGxlX2NvbnZfYmluYXJ5X3hvciwgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJjcGwiLCAgICBzYW1wbGVfY29udl9iaW5hcnlfY3BsLCAgICAgICAgICAgIDAsIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgImJvb2wiLCAgIHNhbXBsZV9jb252X2FyaXRoX2Jvb2wsICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfQk9PTCB9LAoJeyAibm90IiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfbm90LCAgICAgICAgICAgICAwLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9CT09MIH0sCgl7ICJvZGQiLCAgICBzYW1wbGVfY29udl9hcml0aF9vZGQsICAgICAgICAgICAgIDAsIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX0JPT0wgfSwKCXsgImV2ZW4iLCAgIHNhbXBsZV9jb252X2FyaXRoX2V2ZW4sICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfQk9PTCB9LAoJeyAiYWRkIiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfYWRkLCAgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJzdWIiLCAgICBzYW1wbGVfY29udl9hcml0aF9zdWIsICBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgIm11bCIsICAgIHNhbXBsZV9jb252X2FyaXRoX211bCwgIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAiZGl2IiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfZGl2LCAgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJtb2QiLCAgICBzYW1wbGVfY29udl9hcml0aF9tb2QsICBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgIm5lZyIsICAgIHNhbXBsZV9jb252X2FyaXRoX25lZywgICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoKCXsgTlVMTCwgTlVMTCwgMCwgMCwgMCB9LAp9fTsKCl9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkKc3RhdGljIHZvaWQgX19zYW1wbGVfaW5pdCh2b2lkKQp7CgkvKiByZWdpc3RlciBzYW1wbGUgZmV0Y2ggYW5kIGZvcm1hdCBjb252ZXJzaW9uIGtleXdvcmRzICovCglzYW1wbGVfcmVnaXN0ZXJfZmV0Y2hlcygmc21wX2t3cyk7CglzYW1wbGVfcmVnaXN0ZXJfY29udnMoJnNhbXBsZV9jb252X2t3cyk7Cn0K