LyoKICogU2FtcGxlIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgogKgogKiBDb3B5cmlnaHQgMjAwOS0yMDEwIEVYQ0VMSUFOQ0UsIEVtZXJpYyBCcnVuIDxlYnJ1bkBleGNlbGlhbmNlLmZyPgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlIDx0eXBlcy9nbG9iYWwuaD4KCiNpbmNsdWRlIDxjb21tb24vY2h1bmsuaD4KI2luY2x1ZGUgPGNvbW1vbi9oYXNoLmg+CiNpbmNsdWRlIDxjb21tb24vc3RhbmRhcmQuaD4KI2luY2x1ZGUgPGNvbW1vbi91cmlfYXV0aC5oPgojaW5jbHVkZSA8Y29tbW9uL2Jhc2U2NC5oPgoKI2luY2x1ZGUgPHByb3RvL2FyZy5oPgojaW5jbHVkZSA8cHJvdG8vYXV0aC5oPgojaW5jbHVkZSA8cHJvdG8vbG9nLmg+CiNpbmNsdWRlIDxwcm90by9wcm90b19odHRwLmg+CiNpbmNsdWRlIDxwcm90by9wcm94eS5oPgojaW5jbHVkZSA8cHJvdG8vc2FtcGxlLmg+CiNpbmNsdWRlIDxwcm90by9zdGlja190YWJsZS5oPgoKLyogc2FtcGxlIHR5cGUgbmFtZXMgKi8KY29uc3QgY2hhciAqc21wX3RvX3R5cGVbU01QX1RZUEVTXSA9IHsKCVtTTVBfVF9BTlldICA9ICJhbnkiLAoJW1NNUF9UX0JPT0xdID0gImJvb2wiLAoJW1NNUF9UX1VJTlRdID0gInVpbnQiLAoJW1NNUF9UX1NJTlRdID0gInNpbnQiLAoJW1NNUF9UX0FERFJdID0gImFkZHIiLAoJW1NNUF9UX0lQVjRdID0gImlwdjQiLAoJW1NNUF9UX0lQVjZdID0gImlwdjYiLAoJW1NNUF9UX1NUUl0gID0gInN0ciIsCglbU01QX1RfQklOXSAgPSAiYmluIiwKCVtTTVBfVF9NRVRIXSA9ICJtZXRoIiwKfTsKCi8qIHN0YXRpYyBzYW1wbGUgdXNlZCBpbiBzYW1wbGVfcHJvY2VzcygpIHdoZW4gPHA+IGlzIE5VTEwgKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGUgdGVtcF9zbXA7CgovKiBsaXN0IGhlYWQgb2YgYWxsIGtub3duIHNhbXBsZSBmZXRjaCBrZXl3b3JkcyAqLwpzdGF0aWMgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0IHNhbXBsZV9mZXRjaGVzID0gewoJLmxpc3QgPSBMSVNUX0hFQURfSU5JVChzYW1wbGVfZmV0Y2hlcy5saXN0KQp9OwoKLyogbGlzdCBoZWFkIG9mIGFsbCBrbm93biBzYW1wbGUgZm9ybWF0IGNvbnZlcnNpb24ga2V5d29yZHMgKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0IHNhbXBsZV9jb252cyA9IHsKCS5saXN0ID0gTElTVF9IRUFEX0lOSVQoc2FtcGxlX2NvbnZzLmxpc3QpCn07Cgpjb25zdCB1bnNpZ25lZCBpbnQgZmV0Y2hfY2FwW1NNUF9TUkNfRU5UUklFU10gPSB7CglbU01QX1NSQ19JTlRSTl0gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MSVNUTl0gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19GVEVORF0gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNENMSV0gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNUNMSV0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19UUkFDS10gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNlJFUV0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19IUlFIVl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19IUlFIUF0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19IUlFCT10gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19CS0VORF0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19TRVJWUl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNFNSVl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNVNSVl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNlJFU10gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19IUlNIVl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19IUlNIUF0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19IUlNCT10gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19SUUZJTl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19SU0ZJTl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19UWEZJTl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19TU0ZJTl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKfTsKCnN0YXRpYyBjb25zdCBjaGFyICpmZXRjaF9zcmNfbmFtZXNbU01QX1NSQ19FTlRSSUVTXSA9IHsKCVtTTVBfU1JDX0lOVFJOXSA9ICJpbnRlcm5hbCBzdGF0ZSIsCglbU01QX1NSQ19MSVNUTl0gPSAibGlzdGVuZXIiLAoJW1NNUF9TUkNfRlRFTkRdID0gImZyb250ZW5kIiwKCVtTTVBfU1JDX0w0Q0xJXSA9ICJjbGllbnQgYWRkcmVzcyIsCglbU01QX1NSQ19MNUNMSV0gPSAiY2xpZW50LXNpZGUgY29ubmVjdGlvbiIsCglbU01QX1NSQ19UUkFDS10gPSAidHJhY2sgY291bnRlcnMiLAoJW1NNUF9TUkNfTDZSRVFdID0gInJlcXVlc3QgYnVmZmVyIiwKCVtTTVBfU1JDX0hSUUhWXSA9ICJIVFRQIHJlcXVlc3QgaGVhZGVycyIsCglbU01QX1NSQ19IUlFIUF0gPSAiSFRUUCByZXF1ZXN0IiwKCVtTTVBfU1JDX0hSUUJPXSA9ICJIVFRQIHJlcXVlc3QgYm9keSIsCglbU01QX1NSQ19CS0VORF0gPSAiYmFja2VuZCIsCglbU01QX1NSQ19TRVJWUl0gPSAic2VydmVyIiwKCVtTTVBfU1JDX0w0U1JWXSA9ICJzZXJ2ZXIgYWRkcmVzcyIsCglbU01QX1NSQ19MNVNSVl0gPSAic2VydmVyLXNpZGUgY29ubmVjdGlvbiIsCglbU01QX1NSQ19MNlJFU10gPSAicmVzcG9uc2UgYnVmZmVyIiwKCVtTTVBfU1JDX0hSU0hWXSA9ICJIVFRQIHJlc3BvbnNlIGhlYWRlcnMiLAoJW1NNUF9TUkNfSFJTSFBdID0gIkhUVFAgcmVzcG9uc2UiLAoJW1NNUF9TUkNfSFJTQk9dID0gIkhUVFAgcmVzcG9uc2UgYm9keSIsCglbU01QX1NSQ19SUUZJTl0gPSAicmVxdWVzdCBidWZmZXIgc3RhdGlzdGljcyIsCglbU01QX1NSQ19SU0ZJTl0gPSAicmVzcG9uc2UgYnVmZmVyIHN0YXRpc3RpY3MiLAoJW1NNUF9TUkNfVFhGSU5dID0gInRyYW5zYWN0aW9uIHN0YXRpc3RpY3MiLAoJW1NNUF9TUkNfU1NGSU5dID0gInNlc3Npb24gc3RhdGlzdGljcyIsCn07CgpzdGF0aWMgY29uc3QgY2hhciAqZmV0Y2hfY2twX25hbWVzW1NNUF9DS1BfRU5UUklFU10gPSB7CglbU01QX0NLUF9GRV9DT05fQUNDXSA9ICJmcm9udGVuZCB0Y3AtcmVxdWVzdCBjb25uZWN0aW9uIHJ1bGUiLAoJW1NNUF9DS1BfRkVfU0VTX0FDQ10gPSAiZnJvbnRlbmQgdGNwLXJlcXVlc3Qgc2Vzc2lvbiBydWxlIiwKCVtTTVBfQ0tQX0ZFX1JFUV9DTlRdID0gImZyb250ZW5kIHRjcC1yZXF1ZXN0IGNvbnRlbnQgcnVsZSIsCglbU01QX0NLUF9GRV9IUlFfSERSXSA9ICJmcm9udGVuZCBodHRwLXJlcXVlc3QgaGVhZGVyIHJ1bGUiLAoJW1NNUF9DS1BfRkVfSFJRX0JEWV0gPSAiZnJvbnRlbmQgaHR0cC1yZXF1ZXN0IGJvZHkgcnVsZSIsCglbU01QX0NLUF9GRV9TRVRfQkNLXSA9ICJmcm9udGVuZCB1c2UtYmFja2VuZCBydWxlIiwKCVtTTVBfQ0tQX0JFX1JFUV9DTlRdID0gImJhY2tlbmQgdGNwLXJlcXVlc3QgY29udGVudCBydWxlIiwKCVtTTVBfQ0tQX0JFX0hSUV9IRFJdID0gImJhY2tlbmQgaHR0cC1yZXF1ZXN0IGhlYWRlciBydWxlIiwKCVtTTVBfQ0tQX0JFX0hSUV9CRFldID0gImJhY2tlbmQgaHR0cC1yZXF1ZXN0IGJvZHkgcnVsZSIsCglbU01QX0NLUF9CRV9TRVRfU1JWXSA9ICJiYWNrZW5kIHVzZS1zZXJ2ZXIsIGJhbGFuY2Ugb3Igc3RpY2stbWF0Y2ggcnVsZSIsCglbU01QX0NLUF9CRV9TUlZfQ09OXSA9ICJzZXJ2ZXIgc291cmNlIHNlbGVjdGlvbiIsCglbU01QX0NLUF9CRV9SRVNfQ05UXSA9ICJiYWNrZW5kIHRjcC1yZXNwb25zZSBjb250ZW50IHJ1bGUiLAoJW1NNUF9DS1BfQkVfSFJTX0hEUl0gPSAiYmFja2VuZCBodHRwLXJlc3BvbnNlIGhlYWRlciBydWxlIiwKCVtTTVBfQ0tQX0JFX0hSU19CRFldID0gImJhY2tlbmQgaHR0cC1yZXNwb25zZSBib2R5IHJ1bGUiLAoJW1NNUF9DS1BfQkVfU1RPX1JVTF0gPSAiYmFja2VuZCBzdGljay1zdG9yZSBydWxlIiwKCVtTTVBfQ0tQX0ZFX1JFU19DTlRdID0gImZyb250ZW5kIHRjcC1yZXNwb25zZSBjb250ZW50IHJ1bGUiLAoJW1NNUF9DS1BfRkVfSFJTX0hEUl0gPSAiZnJvbnRlbmQgaHR0cC1yZXNwb25zZSBoZWFkZXIgcnVsZSIsCglbU01QX0NLUF9GRV9IUlNfQkRZXSA9ICJmcm9udGVuZCBodHRwLXJlc3BvbnNlIGJvZHkgcnVsZSIsCglbU01QX0NLUF9GRV9MT0dfRU5EXSA9ICJsb2dzIiwKfTsKCi8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2FtcGxlX2V4cHIuCiAqIEl0IGFzc3VtZXMgdGhhdCB0aGUgPGV4cHI+IGFuZCBhbGwgb2YgaXRzIGNvbnZlcnRlcnMgYXJlIHByb3Blcmx5CiAqIGluaXRpYWxpemVkLgogKi8KaW5saW5lCmludCBzbXBfZXhwcl9vdXRwdXRfdHlwZShzdHJ1Y3Qgc2FtcGxlX2V4cHIgKmV4cHIpCnsKCXN0cnVjdCBzYW1wbGVfY29udl9leHByICpzbXBfZXhwcjsKCglpZiAoIUxJU1RfSVNFTVBUWSgmZXhwci0+Y29udl9leHBycykpIHsKCQlzbXBfZXhwciA9IExJU1RfUFJFVigmZXhwci0+Y29udl9leHBycywgc3RydWN0IHNhbXBsZV9jb252X2V4cHIgKiwgbGlzdCk7CgkJcmV0dXJuIHNtcF9leHByLT5jb252LT5vdXRfdHlwZTsKCX0KCXJldHVybiBleHByLT5mZXRjaC0+b3V0X3R5cGU7Cn0KCgovKiBmaWxsIHRoZSB0cmFzaCB3aXRoIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2Ygc291cmNlIG5hbWVzIGZvciB0aGUgPHVzZT4gYml0CiAqIGZpZWxkIHdoaWNoIG11c3QgYmUgY29tcG9zZWQgb2YgYSBub24tbnVsbCBzZXQgb2YgU01QX1VTRV8qIGZsYWdzLiBUaGUgcmV0dXJuCiAqIHZhbHVlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgaW4gdGhlIHRyYXNoIGJ1ZmZlci4KICovCmNvbnN0IGNoYXIgKnNhbXBsZV9zcmNfbmFtZXModW5zaWduZWQgaW50IHVzZSkKewoJaW50IGJpdDsKCgl0cmFzaC5sZW4gPSAwOwoJdHJhc2guc3RyWzBdID0gJ1wwJzsKCWZvciAoYml0ID0gMDsgYml0IDwgU01QX1NSQ19FTlRSSUVTOyBiaXQrKykgewoJCWlmICghKHVzZSAmIH4oKDEgPDwgYml0KSAtIDEpKSkKCQkJYnJlYWs7IC8qIG5vIG1vcmUgYml0cyAqLwoKCQlpZiAoISh1c2UgJiAoMSA8PCBiaXQpKSkKCQkJY29udGludWU7IC8qIGJpdCBub3Qgc2V0ICovCgoJCXRyYXNoLmxlbiArPSBzbnByaW50Zih0cmFzaC5zdHIgKyB0cmFzaC5sZW4sIHRyYXNoLnNpemUgLSB0cmFzaC5sZW4sICIlcyVzIiwKCQkJCSAgICAgICh1c2UgJiAoKDEgPDwgYml0KSAtIDEpKSA/ICIsIiA6ICIiLAoJCSAgICAgICAgICAgICAgICAgICAgICBmZXRjaF9zcmNfbmFtZXNbYml0XSk7Cgl9CglyZXR1cm4gdHJhc2guc3RyOwp9CgovKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb3JyZWN0IHNhbXBsZSBjaGVja3BvaW50IG5hbWUsIG9yICJ1bmtub3duIiB3aGVuCiAqIHRoZSBmbGFncyBhcmUgaW52YWxpZC4gT25seSB0aGUgbG93ZXN0IGJpdCBpcyB1c2VkLCBoaWdoZXIgYml0cyBhcmUgaWdub3JlZAogKiBpZiBzZXQuCiAqLwpjb25zdCBjaGFyICpzYW1wbGVfY2twX25hbWVzKHVuc2lnbmVkIGludCB1c2UpCnsKCWludCBiaXQ7CgoJZm9yIChiaXQgPSAwOyBiaXQgPCBTTVBfQ0tQX0VOVFJJRVM7IGJpdCsrKQoJCWlmICh1c2UgJiAoMSA8PCBiaXQpKQoJCQlyZXR1cm4gZmV0Y2hfY2twX25hbWVzW2JpdF07CglyZXR1cm4gInVua25vd24gc2FtcGxlIGNoZWNrIHBsYWNlLCBwbGVhc2UgcmVwb3J0IHRoaXMgYnVnIjsKfQoKLyoKICogUmVnaXN0ZXJzIHRoZSBzYW1wbGUgZmV0Y2gga2V5d29yZCBsaXN0IDxrd2w+IGFzIGEgbGlzdCBvZiB2YWxpZCBrZXl3b3JkcwogKiBmb3IgbmV4dCBwYXJzaW5nIHNlc3Npb25zLiBUaGUgZmV0Y2gga2V5d29yZHMgY2FwYWJpbGl0aWVzIGFyZSBhbHNvIGNvbXB1dGVkCiAqIGZyb20gdGhlaXIgLT51c2UgZmllbGQuCiAqLwp2b2lkIHNhbXBsZV9yZWdpc3Rlcl9mZXRjaGVzKHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCAqa3dsKQp7CglzdHJ1Y3Qgc2FtcGxlX2ZldGNoICpzZjsKCWludCBiaXQ7CgoJZm9yIChzZiA9IGt3bC0+a3c7IHNmLT5rdyAhPSBOVUxMOyBzZisrKSB7CgkJZm9yIChiaXQgPSAwOyBiaXQgPCBTTVBfU1JDX0VOVFJJRVM7IGJpdCsrKQoJCQlpZiAoc2YtPnVzZSAmICgxIDw8IGJpdCkpCgkJCQlzZi0+dmFsIHw9IGZldGNoX2NhcFtiaXRdOwoJfQoJTElTVF9BRERRKCZzYW1wbGVfZmV0Y2hlcy5saXN0LCAma3dsLT5saXN0KTsKfQoKLyoKICogUmVnaXN0ZXJzIHRoZSBzYW1wbGUgZm9ybWF0IGNvdmVyc3Rpb24ga2V5d29yZCBsaXN0IDxwY2tsPiBhcyBhIGxpc3Qgb2YgdmFsaWQga2V5d29yZHMgZm9yIG5leHQKICogcGFyc2luZyBzZXNzaW9ucy4KICovCnZvaWQgc2FtcGxlX3JlZ2lzdGVyX2NvbnZzKHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0ICpwY2tsKQp7CglMSVNUX0FERFEoJnNhbXBsZV9jb252cy5saXN0LCAmcGNrbC0+bGlzdCk7Cn0KCi8qCiAqIFJldHVybnMgdGhlIHBvaW50ZXIgb24gc2FtcGxlIGZldGNoIGtleXdvcmQgc3RydWN0dXJlIGlkZW50aWZpZWQgYnkKICogc3RyaW5nIG9mIDxsZW4+IGluIGJ1ZmZlciA8a3c+LgogKgogKi8Kc3RydWN0IHNhbXBsZV9mZXRjaCAqZmluZF9zYW1wbGVfZmV0Y2goY29uc3QgY2hhciAqa3csIGludCBsZW4pCnsKCWludCBpbmRleDsKCXN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCAqa3dsOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoa3dsLCAmc2FtcGxlX2ZldGNoZXMubGlzdCwgbGlzdCkgewoJCWZvciAoaW5kZXggPSAwOyBrd2wtPmt3W2luZGV4XS5rdyAhPSBOVUxMOyBpbmRleCsrKSB7CgkJCWlmIChzdHJuY21wKGt3bC0+a3dbaW5kZXhdLmt3LCBrdywgbGVuKSA9PSAwICYmCgkJCSAgICBrd2wtPmt3W2luZGV4XS5rd1tsZW5dID09ICdcMCcpCgkJCQlyZXR1cm4gJmt3bC0+a3dbaW5kZXhdOwoJCX0KCX0KCXJldHVybiBOVUxMOwp9CgovKiBUaGlzIGZ1Y250aW9uIGJyb3dzZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgc2FwbGUgZmV0Y2guIDxjdXJyZW50PiBpcwogKiB0aGUgbGFzdCB1c2VkIHNhbXBsZSBmZXRjaC4gSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwsIGl0IG11c3Qgc2V0IHRvIE5VTEwuCiAqIDxpZHg+IGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzYW1wbGXoZmV0Y2ggZW50cnkuIEl0IGlzIHVzZWQgYXMgcHJpdmF0ZQogKiB2YWx1ZS4gSXQgaXMgdXNlbGVzIHRvIGluaXRpYXRlIGl0LgogKgogKiBJdCByZXR1cm5zIGFsd2F5cyB0aGUgbmV3dCBmZXRjaF9zYW1wbGUgZW50cnksIGFuZCBOVUxMIHdoZW4gdGhlIGVuZCBvZgogKiB0aGUgbGlzdCBpcyByZWFjaGVkLgogKi8Kc3RydWN0IHNhbXBsZV9mZXRjaCAqc2FtcGxlX2ZldGNoX2dldG5leHQoc3RydWN0IHNhbXBsZV9mZXRjaCAqY3VycmVudCwgaW50ICppZHgpCnsKCXN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCAqa3dsOwoJc3RydWN0IHNhbXBsZV9mZXRjaCAqYmFzZTsKCglpZiAoIWN1cnJlbnQpIHsKCQkvKiBHZXQgZmlyc3Qga3dsIGVudHJ5LiAqLwoJCWt3bCA9IExJU1RfTkVYVCgmc2FtcGxlX2ZldGNoZXMubGlzdCwgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0ICosIGxpc3QpOwoJCSgqaWR4KSA9IDA7Cgl9IGVsc2UgewoJCS8qIEdldCBrd2wgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmV0IGVudHJ5LiAqLwoJCWJhc2UgPSBjdXJyZW50ICsgMSAtICgqaWR4KTsKCQlrd2wgPSBjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0LCBrdyk7Cgl9CgoJd2hpbGUgKDEpIHsKCgkJLyogQ2hlY2sgaWYga3dsIGlzIHRoZSBsYXN0IGVudHJ5LiAqLwoJCWlmICgma3dsLT5saXN0ID09ICZzYW1wbGVfZmV0Y2hlcy5saXN0KQoJCQlyZXR1cm4gTlVMTDsKCgkJLyogaWR4IGNvbnRhaW4gdGhlIG5leHQga2V5d29yZC4gSWYgaXQgaXMgYXZhaWxhYmxlLCByZXR1cm4gaXQuICovCgkJaWYgKGt3bC0+a3dbKmlkeF0ua3cpIHsKCQkJKCppZHgpKys7CgkJCXJldHVybiAma3dsLT5rd1soKmlkeCktMV07CgkJfQoKCQkvKiBnZXQgbmV4dCBlbnRyeSBpbiB0aGUgbWFpbiBsaXN0LCBhbmQgcmV0dXJuIE5VTEwgaWYgdGhlIGVuZCBpcyByZWFjaGVkLiAqLwoJCWt3bCA9IExJU1RfTkVYVCgma3dsLT5saXN0LCBzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3QgKiwgbGlzdCk7CgoJCS8qIFNldCBpbmRleCB0byAwLCBhbnMgZG8gb25lIG90aGVyIGxvb3AuICovCgkJKCppZHgpID0gMDsKCX0KfQoKLyogVGhpcyBmdW5jdGlvbiBicm93c2VzIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb252ZXJ0ZXJzLiA8Y3VycmVudD4gaXMKICogdGhlIGxhc3QgdXNlZCBjb252ZXJ0ZXIuIElmIGl0IGlzIHRoZSBmaXJzdCBjYWxsLCBpdCBtdXN0IHNldCB0byBOVUxMLgogKiA8aWR4PiBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY29udmVydGVyIGVudHJ5LiBJdCBpcyB1c2VkIGFzIHByaXZhdGUKICogdmFsdWUuIEl0IGlzIHVzZWxlc3MgdG8gaW5pdGlhdGUgaXQuCiAqCiAqIEl0IHJldHVybnMgYWx3YXlzIHRoZSBuZXh0IHNhbXBsZV9jb252IGVudHJ5LCBhbmQgTlVMTCB3aGVuIHRoZSBlbmQgb2YKICogdGhlIGxpc3QgaXMgcmVhY2hlZC4KICovCnN0cnVjdCBzYW1wbGVfY29udiAqc2FtcGxlX2NvbnZfZ2V0bmV4dChzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmN1cnJlbnQsIGludCAqaWR4KQp7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCAqa3dsOwoJc3RydWN0IHNhbXBsZV9jb252ICpiYXNlOwoKCWlmICghY3VycmVudCkgewoJCS8qIEdldCBmaXJzdCBrd2wgZW50cnkuICovCgkJa3dsID0gTElTVF9ORVhUKCZzYW1wbGVfY29udnMubGlzdCwgc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3QgKiwgbGlzdCk7CgkJKCppZHgpID0gMDsKCX0gZWxzZSB7CgkJLyogR2V0IGt3bCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZXQgZW50cnkuICovCgkJYmFzZSA9IGN1cnJlbnQgKyAxIC0gKCppZHgpOwoJCWt3bCA9IGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCwga3cpOwoJfQoKCXdoaWxlICgxKSB7CgkJLyogQ2hlY2sgaWYga3dsIGlzIHRoZSBsYXN0IGVudHJ5LiAqLwoJCWlmICgma3dsLT5saXN0ID09ICZzYW1wbGVfY29udnMubGlzdCkKCQkJcmV0dXJuIE5VTEw7CgoJCS8qIGlkeCBjb250YWluIHRoZSBuZXh0IGtleXdvcmQuIElmIGl0IGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0LiAqLwoJCWlmIChrd2wtPmt3WyppZHhdLmt3KSB7CgkJCSgqaWR4KSsrOwoJCQlyZXR1cm4gJmt3bC0+a3dbKCppZHgpLTFdOwoJCX0KCgkJLyogZ2V0IG5leHQgZW50cnkgaW4gdGhlIG1haW4gbGlzdCwgYW5kIHJldHVybiBOVUxMIGlmIHRoZSBlbmQgaXMgcmVhY2hlZC4gKi8KCQlrd2wgPSBMSVNUX05FWFQoJmt3bC0+bGlzdCwgc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3QgKiwgbGlzdCk7CgoJCS8qIFNldCBpbmRleCB0byAwLCBhbnMgZG8gb25lIG90aGVyIGxvb3AuICovCgkJKCppZHgpID0gMDsKCX0KfQoKLyoKICogUmV0dXJucyB0aGUgcG9pbnRlciBvbiBzYW1wbGUgZm9ybWF0IGNvbnZlcnNpb24ga2V5d29yZCBzdHJ1Y3R1cmUgaWRlbnRpZmllZCBieQogKiBzdHJpbmcgb2YgPGxlbj4gaW4gYnVmZmVyIDxrdz4uCiAqCiAqLwpzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmZpbmRfc2FtcGxlX2NvbnYoY29uc3QgY2hhciAqa3csIGludCBsZW4pCnsKCWludCBpbmRleDsKCXN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0ICprd2w7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShrd2wsICZzYW1wbGVfY29udnMubGlzdCwgbGlzdCkgewoJCWZvciAoaW5kZXggPSAwOyBrd2wtPmt3W2luZGV4XS5rdyAhPSBOVUxMOyBpbmRleCsrKSB7CgkJCWlmIChzdHJuY21wKGt3bC0+a3dbaW5kZXhdLmt3LCBrdywgbGVuKSA9PSAwICYmCgkJCSAgICBrd2wtPmt3W2luZGV4XS5rd1tsZW5dID09ICdcMCcpCgkJCQlyZXR1cm4gJmt3bC0+a3dbaW5kZXhdOwoJCX0KCX0KCXJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICBTYW1wbGUgY2FzdHMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgIE5vdGU6IHRoZXNlIGZ1bmN0aW9ucyBkbyAqTk9UKiBzZXQgdGhlIG91dHB1dCB0eXBlIG9uIHRoZSAgICAqLwovKiAgIHNhbXBsZSwgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZG9pbmcgdGhpcyBvbiByZXR1cm4uICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludCBjX2lwMmludChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXNtcC0+ZGF0YS51aW50ID0gbnRvaGwoc21wLT5kYXRhLmlwdjQuc19hZGRyKTsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX2lwMnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCglpZiAoIWluZXRfbnRvcChBRl9JTkVULCAodm9pZCAqKSZzbXAtPmRhdGEuaXB2NCwgdHJhc2gtPnN0ciwgdHJhc2gtPnNpemUpKQoJCXJldHVybiAwOwoKCXRyYXNoLT5sZW4gPSBzdHJsZW4odHJhc2gtPnN0cik7CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pcDJpcHY2KHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJdjR0b3Y2KCZzbXAtPmRhdGEuaXB2NiwgJnNtcC0+ZGF0YS5pcHY0KTsKCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjY7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX2lwdjYyc3RyKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJc3RydWN0IGNodW5rICp0cmFzaCA9IGdldF90cmFzaF9jaHVuaygpOwoKCWlmICghaW5ldF9udG9wKEFGX0lORVQ2LCAodm9pZCAqKSZzbXAtPmRhdGEuaXB2NiwgdHJhc2gtPnN0ciwgdHJhc2gtPnNpemUpKQoJCXJldHVybiAwOwoKCXRyYXNoLT5sZW4gPSBzdHJsZW4odHJhc2gtPnN0cik7CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKLyoKc3RhdGljIGludCBjX2lwdjYyaXAoc3RydWN0IHNhbXBsZSAqc21wKQp7CglyZXR1cm4gdjZ0b3Y0KCZzbXAtPmRhdGEuaXB2NCwgJnNtcC0+ZGF0YS5pcHY2KTsKfQoqLwoKc3RhdGljIGludCBjX2ludDJpcChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXNtcC0+ZGF0YS5pcHY0LnNfYWRkciA9IGh0b25sKHNtcC0+ZGF0YS51aW50KTsKCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX3N0cjJhZGRyKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJaWYgKCFidWYyaXAoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuLCAmc21wLT5kYXRhLmlwdjQpKSB7CgkJaWYgKCFidWYyaXA2KHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbiwgJnNtcC0+ZGF0YS5pcHY2KSkKCQkJcmV0dXJuIDA7CgkJc21wLT50eXBlID0gU01QX1RfSVBWNjsKCQlzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCQlyZXR1cm4gMTsKCX0KCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjQ7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfc3RyMmlwKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJaWYgKCFidWYyaXAoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuLCAmc21wLT5kYXRhLmlwdjQpKQoJCXJldHVybiAwOwoJc21wLT50eXBlID0gU01QX1RfSVBWNDsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19zdHIyaXB2NihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWlmICghYnVmMmlwNihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4sICZzbXAtPmRhdGEuaXB2NikpCgkJcmV0dXJuIDA7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY2OwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKLyoKICogVGhlIE5VTEwgY2hhciBhbHdheXMgZW5mb3JjZXMgdGhlIGVuZCBvZiBzdHJpbmcgaWYgaXQgaXMgbWV0LgogKiBEYXRhIGlzIG5ldmVyIGNoYW5nZWQsIHNvIHdlIGNhbiBpZ25vcmUgdGhlIENPTlNUIGNhc2UKICovCnN0YXRpYyBpbnQgY19iaW4yc3RyKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IHNtcC0+ZGF0YS5zdHIubGVuOyBpKyspIHsKCQlpZiAoIXNtcC0+ZGF0YS5zdHIuc3RyW2ldKSB7CgkJCXNtcC0+ZGF0YS5zdHIubGVuID0gaTsKCQkJYnJlYWs7CgkJfQoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pbnQyc3RyKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJc3RydWN0IGNodW5rICp0cmFzaCA9IGdldF90cmFzaF9jaHVuaygpOwoJY2hhciAqcG9zOwoKCXBvcyA9IHVsdG9hX3Ioc21wLT5kYXRhLnVpbnQsIHRyYXNoLT5zdHIsIHRyYXNoLT5zaXplKTsKCWlmICghcG9zKQoJCXJldHVybiAwOwoKCXRyYXNoLT5zaXplID0gdHJhc2gtPnNpemUgLSAocG9zIC0gdHJhc2gtPnN0cik7Cgl0cmFzaC0+c3RyID0gcG9zOwoJdHJhc2gtPmxlbiA9IHN0cmxlbihwb3MpOwoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19zaW50MnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCWNoYXIgKnBvczsKCglwb3MgPSBzbHRvYV9yKHNtcC0+ZGF0YS5zaW50LCB0cmFzaC0+c3RyLCB0cmFzaC0+c2l6ZSk7CglpZiAoIXBvcykKCQlyZXR1cm4gMDsKCgl0cmFzaC0+c2l6ZSA9IHRyYXNoLT5zaXplIC0gKHBvcyAtIHRyYXNoLT5zdHIpOwoJdHJhc2gtPnN0ciA9IHBvczsKCXRyYXNoLT5sZW4gPSBzdHJsZW4ocG9zKTsKCXNtcC0+ZGF0YS5zdHIgPSAqdHJhc2g7CglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXJldHVybiAxOwp9CgovKiBUaGlzIGZ1bmN0aW9uIGR1cGxpY2F0ZXMgZGF0YSBhbmQgcmVtb3ZlcyB0aGUgZmxhZyAiY29uc3QiLiAqLwppbnQgc21wX2R1cChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2g7CgoJLyogSWYgdGhlIGNvbnN0IGZsYWcgaXMgbm90IHNldCwgd2UgZG9uJ3QgbmVlZCB0byBkdXBsaWNhdGUgdGhlCgkgKiBwYXR0ZXJuIGFzIGl0IGNhbiBiZSBtb2RpZmllZCBpbiBwbGFjZS4KCSAqLwoJaWYgKCEoc21wLT5mbGFncyAmIFNNUF9GX0NPTlNUKSkKCQlyZXR1cm4gMTsKCglzd2l0Y2ggKHNtcC0+dHlwZSkgewoJY2FzZSBTTVBfVF9CT09MOgoJY2FzZSBTTVBfVF9VSU5UOgoJY2FzZSBTTVBfVF9TSU5UOgoJY2FzZSBTTVBfVF9BRERSOgoJY2FzZSBTTVBfVF9JUFY0OgoJY2FzZSBTTVBfVF9JUFY2OgoJCS8qIFRoZXNlIHR5cGUgYXJlIG5vdCBjb25zdC4gKi8KCQlicmVhazsKCWNhc2UgU01QX1RfU1RSOgoJY2FzZSBTTVBfVF9CSU46CgkJLyogRHVwbGljYXRlIGRhdGEuICovCgkJdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCQl0cmFzaC0+bGVuID0gc21wLT5kYXRhLnN0ci5sZW4gPCB0cmFzaC0+c2l6ZSA/IHNtcC0+ZGF0YS5zdHIubGVuIDogdHJhc2gtPnNpemU7CgkJbWVtY3B5KHRyYXNoLT5zdHIsIHNtcC0+ZGF0YS5zdHIuc3RyLCB0cmFzaC0+bGVuKTsKCQlzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQkvKiBPdGhlciBjYXNlcyBhcmUgdW5leHBlY3RlZC4gKi8KCQlyZXR1cm4gMDsKCX0KCgkvKiByZW1vdmUgY29uc3QgZmxhZyAqLwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKaW50IGNfbm9uZShzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfc3RyMmludChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWludCBpOwoJdWludDMyX3QgcmV0ID0gMDsKCglpZiAoc21wLT5kYXRhLnN0ci5sZW4gPT0gMCkKCQlyZXR1cm4gMDsKCglmb3IgKGkgPSAwOyBpIDwgc21wLT5kYXRhLnN0ci5sZW47IGkrKykgewoJCXVpbnQzMl90IHZhbCA9IHNtcC0+ZGF0YS5zdHIuc3RyW2ldIC0gJzAnOwoKCQlpZiAodmFsID4gOSkgewoJCQlpZiAoaSA9PSAwKQoJCQkJcmV0dXJuIDA7CgkJCWJyZWFrOwoJCX0KCgkJcmV0ID0gcmV0ICogMTAgKyB2YWw7Cgl9CgoJc21wLT5kYXRhLnVpbnQgPSByZXQ7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX3N0cjJtZXRoKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJZW51bSBodHRwX21ldGhfdCBtZXRoOwoJaW50IGxlbjsKCgltZXRoID0gZmluZF9odHRwX21ldGgoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuKTsKCWlmIChtZXRoID09IEhUVFBfTUVUSF9PVEhFUikgewoJCWxlbiA9IHNtcC0+ZGF0YS5zdHIubGVuOwoJCXNtcC0+ZGF0YS5tZXRoLnN0ci5zdHIgPSBzbXAtPmRhdGEuc3RyLnN0cjsKCQlzbXAtPmRhdGEubWV0aC5zdHIubGVuID0gbGVuOwoJfQoJZWxzZQoJCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJc21wLT5kYXRhLm1ldGgubWV0aCA9IG1ldGg7CglzbXAtPnR5cGUgPSBTTVBfVF9NRVRIOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19tZXRoMnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWludCBsZW47CgllbnVtIGh0dHBfbWV0aF90IG1ldGg7CgoJaWYgKHNtcC0+ZGF0YS5tZXRoLm1ldGggPT0gSFRUUF9NRVRIX09USEVSKSB7CgkJLyogVGhlIG1ldGhvZCBpcyB1bmtub3duLiBDb3B5IHRoZSBvcmlnaW5hbCBwb2ludGVyLiAqLwoJCWxlbiA9IHNtcC0+ZGF0YS5tZXRoLnN0ci5sZW47CgkJc21wLT5kYXRhLnN0ci5zdHIgPSBzbXAtPmRhdGEubWV0aC5zdHIuc3RyOwoJCXNtcC0+ZGF0YS5zdHIubGVuID0gbGVuOwoJCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCX0KCWVsc2UgaWYgKHNtcC0+ZGF0YS5tZXRoLm1ldGggPCBIVFRQX01FVEhfT1RIRVIpIHsKCQkvKiBUaGUgbWV0aG9kIGlzIGtub3duLCBjb3B5IHRoZSBwb2ludGVyIGNvbnRhaW5pbmcgdGhlIHN0cmluZy4gKi8KCQltZXRoID0gc21wLT5kYXRhLm1ldGgubWV0aDsKCQlzbXAtPmRhdGEuc3RyLnN0ciA9IGh0dHBfa25vd25fbWV0aG9kc1ttZXRoXS5uYW1lOwoJCXNtcC0+ZGF0YS5zdHIubGVuID0gaHR0cF9rbm93bl9tZXRob2RzW21ldGhdLmxlbjsKCQlzbXAtPmZsYWdzIHw9IFNNUF9GX0NPTlNUOwoJCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCX0KCWVsc2UgewoJCS8qIFVua25vd24gbWV0aG9kICovCgkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX2FkZHIyYmluKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJc3RydWN0IGNodW5rICpjaGsgPSBnZXRfdHJhc2hfY2h1bmsoKTsKCglpZiAoc21wLT50eXBlID09IFNNUF9UX0lQVjQpIHsKCQljaGstPmxlbiA9IDQ7CgkJbWVtY3B5KGNoay0+c3RyLCAmc21wLT5kYXRhLmlwdjQsIGNoay0+bGVuKTsKCX0KCWVsc2UgaWYgKHNtcC0+dHlwZSA9PSBTTVBfVF9JUFY2KSB7CgkJY2hrLT5sZW4gPSAxNjsKCQltZW1jcHkoY2hrLT5zdHIsICZzbXAtPmRhdGEuaXB2NiwgY2hrLT5sZW4pOwoJfQoJZWxzZQoJCXJldHVybiAwOwoKCXNtcC0+ZGF0YS5zdHIgPSAqY2hrOwoJc21wLT50eXBlID0gU01QX1RfQklOOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pbnQyYmluKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJc3RydWN0IGNodW5rICpjaGsgPSBnZXRfdHJhc2hfY2h1bmsoKTsKCgkqKHVuc2lnbmVkIGludCAqKWNoay0+c3RyID0gaHRvbmwoc21wLT5kYXRhLnVpbnQpOwoJY2hrLT5sZW4gPSA0OwoKCXNtcC0+ZGF0YS5zdHIgPSAqY2hrOwoJc21wLT50eXBlID0gU01QX1RfQklOOwoJcmV0dXJuIDE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgU2FtcGxlIGNhc3RzIG1hdHJpeDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgIHNhbXBsZV9jYXN0c1tmcm9tIHR5cGVdW3RvIHR5cGVdICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgTlVMTCBwb2ludGVyIHVzZWQgZm9yIGltcG9zc2libGUgc2FtcGxlIGNhc3RzICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnNhbXBsZV9jYXN0X2ZjdCBzYW1wbGVfY2FzdHNbU01QX1RZUEVTXVtTTVBfVFlQRVNdID0gewovKiAgICAgICAgICAgIHRvOiAgQU5ZICAgICBCT09MICAgICAgIFVJTlQgICAgICAgU0lOVCAgICAgICBBRERSICAgICAgICBJUFY0ICAgICAgSVBWNiAgICAgICAgU1RSICAgICAgICAgQklOICAgICAgICAgTUVUSCAqLwovKiBmcm9tOiAgQU5ZICovIHsgY19ub25lLCBjX25vbmUsICAgIGNfbm9uZSwgICAgY19ub25lLCAgICBjX25vbmUsICAgICBjX25vbmUsICAgY19ub25lLCAgICAgY19ub25lLCAgICAgY19ub25lLCAgICAgY19ub25lLCAgICAgfSwKLyogICAgICAgQk9PTCAqLyB7IGNfbm9uZSwgY19ub25lLCAgICBjX25vbmUsICAgIGNfbm9uZSwgICAgTlVMTCwgICAgICAgTlVMTCwgICAgIE5VTEwsICAgICAgIGNfaW50MnN0ciwgIE5VTEwsICAgICAgIE5VTEwsICAgICAgIH0sCi8qICAgICAgIFVJTlQgKi8geyBjX25vbmUsIGNfbm9uZSwgICAgY19ub25lLCAgICBjX25vbmUsICAgIGNfaW50MmlwLCAgIGNfaW50MmlwLCBOVUxMLCAgICAgICBjX2ludDJzdHIsICBjX2ludDJiaW4sICBOVUxMLCAgICAgICB9LAovKiAgICAgICBTSU5UICovIHsgY19ub25lLCBjX25vbmUsICAgIGNfbm9uZSwgICAgY19ub25lLCAgICBjX2ludDJpcCwgICBjX2ludDJpcCwgTlVMTCwgICAgICAgY19zaW50MnN0ciwgY19pbnQyYmluLCAgTlVMTCwgICAgICAgfSwKLyogICAgICAgQUREUiAqLyB7IGNfbm9uZSwgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICAgIH0sCi8qICAgICAgIElQVjQgKi8geyBjX25vbmUsIE5VTEwsICAgICAgY19pcDJpbnQsICBjX2lwMmludCwgIGNfbm9uZSwgICAgIGNfbm9uZSwgICBjX2lwMmlwdjYsICBjX2lwMnN0ciwgICBjX2FkZHIyYmluLCBOVUxMLCAgICAgICB9LAovKiAgICAgICBJUFY2ICovIHsgY19ub25lLCBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBjX25vbmUsICAgICBOVUxMLCAgICAgY19ub25lLCAgICAgY19pcHY2MnN0ciwgY19hZGRyMmJpbiwgTlVMTCwgICAgICAgfSwKLyogICAgICAgIFNUUiAqLyB7IGNfbm9uZSwgY19zdHIyaW50LCBjX3N0cjJpbnQsIGNfc3RyMmludCwgY19zdHIyYWRkciwgY19zdHIyaXAsIGNfc3RyMmlwdjYsIGNfbm9uZSwgICAgIGNfbm9uZSwgICAgIGNfc3RyMm1ldGgsIH0sCi8qICAgICAgICBCSU4gKi8geyBjX25vbmUsIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICBOVUxMLCAgICAgICBjX2JpbjJzdHIsICBjX25vbmUsICAgICBjX3N0cjJtZXRoLCB9LAovKiAgICAgICBNRVRIICovIHsgY19ub25lLCBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgICBOVUxMLCAgICAgTlVMTCwgICAgICAgY19tZXRoMnN0ciwgY19tZXRoMnN0ciwgY19ub25lLCAgICAgfQp9OwoKLyoKICogUGFyc2UgYSBzYW1wbGUgZXhwcmVzc2lvbiBjb25maWd1cmF0aW9uOgogKiAgICAgICAgZmV0Y2gga2V5d29yZCBmb2xsb3dlZCBieSBmb3JtYXQgY29udmVyc2lvbiBrZXl3b3Jkcy4KICogUmV0dXJucyBhIHBvaW50ZXIgb24gYWxsb2NhdGVkIHNhbXBsZSBleHByZXNzaW9uIHN0cnVjdHVyZS4KICogVGhlIGNhbGxlciBtdXN0IGhhdmUgc2V0IGFsLT5jdHguCiAqLwpzdHJ1Y3Qgc2FtcGxlX2V4cHIgKnNhbXBsZV9wYXJzZV9leHByKGNoYXIgKipzdHIsIGludCAqaWR4LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqKmVycl9tc2csIHN0cnVjdCBhcmdfbGlzdCAqYWwpCnsKCWNvbnN0IGNoYXIgKmJlZ3c7IC8qIGJlZ2lubmluZyBvZiB3b3JkICovCgljb25zdCBjaGFyICplbmR3OyAvKiBlbmQgb2Ygd29yZCAqLwoJY29uc3QgY2hhciAqZW5kdDsgLyogZW5kIG9mIHRlcm0gKi8KCXN0cnVjdCBzYW1wbGVfZXhwciAqZXhwcjsKCXN0cnVjdCBzYW1wbGVfZmV0Y2ggKmZldGNoOwoJc3RydWN0IHNhbXBsZV9jb252ICpjb252OwoJdW5zaWduZWQgbG9uZyBwcmV2X3R5cGU7CgljaGFyICpma3cgPSBOVUxMOwoJY2hhciAqY2t3ID0gTlVMTDsKCWludCBlcnJfYXJnOwoKCWJlZ3cgPSBzdHJbKmlkeF07Cglmb3IgKGVuZHcgPSBiZWd3OyAqZW5kdyAmJiAqZW5kdyAhPSAnKCcgJiYgKmVuZHcgIT0gJywnOyBlbmR3KyspOwoKCWlmIChlbmR3ID09IGJlZ3cpIHsKCQltZW1wcmludGYoZXJyX21zZywgIm1pc3NpbmcgZmV0Y2ggbWV0aG9kIik7CgkJZ290byBvdXRfZXJyb3I7Cgl9CgoJLyoga2VlcCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZmV0Y2gga2V5d29yZCBmb3IgZXJyb3IgcmVwb3J0aW5nICovCglma3cgPSBteV9zdHJuZHVwKGJlZ3csIGVuZHcgLSBiZWd3KTsKCglmZXRjaCA9IGZpbmRfc2FtcGxlX2ZldGNoKGJlZ3csIGVuZHcgLSBiZWd3KTsKCWlmICghZmV0Y2gpIHsKCQltZW1wcmludGYoZXJyX21zZywgInVua25vd24gZmV0Y2ggbWV0aG9kICclcyciLCBma3cpOwoJCWdvdG8gb3V0X2Vycm9yOwoJfQoKCWVuZHQgPSBlbmR3OwoJaWYgKCplbmR0ID09ICcoJykgewoJCS8qIGxvb2sgZm9yIHRoZSBlbmQgb2YgdGhpcyB0ZXJtIGFuZCBza2lwIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzICovCgkJZW5kdCA9ICsrZW5kdzsKCQl3aGlsZSAoKmVuZHQgJiYgKmVuZHQgIT0gJyknKQoJCQllbmR0Kys7CgkJaWYgKCplbmR0ICE9ICcpJykgewoJCQltZW1wcmludGYoZXJyX21zZywgIm1pc3NpbmcgY2xvc2luZyAnKScgYWZ0ZXIgYXJndW1lbnRzIHRvIGZldGNoIGtleXdvcmQgJyVzJyIsIGZrdyk7CgkJCWdvdG8gb3V0X2Vycm9yOwoJCX0KCX0KCgkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIDoKCSAqICAgLSBiZWd3IDogYmVnaW5uaW5nIG9mIHRoZSBrZXl3b3JkCgkgKiAgIC0gZW5kdyA6IGVuZCBvZiB0aGUga2V5d29yZCwgZmlyc3QgY2hhcmFjdGVyIG5vdCBwYXJ0IG9mIGtleXdvcmQKCSAqICAgICAgICAgICAgbm9yIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzIChzbyBmaXJzdCBjaGFyYWN0ZXIgb2YgYXJncwoJICogICAgICAgICAgICBpZiBwcmVzZW50KS4KCSAqICAgLSBlbmR0IDogZW5kIG9mIHRoZSB0ZXJtICg9ZW5kdyBvciBsYXN0IHBhcmVudGhlc2lzIGlmIGFyZ3MgYXJlIHByZXNlbnQpCgkgKi8KCglpZiAoZmV0Y2gtPm91dF90eXBlID49IFNNUF9UWVBFUykgewoJCW1lbXByaW50ZihlcnJfbXNnLCAicmV0dXJucyB0eXBlIG9mIGZldGNoIG1ldGhvZCAnJXMnIGlzIHVua25vd24iLCBma3cpOwoJCWdvdG8gb3V0X2Vycm9yOwoJfQoJcHJldl90eXBlID0gZmV0Y2gtPm91dF90eXBlOwoKCWV4cHIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzYW1wbGVfZXhwcikpOwoJaWYgKCFleHByKQoJCWdvdG8gb3V0X2Vycm9yOwoKCUxJU1RfSU5JVCgmKGV4cHItPmNvbnZfZXhwcnMpKTsKCWV4cHItPmZldGNoID0gZmV0Y2g7CglleHByLT5hcmdfcCA9IGVtcHR5X2FyZ19saXN0OwoKCS8qIE5vdGUgdGhhdCB3ZSBjYWxsIHRoZSBhcmd1bWVudCBwYXJzZXIgZXZlbiB3aXRoIGFuIGVtcHR5IHN0cmluZywKCSAqIHRoaXMgYWxsb3dzIGl0IHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGVudHJpZXMgZm9yIG1hbmRhdG9yeQoJICogaW1wbGljaXQgYXJndW1lbnRzIChlZzogbG9jYWwgcHJveHkgbmFtZSkuCgkgKi8KCWFsLT5rdyA9IGV4cHItPmZldGNoLT5rdzsKCWFsLT5jb252ID0gTlVMTDsKCWlmIChtYWtlX2FyZ19saXN0KGVuZHcsIGVuZHQgLSBlbmR3LCBmZXRjaC0+YXJnX21hc2ssICZleHByLT5hcmdfcCwgZXJyX21zZywgTlVMTCwgJmVycl9hcmcsIGFsKSA8IDApIHsKCQltZW1wcmludGYoZXJyX21zZywgImZldGNoIG1ldGhvZCAnJXMnIDogJXMiLCBma3csICplcnJfbXNnKTsKCQlnb3RvIG91dF9lcnJvcjsKCX0KCglpZiAoIWV4cHItPmFyZ19wKSB7CgkJZXhwci0+YXJnX3AgPSBlbXB0eV9hcmdfbGlzdDsKCX0KCWVsc2UgaWYgKGZldGNoLT52YWxfYXJncyAmJiAhZmV0Y2gtPnZhbF9hcmdzKGV4cHItPmFyZ19wLCBlcnJfbXNnKSkgewoJCW1lbXByaW50ZihlcnJfbXNnLCAiaW52YWxpZCBhcmdzIGluIGZldGNoIG1ldGhvZCAnJXMnIDogJXMiLCBma3csICplcnJfbXNnKTsKCQlnb3RvIG91dF9lcnJvcjsKCX0KCgkvKiBOb3cgcHJvY2VzcyB0aGUgY29udmVydGVycyBpZiBhbnkuIFdlIGhhdmUgdHdvIHN1cHBvcnRlZCBzeW50YXhlcwoJICogZm9yIHRoZSBjb252ZXJ0ZXJzLCB3aGljaCBjYW4gYmUgY29tYmluZWQgOgoJICogIC0gY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgY29udmVydGVycyBqdXN0IGFmdGVyIHRoZSBrZXl3b3JkIGFuZCBhcmdzIDsKCSAqICAtIG9uZSBjb252ZXJ0ZXIgcGVyIGtleXdvcmQKCSAqIFRoZSBjb21iaW5hdGlvbiBhbGxvd3MgdG8gaGF2ZSBlYWNoIGtleXdvcmQgYmVpbmcgYSBjb21tYS1kZWxpbWl0ZWQKCSAqIHNlcmllcyBvZiBjb252ZXJ0ZXJzLgoJICoKCSAqIFdlIHdhbnQgdG8gcHJvY2VzcyB0aGUgZm9ybWVyIGZpcnN0LCB0aGVuIHRoZSBsYXR0ZXIuIEZvciB0aGlzIHdlIHN0YXJ0CgkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1cHBvc2VkIHBsYWNlIGluIHRoZSBleGl0aW5nIGNvbnYgY2hhaW4sIHdoaWNoCgkgKiBzdGFydHMgYXQgdGhlIGxhc3QgY29tbWEgKGVuZHQpLgoJICovCgoJd2hpbGUgKDEpIHsKCQlzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwciAqY29udl9leHByOwoKCQlpZiAoKmVuZHQgPT0gJyknKSAvKiBza2lwIGxhc3QgY2xvc2luZyBwYXJlbnRoZXNpcyAqLwoJCQllbmR0Kys7CgoJCWlmICgqZW5kdCAmJiAqZW5kdCAhPSAnLCcpIHsKCQkJaWYgKGNrdykKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBjb21tYSBhZnRlciBjb252IGtleXdvcmQgJyVzJyIsIGNrdyk7CgkJCWVsc2UKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBjb21tYSBhZnRlciBmZXRjaCBrZXl3b3JkICclcyciLCBma3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9CgoJCXdoaWxlICgqZW5kdCA9PSAnLCcpIC8qIHRoZW4gdHJhaWxpbmcgY29tbWFzICovCgkJCWVuZHQrKzsKCgkJYmVndyA9IGVuZHQ7IC8qIHN0YXJ0IG9mIGNvbnYga2V5d29yZCAqLwoKCQlpZiAoISpiZWd3KSB7CgkJCS8qIG5vbmUgPyBza2lwIHRvIG5leHQgc3RyaW5nICovCgkJCSgqaWR4KSsrOwoJCQliZWd3ID0gc3RyWyppZHhdOwoJCQlpZiAoIWJlZ3cgfHwgISpiZWd3KQoJCQkJYnJlYWs7CgkJfQoKCQlmb3IgKGVuZHcgPSBiZWd3OyAqZW5kdyAmJiAqZW5kdyAhPSAnKCcgJiYgKmVuZHcgIT0gJywnOyBlbmR3KyspOwoKCQlmcmVlKGNrdyk7CgkJY2t3ID0gbXlfc3RybmR1cChiZWd3LCBlbmR3IC0gYmVndyk7CgoJCWNvbnYgPSBmaW5kX3NhbXBsZV9jb252KGJlZ3csIGVuZHcgLSBiZWd3KTsKCQlpZiAoIWNvbnYpIHsKCQkJLyogd2UgZm91bmQgYW4gaXNvbGF0ZWQga2V5d29yZCB0aGF0IHdlIGRvbid0IGtub3csIGl0J3Mgbm90IG91cnMgKi8KCQkJaWYgKGJlZ3cgPT0gc3RyWyppZHhdKQoJCQkJYnJlYWs7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAidW5rbm93biBjb252IG1ldGhvZCAnJXMnIiwgY2t3KTsKCQkJZ290byBvdXRfZXJyb3I7CgkJfQoKCQllbmR0ID0gZW5kdzsKCQlpZiAoKmVuZHQgPT0gJygnKSB7CgkJCS8qIGxvb2sgZm9yIHRoZSBlbmQgb2YgdGhpcyB0ZXJtICovCgkJCXdoaWxlICgqZW5kdCAmJiAqZW5kdCAhPSAnKScpCgkJCQllbmR0Kys7CgkJCWlmICgqZW5kdCAhPSAnKScpIHsKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAic3ludGF4IGVycm9yOiBtaXNzaW5nICcpJyBhZnRlciBjb252IGtleXdvcmQgJyVzJyIsIGNrdyk7CgkJCQlnb3RvIG91dF9lcnJvcjsKCQkJfQoJCX0KCgkJaWYgKGNvbnYtPmluX3R5cGUgPj0gU01QX1RZUEVTIHx8IGNvbnYtPm91dF90eXBlID49IFNNUF9UWVBFUykgewoJCQltZW1wcmludGYoZXJyX21zZywgInJldHVybnMgdHlwZSBvZiBjb252IG1ldGhvZCAnJXMnIGlzIHVua25vd24iLCBja3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9CgoJCS8qIElmIGltcG9zc2libGUgdHlwZSBjb252ZXJzaW9uICovCgkJaWYgKCFzYW1wbGVfY2FzdHNbcHJldl90eXBlXVtjb252LT5pbl90eXBlXSkgewoJCQltZW1wcmludGYoZXJyX21zZywgImNvbnYgbWV0aG9kICclcycgY2Fubm90IGJlIGFwcGxpZWQiLCBja3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9CgoJCXByZXZfdHlwZSA9IGNvbnYtPm91dF90eXBlOwoJCWNvbnZfZXhwciA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHNhbXBsZV9jb252X2V4cHIpKTsKCQlpZiAoIWNvbnZfZXhwcikKCQkJZ290byBvdXRfZXJyb3I7CgoJCUxJU1RfQUREUSgmKGV4cHItPmNvbnZfZXhwcnMpLCAmKGNvbnZfZXhwci0+bGlzdCkpOwoJCWNvbnZfZXhwci0+Y29udiA9IGNvbnY7CgoJCWlmIChlbmR0ICE9IGVuZHcpIHsKCQkJaW50IGVycl9hcmc7CgoJCQlpZiAoIWNvbnYtPmFyZ19tYXNrKSB7CgkJCQltZW1wcmludGYoZXJyX21zZywgImNvbnYgbWV0aG9kICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkgYXJncyIsIGNrdyk7CgkJCQlnb3RvIG91dF9lcnJvcjsKCQkJfQoKCQkJYWwtPmt3ID0gZXhwci0+ZmV0Y2gtPmt3OwoJCQlhbC0+Y29udiA9IGNvbnZfZXhwci0+Y29udi0+a3c7CgkJCWlmIChtYWtlX2FyZ19saXN0KGVuZHcgKyAxLCBlbmR0IC0gZW5kdyAtIDEsIGNvbnYtPmFyZ19tYXNrLCAmY29udl9leHByLT5hcmdfcCwgZXJyX21zZywgTlVMTCwgJmVycl9hcmcsIGFsKSA8IDApIHsKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAiaW52YWxpZCBhcmcgJWQgaW4gY29udiBtZXRob2QgJyVzJyA6ICVzIiwgZXJyX2FyZysxLCBja3csICplcnJfbXNnKTsKCQkJCWdvdG8gb3V0X2Vycm9yOwoJCQl9CgoJCQlpZiAoIWNvbnZfZXhwci0+YXJnX3ApCgkJCQljb252X2V4cHItPmFyZ19wID0gZW1wdHlfYXJnX2xpc3Q7CgoJCQlpZiAoY29udi0+dmFsX2FyZ3MgJiYgIWNvbnYtPnZhbF9hcmdzKGNvbnZfZXhwci0+YXJnX3AsIGNvbnYsIGZpbGUsIGxpbmUsIGVycl9tc2cpKSB7CgkJCQltZW1wcmludGYoZXJyX21zZywgImludmFsaWQgYXJncyBpbiBjb252IG1ldGhvZCAnJXMnIDogJXMiLCBja3csICplcnJfbXNnKTsKCQkJCWdvdG8gb3V0X2Vycm9yOwoJCQl9CgkJfQoJCWVsc2UgaWYgKEFSR00oY29udi0+YXJnX21hc2spKSB7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBhcmdzIGZvciBjb252IG1ldGhvZCAnJXMnIiwgY2t3KTsKCQkJZ290byBvdXRfZXJyb3I7CgkJfQoJfQoKIG91dDoKCWZyZWUoZmt3KTsKCWZyZWUoY2t3KTsKCXJldHVybiBleHByOwoKb3V0X2Vycm9yOgoJLyogVE9ETzogcHJ1bmVfc2FtcGxlX2V4cHIoZXhwcik7ICovCglleHByID0gTlVMTDsKCWdvdG8gb3V0Owp9CgovKgogKiBQcm9jZXNzIGEgZmV0Y2ggKyBmb3JtYXQgY29udmVyc2lvbiBvZiBkZWZpbmVkIGJ5IHRoZSBzYW1wbGUgZXhwcmVzc2lvbiA8ZXhwcj4KICogb24gcmVxdWVzdCBvciByZXNwb25zZSBjb25zaWRlcmluZyB0aGUgPG9wdD4gcGFyYW1ldGVyLgogKiBSZXR1cm5zIGEgcG9pbnRlciBvbiBhIHR5cGVkIHNhbXBsZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9yIE5VTEwgaWYKICogc2FtcGxlIGlzIG5vdCBmb3VuZCBvciB3aGVuIGZvcm1hdCBjb252ZXJzaW9uIGZhaWxlZC4KICogIElmIDxwPiBpcyBub3QgbnVsbCwgZnVuY3Rpb24gcmV0dXJucyByZXN1bHRzIGluIHN0cnVjdHVyZSBwb2ludGVkIGJ5IDxwPi4KICogIElmIDxwPiBpcyBudWxsLCBmdW5jdGlvbnMgcmV0dXJucyBhIHBvaW50ZXIgb24gYSBzdGF0aWMgc2FtcGxlIHN0cnVjdHVyZS4KICoKICogTm90ZTogdGhlIGZldGNoIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gcHJvcGVybHkgc2V0IHRoZSByZXR1cm4gdHlwZS4gVGhlCiAqIGNvbnZlcnNpb24gZnVuY3Rpb25zIG11c3QgZG8gc28gdG9vLiBIb3dldmVyIHRoZSBjYXN0IGZ1bmN0aW9ucyBkbyBub3QgbmVlZAogKiB0byBzaW5jZSB0aGV5J3JlIG1hZGUgdG8gY2FzdCBtdXRpcGxlIHR5cGVzIGFjY29yZGluZyB0byB3aGF0IGlzIHJlcXVpcmVkLgogKgogKiBUaGUgY2FsbGVyIG1heSBpbmRpY2F0ZSBpbiA8b3B0PiBpZiBpdCBjb25zaWRlcnMgdGhlIHJlc3VsdCBmaW5hbCBvciBub3QuCiAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2sgdGhlIFNNUF9GX01BWV9DSEFOR0UgZmxhZyBpbiBwLT5mbGFncyB0byB2ZXJpZnkKICogaWYgdGhlIHJlc3VsdCBpcyBzdGFibGUgb3Igbm90LCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZSA6CiAqCiAqIHJldHVybiBNQVlfQ0hBTkdFIEZJTkFMICAgTWVhbmluZyBmb3IgdGhlIHNhbXBsZQogKiAgTlVMTCAgICAgIDAgICAgICAgICogICAgIE5vdCBwcmVzZW50IGFuZCB3aWxsIG5ldmVyIGJlIChlZzogaGVhZGVyKQogKiAgTlVMTCAgICAgIDEgICAgICAgIDAgICAgIE5vdCBwcmVzZW50IHlldCwgY291bGQgY2hhbmdlIChlZzogUE9TVCBwYXJhbSkKICogIE5VTEwgICAgICAxICAgICAgICAxICAgICBOb3QgcHJlc2VudCB5ZXQsIHdpbGwgbm90IGNoYW5nZSBhbnltb3JlCiAqICAgc21wICAgICAgMCAgICAgICAgKiAgICAgUHJlc2VudCBhbmQgd2lsbCBub3QgY2hhbmdlIChlZzogaGVhZGVyKQogKiAgIHNtcCAgICAgIDEgICAgICAgIDAgICAgIFByZXNlbnQsIG1heSBjaGFuZ2UgKGVnOiByZXF1ZXN0IGxlbmd0aCkKICogICBzbXAgICAgICAxICAgICAgICAxICAgICBQcmVzZW50LCBsYXN0IGtub3duIHZhbHVlIChlZzogcmVxdWVzdCBsZW5ndGgpCiAqLwpzdHJ1Y3Qgc2FtcGxlICpzYW1wbGVfcHJvY2VzcyhzdHJ1Y3QgcHJveHkgKnB4LCBzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmVhbSAqc3RybSwgdW5zaWduZWQgaW50IG9wdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZV9leHByICpleHByLCBzdHJ1Y3Qgc2FtcGxlICpwKQp7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwciAqY29udl9leHByOwoKCWlmIChwID09IE5VTEwpIHsKCQlwID0gJnRlbXBfc21wOwoJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKCX0KCglwLT5weCAgID0gcHg7CglwLT5zZXNzID0gc2VzczsKCXAtPnN0cm0gPSBzdHJtOwoJcC0+b3B0ICA9IG9wdDsKCWlmICghZXhwci0+ZmV0Y2gtPnByb2Nlc3MoZXhwci0+YXJnX3AsIHAsIGV4cHItPmZldGNoLT5rdywgZXhwci0+ZmV0Y2gtPnByaXZhdGUpKQoJCXJldHVybiBOVUxMOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udl9leHByLCAmZXhwci0+Y29udl9leHBycywgbGlzdCkgewoJCS8qIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgcC0+dHlwZSBjYW4gYmUgY2FzdGVkIGludG8KCQkgKiBjb252X2V4cHItPmNvbnYtPmluX3R5cGUuIFdlIGhhdmUgMyBwb3NzaWJpbGl0aWVzIDoKCQkgKiAgLSBOVUxMICAgPT4gbm90IGNhc3RhYmxlLgoJCSAqICAtIGNfbm9uZSA9PiBub3RoaW5nIHRvIGRvIChsZXQncyBvcHRpbWl6ZSBpdCkKCQkgKiAgLSBvdGhlciAgPT4gYXBwbHkgY2FzdCBhbmQgcHJlcGFyZSB0byBmYWlsCgkJICovCgkJaWYgKCFzYW1wbGVfY2FzdHNbcC0+dHlwZV1bY29udl9leHByLT5jb252LT5pbl90eXBlXSkKCQkJcmV0dXJuIE5VTEw7CgoJCWlmIChzYW1wbGVfY2FzdHNbcC0+dHlwZV1bY29udl9leHByLT5jb252LT5pbl90eXBlXSAhPSBjX25vbmUgJiYKCQkgICAgIXNhbXBsZV9jYXN0c1twLT50eXBlXVtjb252X2V4cHItPmNvbnYtPmluX3R5cGVdKHApKQoJCQlyZXR1cm4gTlVMTDsKCgkJLyogT0sgY2FzdCBzdWNjZWVkZWQgKi8KCgkJaWYgKCFjb252X2V4cHItPmNvbnYtPnByb2Nlc3MoY29udl9leHByLT5hcmdfcCwgcCwgY29udl9leHByLT5jb252LT5wcml2YXRlKSkKCQkJcmV0dXJuIE5VTEw7Cgl9CglyZXR1cm4gcDsKfQoKLyoKICogUmVzb2x2ZSBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBpbiBwcm94eSA8cD4uIFJldHVybnMgdGhlIG51bWJlciBvZgogKiBlcnJvcnMgb3IgMCBpZiBldmVyeXRoaW5nIGlzIGZpbmUuCiAqLwppbnQgc21wX3Jlc29sdmVfYXJncyhzdHJ1Y3QgcHJveHkgKnApCnsKCXN0cnVjdCBhcmdfbGlzdCAqY3VyLCAqYmFrOwoJY29uc3QgY2hhciAqY3R4LCAqd2hlcmU7Cgljb25zdCBjaGFyICpjb252X2N0eCwgKmNvbnZfcHJlLCAqY29udl9wb3M7CglzdHJ1Y3QgdXNlcmxpc3QgKnVsOwoJc3RydWN0IG15X3JlZ2V4ICpyZWc7CglzdHJ1Y3QgYXJnICphcmc7CglpbnQgY2ZnZXJyID0gMDsKCWludCByZmxhZ3M7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN1ciwgYmFrLCAmcC0+Y29uZi5hcmdzLmxpc3QsIGxpc3QpIHsKCQlzdHJ1Y3QgcHJveHkgKnB4OwoJCXN0cnVjdCBzZXJ2ZXIgKnNydjsKCQljaGFyICpwbmFtZSwgKnNuYW1lOwoJCWNoYXIgKmVycjsKCgkJYXJnID0gY3VyLT5hcmc7CgoJCS8qIHByZXBhcmUgb3V0cHV0IG1lc3NhZ2VzICovCgkJY29udl9wcmUgPSBjb252X3BvcyA9IGNvbnZfY3R4ID0gIiI7CgkJaWYgKGN1ci0+Y29udikgewoJCQljb252X2N0eCA9IGN1ci0+Y29udjsKCQkJY29udl9wcmUgPSAiY29udmVyc2lvbiBrZXl3b3JkICciOwoJCQljb252X3BvcyA9ICInIGZvciAiOwoJCX0KCgkJd2hlcmUgPSAiaW4iOwoJCWN0eCA9ICJzYW1wbGUgZmV0Y2gga2V5d29yZCI7CgkJc3dpdGNoIChjdXItPmN0eCkgewoJCWNhc2UgQVJHQ19TVEs6IHdoZXJlID0gImluIHN0aWNrIHJ1bGUgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfVFJLOiB3aGVyZSA9ICJpbiB0cmFja2luZyBydWxlIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX0xPRzogd2hlcmUgPSAiaW4gbG9nLWZvcm1hdCBzdHJpbmcgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfSFJROiB3aGVyZSA9ICJpbiBodHRwLXJlcXVlc3QgaGVhZGVyIGZvcm1hdCBzdHJpbmcgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfSFJTOiB3aGVyZSA9ICJpbiBodHRwLXJlc3BvbnNlIGhlYWRlciBmb3JtYXQgc3RyaW5nIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX1VJRjogd2hlcmUgPSAiaW4gdW5pcXVlLWlkLWZvcm1hdCBzdHJpbmcgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfUkRSOiB3aGVyZSA9ICJpbiByZWRpcmVjdCBmb3JtYXQgc3RyaW5nIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX0NBUDogd2hlcmUgPSAiaW4gY2FwdHVyZSBydWxlIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX0FDTDogY3R4ID0gIkFDTCBrZXl3b3JkIjsgYnJlYWs7CgkJfQoKCQkvKiBzZXQgYSBmZXcgZGVmYXVsdCBzZXR0aW5ncyAqLwoJCXB4ID0gcDsKCQlwbmFtZSA9IHAtPmlkOwoKCQlzd2l0Y2ggKGFyZy0+dHlwZSkgewoJCWNhc2UgQVJHVF9TUlY6CgkJCWlmICghYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBtaXNzaW5nIHNlcnZlciBuYW1lIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvKiB3ZSBzdXBwb3J0IHR3byBmb3JtYXRzIDogImJjay9zcnYiIGFuZCAic3J2IiAqLwoJCQlzbmFtZSA9IHN0cnJjaHIoYXJnLT5kYXRhLnN0ci5zdHIsICcvJyk7CgoJCQlpZiAoc25hbWUpIHsKCQkJCSpzbmFtZSsrID0gJ1wwJzsKCQkJCXBuYW1lID0gYXJnLT5kYXRhLnN0ci5zdHI7CgoJCQkJcHggPSBwcm94eV9iZV9ieV9uYW1lKHBuYW1lKTsKCQkJCWlmICghcHgpIHsKCQkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogdW5hYmxlIHRvIGZpbmQgcHJveHkgJyVzJyByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQkJY2ZnZXJyKys7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQkJc25hbWUgPSBhcmctPmRhdGEuc3RyLnN0cjsKCgkJCXNydiA9IGZpbmRzZXJ2ZXIocHgsIHNuYW1lKTsKCQkJaWYgKCFzcnYpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCBzZXJ2ZXIgJyVzJyBpbiBwcm94eSAnJXMnLCByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHNuYW1lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS5zcnYgPSBzcnY7CgkJCWJyZWFrOwoKCQljYXNlIEFSR1RfRkU6CgkJCWlmIChhcmctPmRhdGEuc3RyLmxlbikgewoJCQkJcG5hbWUgPSBhcmctPmRhdGEuc3RyLnN0cjsKCQkJCXB4ID0gcHJveHlfZmVfYnlfbmFtZShwbmFtZSk7CgkJCX0KCgkJCWlmICghcHgpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCBmcm9udGVuZCAnJXMnIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlpZiAoIShweC0+Y2FwICYgUFJfQ0FQX0ZFKSkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHByb3h5ICclcycsIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJywgaGFzIG5vdCBmcm9udGVuZCBjYXBhYmlsaXR5LlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS5wcnggPSBweDsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9CRToKCQkJaWYgKGFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlwbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoJCQkJcHggPSBwcm94eV9iZV9ieV9uYW1lKHBuYW1lKTsKCQkJfQoKCQkJaWYgKCFweCkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHVuYWJsZSB0byBmaW5kIGJhY2tlbmQgJyVzJyByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJaWYgKCEocHgtPmNhcCAmIFBSX0NBUF9CRSkpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBwcm94eSAnJXMnLCByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycsIGhhcyBub3QgYmFja2VuZCBjYXBhYmlsaXR5LlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS5wcnggPSBweDsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9UQUI6CgkJCWlmIChhcmctPmRhdGEuc3RyLmxlbikgewoJCQkJcG5hbWUgPSBhcmctPmRhdGEuc3RyLnN0cjsKCQkJCXB4ID0gcHJveHlfdGJsX2J5X25hbWUocG5hbWUpOwoJCQl9CgoJCQlpZiAoIXB4KSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogdW5hYmxlIHRvIGZpbmQgdGFibGUgJyVzJyByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJaWYgKCFweC0+dGFibGUuc2l6ZSkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IG5vIHRhYmxlIGluIHByb3h5ICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS5wcnggPSBweDsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9VU1I6CgkJCWlmICghYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBtaXNzaW5nIHVzZXJsaXN0IG5hbWUgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmIChwLT51cmlfYXV0aCAmJiBwLT51cmlfYXV0aC0+dXNlcmxpc3QgJiYKCQkJICAgICFzdHJjbXAocC0+dXJpX2F1dGgtPnVzZXJsaXN0LT5uYW1lLCBhcmctPmRhdGEuc3RyLnN0cikpCgkJCQl1bCA9IHAtPnVyaV9hdXRoLT51c2VybGlzdDsKCQkJZWxzZQoJCQkJdWwgPSBhdXRoX2ZpbmRfdXNlcmxpc3QoYXJnLT5kYXRhLnN0ci5zdHIpOwoKCQkJaWYgKCF1bCkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHVuYWJsZSB0byBmaW5kIHVzZXJsaXN0ICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBhcmctPmRhdGEuc3RyLnN0ciwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS51c3IgPSB1bDsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9SRUc6CgkJCWlmICghYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBtaXNzaW5nIHJlZ2V4IGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlyZWcgPSBjYWxsb2MoMSwgc2l6ZW9mKCpyZWcpKTsKCQkJaWYgKCFyZWcpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBub3QgZW5vdWdoIG1lbW9yeSB0byBidWlsZCByZWdleCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJcmZsYWdzID0gMDsKCQkJcmZsYWdzIHw9IChhcmctPnR5cGVfZmxhZ3MgJiBBUkdGX1JFR19JQ0FTRSkgPyBSRUdfSUNBU0UgOiAwOwoJCQllcnIgPSBOVUxMOwoKCQkJaWYgKCFyZWdleF9jb21wKGFyZy0+ZGF0YS5zdHIuc3RyLCByZWcsICEocmZsYWdzICYgUkVHX0lDQVNFKSwgMSAvKiBjYXB0dXJlIHN1YnN0ciAqLywgJmVycikpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBlcnJvciBpbiByZWdleCAnJXMnIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycgOiAlcy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwKCQkJCSAgICAgIGFyZy0+ZGF0YS5zdHIuc3RyLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQsIGVycik7CgkJCQljZmdlcnIrKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlmcmVlKGFyZy0+ZGF0YS5zdHIuc3RyKTsKCQkJYXJnLT5kYXRhLnN0ci5zdHIgPSBOVUxMOwoJCQlhcmctPnVucmVzb2x2ZWQgPSAwOwoJCQlhcmctPmRhdGEucmVnID0gcmVnOwoJCQlicmVhazsKCgoJCX0KCgkJTElTVF9ERUwoJmN1ci0+bGlzdCk7CgkJZnJlZShjdXIpOwoJfSAvKiBlbmQgb2YgYXJncyBwcm9jZXNzaW5nICovCgoJcmV0dXJuIGNmZ2VycjsKfQoKLyoKICogUHJvY2VzcyBhIGZldGNoICsgZm9ybWF0IGNvbnZlcnNpb24gYXMgZGVmaW5lZCBieSB0aGUgc2FtcGxlIGV4cHJlc3Npb24KICogPGV4cHI+IG9uIHJlcXVlc3Qgb3IgcmVzcG9uc2UgY29uc2lkZXJpbmcgdGhlIDxvcHQ+IHBhcmFtZXRlci4gVGhlIG91dHB1dCBpcwogKiBhbHdheXMgb2YgdHlwZSBzdHJpbmcuIElmIGEgc3RhYmxlIHNhbXBsZSBjYW4gYmUgZmV0Y2hlZCwgb3IgYW4gdW5zdGFibGUgb25lCiAqIHdoZW4gPG9wdD4gY29udGFpbnMgU01QX09QVF9GSU5BTCwgdGhlIHNhbXBsZSBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgYW5kCiAqIHJldHVybmVkIHdpdGhvdXQgdGhlIFNNUF9GX01BWV9DSEFOR0UgZmxhZy4gSWYgYW4gdW5zdGFibGUgc2FtcGxlIGlzIGZvdW5kCiAqIGFuZCA8b3B0PiBkb2VzIG5vdCBjb250YWluIFNNUF9PUFRfRklOQUwsIHRoZW4gdGhlIHNhbXBsZSBpcyByZXR1cm5lZCBhcy1pcwogKiB3aXRoIGl0cyBTTVBfRl9NQVlfQ0hBTkdFIGZsYWcgc28gdGhhdCB0aGUgY2FsbGVyIGNhbiBjaGVjayBpdCBhbmQgZGVjaWRlIHRvCiAqIHRha2UgYWN0aW9ucyAoZWc6IHdhaXQgbG9uZ2VyKS4gSWYgYSBzYW1wbGUgY291bGQgbm90IGJlIGZvdW5kIG9yIGNvdWxkIG5vdAogKiBiZSBjb252ZXJ0ZWQsIE5VTEwgaXMgcmV0dXJuZWQuIFRoZSBjYWxsZXIgTVVTVCBOT1QgdXNlIHRoZSBzYW1wbGUgaWYgdGhlCiAqIFNNUF9GX01BWV9DSEFOR0UgZmxhZyBpcyBwcmVzZW50LCBhcyBpdCBpcyB1c2VkIG9ubHkgYXMgYSBoaW50IHRoYXQgdGhlcmUgaXMKICogc3RpbGwgaG9wZSB0byBnZXQgaXQgYWZ0ZXIgd2FpdGluZyBsb25nZXIsIGFuZCBpcyBub3QgY29udmVydGVkIHRvIHN0cmluZy4KICogVGhlIHBvc3NpYmxlIG91dHB1dCBjb21iaW5hdGlvbnMgYXJlIHRoZSBmb2xsb3dpbmcgOgogKgogKiByZXR1cm4gTUFZX0NIQU5HRSBGSU5BTCAgIE1lYW5pbmcgZm9yIHRoZSBzYW1wbGUKICogIE5VTEwgICAgICAqICAgICAgICAqICAgICBOb3QgcHJlc2VudCBhbmQgd2lsbCBuZXZlciBiZSAoZWc6IGhlYWRlcikKICogICBzbXAgICAgICAwICAgICAgICAqICAgICBGaW5hbCB2YWx1ZSBjb252ZXJ0ZWQgKGVnOiBoZWFkZXIpCiAqICAgc21wICAgICAgMSAgICAgICAgMCAgICAgTm90IHByZXNlbnQgeWV0LCBtYXkgYXBwZWFyIGxhdGVyIChlZzogaGVhZGVyKQogKiAgIHNtcCAgICAgIDEgICAgICAgIDEgICAgIG5ldmVyIGhhcHBlbnMgKGVpdGhlciBmbGFnIGlzIGNsZWFyZWQgb24gb3V0cHV0KQogKi8Kc3RydWN0IHNhbXBsZSAqc2FtcGxlX2ZldGNoX3N0cmluZyhzdHJ1Y3QgcHJveHkgKnB4LCBzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RyZWFtICpzdHJtLCB1bnNpZ25lZCBpbnQgb3B0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGVfZXhwciAqZXhwcikKewoJc3RydWN0IHNhbXBsZSAqc21wID0gJnRlbXBfc21wOwoKCW1lbXNldChzbXAsIDAsIHNpemVvZigqc21wKSk7CgoJaWYgKCFzYW1wbGVfcHJvY2VzcyhweCwgc2Vzcywgc3RybSwgb3B0LCBleHByLCBzbXApKSB7CgkJaWYgKChzbXAtPmZsYWdzICYgU01QX0ZfTUFZX0NIQU5HRSkgJiYgIShvcHQgJiBTTVBfT1BUX0ZJTkFMKSkKCQkJcmV0dXJuIHNtcDsKCQlyZXR1cm4gTlVMTDsKCX0KCglpZiAoIXNhbXBsZV9jYXN0c1tzbXAtPnR5cGVdW1NNUF9UX1NUUl0pCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCFzYW1wbGVfY2FzdHNbc21wLT50eXBlXVtTTVBfVF9TVFJdKHNtcCkpCgkJcmV0dXJuIE5VTEw7CgoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfTUFZX0NIQU5HRTsKCXJldHVybiBzbXA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgU2FtcGxlIGZvcm1hdCBjb252ZXJ0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBUaGVzZSBmdW5jdGlvbnMgc2V0IHRoZSBkYXRhIHR5cGUgb24gcmV0dXJuLiAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZmRlZiBERUJVR19FWFBSCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfZGVidWcoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJaW50IGk7CglzdHJ1Y3Qgc2FtcGxlIHRtcDsKCglpZiAoIShnbG9iYWwubW9kZSAmIE1PREVfUVVJRVQpIHx8IChnbG9iYWwubW9kZSAmIChNT0RFX1ZFUkJPU0UgfCBNT0RFX1NUQVJUSU5HKSkpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIltkZWJ1ZyBjb252ZXJ0ZXJdIHR5cGU6ICVzICIsIHNtcF90b190eXBlW3NtcC0+dHlwZV0pOwoJCWlmICghc2FtcGxlX2Nhc3RzW3NtcC0+dHlwZV1bU01QX1RfU1RSXSkgewoJCQlmcHJpbnRmKHN0ZGVyciwgIih1bmRpc3BsYXlhYmxlKSIpOwoJCX0gZWxzZSB7CgoJCQkvKiBDb3B5IHNhbXBsZSBmZXRjaC4gVGhpcyBwdXQgdGhlIHNhbXBsZSBhcyBjb25zdCwgdGhlCgkJCSAqIGNhc3Qgd2lsbCBjb3B5IGRhdGEgaWYgYSB0cmFuc2Zvcm1hdGlvbiBpcyByZXF1aXJlZC4KCQkJICovCgkJCW1lbWNweSgmdG1wLCBzbXAsIHNpemVvZihzdHJ1Y3Qgc2FtcGxlKSk7CgkJCXRtcC5mbGFncyA9IFNNUF9GX0NPTlNUOwoKCQkJaWYgKCFzYW1wbGVfY2FzdHNbc21wLT50eXBlXVtTTVBfVF9TVFJdKCZ0bXApKQoJCQkJZnByaW50ZihzdGRlcnIsICIodW5kaXNwbGF5YWJsZSkiKTsKCgkJCWVsc2UgewoJCQkJLyogRGlzcGxheSB0aGUgZGlzcGxheWFibGUgY2hhcnMqLiAqLwoJCQkJZnByaW50ZihzdGRlcnIsICI8Iik7CgkJCQlmb3IgKGkgPSAwOyBpIDwgdG1wLmRhdGEuc3RyLmxlbjsgaSsrKSB7CgkJCQkJaWYgKGlzcHJpbnQodG1wLmRhdGEuc3RyLnN0cltpXSkpCgkJCQkJCWZwdXRjKHRtcC5kYXRhLnN0ci5zdHJbaV0sIHN0ZGVycik7CgkJCQkJZWxzZQoJCQkJCQlmcHV0YygnLicsIHN0ZGVycik7CgkJCQl9CgkJCX0KCQkJZnByaW50ZihzdGRlcnIsICI+XG4iKTsKCQl9Cgl9CglyZXR1cm4gMTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYmluMmJhc2U2NChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzdHJ1Y3QgY2h1bmsgKnRyYXNoID0gZ2V0X3RyYXNoX2NodW5rKCk7CglpbnQgYjY0X2xlbjsKCgl0cmFzaC0+bGVuID0gMDsKCWI2NF9sZW4gPSBhMmJhc2U2NChzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4sIHRyYXNoLT5zdHIsIHRyYXNoLT5zaXplKTsKCWlmIChiNjRfbGVuIDwgMCkKCQlyZXR1cm4gMDsKCgl0cmFzaC0+bGVuID0gYjY0X2xlbjsKCXNtcC0+ZGF0YS5zdHIgPSAqdHJhc2g7CglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbjJoZXgoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc3RydWN0IGNodW5rICp0cmFzaCA9IGdldF90cmFzaF9jaHVuaygpOwoJdW5zaWduZWQgY2hhciBjOwoJaW50IHB0ciA9IDA7CgoJdHJhc2gtPmxlbiA9IDA7Cgl3aGlsZSAocHRyIDwgc21wLT5kYXRhLnN0ci5sZW4gJiYgdHJhc2gtPmxlbiA8PSB0cmFzaC0+c2l6ZSAtIDIpIHsKCQljID0gc21wLT5kYXRhLnN0ci5zdHJbcHRyKytdOwoJCXRyYXNoLT5zdHJbdHJhc2gtPmxlbisrXSA9IGhleHRhYlsoYyA+PiA0KSAmIDB4Rl07CgkJdHJhc2gtPnN0clt0cmFzaC0+bGVuKytdID0gaGV4dGFiW2MgJiAweEZdOwoJfQoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCi8qIGhhc2hlcyB0aGUgYmluYXJ5IGlucHV0IGludG8gYSAzMi1iaXQgdW5zaWduZWQgaW50ICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfZGpiMihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IGhhc2hfZGpiMihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNhbXBsZV9jb252X3N0cjJsb3dlcihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpbnQgaTsKCglpZiAoIXNtcF9kdXAoc21wKSkKCQlyZXR1cm4gMDsKCglpZiAoIXNtcC0+ZGF0YS5zdHIuc2l6ZSkKCQlyZXR1cm4gMDsKCglmb3IgKGkgPSAwOyBpIDwgc21wLT5kYXRhLnN0ci5sZW47IGkrKykgewoJCWlmICgoc21wLT5kYXRhLnN0ci5zdHJbaV0gPj0gJ0EnKSAmJiAoc21wLT5kYXRhLnN0ci5zdHJbaV0gPD0gJ1onKSkKCQkJc21wLT5kYXRhLnN0ci5zdHJbaV0gKz0gJ2EnIC0gJ0EnOwoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfc3RyMnVwcGVyKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCWludCBpOwoKCWlmICghc21wX2R1cChzbXApKQoJCXJldHVybiAwOwoKCWlmICghc21wLT5kYXRhLnN0ci5zaXplKQoJCXJldHVybiAwOwoKCWZvciAoaSA9IDA7IGkgPCBzbXAtPmRhdGEuc3RyLmxlbjsgaSsrKSB7CgkJaWYgKChzbXAtPmRhdGEuc3RyLnN0cltpXSA+PSAnYScpICYmIChzbXAtPmRhdGEuc3RyLnN0cltpXSA8PSAneicpKQoJCQlzbXAtPmRhdGEuc3RyLnN0cltpXSArPSAnQScgLSAnYSc7Cgl9CglyZXR1cm4gMTsKfQoKLyogdGFrZXMgdGhlIG5ldG1hc2sgaW4gYXJnX3AgKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9pcG1hc2soY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLmlwdjQuc19hZGRyICY9IGFyZ19wLT5kYXRhLmlwdjQuc19hZGRyOwoJc21wLT50eXBlID0gU01QX1RfSVBWNDsKCXJldHVybiAxOwp9CgovKiB0YWtlcyBhbiBVSU5UIHZhbHVlIG9uIGlucHV0IHN1cHBvc2VkIHRvIHJlcHJlc2VudCB0aGUgdGltZSBzaW5jZSBFUE9DSCwKICogYWRkcyBhbiBvcHRpb25hbCBvZmZzZXQgZm91bmQgaW4gYXJnc1sxXSBhbmQgZW1pdHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nCiAqIHRoZSBsb2NhbCB0aW1lIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGluIGFyZ3NbMV0gdXNpbmcgc3RyZnRpbWUoKS4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfbHRpbWUoY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzdHJ1Y3QgY2h1bmsgKnRlbXA7Cgl0aW1lX3QgY3Vycl9kYXRlID0gc21wLT5kYXRhLnVpbnQ7CgoJLyogYWRkIG9mZnNldCAqLwoJaWYgKGFyZ3NbMV0udHlwZSA9PSBBUkdUX1NJTlQgfHwgYXJnc1sxXS50eXBlID09IEFSR1RfVUlOVCkKCQljdXJyX2RhdGUgKz0gYXJnc1sxXS5kYXRhLnNpbnQ7CgoJdGVtcCA9IGdldF90cmFzaF9jaHVuaygpOwoJdGVtcC0+bGVuID0gc3RyZnRpbWUodGVtcC0+c3RyLCB0ZW1wLT5zaXplLCBhcmdzWzBdLmRhdGEuc3RyLnN0ciwgbG9jYWx0aW1lKCZjdXJyX2RhdGUpKTsKCXNtcC0+ZGF0YS5zdHIgPSAqdGVtcDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXJldHVybiAxOwp9CgovKiBoYXNoZXMgdGhlIGJpbmFyeSBpbnB1dCBpbnRvIGEgMzItYml0IHVuc2lnbmVkIGludCAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X3NkYm0oY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSBoYXNoX3NkYm0oc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuKTsKCWlmIChhcmdfcCAmJiBhcmdfcC0+ZGF0YS51aW50KQoJCXNtcC0+ZGF0YS51aW50ID0gZnVsbF9oYXNoKHNtcC0+ZGF0YS51aW50KTsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglyZXR1cm4gMTsKfQoKLyogdGFrZXMgYW4gVUlOVCB2YWx1ZSBvbiBpbnB1dCBzdXBwb3NlZCB0byByZXByZXNlbnQgdGhlIHRpbWUgc2luY2UgRVBPQ0gsCiAqIGFkZHMgYW4gb3B0aW9uYWwgb2Zmc2V0IGZvdW5kIGluIGFyZ3NbMV0gYW5kIGVtaXRzIGEgc3RyaW5nIHJlcHJlc2VudGluZwogKiB0aGUgVVRDIGRhdGUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gYXJnc1sxXSB1c2luZyBzdHJmdGltZSgpLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl91dGltZShjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdGVtcDsKCXRpbWVfdCBjdXJyX2RhdGUgPSBzbXAtPmRhdGEudWludDsKCgkvKiBhZGQgb2Zmc2V0ICovCglpZiAoYXJnc1sxXS50eXBlID09IEFSR1RfU0lOVCB8fCBhcmdzWzFdLnR5cGUgPT0gQVJHVF9VSU5UKQoJCWN1cnJfZGF0ZSArPSBhcmdzWzFdLmRhdGEuc2ludDsKCgl0ZW1wID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl0ZW1wLT5sZW4gPSBzdHJmdGltZSh0ZW1wLT5zdHIsIHRlbXAtPnNpemUsIGFyZ3NbMF0uZGF0YS5zdHIuc3RyLCBnbXRpbWUoJmN1cnJfZGF0ZSkpOwoJc21wLT5kYXRhLnN0ciA9ICp0ZW1wOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJcmV0dXJuIDE7Cn0KCi8qIGhhc2hlcyB0aGUgYmluYXJ5IGlucHV0IGludG8gYSAzMi1iaXQgdW5zaWduZWQgaW50ICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfd3Q2KGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gaGFzaF93dDYoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuKTsKCWlmIChhcmdfcCAmJiBhcmdfcC0+ZGF0YS51aW50KQoJCXNtcC0+ZGF0YS51aW50ID0gZnVsbF9oYXNoKHNtcC0+ZGF0YS51aW50KTsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglyZXR1cm4gMTsKfQoKLyogaGFzaGVzIHRoZSBiaW5hcnkgaW5wdXQgaW50byBhIDMyLWJpdCB1bnNpZ25lZCBpbnQgKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9jcmMzMihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IGhhc2hfY3JjMzIoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuKTsKCWlmIChhcmdfcCAmJiBhcmdfcC0+ZGF0YS51aW50KQoJCXNtcC0+ZGF0YS51aW50ID0gZnVsbF9oYXNoKHNtcC0+ZGF0YS51aW50KTsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglyZXR1cm4gMTsKfQoKLyogVGhpcyBmdW5jdGlvbiBlc2NhcGUgc3BlY2lhbCBqc29uIGNoYXJhY3RlcnMuIFRoZSByZXR1cm5lZCBzdHJpbmcgY2FuIGJlCiAqIHNhZmVseSBzZXQgYmV0d2VlbiB0d28gJyInIGFuZCB1c2VkIGFzIGpzb24gc3RyaW5nLiBUaGUganNvbiBzdHJpbmcgaXMKICogZGVmaW5lZCBsaWtlIHRoaXM6CiAqCiAqICAgIGFueSBVbmljb2RlIGNoYXJhY3RlciBleGNlcHQgJyInIG9yICdcJyBvciBjb250cm9sIGNoYXJhY3RlcgogKiAgICBcIiwgXFwsIFwvLCBcYiwgXGYsIFxuLCBcciwgXHQsIFx1ICsgZm91ci1oZXgtZGlnaXRzCiAqCiAqIFRoZSBlbnVtIGlucHV0X3R5cGUgY29udGFpbiBhbGwgdGhlIGFsbG93ZWQgbW9kZSBmb3IgZGVjb2RpbmcgdGhlIGlucHV0CiAqIHN0cmluZy4KICovCmVudW0gaW5wdXRfdHlwZSB7CglJVF9BU0NJSSA9IDAsCglJVF9VVEY4LAoJSVRfVVRGOFMsCglJVF9VVEY4UCwKCUlUX1VURjhQUywKfTsKc3RhdGljIGludCBzYW1wbGVfY29udl9qc29uX2NoZWNrKHN0cnVjdCBhcmcgKmFyZywgc3RydWN0IHNhbXBsZV9jb252ICpjb252LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKiplcnIpCnsKCWlmICghYXJnKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgZW1wdHkgYXJnIGxpc3QiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoYXJnLT50eXBlICE9IEFSR1RfU1RSKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgYXJnIHR5cGUiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoc3RyY21wKGFyZy0+ZGF0YS5zdHIuc3RyLCAiIikgPT0gMCkgewoJCWFyZy0+dHlwZSA9IEFSR1RfVUlOVDsKCQlhcmctPmRhdGEudWludCA9IElUX0FTQ0lJOwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgImFzY2lpIikgPT0gMCkgewoJCWFyZy0+dHlwZSA9IEFSR1RfVUlOVDsKCQlhcmctPmRhdGEudWludCA9IElUX0FTQ0lJOwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgInV0ZjgiKSA9PSAwKSB7CgkJYXJnLT50eXBlID0gQVJHVF9VSU5UOwoJCWFyZy0+ZGF0YS51aW50ID0gSVRfVVRGODsKCQlyZXR1cm4gMTsKCX0KCgllbHNlIGlmIChzdHJjbXAoYXJnLT5kYXRhLnN0ci5zdHIsICJ1dGY4cyIpID09IDApIHsKCQlhcmctPnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnLT5kYXRhLnVpbnQgPSBJVF9VVEY4UzsKCQlyZXR1cm4gMTsKCX0KCgllbHNlIGlmIChzdHJjbXAoYXJnLT5kYXRhLnN0ci5zdHIsICJ1dGY4cCIpID09IDApIHsKCQlhcmctPnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnLT5kYXRhLnVpbnQgPSBJVF9VVEY4UDsKCQlyZXR1cm4gMTsKCX0KCgllbHNlIGlmIChzdHJjbXAoYXJnLT5kYXRhLnN0ci5zdHIsICJ1dGY4cHMiKSA9PSAwKSB7CgkJYXJnLT50eXBlID0gQVJHVF9VSU5UOwoJCWFyZy0+ZGF0YS51aW50ID0gSVRfVVRGOFBTOwoJCXJldHVybiAxOwoJfQoKCW1lbXByaW50ZihlcnIsICJVbmV4cGVjdGVkIGlucHV0IGNvZGUgdHlwZSBhdCBmaWxlICclcycsIGxpbmUgJWQuICIKCSAgICAgICAgICAgICAgICJBbGxvd2VkIHZhbHVlIGFyZSAnYXNjaWknLCAndXRmOCcsICd1dGY4cCcgYW5kICd1dGY4cHAnIiwgZmlsZSwgbGluZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9qc29uKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdGVtcDsKCWNoYXIgX3N0cls3XTsgLyogXHUgKyA0IGhleCBkaWdpdCArIG51bGwgY2hhciBmb3Igc3ByaW50Zi4gKi8KCWNvbnN0IGNoYXIgKnN0cjsKCWludCBsZW47CgllbnVtIGlucHV0X3R5cGUgaW5wdXRfdHlwZSA9IElUX0FTQ0lJOwoJdW5zaWduZWQgaW50IGM7Cgl1bnNpZ25lZCBpbnQgcmV0OwoJY2hhciAqcDsKCglpZiAoYXJnX3ApCgkJaW5wdXRfdHlwZSA9IGFyZ19wLT5kYXRhLnVpbnQ7CgoJdGVtcCA9IGdldF90cmFzaF9jaHVuaygpOwoJdGVtcC0+bGVuID0gMDsKCglwID0gc21wLT5kYXRhLnN0ci5zdHI7Cgl3aGlsZSAocCA8IHNtcC0+ZGF0YS5zdHIuc3RyICsgc21wLT5kYXRhLnN0ci5sZW4pIHsKCgkJaWYgKGlucHV0X3R5cGUgPT0gSVRfQVNDSUkpIHsKCQkJLyogUmVhZCBpbnB1dCBhcyBBU0NJSS4gKi8KCQkJYyA9ICoodW5zaWduZWQgY2hhciAqKXA7CgkJCXArKzsKCQl9CgkJZWxzZSB7CgkJCS8qIFJlYWQgaW5wdXQgYXMgVVRGOC4gKi8KCQkJcmV0ID0gdXRmOF9uZXh0KHAsIHNtcC0+ZGF0YS5zdHIubGVuIC0gKCBwIC0gc21wLT5kYXRhLnN0ci5zdHIgKSwgJmMpOwoJCQlwICs9IHV0ZjhfcmV0dXJuX2xlbmd0aChyZXQpOwoKCQkJaWYgKGlucHV0X3R5cGUgPT0gSVRfVVRGOCAmJiB1dGY4X3JldHVybl9jb2RlKHJldCkgIT0gVVRGOF9DT0RFX09LKQoJCQkJCXJldHVybiAwOwoJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4UyAmJiB1dGY4X3JldHVybl9jb2RlKHJldCkgIT0gVVRGOF9DT0RFX09LKQoJCQkJCWNvbnRpbnVlOwoJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4UCAmJiB1dGY4X3JldHVybl9jb2RlKHJldCkgJiAoVVRGOF9DT0RFX0lOVlJBTkdFfFVURjhfQ09ERV9CQURTRVEpKQoJCQkJCXJldHVybiAwOwoJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4UFMgJiYgdXRmOF9yZXR1cm5fY29kZShyZXQpICYgKFVURjhfQ09ERV9JTlZSQU5HRXxVVEY4X0NPREVfQkFEU0VRKSkKCQkJCQljb250aW51ZTsKCgkJCS8qIENoZWNrIHRvbyBiaWcgdmFsdWVzLiAqLwoJCQlpZiAoKHVuc2lnbmVkIGludCljID4gMHhmZmZmKSB7CgkJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4IHx8IGlucHV0X3R5cGUgPT0gSVRfVVRGOFApCgkJCQkJcmV0dXJuIDA7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCgkJLyogQ29udmVydCBjaGFyYWN0ZXIuICovCgkJaWYgKGMgPT0gJyInKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXFwiIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXFwnKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXFxcIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnLycpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcLyI7CgkJfQoJCWVsc2UgaWYgKGMgPT0gJ1xiJykgewoJCQlsZW4gPSAyOwoJCQlzdHIgPSAiXFxiIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXGYnKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXGYiOwoJCX0KCQllbHNlIGlmIChjID09ICdccicpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcciI7CgkJfQoJCWVsc2UgaWYgKGMgPT0gJ1xuJykgewoJCQlsZW4gPSAyOwoJCQlzdHIgPSAiXFxuIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXHQnKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXHQiOwoJCX0KCQllbHNlIGlmIChjID4gMHhmZiB8fCAhaXNwcmludChjKSkgewoJCQkvKiBpc3ByaW50IGdlbmVyYXRlIGEgc2VnZmF1bHQgaWYgYyBpcyB0b28gYmlnLiBUaGUgbWFuIHNheXMgdGhhdAoJCQkgKiBjIG11c3QgaGF2ZSB0aGUgdmFsdWUgb2YgYW4gdW5zaWduZWQgY2hhciBvciBFT0YuCgkJCSAqLwoJCQlsZW4gPSA2OwoJCQlfc3RyWzBdID0gJ1xcJzsKCQkJX3N0clsxXSA9ICd1JzsKCQkJc25wcmludGYoJl9zdHJbMl0sIDUsICIlMDR4IiwgKHVuc2lnbmVkIHNob3J0KWMpOwoJCQlzdHIgPSBfc3RyOwoJCX0KCQllbHNlIHsKCQkJbGVuID0gMTsKCQkJc3RyID0gKGNoYXIgKikmYzsKCQl9CgoJCS8qIENoZWNrIGxlbmd0aCAqLwoJCWlmICh0ZW1wLT5sZW4gKyBsZW4gPiB0ZW1wLT5zaXplKQoJCQlyZXR1cm4gMDsKCgkJLyogQ29weSBzdHJpbmcuICovCgkJbWVtY3B5KHRlbXAtPnN0ciArIHRlbXAtPmxlbiwgc3RyLCBsZW4pOwoJCXRlbXAtPmxlbiArPSBsZW47Cgl9CgoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglzbXAtPmRhdGEuc3RyID0gKnRlbXA7CglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CgoJcmV0dXJuIDE7Cn0KCi8qIFRoaXMgc2FtcGxlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGV4dHJhY3Qgc29tZSBieXRlcyBmcm9tIGFuIGlucHV0IGJ1ZmZlci4KICogRmlyc3QgYXJnIGlzIHRoZSBvZmZzZXQuCiAqIE9wdGlvbmFsIHNlY29uZCBhcmcgaXMgdGhlIGxlbmd0aCB0byB0cnVuY2F0ZSAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2J5dGVzKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCWlmIChzbXAtPmRhdGEuc3RyLmxlbiA8PSBhcmdfcFswXS5kYXRhLnVpbnQpIHsKCQlzbXAtPmRhdGEuc3RyLmxlbiA9IDA7CgkJcmV0dXJuIDE7Cgl9CgoJaWYgKHNtcC0+ZGF0YS5zdHIuc2l6ZSkKCQkJc21wLT5kYXRhLnN0ci5zaXplIC09IGFyZ19wWzBdLmRhdGEudWludDsKCXNtcC0+ZGF0YS5zdHIubGVuIC09IGFyZ19wWzBdLmRhdGEudWludDsKCXNtcC0+ZGF0YS5zdHIuc3RyICs9IGFyZ19wWzBdLmRhdGEudWludDsKCglpZiAoKGFyZ19wWzFdLnR5cGUgPT0gQVJHVF9VSU5UKSAmJiAoYXJnX3BbMV0uZGF0YS51aW50IDwgc21wLT5kYXRhLnN0ci5sZW4pKQoJCXNtcC0+ZGF0YS5zdHIubGVuID0gYXJnX3BbMV0uZGF0YS51aW50OwoKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNhbXBsZV9jb252X2ZpZWxkX2NoZWNrKHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGVfY29udiAqY29udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjaGFyICoqZXJyKQp7CglzdHJ1Y3QgYXJnICphcmcgPSBhcmdzOwoKCWlmICghYXJnKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgZW1wdHkgYXJnIGxpc3QiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoYXJnLT50eXBlICE9IEFSR1RfVUlOVCkgewoJCW1lbXByaW50ZihlcnIsICJVbmV4cGVjdGVkIGFyZyB0eXBlIik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKCFhcmctPmRhdGEudWludCkgewoJCW1lbXByaW50ZihlcnIsICJVbmV4cGVjdGVkIHZhbHVlIDAgZm9yIGluZGV4Iik7CgkJcmV0dXJuIDA7Cgl9CgoJYXJnKys7CgoJaWYgKGFyZy0+dHlwZSAhPSBBUkdUX1NUUikgewoJCW1lbXByaW50ZihlcnIsICJVbmV4cGVjdGVkIGFyZyB0eXBlIik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKCFhcmctPmRhdGEuc3RyLmxlbikgewoJCW1lbXByaW50ZihlcnIsICJFbXB0eSBzZXBhcmF0b3JzIGxpc3QiKTsKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gMTsKfQoKLyogVGhpcyBzYW1wbGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYSByZXR1cm4gc2VsZWN0ZWQgcGFydCBvZiBhIHN0cmluZyAoZmllbGQpLgogKiBGaXJzdCBhcmcgaXMgdGhlIGluZGV4IG9mIHRoZSBmaWVsZCAoc3RhcnQgYXQgMSkKICogU2Vjb25kIGFyZyBpcyBhIGNoYXIgbGlzdCBvZiBzZXBhcmF0b3JzICh0eXBlIHN0cmluZykKICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfZmllbGQoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJdW5zaWduZWQgaW50IGZpZWxkOwoJY2hhciAqc3RhcnQsICplbmQ7CglpbnQgaTsKCglpZiAoIWFyZ19wWzBdLmRhdGEudWludCkKCQlyZXR1cm4gMDsKCglmaWVsZCA9IDE7CgllbmQgPSBzdGFydCA9IHNtcC0+ZGF0YS5zdHIuc3RyOwoJd2hpbGUgKGVuZCAtIHNtcC0+ZGF0YS5zdHIuc3RyIDwgc21wLT5kYXRhLnN0ci5sZW4pIHsKCgkJZm9yIChpID0gMCA7IGkgPCBhcmdfcFsxXS5kYXRhLnN0ci5sZW4gOyBpKyspIHsKCQkJaWYgKCplbmQgPT0gYXJnX3BbMV0uZGF0YS5zdHIuc3RyW2ldKSB7CgkJCQlpZiAoZmllbGQgPT0gYXJnX3BbMF0uZGF0YS51aW50KQoJCQkJCWdvdG8gZm91bmQ7CgkJCQlzdGFydCA9IGVuZCsxOwoJCQkJZmllbGQrKzsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWVuZCsrOwoJfQoKCS8qIEZpZWxkIG5vdCBmb3VuZCAqLwoJaWYgKGZpZWxkICE9IGFyZ19wWzBdLmRhdGEudWludCkgewoJCXNtcC0+ZGF0YS5zdHIubGVuID0gMDsKCQlyZXR1cm4gMTsKCX0KZm91bmQ6CglzbXAtPmRhdGEuc3RyLmxlbiA9IGVuZCAtIHN0YXJ0OwoJLyogSWYgcmV0IHN0cmluZyBpcyBsZW4gMCwgbm8gbmVlZCB0bwogICAgICAgICAgIGNoYW5nZSBwb2ludGVycyBvciB0byB1cGRhdGUgc2l6ZSAqLwoJaWYgKCFzbXAtPmRhdGEuc3RyLmxlbikKCQlyZXR1cm4gMTsKCglzbXAtPmRhdGEuc3RyLnN0ciA9IHN0YXJ0OwoKCS8qIENvbXB1dGUgcmVtYWluaW5nIHNpemUgaWYgbmVlZGVkCiAgICAgICAgICAgTm90ZTogc21wLT5kYXRhLnN0ci5zaXplIGNhbm5vdCBiZSBzZXQgdG8gMCAqLwoJaWYgKHNtcC0+ZGF0YS5zdHIuc2l6ZSkKCQlzbXAtPmRhdGEuc3RyLnNpemUgLT0gc3RhcnQgLSBzbXAtPmRhdGEuc3RyLnN0cjsKCglyZXR1cm4gMTsKfQoKLyogVGhpcyBzYW1wbGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gcmV0dXJuIGEgd29yZCBmcm9tIGEgc3RyaW5nLgogKiBGaXJzdCBhcmcgaXMgdGhlIGluZGV4IG9mIHRoZSB3b3JkIChzdGFydCBhdCAxKQogKiBTZWNvbmQgYXJnIGlzIGEgY2hhciBsaXN0IG9mIHdvcmRzIHNlcGFyYXRvcnMgKHR5cGUgc3RyaW5nKQogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl93b3JkKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXVuc2lnbmVkIGludCB3b3JkOwoJY2hhciAqc3RhcnQsICplbmQ7CglpbnQgaSwgaXNzZXAsIGlud29yZDsKCglpZiAoIWFyZ19wWzBdLmRhdGEudWludCkKCQlyZXR1cm4gMDsKCgl3b3JkID0gMDsKCWlud29yZCA9IDA7CgllbmQgPSBzdGFydCA9IHNtcC0+ZGF0YS5zdHIuc3RyOwoJd2hpbGUgKGVuZCAtIHNtcC0+ZGF0YS5zdHIuc3RyIDwgc21wLT5kYXRhLnN0ci5sZW4pIHsKCQlpc3NlcCA9IDA7CgkJZm9yIChpID0gMCA7IGkgPCBhcmdfcFsxXS5kYXRhLnN0ci5sZW4gOyBpKyspIHsKCQkJaWYgKCplbmQgPT0gYXJnX3BbMV0uZGF0YS5zdHIuc3RyW2ldKSB7CgkJCQlpc3NlcCA9IDE7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlpZiAoIWlud29yZCkgewoJCQlpZiAoIWlzc2VwKSB7CgkJCQl3b3JkKys7CgkJCQlzdGFydCA9IGVuZDsKCQkJCWlud29yZCA9IDE7CgkJCX0KCQl9CgkJZWxzZSBpZiAoaXNzZXApIHsKCQkJaWYgKHdvcmQgPT0gYXJnX3BbMF0uZGF0YS51aW50KQoJCQkJZ290byBmb3VuZDsKCQkJaW53b3JkID0gMDsKCQl9CgkJZW5kKys7Cgl9CgoJLyogRmllbGQgbm90IGZvdW5kICovCglpZiAod29yZCAhPSBhcmdfcFswXS5kYXRhLnVpbnQpIHsKCQlzbXAtPmRhdGEuc3RyLmxlbiA9IDA7CgkJcmV0dXJuIDE7Cgl9CmZvdW5kOgoJc21wLT5kYXRhLnN0ci5sZW4gPSBlbmQgLSBzdGFydDsKCS8qIElmIHJldCBzdHJpbmcgaXMgbGVuIDAsIG5vIG5lZWQgdG8KICAgICAgICAgICBjaGFuZ2UgcG9pbnRlcnMgb3IgdG8gdXBkYXRlIHNpemUgKi8KCWlmICghc21wLT5kYXRhLnN0ci5sZW4pCgkJcmV0dXJuIDE7CgoJc21wLT5kYXRhLnN0ci5zdHIgPSBzdGFydDsKCgkvKiBDb21wdXRlIHJlbWFpbmluZyBzaXplIGlmIG5lZWRlZAogICAgICAgICAgIE5vdGU6IHNtcC0+ZGF0YS5zdHIuc2l6ZSBjYW5ub3QgYmUgc2V0IHRvIDAgKi8KCWlmIChzbXAtPmRhdGEuc3RyLnNpemUpCgkJc21wLT5kYXRhLnN0ci5zaXplIC09IHN0YXJ0IC0gc21wLT5kYXRhLnN0ci5zdHI7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfcmVnc3ViX2NoZWNrKHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGVfY29udiAqY29udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKiplcnIpCnsKCXN0cnVjdCBhcmcgKmFyZyA9IGFyZ3M7CgljaGFyICpwOwoJaW50IGxlbjsKCgkvKiBhcmcwIGlzIGEgcmVnZXgsIGl0IHVzZXMgdHlwZV9mbGFnIGZvciBJQ0FTRSBhbmQgZ2xvYmFsIG1hdGNoICovCglhcmdbMF0udHlwZV9mbGFncyA9IDA7CgoJaWYgKGFyZ1syXS50eXBlICE9IEFSR1RfU1RSKQoJCXJldHVybiAxOwoKCXAgPSBhcmdbMl0uZGF0YS5zdHIuc3RyOwoJbGVuID0gYXJnWzJdLmRhdGEuc3RyLmxlbjsKCXdoaWxlIChsZW4pIHsKCQlpZiAoKnAgPT0gJ2knKSB7CgkJCWFyZ1swXS50eXBlX2ZsYWdzIHw9IEFSR0ZfUkVHX0lDQVNFOwoJCX0KCQllbHNlIGlmICgqcCA9PSAnZycpIHsKCQkJYXJnWzBdLnR5cGVfZmxhZ3MgfD0gQVJHRl9SRUdfR0xPQjsKCQl9CgkJZWxzZSB7CgkJCW1lbXByaW50ZihlcnIsICJpbnZhbGlkIHJlZ2V4IGZsYWcgJyVjJywgb25seSAnaScgYW5kICdnJyBhcmUgc3VwcG9ydGVkIiwgKnApOwoJCQlyZXR1cm4gMDsKCQl9CgkJcCsrOwoJCWxlbi0tOwoJfQoJcmV0dXJuIDE7Cn0KCi8qIFRoaXMgc2FtcGxlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGRvIHRoZSBlcXVpdmFsZW50IG9mIHMvbWF0Y2gvcmVwbGFjZS8gb24KICogdGhlIGlucHV0IHN0cmluZy4gSXQgYXBwbGllcyBhIHJlZ2V4IGFuZCByZXN0YXJ0cyBmcm9tIHRoZSBsYXN0IG1hdGNoZWQKICogbG9jYXRpb24gdW50aWwgbm90aGluZyBtYXRjaGVzIGFueW1vcmUuIEZpcnN0IGFyZyBpcyB0aGUgcmVnZXggdG8gYXBwbHkgdG8KICogdGhlIGlucHV0IHN0cmluZywgc2Vjb25kIGFyZyBpcyB0aGUgcmVwbGFjZW1lbnQgZXhwcmVzc2lvbi4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfcmVnc3ViKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCWNoYXIgKnN0YXJ0LCAqZW5kOwoJc3RydWN0IG15X3JlZ2V4ICpyZWcgPSBhcmdfcFswXS5kYXRhLnJlZzsKCXJlZ21hdGNoX3QgcG1hdGNoW01BWF9NQVRDSF07CglzdHJ1Y3QgY2h1bmsgKnRyYXNoID0gZ2V0X3RyYXNoX2NodW5rKCk7CglpbnQgZmxhZywgbWF4OwoJaW50IGZvdW5kOwoKCXN0YXJ0ID0gc21wLT5kYXRhLnN0ci5zdHI7CgllbmQgPSBzdGFydCArIHNtcC0+ZGF0YS5zdHIubGVuOwoKCWZsYWcgPSAwOwoJd2hpbGUgKDEpIHsKCQkvKiBjaGVjayBmb3IgbGFzdCByb3VuZCB3aGljaCBpcyB1c2VkIHRvIGNvcHkgcmVtYWluaW5nIHBhcnRzCgkJICogd2hlbiBub3QgcnVubmluZyBpbiBnbG9iYWwgcmVwbGFjZW1lbnQgbW9kZS4KCQkgKi8KCQlmb3VuZCA9IDA7CgkJaWYgKChhcmdfcFswXS50eXBlX2ZsYWdzICYgQVJHRl9SRUdfR0xPQikgfHwgIShmbGFnICYgUkVHX05PVEJPTCkpIHsKCQkJLyogTm90ZTogd2UgY2FuIGhhdmUgc3RhcnQgPT0gZW5kIG9uIGVtcHR5IHN0cmluZ3Mgb3IgYXQgdGhlIGVuZCAqLwoJCQlmb3VuZCA9IHJlZ2V4X2V4ZWNfbWF0Y2gyKHJlZywgc3RhcnQsIGVuZCAtIHN0YXJ0LCBNQVhfTUFUQ0gsIHBtYXRjaCwgZmxhZyk7CgkJfQoKCQlpZiAoIWZvdW5kKQoJCQlwbWF0Y2hbMF0ucm1fc28gPSBlbmQgLSBzdGFydDsKCgkJLyogY29weSB0aGUgaGVhZGluZyBub24tbWF0Y2hpbmcgcGFydCAod2hpY2ggbWF5IGFsc28gYmUgdGhlIHRhaWwgaWYgbm90aGluZyBtYXRjaGVzKSAqLwoJCW1heCA9IHRyYXNoLT5zaXplIC0gdHJhc2gtPmxlbjsKCQlpZiAobWF4ICYmIHBtYXRjaFswXS5ybV9zbyA+IDApIHsKCQkJaWYgKG1heCA+IHBtYXRjaFswXS5ybV9zbykKCQkJCW1heCA9IHBtYXRjaFswXS5ybV9zbzsKCQkJbWVtY3B5KHRyYXNoLT5zdHIgKyB0cmFzaC0+bGVuLCBzdGFydCwgbWF4KTsKCQkJdHJhc2gtPmxlbiArPSBtYXg7CgkJfQoKCQlpZiAoIWZvdW5kKQoJCQlicmVhazsKCgkJLyogcmVwbGFjZSB0aGUgbWF0Y2hpbmcgcGFydCAqLwoJCW1heCA9IHRyYXNoLT5zaXplIC0gdHJhc2gtPmxlbjsKCQlpZiAobWF4KSB7CgkJCWlmIChtYXggPiBhcmdfcFsxXS5kYXRhLnN0ci5sZW4pCgkJCQltYXggPSBhcmdfcFsxXS5kYXRhLnN0ci5sZW47CgkJCW1lbWNweSh0cmFzaC0+c3RyICsgdHJhc2gtPmxlbiwgYXJnX3BbMV0uZGF0YS5zdHIuc3RyLCBtYXgpOwoJCQl0cmFzaC0+bGVuICs9IG1heDsKCQl9CgoJCS8qIHN0b3AgaGVyZSBpZiB3ZSdyZSBkb25lIHdpdGggdGhpcyBzdHJpbmcgKi8KCQlpZiAoc3RhcnQgPj0gZW5kKQoJCQlicmVhazsKCgkJLyogV2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSBmb3IgbWF0Y2hlcyBvZiBsZW5ndGggMCAoZWc6ICJ4KnkqIikuCgkJICogVGhlc2Ugb25lcyBhcmUgY29uc2lkZXJlZCB0byBtYXRjaCBpbiBmcm9udCBvZiBhIGNoYXJhY3RlciwKCQkgKiBzbyB3ZSBoYXZlIHRvIGNvcHkgdGhhdCBjaGFyYWN0ZXIgYW5kIHNraXAgdG8gdGhlIG5leHQgb25lLgoJCSAqLwoJCWlmICghcG1hdGNoWzBdLnJtX2VvKSB7CgkJCWlmICh0cmFzaC0+bGVuIDwgdHJhc2gtPnNpemUpCgkJCQl0cmFzaC0+c3RyW3RyYXNoLT5sZW4rK10gPSBzdGFydFtwbWF0Y2hbMF0ucm1fZW9dOwoJCQlwbWF0Y2hbMF0ucm1fZW8rKzsKCQl9CgoJCXN0YXJ0ICs9IHBtYXRjaFswXS5ybV9lbzsKCQlmbGFnIHw9IFJFR19OT1RCT0w7Cgl9CgoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYSBiaW5hcnkgdHdvcyBjb21wbGVtZW50IGFuZCByZXR1cm5zIHRoZSBVSU5UCiAqIHJlc3VsdC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYmluYXJ5X2NwbChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IH5zbXAtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYSBiaW5hcnkgImFuZCIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwgYW5kCiAqIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9iaW5hcnlfYW5kKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ICY9IGFyZ19wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGEgYmluYXJ5ICJvciIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwgYW5kCiAqIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9iaW5hcnlfb3IoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgfD0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYSBiaW5hcnkgInhvciIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwgYW5kCiAqIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9iaW5hcnlfeG9yKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50IF49IGFyZ19wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgImFkZCIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9hZGQoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgKz0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYW4gYXJpdGhtZXRpYyAic3ViIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLAogKiBhbmQgcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX3N1Yihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCAtPSBhcmdfcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhbiBhcml0aG1ldGljICJtdWwiIHdpdGggdGhlIFVJTlQgaW4gYXJnX3AsCiAqIGFuZCByZXR1cm5zIHRoZSBVSU5UIHJlc3VsdC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfbXVsKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ICo9IGFyZ19wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgImRpdiIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LiBJZiBhcmdfcCBtYWtlcyB0aGUgcmVzdWx0IG92ZXJmbG93LCB0aGVuIHRoZQogKiBsYXJnZXN0IHBvc3NpYmxlIHF1YW50aXR5IGlzIHJldHVybmVkLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9kaXYoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJaWYgKGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgLz0gYXJnX3AtPmRhdGEudWludDsKCWVsc2UKCQlzbXAtPmRhdGEudWludCA9IH4wOwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhbiBhcml0aG1ldGljICJtb2QiIHdpdGggdGhlIFVJTlQgaW4gYXJnX3AsCiAqIGFuZCByZXR1cm5zIHRoZSBVSU5UIHJlc3VsdC4gSWYgYXJnX3AgbWFrZXMgdGhlIHJlc3VsdCBvdmVyZmxvdywgdGhlbiB6ZXJvCiAqIGlzIHJldHVybmVkLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9tb2QoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJaWYgKGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgJT0gYXJnX3AtPmRhdGEudWludDsKCWVsc2UKCQlzbXAtPmRhdGEudWludCA9IDA7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYW4gVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhbiBhcml0aG1ldGljICJuZWciIGFuZCByZXR1cm5zIHRoZSBVSU5UCiAqIHJlc3VsdC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfbmVnKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gLXNtcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgcmV0dXJucyB0cnVlIGlzIHRoZSB2YWx1ZSBpcyBub24tbnVsbCwgb3RoZXJ3aXNlCiAqIGZhbHNlLiBUaGUgb3V0cHV0IGlzIGEgQk9PTC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfYm9vbChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSAhIXNtcC0+ZGF0YS51aW50OwoJc21wLT50eXBlID0gU01QX1RfQk9PTDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIHJldHVybnMgZmFsc2UgaXMgdGhlIHZhbHVlIGlzIG5vbi1udWxsLCBvdGhlcndpc2UKICogdHJ1ZWUuIFRoZSBvdXRwdXQgaXMgYSBCT09MLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9ub3QoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSAhc21wLT5kYXRhLnVpbnQ7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgcmV0dXJucyB0cnVlIGlzIHRoZSB2YWx1ZSBpcyBvZGQsIG90aGVyd2lzZSBmYWxzZS4KICogVGhlIG91dHB1dCBpcyBhIEJPT0wuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX29kZChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IHNtcC0+ZGF0YS51aW50ICYgMTsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCByZXR1cm5zIHRydWUgaXMgdGhlIHZhbHVlIGlzIGV2ZW4sIG90aGVyd2lzZSBmYWxzZS4KICogVGhlIG91dHB1dCBpcyBhIEJPT0wuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX2V2ZW4oY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gIShzbXAtPmRhdGEudWludCAmIDEpOwoJc21wLT50eXBlID0gU01QX1RfQk9PTDsKCXJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICBBbGwgc3VwcG9ydGVkIHNhbXBsZSBmZXRjaCBmdW5jdGlvbnMgbXVzdCBiZSBkZWNsYXJlZCBoZXJlICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogZm9yY2UgVFJVRSB0byBiZSByZXR1cm5lZCBhdCB0aGUgZmV0Y2ggbGV2ZWwgKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfdHJ1ZShjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJc21wLT5kYXRhLnVpbnQgPSAxOwoJcmV0dXJuIDE7Cn0KCi8qIGZvcmNlIEZBTFNFIHRvIGJlIHJldHVybmVkIGF0IHRoZSBmZXRjaCBsZXZlbCAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9mYWxzZShjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJc21wLT5kYXRhLnVpbnQgPSAwOwoJcmV0dXJuIDE7Cn0KCi8qIHJldHJpZXZlIGVudmlyb25tZW50IHZhcmlhYmxlICQxIGFzIGEgc3RyaW5nICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX2Vudihjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CgljaGFyICplbnY7CgoJaWYgKCFhcmdzIHx8IGFyZ3NbMF0udHlwZSAhPSBBUkdUX1NUUikKCQlyZXR1cm4gMDsKCgllbnYgPSBnZXRlbnYoYXJnc1swXS5kYXRhLnN0ci5zdHIpOwoJaWYgKCFlbnYpCgkJcmV0dXJuIDA7CgoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyA9IFNNUF9GX0NPTlNUOwoJc21wLT5kYXRhLnN0ci5zdHIgPSBlbnY7CglzbXAtPmRhdGEuc3RyLmxlbiA9IHN0cmxlbihlbnYpOwoJcmV0dXJuIDE7Cn0KCi8qIHJldHJpZXZlIHRoZSBjdXJyZW50IGxvY2FsIGRhdGUgaW4gZXBvY2ggdGltZSwgYW5kIGFwcGxpZXMgYW4gb3B0aW9uYWwgb2Zmc2V0CiAqIG9mIGFyZ3NbMF0gc2Vjb25kcy4KICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX2RhdGUoY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSBkYXRlLnR2X3NlYzsKCgkvKiBhZGQgb2Zmc2V0ICovCglpZiAoYXJncyAmJiAoYXJnc1swXS50eXBlID09IEFSR1RfU0lOVCB8fCBhcmdzWzBdLnR5cGUgPT0gQVJHVF9VSU5UKSkKCQlzbXAtPmRhdGEudWludCArPSBhcmdzWzBdLmRhdGEuc2ludDsKCglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJc21wLT5mbGFncyB8PSBTTVBfRl9WT0xfVEVTVCB8IFNNUF9GX01BWV9DSEFOR0U7CglyZXR1cm4gMTsKfQoKLyogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9uYnByb2MoY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZGF0YS51aW50ID0gZ2xvYmFsLm5icHJvYzsKCXJldHVybiAxOwp9CgovKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyAoYmV0d2VlbiAxIGFuZCBuYnByb2MgKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfcHJvYyhjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJc21wLT5kYXRhLnVpbnQgPSByZWxhdGl2ZV9waWQ7CglyZXR1cm4gMTsKfQoKLyogZ2VuZXJhdGUgYSByYW5kb20gMzItYml0IGludGVnZXIgZm9yIHdoYXRldmVyIHB1cnBvc2UsIHdpdGggYW4gb3B0aW9uYWwKICogcmFuZ2Ugc3BlY2lmaWVkIGluIGFyZ3VtZW50LgogKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfcmFuZChjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IHJhbmRvbSgpOwoKCS8qIHJlZHVjZSBpZiBuZWVkZWQuIERvbid0IGRvIGEgbW9kdWxvLCB1c2UgYWxsIGJpdHMhICovCglpZiAoYXJncyAmJiBhcmdzWzBdLnR5cGUgPT0gQVJHVF9VSU5UKQoJCXNtcC0+ZGF0YS51aW50ID0gKCh1aW50NjRfdClzbXAtPmRhdGEudWludCAqIGFyZ3NbMF0uZGF0YS51aW50KSAvICgodTY0KVJBTkRfTUFYKzEpOwoKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglzbXAtPmZsYWdzIHw9IFNNUF9GX1ZPTF9URVNUIHwgU01QX0ZfTUFZX0NIQU5HRTsKCXJldHVybiAxOwp9CgovKiByZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBzdG9wcGluZyAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9zdG9wcGluZyhjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJc21wLT5kYXRhLnVpbnQgPSBzdG9wcGluZzsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNtcF9mZXRjaF9jb25zdF9zdHIoY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5mbGFncyB8PSBTTVBfRl9DT05TVDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZGF0YS5zdHIuc3RyID0gYXJnc1swXS5kYXRhLnN0ci5zdHI7CglzbXAtPmRhdGEuc3RyLmxlbiA9IGFyZ3NbMF0uZGF0YS5zdHIubGVuOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc21wX2NoZWNrX2NvbnN0X2Jvb2woc3RydWN0IGFyZyAqYXJncywgY2hhciAqKmVycikKewoJaWYgKHN0cmNhc2VjbXAoYXJnc1swXS5kYXRhLnN0ci5zdHIsICJ0cnVlIikgPT0gMCB8fAoJICAgIHN0cmNhc2VjbXAoYXJnc1swXS5kYXRhLnN0ci5zdHIsICIxIikgPT0gMCkgewoJCWFyZ3NbMF0udHlwZSA9IEFSR1RfVUlOVDsKCQlhcmdzWzBdLmRhdGEudWludCA9IDE7CgkJcmV0dXJuIDE7Cgl9CglpZiAoc3RyY2FzZWNtcChhcmdzWzBdLmRhdGEuc3RyLnN0ciwgImZhbHNlIikgPT0gMCB8fAoJICAgIHN0cmNhc2VjbXAoYXJnc1swXS5kYXRhLnN0ci5zdHIsICIwIikgPT0gMCkgewoJCWFyZ3NbMF0udHlwZSA9IEFSR1RfVUlOVDsKCQlhcmdzWzBdLmRhdGEudWludCA9IDA7CgkJcmV0dXJuIDE7Cgl9CgltZW1wcmludGYoZXJyLCAiRXhwZWN0cyAndHJ1ZScsICdmYWxzZScsICcwJyBvciAnMSciKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNtcF9mZXRjaF9jb25zdF9ib29sKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglzbXAtPmRhdGEudWludCA9IGFyZ3NbMF0uZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc21wX2ZldGNoX2NvbnN0X3VpbnQoY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZGF0YS51aW50ID0gYXJnc1swXS5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzbXBfZmV0Y2hfY29uc3Rfc2ludChjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9TSU5UOwoJc21wLT5kYXRhLnNpbnQgPSBhcmdzWzBdLmRhdGEuc2ludDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNtcF9mZXRjaF9jb25zdF9pcHY0KGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjQ7CglzbXAtPmRhdGEuaXB2NCA9IGFyZ3NbMF0uZGF0YS5pcHY0OwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc21wX2ZldGNoX2NvbnN0X2lwdjYoY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT50eXBlID0gU01QX1RfSVBWNjsKCXNtcC0+ZGF0YS5pcHY2ID0gYXJnc1swXS5kYXRhLmlwdjY7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzbXBfY2hlY2tfY29uc3RfYmluKHN0cnVjdCBhcmcgKmFyZ3MsIGNoYXIgKiplcnIpCnsKCWNoYXIgKmJpbnN0cjsKCWludCBiaW5zdHJsZW47CgoJaWYgKCFwYXJzZV9iaW5hcnkoYXJnc1swXS5kYXRhLnN0ci5zdHIsICZiaW5zdHIsICZiaW5zdHJsZW4sIGVycikpCgkJcmV0dXJuIDA7CglhcmdzWzBdLnR5cGUgPSBBUkdUX1NUUjsKCWFyZ3NbMF0uZGF0YS5zdHIuc3RyID0gYmluc3RyOwoJYXJnc1swXS5kYXRhLnN0ci5sZW4gPSBiaW5zdHJsZW47CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzbXBfZmV0Y2hfY29uc3RfYmluKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZmxhZ3MgfD0gU01QX0ZfQ09OU1Q7CglzbXAtPnR5cGUgPSBTTVBfVF9CSU47CglzbXAtPmRhdGEuc3RyLnN0ciA9IGFyZ3NbMF0uZGF0YS5zdHIuc3RyOwoJc21wLT5kYXRhLnN0ci5sZW4gPSBhcmdzWzBdLmRhdGEuc3RyLmxlbjsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNtcF9jaGVja19jb25zdF9tZXRoKHN0cnVjdCBhcmcgKmFyZ3MsIGNoYXIgKiplcnIpCnsKCWVudW0gaHR0cF9tZXRoX3QgbWV0aDsKCWludCBpOwoKCW1ldGggPSBmaW5kX2h0dHBfbWV0aChhcmdzWzBdLmRhdGEuc3RyLnN0ciwgYXJnc1swXS5kYXRhLnN0ci5sZW4pOwoJaWYgKG1ldGggIT0gSFRUUF9NRVRIX09USEVSKSB7CgkJYXJnc1swXS50eXBlID0gQVJHVF9VSU5UOwoJCWFyZ3NbMF0uZGF0YS51aW50ID0gbWV0aDsKCX0gZWxzZSB7CgkJLyogQ2hlY2sgbWV0aG9kIGF2YWxhaWJpbGl0eS4gQSBtZXRob3MgaXMgYSB0b2tlbiBkZWZpbmVkIGFzIDoKCQkgKiB0Y2hhciA9ICIhIiAvICIjIiAvICIkIiAvICIlIiAvICImIiAvICInIiAvICIqIiAvICIrIiAvICItIiAvICIuIiAvCgkJICogICAgICAgICAiXiIgLyAiXyIgLyAiYCIgLyAifCIgLyAifiIgLyBESUdJVCAvIEFMUEhBCgkJICogdG9rZW4gPSAxKnRjaGFyCgkJICovCgkJZm9yIChpID0gMDsgaSA8IGFyZ3NbMF0uZGF0YS5zdHIubGVuOyBpKyspIHsKCQkJaWYgKCFodHRwX2lzX3Rva2VuWyh1bnNpZ25lZCBjaGFyKWFyZ3NbMF0uZGF0YS5zdHIuc3RyW2ldXSkgewoJCQkJbWVtcHJpbnRmKGVyciwgImV4cGVjdHMgdmFsaWQgbWV0aG9kLiIpOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQl9Cgl9CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzbXBfZmV0Y2hfY29uc3RfbWV0aChjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9NRVRIOwoJaWYgKGFyZ3NbMF0udHlwZSA9PSBBUkdUX1VJTlQpIHsKCQlzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCQlzbXAtPmRhdGEubWV0aC5tZXRoID0gYXJnc1swXS5kYXRhLnVpbnQ7CgkJc21wLT5kYXRhLm1ldGguc3RyLnN0ciA9ICIiOwoJCXNtcC0+ZGF0YS5tZXRoLnN0ci5sZW4gPSAwOwoJfSBlbHNlIHsKCQlzbXAtPmZsYWdzIHw9IFNNUF9GX0NPTlNUOwoJCXNtcC0+ZGF0YS5tZXRoLm1ldGggPSBIVFRQX01FVEhfT1RIRVI7CgkJc21wLT5kYXRhLm1ldGguc3RyLnN0ciA9IGFyZ3NbMF0uZGF0YS5zdHIuc3RyOwoJCXNtcC0+ZGF0YS5tZXRoLnN0ci5sZW4gPSBhcmdzWzBdLmRhdGEuc3RyLmxlbjsKCX0KCXJldHVybiAxOwp9CgovKiBOb3RlOiBtdXN0IG5vdCBiZSBkZWNsYXJlZCA8Y29uc3Q+IGFzIGl0cyBsaXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCiAqIE5vdGU6IGZldGNoZXMgdGhhdCBtYXkgcmV0dXJuIG11bHRpcGxlIHR5cGVzIG11c3QgYmUgZGVjbGFyZWQgYXMgdGhlIGxvd2VzdAogKiBjb21tb24gZGVub21pbmF0b3IsIHRoZSB0eXBlIHRoYXQgY2FuIGJlIGNhc3RlZCBpbnRvIGFsbCBvdGhlciBvbmVzLiBGb3IKICogaW5zdGFuY2UgSVB2NC9JUHY2IG11c3QgYmUgZGVjbGFyZWQgSVB2NC4KICovCnN0YXRpYyBzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3Qgc21wX2t3cyA9IHtJTEgsIHsKCXsgImFsd2F5c19mYWxzZSIsIHNtcF9mZXRjaF9mYWxzZSwgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9CT09MLCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJhbHdheXNfdHJ1ZSIsICBzbXBfZmV0Y2hfdHJ1ZSwgIDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfQk9PTCwgU01QX1VTRV9JTlRSTiB9LAoJeyAiZW52IiwgICAgICAgICAgc21wX2ZldGNoX2VudiwgICBBUkcxKDEsU1RSKSwgIE5VTEwsIFNNUF9UX1NUUiwgIFNNUF9VU0VfSU5UUk4gfSwKCXsgImRhdGUiLCAgICAgICAgIHNtcF9mZXRjaF9kYXRlLCAgQVJHMSgwLFNJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJuYnByb2MiLCAgICAgICBzbXBfZmV0Y2hfbmJwcm9jLDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfVUlOVCwgU01QX1VTRV9JTlRSTiB9LAoJeyAicHJvYyIsICAgICAgICAgc21wX2ZldGNoX3Byb2MsICAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9VU0VfSU5UUk4gfSwKCXsgInJhbmQiLCAgICAgICAgIHNtcF9mZXRjaF9yYW5kLCAgQVJHMSgwLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJzdG9wcGluZyIsICAgICBzbXBfZmV0Y2hfc3RvcHBpbmcsIDAsICAgICAgICAgTlVMTCwgU01QX1RfQk9PTCwgU01QX1VTRV9JTlRSTiB9LAoKCXsgInN0ciIsICBzbXBfZmV0Y2hfY29uc3Rfc3RyLCAgQVJHMSgxLFNUUiksICBOVUxMICAgICAgICAgICAgICAgICwgU01QX1RfU1RSLCAgU01QX1VTRV9JTlRSTiB9LAoJeyAiYm9vbCIsIHNtcF9mZXRjaF9jb25zdF9ib29sLCBBUkcxKDEsU1RSKSwgIHNtcF9jaGVja19jb25zdF9ib29sLCBTTVBfVF9CT09MLCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJ1aW50Iiwgc21wX2ZldGNoX2NvbnN0X3VpbnQsIEFSRzEoMSxVSU5UKSwgTlVMTCAgICAgICAgICAgICAgICAsIFNNUF9UX1VJTlQsIFNNUF9VU0VfSU5UUk4gfSwKCXsgInNpbnQiLCBzbXBfZmV0Y2hfY29uc3Rfc2ludCwgQVJHMSgxLFNJTlQpLCBOVUxMICAgICAgICAgICAgICAgICwgU01QX1RfU0lOVCwgU01QX1VTRV9JTlRSTiB9LAoJeyAiaXB2NCIsIHNtcF9mZXRjaF9jb25zdF9pcHY0LCBBUkcxKDEsSVBWNCksIE5VTEwgICAgICAgICAgICAgICAgLCBTTVBfVF9JUFY0LCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJpcHY2Iiwgc21wX2ZldGNoX2NvbnN0X2lwdjYsIEFSRzEoMSxJUFY2KSwgTlVMTCAgICAgICAgICAgICAgICAsIFNNUF9UX0lQVjYsIFNNUF9VU0VfSU5UUk4gfSwKCXsgImJpbiIsICBzbXBfZmV0Y2hfY29uc3RfYmluLCAgQVJHMSgxLFNUUiksICBzbXBfY2hlY2tfY29uc3RfYmluICwgU01QX1RfQklOLCAgU01QX1VTRV9JTlRSTiB9LAoJeyAibWV0aCIsIHNtcF9mZXRjaF9jb25zdF9tZXRoLCBBUkcxKDEsU1RSKSwgIHNtcF9jaGVja19jb25zdF9tZXRoLCBTTVBfVF9NRVRILCBTTVBfVVNFX0lOVFJOIH0sCgoJeyAvKiBFTkQgKi8gfSwKfX07CgovKiBOb3RlOiBtdXN0IG5vdCBiZSBkZWNsYXJlZCA8Y29uc3Q+IGFzIGl0cyBsaXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0IHNhbXBsZV9jb252X2t3cyA9IHtJTEgsIHsKI2lmZGVmIERFQlVHX0VYUFIKCXsgImRlYnVnIiwgIHNhbXBsZV9jb252X2RlYnVnLCAgICAgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9BTlksICBTTVBfVF9BTlkgIH0sCiNlbmRpZgoKCXsgImJhc2U2NCIsIHNhbXBsZV9jb252X2JpbjJiYXNlNjQsMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9TVFIgIH0sCgl7ICJ1cHBlciIsICBzYW1wbGVfY29udl9zdHIydXBwZXIsIDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfU1RSLCAgU01QX1RfU1RSICB9LAoJeyAibG93ZXIiLCAgc2FtcGxlX2NvbnZfc3RyMmxvd2VyLCAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX1NUUiwgIFNNUF9UX1NUUiAgfSwKCXsgImhleCIsICAgIHNhbXBsZV9jb252X2JpbjJoZXgsICAgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9TVFIgIH0sCgl7ICJpcG1hc2siLCBzYW1wbGVfY29udl9pcG1hc2ssICAgIEFSRzEoMSxNU0s0KSwgTlVMTCwgU01QX1RfSVBWNCwgU01QX1RfSVBWNCB9LAoJeyAibHRpbWUiLCAgc2FtcGxlX2NvbnZfbHRpbWUsICAgICBBUkcyKDEsU1RSLFNJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9TVFIgfSwKCXsgInV0aW1lIiwgIHNhbXBsZV9jb252X3V0aW1lLCAgICAgQVJHMigxLFNUUixTSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfU1RSIH0sCgl7ICJjcmMzMiIsICBzYW1wbGVfY29udl9jcmMzMiwgICAgIEFSRzEoMCxVSU5UKSwgTlVMTCwgU01QX1RfQklOLCAgU01QX1RfVUlOVCB9LAoJeyAiZGpiMiIsICAgc2FtcGxlX2NvbnZfZGpiMiwgICAgICBBUkcxKDAsVUlOVCksIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1VJTlQgfSwKCXsgInNkYm0iLCAgIHNhbXBsZV9jb252X3NkYm0sICAgICAgQVJHMSgwLFVJTlQpLCBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9VSU5UIH0sCgl7ICJ3dDYiLCAgICBzYW1wbGVfY29udl93dDYsICAgICAgIEFSRzEoMCxVSU5UKSwgTlVMTCwgU01QX1RfQklOLCAgU01QX1RfVUlOVCB9LAoJeyAianNvbiIsICAgc2FtcGxlX2NvbnZfanNvbiwgICAgICBBUkcxKDEsU1RSKSwgIHNhbXBsZV9jb252X2pzb25fY2hlY2ssIFNNUF9UX1NUUiwgIFNNUF9UX1NUUiB9LAoJeyAiYnl0ZXMiLCAgc2FtcGxlX2NvbnZfYnl0ZXMsICAgICBBUkcyKDEsVUlOVCxVSU5UKSwgTlVMTCwgU01QX1RfQklOLCAgU01QX1RfQklOIH0sCgl7ICJmaWVsZCIsICBzYW1wbGVfY29udl9maWVsZCwgICAgIEFSRzIoMixVSU5ULFNUUiksIHNhbXBsZV9jb252X2ZpZWxkX2NoZWNrLCBTTVBfVF9TVFIsICBTTVBfVF9TVFIgfSwKCXsgIndvcmQiLCAgIHNhbXBsZV9jb252X3dvcmQsICAgICAgQVJHMigyLFVJTlQsU1RSKSwgc2FtcGxlX2NvbnZfZmllbGRfY2hlY2ssIFNNUF9UX1NUUiwgIFNNUF9UX1NUUiB9LAoJeyAicmVnc3ViIiwgc2FtcGxlX2NvbnZfcmVnc3ViLCAgICBBUkczKDIsUkVHLFNUUixTVFIpLCBzYW1wbGVfY29udl9yZWdzdWJfY2hlY2ssIFNNUF9UX1NUUiwgU01QX1RfU1RSIH0sCgoJeyAiYW5kIiwgICAgc2FtcGxlX2NvbnZfYmluYXJ5X2FuZCwgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJvciIsICAgICBzYW1wbGVfY29udl9iaW5hcnlfb3IsICBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgInhvciIsICAgIHNhbXBsZV9jb252X2JpbmFyeV94b3IsIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAiY3BsIiwgICAgc2FtcGxlX2NvbnZfYmluYXJ5X2NwbCwgICAgICAgICAgICAwLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJib29sIiwgICBzYW1wbGVfY29udl9hcml0aF9ib29sLCAgICAgICAgICAgIDAsIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX0JPT0wgfSwKCXsgIm5vdCIsICAgIHNhbXBsZV9jb252X2FyaXRoX25vdCwgICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfQk9PTCB9LAoJeyAib2RkIiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfb2RkLCAgICAgICAgICAgICAwLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9CT09MIH0sCgl7ICJldmVuIiwgICBzYW1wbGVfY29udl9hcml0aF9ldmVuLCAgICAgICAgICAgIDAsIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX0JPT0wgfSwKCXsgImFkZCIsICAgIHNhbXBsZV9jb252X2FyaXRoX2FkZCwgIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAic3ViIiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfc3ViLCAgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJtdWwiLCAgICBzYW1wbGVfY29udl9hcml0aF9tdWwsICBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgImRpdiIsICAgIHNhbXBsZV9jb252X2FyaXRoX2RpdiwgIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAibW9kIiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfbW9kLCAgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJuZWciLCAgICBzYW1wbGVfY29udl9hcml0aF9uZWcsICAgICAgICAgICAgIDAsIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCgl7IE5VTEwsIE5VTEwsIDAsIDAsIDAgfSwKfX07CgpfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpCnN0YXRpYyB2b2lkIF9fc2FtcGxlX2luaXQodm9pZCkKewoJLyogcmVnaXN0ZXIgc2FtcGxlIGZldGNoIGFuZCBmb3JtYXQgY29udmVyc2lvbiBrZXl3b3JkcyAqLwoJc2FtcGxlX3JlZ2lzdGVyX2ZldGNoZXMoJnNtcF9rd3MpOwoJc2FtcGxlX3JlZ2lzdGVyX2NvbnZzKCZzYW1wbGVfY29udl9rd3MpOwp9Cg==