LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KCnZvaWQgc2M1MjBfdGltZXJfaXNyKHZvaWQpCnsKCS8qIEFjayB0aGUgR1AgVGltZXIgSW50ZXJydXB0ICovCglzYzUyMF9tbWNyLT5ncHRtcnN0YSA9IDB4MDI7Cn0KCmludCB0aW1lcl9pbml0KHZvaWQpCnsKCS8qIFJlZ2lzdGVyIHRoZSBTQzUyMCBzcGVjaWZpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciAqLwoJcmVnaXN0ZXJfdGltZXJfaXNyIChzYzUyMF90aW1lcl9pc3IpOwoKCS8qIEluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIgZm9yIEdQIFRpbWVyIDEgKi8KCWlycV9pbnN0YWxsX2hhbmRsZXIgKDAsIHRpbWVyX2lzciwgTlVMTCk7CgoJLyogTWFwIEdQIFRpbWVyIDEgdG8gTWFzdGVyIFBJQyBJUjAgICovCglzYzUyMF9tbWNyLT5ncF90bXJfaW50X21hcFsxXSA9IDB4MDE7CgoJLyogRGlzYWJsZSBHUCBUaW1lcnMgMSAmIDIgLSBBbGxvdyBjb25maWd1cmF0aW9uIHdyaXRlcyAqLwoJc2M1MjBfbW1jci0+Z3B0bXIxY3RsID0gMHg0MDAwOwoJc2M1MjBfbW1jci0+Z3B0bXIyY3RsID0gMHg0MDAwOwoKCS8qIFJlc2V0IEdQIFRpbWVycyAxICYgMiAqLwoJc2M1MjBfbW1jci0+Z3B0bXIxY250ID0gMHgwMDAwOwoJc2M1MjBfbW1jci0+Z3B0bXIyY250ID0gMHgwMDAwOwoKCS8qIFNldHVwIEdQIFRpbWVyIDIgYXMgYSAxMDBrSHogKDEwdXMpIHByZXNjYWxlciAqLwoJc2M1MjBfbW1jci0+Z3B0bXIybWF4Y21wYSA9IDgzOwoJc2M1MjBfbW1jci0+Z3B0bXIyY3RsID0gMHhjMDAxOwoKCS8qIFNldHVwIEdQIFRpbWVyIDEgYXMgYSAxMDAwIEh6ICgxbXMpIGludGVycnVwdCBnZW5lcmF0b3IgKi8KCXNjNTIwX21tY3ItPmdwdG1yMW1heGNtcGEgPSAxMDA7CglzYzUyMF9tbWNyLT5ncHRtcjFjdGwgPSAweGUwMDk7CgoJdW5tYXNrX2lycSAoMCk7CgoJLyogQ2xlYXIgdGhlIEdQIFRpbWVyIDEgc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCB0aGUgc2hvdyByb2xsaW5nKi8KCXNjNTIwX21tY3ItPmdwdG1yc3RhID0gMHgwMjsKCglyZXR1cm4gMDsKfQoKdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCnsKCWludCBtID0gMDsKCWxvbmcgdTsKCWxvbmcgdGVtcDsKCgl0ZW1wID0gc2M1MjBfbW1jci0+c3d0bXJtaWxsaTsKCXRlbXAgPSBzYzUyMF9tbWNyLT5zd3Rtcm1pY3JvOwoKCWRvIHsKCQltICs9IHNjNTIwX21tY3ItPnN3dG1ybWlsbGk7CgkJdSA9IHNjNTIwX21tY3ItPnN3dG1ybWljcm8gKyAobSAqIDEwMDApOwoJfSB3aGlsZSAodSA8IHVzZWMpOwp9Cg==