LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBEYXRlICYgVGltZSBzdXBwb3J0IGZvciB0aGUgYnVpbHQtaW4gU2Ftc3VuZyBTM0MyNFgwIFJUQwogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KCiNpZiBkZWZpbmVkKENPTkZJR19SVENfUzNDMjRYMCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKCiNpZiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKQojaW5jbHVkZSA8czNjMjQwMC5oPgojZWxpZiBkZWZpbmVkKENPTkZJR19TM0MyNDEwKQojaW5jbHVkZSA8czNjMjQxMC5oPgojZW5kaWYKCiNpbmNsdWRlIDxydGMuaD4KCi8qI2RlZmluZQlERUJVRyovCgp0eXBlZGVmIGVudW0gewoJUlRDX0VOQUJMRSwKCVJUQ19ESVNBQkxFCn0gUlRDX0FDQ0VTUzsKCgpzdGF0aWMgaW5saW5lIHZvaWQgU2V0UlRDX0FjY2VzcyhSVENfQUNDRVNTIGEpCnsKCVMzQzI0WDBfUlRDICogY29uc3QgcnRjID0gUzNDMjRYMF9HZXRCYXNlX1JUQygpOwoJc3dpdGNoIChhKSB7CgkJY2FzZSBSVENfRU5BQkxFOgoJCQlydGMtPlJUQ0NPTiB8PSAweDAxOyBicmVhazsKCgkJY2FzZSBSVENfRElTQUJMRToKCQkJcnRjLT5SVENDT04gJj0gfjB4MDE7IGJyZWFrOwoJfQp9CgpzdGF0aWMgdW5zaWduZWQgYmNkMmJpbiAodWNoYXIgbikKewoJcmV0dXJuICgoKChuID4+IDQpICYgMHgwRikgKiAxMCkgKyAobiAmIDB4MEYpKTsKfQoKc3RhdGljIHVuc2lnbmVkIGNoYXIgYmluMmJjZCAodW5zaWduZWQgaW50IG4pCnsKCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgp2b2lkIHJ0Y19nZXQgKHN0cnVjdCBydGNfdGltZSAqdG1wKQp7CglTM0MyNFgwX1JUQyAqIGNvbnN0IHJ0YyA9IFMzQzI0WDBfR2V0QmFzZV9SVEMoKTsKCXVjaGFyIHNlYywgbWluLCBob3VyLCBtZGF5LCB3ZGF5LCBtb24sIHllYXI7Cgl1Y2hhciBhX3NlYyxhX21pbiwgYV9ob3VyLCBhX2RhdGUsIGFfbW9uLCBhX3llYXIsIGFfYXJtZWQ7CgoJLyogZW5hYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCglTZXRSVENfQWNjZXNzKFJUQ19FTkFCTEUpOwoKCS8qIHJlYWQgUlRDIHJlZ2lzdGVycyAqLwoJc2VjCT0gcnRjLT5CQ0RTRUM7CgltaW4JPSBydGMtPkJDRE1JTjsKCWhvdXIJPSBydGMtPkJDREhPVVI7CgltZGF5CT0gcnRjLT5CQ0REQVRFOwoJd2RheQk9IHJ0Yy0+QkNEREFZOwoJbW9uCT0gcnRjLT5CQ0RNT047Cgl5ZWFyCT0gcnRjLT5CQ0RZRUFSOwoKCS8qIHJlYWQgQUxBUk0gcmVnaXN0ZXJzICovCglhX3NlYwk9IHJ0Yy0+QUxNU0VDOwoJYV9taW4JPSBydGMtPkFMTU1JTjsKCWFfaG91cgk9IHJ0Yy0+QUxNSE9VUjsKCWFfZGF0ZQk9IHJ0Yy0+QUxNREFURTsKCWFfbW9uCT0gcnRjLT5BTE1NT047CglhX3llYXIJPSBydGMtPkFMTVlFQVI7CglhX2FybWVkCT0gcnRjLT5SVENBTE07CgoJLyogZGlzYWJsZSBhY2Nlc3MgdG8gUlRDIHJlZ2lzdGVycyAqLwoJU2V0UlRDX0FjY2VzcyhSVENfRElTQUJMRSk7CgojaWZkZWYgUlRDX0RFQlVHCglwcmludGYgKCAiR2V0IFJUQyB5ZWFyOiAlMDJ4IG1vbi9jZW50OiAlMDJ4IG1kYXk6ICUwMnggd2RheTogJTAyeCAiCgkJImhyOiAlMDJ4IG1pbjogJTAyeCBzZWM6ICUwMnhcbiIsCgkJeWVhciwgbW9uLCBtZGF5LCB3ZGF5LAoJCWhvdXIsIG1pbiwgc2VjKTsKCXByaW50ZiAoICJBbGFybXM6ICUwMng6IHllYXI6ICUwMnggbW9udGg6ICUwMnggZGF0ZTogJTAyeCBob3VyOiAlMDJ4IG1pbjogJTAyeCBzZWM6ICUwMnhcbiIsCgkJYV9hcm1lZCwKCQlhX3llYXIsIGFfbW9uLCBhX2RhdGUsCgkJYV9ob3VyLCBhX21pbiwgYV9zZWMpOwojZW5kaWYKCgl0bXAtPnRtX3NlYyAgPSBiY2QyYmluKHNlYyAgJiAweDdGKTsKCXRtcC0+dG1fbWluICA9IGJjZDJiaW4obWluICAmIDB4N0YpOwoJdG1wLT50bV9ob3VyID0gYmNkMmJpbihob3VyICYgMHgzRik7Cgl0bXAtPnRtX21kYXkgPSBiY2QyYmluKG1kYXkgJiAweDNGKTsKCXRtcC0+dG1fbW9uICA9IGJjZDJiaW4obW9uICYgMHgxRik7Cgl0bXAtPnRtX3llYXIgPSBiY2QyYmluKHllYXIpOwoJdG1wLT50bV93ZGF5ID0gYmNkMmJpbih3ZGF5ICYgMHgwNyk7CglpZih0bXAtPnRtX3llYXI8NzApCgkJdG1wLT50bV95ZWFyKz0yMDAwOwoJZWxzZQoJCXRtcC0+dG1feWVhcis9MTkwMDsKCXRtcC0+dG1feWRheSA9IDA7Cgl0bXAtPnRtX2lzZHN0PSAwOwojaWZkZWYgUlRDX0RFQlVHCglwcmludGYgKCAiR2V0IERBVEU6ICU0ZC0lMDJkLSUwMmQgKHdkYXk9JWQpICBUSU1FOiAlMmQ6JTAyZDolMDJkXG4iLAoJCXRtcC0+dG1feWVhciwgdG1wLT50bV9tb24sIHRtcC0+dG1fbWRheSwgdG1wLT50bV93ZGF5LAoJCXRtcC0+dG1faG91ciwgdG1wLT50bV9taW4sIHRtcC0+dG1fc2VjKTsKI2VuZGlmCn0KCnZvaWQgcnRjX3NldCAoc3RydWN0IHJ0Y190aW1lICp0bXApCnsKCVMzQzI0WDBfUlRDICogY29uc3QgcnRjID0gUzNDMjRYMF9HZXRCYXNlX1JUQygpOwoJdWNoYXIgc2VjLCBtaW4sIGhvdXIsIG1kYXksIHdkYXksIG1vbiwgeWVhcjsKCiNpZmRlZiBSVENfREVCVUcKCXByaW50ZiAoICJTZXQgREFURTogJTRkLSUwMmQtJTAyZCAod2RheT0lZCkgIFRJTUU6ICUyZDolMDJkOiUwMmRcbiIsCgkJdG1wLT50bV95ZWFyLCB0bXAtPnRtX21vbiwgdG1wLT50bV9tZGF5LCB0bXAtPnRtX3dkYXksCgkJdG1wLT50bV9ob3VyLCB0bXAtPnRtX21pbiwgdG1wLT50bV9zZWMpOwojZW5kaWYKCXllYXIJPSBiaW4yYmNkKHRtcC0+dG1feWVhciAlIDEwMCk7Cgltb24JPSBiaW4yYmNkKHRtcC0+dG1fbW9uKTsKCXdkYXkJPSBiaW4yYmNkKHRtcC0+dG1fd2RheSk7CgltZGF5CT0gYmluMmJjZCh0bXAtPnRtX21kYXkpOwoJaG91cgk9IGJpbjJiY2QodG1wLT50bV9ob3VyKTsKCW1pbgk9IGJpbjJiY2QodG1wLT50bV9taW4pOwoJc2VjCT0gYmluMmJjZCh0bXAtPnRtX3NlYyk7CgoJLyogZW5hYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCglTZXRSVENfQWNjZXNzKFJUQ19FTkFCTEUpOwoKCS8qIHdyaXRlIFJUQyByZWdpc3RlcnMgKi8KCXJ0Yy0+QkNEU0VDCT0gc2VjOwoJcnRjLT5CQ0RNSU4JPSBtaW47CglydGMtPkJDREhPVVIJPSBob3VyOwoJcnRjLT5CQ0REQVRFCT0gbWRheTsKCXJ0Yy0+QkNEREFZCT0gd2RheTsKCXJ0Yy0+QkNETU9OCT0gbW9uOwoJcnRjLT5CQ0RZRUFSCT0geWVhcjsKCgkvKiBkaXNhYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCglTZXRSVENfQWNjZXNzKFJUQ19ESVNBQkxFKTsKfQoKdm9pZCBydGNfcmVzZXQgKHZvaWQpCnsKCVMzQzI0WDBfUlRDICogY29uc3QgcnRjID0gUzNDMjRYMF9HZXRCYXNlX1JUQygpOwoKCXJ0Yy0+UlRDQ09OID0gKHJ0Yy0+UlRDQ09OICYgfjB4MDYpIHwgMHgwODsKCXJ0Yy0+UlRDQ09OICY9IH4weDA4Owp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZW5kaWYJLyogQ09ORklHX1JUQ19TM0MyNFgwICYmIENGR19DTURfREFURSAqLwo=