LyoKICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi90aW1lci1ncC5jCiAqCiAqIE9NQVAyIEdQIHRpbWVyIHN1cHBvcnQuCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogKiBBdXRob3I6IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPgogKiAgICAgICAgIEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqIE9NQVAgRHVhbC1tb2RlIHRpbWVyIGZyYW1ld29yayBzdXBwb3J0IGJ5IFRpbW8gVGVyYXMKICoKICogU29tZSBwYXJ0cyBiYXNlZCBvZmYgb2YgVEkncyAyNHh4IGNvZGU6CiAqCiAqICAgQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAqCiAqIFJvdWdobHkgbW9kZWxsZWQgYWZ0ZXIgdGhlIE9NQVAxIE1QVSB0aW1lciBjb2RlLgogKgogKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICogZm9yIG1vcmUgZGV0YWlscy4KICovCiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgojaW5jbHVkZSA8bGludXgvY2xrLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgoKI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KI2luY2x1ZGUgPGFzbS9hcmNoL2RtdGltZXIuaD4KCnN0YXRpYyBzdHJ1Y3Qgb21hcF9kbV90aW1lciAqZ3B0aW1lcjsKCnN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMl9ncF90aW1lcl9zdGFydCh1bnNpZ25lZCBsb25nIGxvYWRfdmFsKQp7CglvbWFwX2RtX3RpbWVyX3NldF9sb2FkKGdwdGltZXIsIDEsIDB4ZmZmZmZmZmYgLSBsb2FkX3ZhbCk7CglvbWFwX2RtX3RpbWVyX3NldF9pbnRfZW5hYmxlKGdwdGltZXIsIE9NQVBfVElNRVJfSU5UX09WRVJGTE9XKTsKCW9tYXBfZG1fdGltZXJfc3RhcnQoZ3B0aW1lcik7Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwMl9ncF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQp7Cgl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKCglvbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhncHRpbWVyLCBPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVyk7Cgl0aW1lcl90aWNrKCk7CgoJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKCglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCnN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG9tYXAyX2dwX3RpbWVyX2lycSA9IHsKCS5uYW1lCQk9ICJncCB0aW1lciIsCgkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCgkuaGFuZGxlcgk9IG9tYXAyX2dwX3RpbWVyX2ludGVycnVwdCwKfTsKCnN0YXRpYyB2b2lkIF9faW5pdCBvbWFwMl9ncF90aW1lcl9pbml0KHZvaWQpCnsKCXUzMiB0aWNrX3BlcmlvZDsKCglvbWFwX2RtX3RpbWVyX2luaXQoKTsKCWdwdGltZXIgPSBvbWFwX2RtX3RpbWVyX3JlcXVlc3Rfc3BlY2lmaWMoMSk7CglCVUdfT04oZ3B0aW1lciA9PSBOVUxMKTsKCglvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2UoZ3B0aW1lciwgT01BUF9USU1FUl9TUkNfU1lTX0NMSyk7Cgl0aWNrX3BlcmlvZCA9IGNsa19nZXRfcmF0ZShvbWFwX2RtX3RpbWVyX2dldF9mY2xrKGdwdGltZXIpKSAvIDEwMDsKCXRpY2tfcGVyaW9kIC09IDE7CgoJc2V0dXBfaXJxKG9tYXBfZG1fdGltZXJfZ2V0X2lycShncHRpbWVyKSwgJm9tYXAyX2dwX3RpbWVyX2lycSk7CglvbWFwMl9ncF90aW1lcl9zdGFydCh0aWNrX3BlcmlvZCk7Cn0KCnN0cnVjdCBzeXNfdGltZXIgb21hcF90aW1lciA9IHsKCS5pbml0CT0gb21hcDJfZ3BfdGltZXJfaW5pdCwKfTsK