LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2k4MjU0Lmg+CiNpbmNsdWRlIDxhc20vaWJtcGMuaD4KCnN0cnVjdCB0aW1lcl9pc3JfZnVuY3Rpb24gewoJc3RydWN0IHRpbWVyX2lzcl9mdW5jdGlvbiAqbmV4dDsKCXRpbWVyX2ZuY190ICppc3JfZnVuYzsKfTsKCnN0YXRpYyBzdHJ1Y3QgdGltZXJfaXNyX2Z1bmN0aW9uICpmaXJzdF90aW1lcl9pc3IgPSBOVUxMOwpzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzeXN0ZW1fdGlja3MgPSAwOwoKLyoKICogcmVnaXN0ZXJfdGltZXJfaXNyKCkgYWxsb3dzIG11bHRpcGxlIGFyY2hpdGVjdHVyZSBhbmQgYm9hcmQgc3BlY2lmaWMKICogZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBldmVyeSBtaWxsaXNlY29uZC4gS2VlcCB0aGUgZXhlY3V0aW9uIHRpbWUgb2YKICogZWFjaCBmdW5jdGlvbiBhcyBsb3cgYXMgcG9zc2libGUKICovCmludCByZWdpc3Rlcl90aW1lcl9pc3IgKHRpbWVyX2ZuY190ICppc3JfZnVuYykKewoJc3RydWN0IHRpbWVyX2lzcl9mdW5jdGlvbiAqbmV3X2Z1bmM7CglzdHJ1Y3QgdGltZXJfaXNyX2Z1bmN0aW9uICp0ZW1wOwoJaW50IGZsYWc7CgoJbmV3X2Z1bmMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl9pc3JfZnVuY3Rpb24pKTsKCglpZiAobmV3X2Z1bmMgPT0gTlVMTCkKCQlyZXR1cm4gMTsKCgluZXdfZnVuYy0+aXNyX2Z1bmMgPSBpc3JfZnVuYyArIGdkLT5yZWxvY19vZmY7CgluZXdfZnVuYy0+bmV4dCA9IE5VTEw7CgoJLyoKCSAqICBEb24ndCBhbGxvdyB0aW1lciBpbnRlcnJ1cHRzIHdoaWxlIHRoZQoJICogIGxpbmtlZCBsaXN0IGlzIGJlaW5nIG1vZGlmaWVkCgkgKi8KCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CgoJaWYgKGZpcnN0X3RpbWVyX2lzciA9PSBOVUxMKSB7CgkJZmlyc3RfdGltZXJfaXNyID0gbmV3X2Z1bmM7Cgl9IGVsc2UgewoJCXRlbXAgPSBmaXJzdF90aW1lcl9pc3I7CgkJd2hpbGUgKHRlbXAtPm5leHQgIT0gTlVMTCkKCQkJdGVtcCA9IHRlbXAtPm5leHQ7CgkJdGVtcC0+bmV4dCA9IG5ld19mdW5jOwoJfQoKCWlmIChmbGFnKQoJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOwoKCXJldHVybiAwOwp9CgovKgogKiB0aW1lcl9pc3IoKSBNVVNUIGJlIHRoZSByZWdpc3RlcmVkIGludGVycnVwdCBoYW5kbGVyIGZvcgogKi8Kdm9pZCB0aW1lcl9pc3Iodm9pZCAqdW51c2VkKQp7CglzdHJ1Y3QgdGltZXJfaXNyX2Z1bmN0aW9uICp0ZW1wID0gZmlyc3RfdGltZXJfaXNyOwoKCXN5c3RlbV90aWNrcysrOwoKCS8qIEV4ZWN1dGUgZWFjaCByZWdpc3RlcmVkIGZ1bmN0aW9uICovCgl3aGlsZSAodGVtcCAhPSBOVUxMKSB7CgkJdGVtcC0+aXNyX2Z1bmMgKCk7CgkJdGVtcCA9IHRlbXAtPm5leHQ7Cgl9Cn0KCnZvaWQgcmVzZXRfdGltZXIgKHZvaWQpCnsKCXN5c3RlbV90aWNrcyA9IDA7Cn0KCnVsb25nIGdldF90aW1lciAodWxvbmcgYmFzZSkKewoJcmV0dXJuIChzeXN0ZW1fdGlja3MgLSBiYXNlKTsKfQoKdm9pZCBzZXRfdGltZXIgKHVsb25nIHQpCnsKCXN5c3RlbV90aWNrcyA9IHQ7Cn0K