LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCA8ZGFuaWVsQG9taWNyb24uc2U+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaTgyNTQuaD4KI2luY2x1ZGUgPGFzbS9pYm1wYy5oPgojaW5jbHVkZSA8YXNtL2ludGVycnVwdC5oPgoKI2RlZmluZSBUSU1FUjBfVkFMVUUgMHgwNGFhIC8qIDFrSHogMS45MzE4TUh6IC8gMTAwMCAqLwojZGVmaW5lIFRJTUVSMl9WQUxVRSAweDBhOGUgLyogNDQwSHogKi8KCnN0YXRpYyBpbnQgdGltZXJfaW5pdF9kb25lID0gMDsKCmludCB0aW1lcl9pbml0KHZvaWQpCnsKCS8qIGluaXRpYWxpemUgdGltZXIgMCBhbmQgMgoJICoKCSAqIFRpbWVyIDAgaXMgdXNlZCB0byBpbmNyZW1lbnQgc3lzdGVtX3RpY2sgMTAwMCB0aW1lcy9zZWMKCSAqIFRpbWVyIDEgd2FzIHVzZWQgZm9yIERSQU0gcmVmcmVzaCBpbiBlYXJseSBQQydzCgkgKiBUaW1lciAyIGlzIHVzZWQgdG8gZHJpdmUgdGhlIHNwZWFrZXIKCSAqICh0byBzdGFzcnQgYSBiZWVwOiB3cml0ZSAzIHRvIHBvcnQgMHg2MSwKCSAqIHRvIHN0b3AgaXQgYWdhaW46IHdyaXRlIDApCgkgKi8KCW91dGIgKFBJVF9DTURfQ1RSMCB8IFBJVF9DTURfQk9USCB8IFBJVF9DTURfTU9ERTIsCgkgICAgICBQSVRfQkFTRSArIFBJVF9DT01NQU5EKTsKCW91dGIgKFRJTUVSMF9WQUxVRSAmIDB4ZmYsIFBJVF9CQVNFICsgUElUX1QwKTsKCW91dGIgKFRJTUVSMF9WQUxVRSA+PiA4LCBQSVRfQkFTRSArIFBJVF9UMCk7CgoJb3V0YiAoUElUX0NNRF9DVFIyIHwgUElUX0NNRF9CT1RIIHwgUElUX0NNRF9NT0RFMywKCSAgICAgIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOwoJb3V0YiAoVElNRVIyX1ZBTFVFICYgMHhmZiwgUElUX0JBU0UgKyBQSVRfVDIpOwoJb3V0YiAoVElNRVIyX1ZBTFVFID4+IDgsIFBJVF9CQVNFICsgUElUX1QyKTsKCglpcnFfaW5zdGFsbF9oYW5kbGVyICgwLCB0aW1lcl9pc3IsIE5VTEwpOwoJdW5tYXNrX2lycSAoMCk7CgoJdGltZXJfaW5pdF9kb25lID0gMTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHUxNiByZWFkX3BpdCh2b2lkKQp7Cgl1OCBsb3c7CgoJb3V0YiAoUElUX0NNRF9MQVRDSCwgUElUX0JBU0UgKyBQSVRfQ09NTUFORCk7Cglsb3cgPSBpbmIgKFBJVF9CQVNFICsgUElUX1QwKTsKCglyZXR1cm4gKChpbmIgKFBJVF9CQVNFICsgUElUX1QwKSA8PCA4KSB8IGxvdyk7Cn0KCi8qIHRoaXMgaXMgbm90IHZlcnkgZXhhY3QgKi8Kdm9pZCBfX3VkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjKQp7CglpbnQgY291bnRlcjsKCWludCB3cmFwczsKCglpZiAodGltZXJfaW5pdF9kb25lKQoJewoJCWNvdW50ZXIgPSByZWFkX3BpdCAoKTsKCQl3cmFwcyA9IHVzZWMgLyAxMDAwOwoJCXVzZWMgPSB1c2VjICUgMTAwMDsKCgkJdXNlYyAqPSAxMTk0OwoJCXVzZWMgLz0gMTAwMDsKCQl1c2VjICs9IGNvdW50ZXI7CgoJCXdoaWxlICh1c2VjID4gMTE5NCkgewoJCQl1c2VjIC09IDExOTQ7CgkJCXdyYXBzKys7CgkJfQoKCQl3aGlsZSAoMSkgewoJCQlpbnQgbmV3X2NvdW50ID0gcmVhZF9waXQgKCk7CgoJCQlpZiAoKChuZXdfY291bnQgPCB1c2VjKSAmJiAhd3JhcHMpIHx8IHdyYXBzIDwgMCkKCQkJCWJyZWFrOwoKCQkJaWYgKG5ld19jb3VudCA+IGNvdW50ZXIpCgkJCQl3cmFwcy0tOwoKCQkJY291bnRlciA9IG5ld19jb3VudDsKCQl9Cgl9Cgp9Cg==