LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBEYXRlICYgVGltZSBzdXBwb3J0IGZvciB0aGUgYnVpbHQtaW4gU2Ftc3VuZyBTM0MyNFgwIFJUQwogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KCiNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpKQoKI2lmIGRlZmluZWQoQ09ORklHX1MzQzI0MDApCiNpbmNsdWRlIDxzM2MyNDAwLmg+CiNlbGlmIGRlZmluZWQoQ09ORklHX1MzQzI0MTApCiNpbmNsdWRlIDxzM2MyNDEwLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHJ0Yy5oPgoKLyojZGVmaW5lCURFQlVHKi8KCnR5cGVkZWYgZW51bSB7CglSVENfRU5BQkxFLAoJUlRDX0RJU0FCTEUKfSBSVENfQUNDRVNTOwoKCnN0YXRpYyBpbmxpbmUgdm9pZCBTZXRSVENfQWNjZXNzKFJUQ19BQ0NFU1MgYSkKewoJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7Cglzd2l0Y2ggKGEpIHsKCQljYXNlIFJUQ19FTkFCTEU6CgkJCXJ0Yy0+UlRDQ09OIHw9IDB4MDE7IGJyZWFrOwoKCQljYXNlIFJUQ19ESVNBQkxFOgoJCQlydGMtPlJUQ0NPTiAmPSB+MHgwMTsgYnJlYWs7Cgl9Cn0KCnN0YXRpYyB1bnNpZ25lZCBiY2QyYmluICh1Y2hhciBuKQp7CglyZXR1cm4gKCgoKG4gPj4gNCkgJiAweDBGKSAqIDEwKSArIChuICYgMHgwRikpOwp9CgpzdGF0aWMgdW5zaWduZWQgY2hhciBiaW4yYmNkICh1bnNpZ25lZCBpbnQgbikKewoJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmludCBydGNfZ2V0IChzdHJ1Y3QgcnRjX3RpbWUgKnRtcCkKewoJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7Cgl1Y2hhciBzZWMsIG1pbiwgaG91ciwgbWRheSwgd2RheSwgbW9uLCB5ZWFyOwoJdWNoYXIgYV9zZWMsYV9taW4sIGFfaG91ciwgYV9kYXRlLCBhX21vbiwgYV95ZWFyLCBhX2FybWVkOwoKCS8qIGVuYWJsZSBhY2Nlc3MgdG8gUlRDIHJlZ2lzdGVycyAqLwoJU2V0UlRDX0FjY2VzcyhSVENfRU5BQkxFKTsKCgkvKiByZWFkIFJUQyByZWdpc3RlcnMgKi8KCWRvIHsKCQlzZWMJPSBydGMtPkJDRFNFQzsKCQltaW4JPSBydGMtPkJDRE1JTjsKCQlob3VyCT0gcnRjLT5CQ0RIT1VSOwoJCW1kYXkJPSBydGMtPkJDRERBVEU7CgkJd2RheQk9IHJ0Yy0+QkNEREFZOwoJCW1vbgk9IHJ0Yy0+QkNETU9OOwoJCXllYXIJPSBydGMtPkJDRFlFQVI7Cgl9IHdoaWxlIChzZWMgIT0gcnRjLT5CQ0RTRUMpOwoKCS8qIHJlYWQgQUxBUk0gcmVnaXN0ZXJzICovCglhX3NlYwk9IHJ0Yy0+QUxNU0VDOwoJYV9taW4JPSBydGMtPkFMTU1JTjsKCWFfaG91cgk9IHJ0Yy0+QUxNSE9VUjsKCWFfZGF0ZQk9IHJ0Yy0+QUxNREFURTsKCWFfbW9uCT0gcnRjLT5BTE1NT047CglhX3llYXIJPSBydGMtPkFMTVlFQVI7CglhX2FybWVkCT0gcnRjLT5SVENBTE07CgoJLyogZGlzYWJsZSBhY2Nlc3MgdG8gUlRDIHJlZ2lzdGVycyAqLwoJU2V0UlRDX0FjY2VzcyhSVENfRElTQUJMRSk7CgojaWZkZWYgUlRDX0RFQlVHCglwcmludGYgKCAiR2V0IFJUQyB5ZWFyOiAlMDJ4IG1vbi9jZW50OiAlMDJ4IG1kYXk6ICUwMnggd2RheTogJTAyeCAiCgkJImhyOiAlMDJ4IG1pbjogJTAyeCBzZWM6ICUwMnhcbiIsCgkJeWVhciwgbW9uLCBtZGF5LCB3ZGF5LAoJCWhvdXIsIG1pbiwgc2VjKTsKCXByaW50ZiAoICJBbGFybXM6ICUwMng6IHllYXI6ICUwMnggbW9udGg6ICUwMnggZGF0ZTogJTAyeCBob3VyOiAlMDJ4IG1pbjogJTAyeCBzZWM6ICUwMnhcbiIsCgkJYV9hcm1lZCwKCQlhX3llYXIsIGFfbW9uLCBhX2RhdGUsCgkJYV9ob3VyLCBhX21pbiwgYV9zZWMpOwojZW5kaWYKCgl0bXAtPnRtX3NlYyAgPSBiY2QyYmluKHNlYyAgJiAweDdGKTsKCXRtcC0+dG1fbWluICA9IGJjZDJiaW4obWluICAmIDB4N0YpOwoJdG1wLT50bV9ob3VyID0gYmNkMmJpbihob3VyICYgMHgzRik7Cgl0bXAtPnRtX21kYXkgPSBiY2QyYmluKG1kYXkgJiAweDNGKTsKCXRtcC0+dG1fbW9uICA9IGJjZDJiaW4obW9uICYgMHgxRik7Cgl0bXAtPnRtX3llYXIgPSBiY2QyYmluKHllYXIpOwoJdG1wLT50bV93ZGF5ID0gYmNkMmJpbih3ZGF5ICYgMHgwNyk7CglpZih0bXAtPnRtX3llYXI8NzApCgkJdG1wLT50bV95ZWFyKz0yMDAwOwoJZWxzZQoJCXRtcC0+dG1feWVhcis9MTkwMDsKCXRtcC0+dG1feWRheSA9IDA7Cgl0bXAtPnRtX2lzZHN0PSAwOwojaWZkZWYgUlRDX0RFQlVHCglwcmludGYgKCAiR2V0IERBVEU6ICU0ZC0lMDJkLSUwMmQgKHdkYXk9JWQpICBUSU1FOiAlMmQ6JTAyZDolMDJkXG4iLAoJCXRtcC0+dG1feWVhciwgdG1wLT50bV9tb24sIHRtcC0+dG1fbWRheSwgdG1wLT50bV93ZGF5LAoJCXRtcC0+dG1faG91ciwgdG1wLT50bV9taW4sIHRtcC0+dG1fc2VjKTsKI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCmludCBydGNfc2V0IChzdHJ1Y3QgcnRjX3RpbWUgKnRtcCkKewoJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7Cgl1Y2hhciBzZWMsIG1pbiwgaG91ciwgbWRheSwgd2RheSwgbW9uLCB5ZWFyOwoKI2lmZGVmIFJUQ19ERUJVRwoJcHJpbnRmICggIlNldCBEQVRFOiAlNGQtJTAyZC0lMDJkICh3ZGF5PSVkKSAgVElNRTogJTJkOiUwMmQ6JTAyZFxuIiwKCQl0bXAtPnRtX3llYXIsIHRtcC0+dG1fbW9uLCB0bXAtPnRtX21kYXksIHRtcC0+dG1fd2RheSwKCQl0bXAtPnRtX2hvdXIsIHRtcC0+dG1fbWluLCB0bXAtPnRtX3NlYyk7CiNlbmRpZgoJeWVhcgk9IGJpbjJiY2QodG1wLT50bV95ZWFyICUgMTAwKTsKCW1vbgk9IGJpbjJiY2QodG1wLT50bV9tb24pOwoJd2RheQk9IGJpbjJiY2QodG1wLT50bV93ZGF5KTsKCW1kYXkJPSBiaW4yYmNkKHRtcC0+dG1fbWRheSk7Cglob3VyCT0gYmluMmJjZCh0bXAtPnRtX2hvdXIpOwoJbWluCT0gYmluMmJjZCh0bXAtPnRtX21pbik7CglzZWMJPSBiaW4yYmNkKHRtcC0+dG1fc2VjKTsKCgkvKiBlbmFibGUgYWNjZXNzIHRvIFJUQyByZWdpc3RlcnMgKi8KCVNldFJUQ19BY2Nlc3MoUlRDX0VOQUJMRSk7CgoJLyogd3JpdGUgUlRDIHJlZ2lzdGVycyAqLwoJcnRjLT5CQ0RTRUMJPSBzZWM7CglydGMtPkJDRE1JTgk9IG1pbjsKCXJ0Yy0+QkNESE9VUgk9IGhvdXI7CglydGMtPkJDRERBVEUJPSBtZGF5OwoJcnRjLT5CQ0REQVkJPSB3ZGF5OwoJcnRjLT5CQ0RNT04JPSBtb247CglydGMtPkJDRFlFQVIJPSB5ZWFyOwoKCS8qIGRpc2FibGUgYWNjZXNzIHRvIFJUQyByZWdpc3RlcnMgKi8KCVNldFJUQ19BY2Nlc3MoUlRDX0RJU0FCTEUpOwoKCXJldHVybiAwOwp9Cgp2b2lkIHJ0Y19yZXNldCAodm9pZCkKewoJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7CgoJcnRjLT5SVENDT04gPSAocnRjLT5SVENDT04gJiB+MHgwNikgfCAweDA4OwoJcnRjLT5SVENDT04gJj0gfigweDA4fDB4MDEpOwp9CgojZW5kaWYK