LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pODI1NC5oPgojaW5jbHVkZSA8YXNtL2libXBjLmg+CgojZGVmaW5lIFRJTUVSMF9WQUxVRSAweDA0YWEgLyogMWtIeiAxLjkzMThNSHogLyAxMDAwICovCiNkZWZpbmUgVElNRVIyX1ZBTFVFIDB4MGE4ZSAvKiA0NDBIeiAqLwoKaW50IHRpbWVyX2luaXQodm9pZCkKewoJLyogaW5pdGlhbGl6ZSB0aW1lciAwIGFuZCAyCgkgKgoJICogVGltZXIgMCBpcyB1c2VkIHRvIGluY3JlbWVudCBzeXN0ZW1fdGljayAxMDAwIHRpbWVzL3NlYwoJICogVGltZXIgMSB3YXMgdXNlZCBmb3IgRFJBTSByZWZyZXNoIGluIGVhcmx5IFBDJ3MKCSAqIFRpbWVyIDIgaXMgdXNlZCB0byBkcml2ZSB0aGUgc3BlYWtlcgoJICogKHRvIHN0YXNydCBhIGJlZXA6IHdyaXRlIDMgdG8gcG9ydCAweDYxLAoJICogdG8gc3RvcCBpdCBhZ2Fpbjogd3JpdGUgMCkKCSAqLwoJb3V0YiAoUElUX0NNRF9DVFIwIHwgUElUX0NNRF9CT1RIIHwgUElUX0NNRF9NT0RFMiwKCSAgICAgIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOwoJb3V0YiAoVElNRVIwX1ZBTFVFICYgMHhmZiwgUElUX0JBU0UgKyBQSVRfVDApOwoJb3V0YiAoVElNRVIwX1ZBTFVFID4+IDgsIFBJVF9CQVNFICsgUElUX1QwKTsKCglvdXRiIChQSVRfQ01EX0NUUjIgfCBQSVRfQ01EX0JPVEggfCBQSVRfQ01EX01PREUzLAoJICAgICAgUElUX0JBU0UgKyBQSVRfQ09NTUFORCk7CglvdXRiIChUSU1FUjJfVkFMVUUgJiAweGZmLCBQSVRfQkFTRSArIFBJVF9UMik7CglvdXRiIChUSU1FUjJfVkFMVUUgPj4gOCwgUElUX0JBU0UgKyBQSVRfVDIpOwoKCWlycV9pbnN0YWxsX2hhbmRsZXIgKDAsIHRpbWVyX2lzciwgTlVMTCk7Cgl1bm1hc2tfaXJxICgwKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHUxNiByZWFkX3BpdCh2b2lkKQp7Cgl1OCBsb3c7CgoJb3V0YiAoUElUX0NNRF9MQVRDSCwgUElUX0JBU0UgKyBQSVRfQ09NTUFORCk7Cglsb3cgPSBpbmIgKFBJVF9CQVNFICsgUElUX1QwKTsKCglyZXR1cm4gKChpbmIgKFBJVF9CQVNFICsgUElUX1QwKSA8PCA4KSB8IGxvdyk7Cn0KCi8qIHRoaXMgaXMgbm90IHZlcnkgZXhhY3QgKi8Kdm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlYykKewoJaW50IGNvdW50ZXI7CglpbnQgd3JhcHM7CgoJaWYgKHRpbWVyX2luaXRfZG9uZSkKCXsKCQljb3VudGVyID0gcmVhZF9waXQgKCk7CgkJd3JhcHMgPSB1c2VjIC8gMTAwMDsKCQl1c2VjID0gdXNlYyAlIDEwMDA7CgoJCXVzZWMgKj0gMTE5NDsKCQl1c2VjIC89IDEwMDA7CgkJdXNlYyArPSBjb3VudGVyOwoKCQl3aGlsZSAodXNlYyA+IDExOTQpIHsKCQkJdXNlYyAtPSAxMTk0OwoJCQl3cmFwcysrOwoJCX0KCgkJd2hpbGUgKDEpIHsKCQkJaW50IG5ld19jb3VudCA9IHJlYWRfcGl0ICgpOwoKCQkJaWYgKCgobmV3X2NvdW50IDwgdXNlYykgJiYgIXdyYXBzKSB8fCB3cmFwcyA8IDApCgkJCQlicmVhazsKCgkJCWlmIChuZXdfY291bnQgPiBjb3VudGVyKQoJCQkJd3JhcHMtLTsKCgkJCWNvdW50ZXIgPSBuZXdfY291bnQ7CgkJfQoJfQoKfQo=