LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBEYXRlICYgVGltZSBzdXBwb3J0IGZvciB0aGUgYnVpbHQtaW4gU2Ftc3VuZyBTM0MyNFgwIFJUQwogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KCiNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpKQoKI2lmIGRlZmluZWQoQ09ORklHX1MzQzI0MDApCiNpbmNsdWRlIDxzM2MyNDAwLmg+CiNlbGlmIGRlZmluZWQoQ09ORklHX1MzQzI0MTApCiNpbmNsdWRlIDxzM2MyNDEwLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHJ0Yy5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CgovKiNkZWZpbmUJREVCVUcqLwoKdHlwZWRlZiBlbnVtIHsKCVJUQ19FTkFCTEUsCglSVENfRElTQUJMRQp9IFJUQ19BQ0NFU1M7CgoKc3RhdGljIGlubGluZSB2b2lkIFNldFJUQ19BY2Nlc3MoUlRDX0FDQ0VTUyBhKQp7CglzdHJ1Y3QgczNjMjR4MF9ydGMgKnJ0YyA9IHMzYzI0eDBfZ2V0X2Jhc2VfcnRjKCk7CgoJc3dpdGNoIChhKSB7CgljYXNlIFJUQ19FTkFCTEU6CgkJd3JpdGViKHJlYWRiKCZydGMtPlJUQ0NPTikgfCAweDAxLCAmcnRjLT5SVENDT04pOwoJCWJyZWFrOwoKCWNhc2UgUlRDX0RJU0FCTEU6CgkJd3JpdGViKHJlYWRiKCZydGMtPlJUQ0NPTikgJiB+MHgwMSwgJnJ0Yy0+UlRDQ09OKTsKCQlicmVhazsKCX0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW50IHJ0Y19nZXQoc3RydWN0IHJ0Y190aW1lICp0bXApCnsKCXN0cnVjdCBzM2MyNHgwX3J0YyAqcnRjID0gczNjMjR4MF9nZXRfYmFzZV9ydGMoKTsKCXVjaGFyIHNlYywgbWluLCBob3VyLCBtZGF5LCB3ZGF5LCBtb24sIHllYXI7Cgl1Y2hhciBhX3NlYywgYV9taW4sIGFfaG91ciwgYV9kYXRlLCBhX21vbiwgYV95ZWFyLCBhX2FybWVkOwoKCS8qIGVuYWJsZSBhY2Nlc3MgdG8gUlRDIHJlZ2lzdGVycyAqLwoJU2V0UlRDX0FjY2VzcyhSVENfRU5BQkxFKTsKCgkvKiByZWFkIFJUQyByZWdpc3RlcnMgKi8KCWRvIHsKCQlzZWMgID0gcmVhZGIoJnJ0Yy0+QkNEU0VDKTsKCQltaW4gID0gcmVhZGIoJnJ0Yy0+QkNETUlOKTsKCQlob3VyID0gcmVhZGIoJnJ0Yy0+QkNESE9VUik7CgkJbWRheSA9IHJlYWRiKCZydGMtPkJDRERBVEUpOwoJCXdkYXkgPSByZWFkYigmcnRjLT5CQ0REQVkpOwoJCW1vbiAgPSByZWFkYigmcnRjLT5CQ0RNT04pOwoJCXllYXIgPSByZWFkYigmcnRjLT5CQ0RZRUFSKTsKCX0gd2hpbGUgKHNlYyAhPSByZWFkYigmcnRjLT5CQ0RTRUMpKTsKCgkvKiByZWFkIEFMQVJNIHJlZ2lzdGVycyAqLwoJYV9zZWMgICA9IHJlYWRiKCZydGMtPkFMTVNFQyk7CglhX21pbiAgID0gcmVhZGIoJnJ0Yy0+QUxNTUlOKTsKCWFfaG91ciAgPSByZWFkYigmcnRjLT5BTE1IT1VSKTsKCWFfZGF0ZSAgPSByZWFkYigmcnRjLT5BTE1EQVRFKTsKCWFfbW9uICAgPSByZWFkYigmcnRjLT5BTE1NT04pOwoJYV95ZWFyICA9IHJlYWRiKCZydGMtPkFMTVlFQVIpOwoJYV9hcm1lZCA9IHJlYWRiKCZydGMtPlJUQ0FMTSk7CgoJLyogZGlzYWJsZSBhY2Nlc3MgdG8gUlRDIHJlZ2lzdGVycyAqLwoJU2V0UlRDX0FjY2VzcyhSVENfRElTQUJMRSk7CgojaWZkZWYgUlRDX0RFQlVHCglwcmludGYoIkdldCBSVEMgeWVhcjogJTAyeCBtb24vY2VudDogJTAyeCBtZGF5OiAlMDJ4IHdkYXk6ICUwMnggIgoJICAgICAgICJocjogJTAyeCBtaW46ICUwMnggc2VjOiAlMDJ4XG4iLAoJICAgICAgIHllYXIsIG1vbiwgbWRheSwgd2RheSwgaG91ciwgbWluLCBzZWMpOwoJcHJpbnRmKCJBbGFybXM6ICUwMng6IHllYXI6ICUwMnggbW9udGg6ICUwMnggZGF0ZTogJTAyeCBob3VyOiAiCgkgICAgICAgIiUwMnggbWluOiAlMDJ4IHNlYzogJTAyeFxuIiwKCSAgICAgICBhX2FybWVkLCBhX3llYXIsIGFfbW9uLCBhX2RhdGUsIGFfaG91ciwgYV9taW4sIGFfc2VjKTsKI2VuZGlmCgoJdG1wLT50bV9zZWMgID0gYmNkMmJpbihzZWMgJiAweDdGKTsKCXRtcC0+dG1fbWluICA9IGJjZDJiaW4obWluICYgMHg3Rik7Cgl0bXAtPnRtX2hvdXIgPSBiY2QyYmluKGhvdXIgJiAweDNGKTsKCXRtcC0+dG1fbWRheSA9IGJjZDJiaW4obWRheSAmIDB4M0YpOwoJdG1wLT50bV9tb24gID0gYmNkMmJpbihtb24gJiAweDFGKTsKCXRtcC0+dG1feWVhciA9IGJjZDJiaW4oeWVhcik7Cgl0bXAtPnRtX3dkYXkgPSBiY2QyYmluKHdkYXkgJiAweDA3KTsKCWlmICh0bXAtPnRtX3llYXIgPCA3MCkKCQl0bXAtPnRtX3llYXIgKz0gMjAwMDsKCWVsc2UKCQl0bXAtPnRtX3llYXIgKz0gMTkwMDsKCXRtcC0+dG1feWRheSAgPSAwOwoJdG1wLT50bV9pc2RzdCA9IDA7CiNpZmRlZiBSVENfREVCVUcKCXByaW50ZigiR2V0IERBVEU6ICU0ZC0lMDJkLSUwMmQgKHdkYXk9JWQpICBUSU1FOiAlMmQ6JTAyZDolMDJkXG4iLAoJICAgICAgIHRtcC0+dG1feWVhciwgdG1wLT50bV9tb24sIHRtcC0+dG1fbWRheSwgdG1wLT50bV93ZGF5LAoJICAgICAgIHRtcC0+dG1faG91ciwgdG1wLT50bV9taW4sIHRtcC0+dG1fc2VjKTsKI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCmludCBydGNfc2V0KHN0cnVjdCBydGNfdGltZSAqdG1wKQp7CglzdHJ1Y3QgczNjMjR4MF9ydGMgKnJ0YyA9IHMzYzI0eDBfZ2V0X2Jhc2VfcnRjKCk7Cgl1Y2hhciBzZWMsIG1pbiwgaG91ciwgbWRheSwgd2RheSwgbW9uLCB5ZWFyOwoKI2lmZGVmIFJUQ19ERUJVRwoJcHJpbnRmKCJTZXQgREFURTogJTRkLSUwMmQtJTAyZCAod2RheT0lZCkgIFRJTUU6ICUyZDolMDJkOiUwMmRcbiIsCgkgICAgICAgdG1wLT50bV95ZWFyLCB0bXAtPnRtX21vbiwgdG1wLT50bV9tZGF5LCB0bXAtPnRtX3dkYXksCgkgICAgICAgdG1wLT50bV9ob3VyLCB0bXAtPnRtX21pbiwgdG1wLT50bV9zZWMpOwojZW5kaWYKCXllYXIgPSBiaW4yYmNkKHRtcC0+dG1feWVhciAlIDEwMCk7Cgltb24gID0gYmluMmJjZCh0bXAtPnRtX21vbik7Cgl3ZGF5ID0gYmluMmJjZCh0bXAtPnRtX3dkYXkpOwoJbWRheSA9IGJpbjJiY2QodG1wLT50bV9tZGF5KTsKCWhvdXIgPSBiaW4yYmNkKHRtcC0+dG1faG91cik7CgltaW4gID0gYmluMmJjZCh0bXAtPnRtX21pbik7CglzZWMgID0gYmluMmJjZCh0bXAtPnRtX3NlYyk7CgoJLyogZW5hYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCglTZXRSVENfQWNjZXNzKFJUQ19FTkFCTEUpOwoKCS8qIHdyaXRlIFJUQyByZWdpc3RlcnMgKi8KCXdyaXRlYihzZWMsICZydGMtPkJDRFNFQyk7Cgl3cml0ZWIobWluLCAmcnRjLT5CQ0RNSU4pOwoJd3JpdGViKGhvdXIsICZydGMtPkJDREhPVVIpOwoJd3JpdGViKG1kYXksICZydGMtPkJDRERBVEUpOwoJd3JpdGViKHdkYXksICZydGMtPkJDRERBWSk7Cgl3cml0ZWIobW9uLCAmcnRjLT5CQ0RNT04pOwoJd3JpdGViKHllYXIsICZydGMtPkJDRFlFQVIpOwoKCS8qIGRpc2FibGUgYWNjZXNzIHRvIFJUQyByZWdpc3RlcnMgKi8KCVNldFJUQ19BY2Nlc3MoUlRDX0RJU0FCTEUpOwoKCXJldHVybiAwOwp9Cgp2b2lkIHJ0Y19yZXNldCh2b2lkKQp7CglzdHJ1Y3QgczNjMjR4MF9ydGMgKnJ0YyA9IHMzYzI0eDBfZ2V0X2Jhc2VfcnRjKCk7CgoJd3JpdGViKChyZWFkYigmcnRjLT5SVENDT04pICYgfjB4MDYpIHwgMHgwOCwgJnJ0Yy0+UlRDQ09OKTsKCXdyaXRlYihyZWFkYigmcnRjLT5SVENDT04pICYgfigweDA4IHwgMHgwMSksICZydGMtPlJUQ0NPTik7Cn0KCiNlbmRpZgo=