LyoKICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi90aW1lci1ncC5jCiAqCiAqIE9NQVAyIEdQIHRpbWVyIHN1cHBvcnQuCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogKiBBdXRob3I6IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPgogKiAgICAgICAgIEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqCiAqIFNvbWUgcGFydHMgYmFzZWQgb2ZmIG9mIFRJJ3MgMjR4eCBjb2RlOgogKgogKiAgIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogKgogKiBSb3VnaGx5IG1vZGVsbGVkIGFmdGVyIHRoZSBPTUFQMSBNUFUgdGltZXIgY29kZS4KICoKICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZS4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAqIGZvciBtb3JlIGRldGFpbHMuCiAqLwojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvdGltZS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgoKI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KI2luY2x1ZGUgPGFzbS9kZWxheS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CgojZGVmaW5lIE9NQVAyX0dQX1RJTUVSMV9CQVNFCTB4NDgwMjgwMDAKI2RlZmluZSBPTUFQMl9HUF9USU1FUjJfQkFTRQkweDQ4MDJhMDAwCiNkZWZpbmUgT01BUDJfR1BfVElNRVIzX0JBU0UJMHg0ODA3ODAwMAojZGVmaW5lIE9NQVAyX0dQX1RJTUVSNF9CQVNFCTB4NDgwN2EwMDAKCiNkZWZpbmUgR1BfVElNRVJfVElEUgkJMHgwMAojZGVmaW5lIEdQX1RJTUVSX1RJU1IJCTB4MTgKI2RlZmluZSBHUF9USU1FUl9USUVSCQkweDFjCiNkZWZpbmUgR1BfVElNRVJfVENMUgkJMHgyNAojZGVmaW5lIEdQX1RJTUVSX1RDUlIJCTB4MjgKI2RlZmluZSBHUF9USU1FUl9UTERSCQkweDJjCiNkZWZpbmUgR1BfVElNRVJfVFNJQ1IJCTB4NDAKCiNkZWZpbmUgT1NfVElNRVJfTlIJCTEgIC8qIEdQIHRpbWVyIDIgKi8KCnN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2VbXSA9IHsKCUlPX0FERFJFU1MoT01BUDJfR1BfVElNRVIxX0JBU0UpLAoJSU9fQUREUkVTUyhPTUFQMl9HUF9USU1FUjJfQkFTRSksCglJT19BRERSRVNTKE9NQVAyX0dQX1RJTUVSM19CQVNFKSwKCUlPX0FERFJFU1MoT01BUDJfR1BfVElNRVI0X0JBU0UpLAp9OwoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGltZXJfcmVhZF9yZWcoaW50IG5yLCB1bnNpZ25lZCBpbnQgcmVnKQp7CglyZXR1cm4gX19yYXdfcmVhZGwodGltZXJfYmFzZVtucl0gKyByZWcpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfd3JpdGVfcmVnKGludCBuciwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKewoJX19yYXdfd3JpdGVsKHZhbCwgdGltZXJfYmFzZVtucl0gKyByZWcpOwp9CgovKiBOb3RlIHRoYXQgd2UgYWx3YXlzIGVuYWJsZSB0aGUgY2xvY2sgcHJlc2NhbGUgZGl2aWRlciBiaXQgKi8Kc3RhdGljIGlubGluZSB2b2lkIG9tYXAyX2dwX3RpbWVyX3N0YXJ0KGludCBuciwgdW5zaWduZWQgbG9uZyBsb2FkX3ZhbCkKewoJdW5zaWduZWQgaW50IHRtcDsKCgl0bXAgPSAweGZmZmZmZmZmIC0gbG9hZF92YWw7CgoJdGltZXJfd3JpdGVfcmVnKG5yLCBHUF9USU1FUl9UTERSLCB0bXApOwoJdGltZXJfd3JpdGVfcmVnKG5yLCBHUF9USU1FUl9UQ1JSLCB0bXApOwoJdGltZXJfd3JpdGVfcmVnKG5yLCBHUF9USU1FUl9USUVSLCAxIDw8IDEpOwoJdGltZXJfd3JpdGVfcmVnKG5yLCBHUF9USU1FUl9UQ0xSLCAoMSA8PCA1KSB8ICgxIDw8IDEpIHwgMSk7Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwMl9ncF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAoJCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CgoJdGltZXJfd3JpdGVfcmVnKE9TX1RJTUVSX05SLCBHUF9USU1FUl9USVNSLCAxIDw8IDEpOwoJdGltZXJfdGljayhyZWdzKTsKCgl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwoKCXJldHVybiBJUlFfSEFORExFRDsKfQoKc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcDJfZ3BfdGltZXJfaXJxID0gewoJLm5hbWUJCT0gImdwIHRpbWVyIiwKCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCgkuaGFuZGxlcgk9IG9tYXAyX2dwX3RpbWVyX2ludGVycnVwdCwKfTsKCnN0YXRpYyB2b2lkIF9faW5pdCBvbWFwMl9ncF90aW1lcl9pbml0KHZvaWQpCnsKCXN0cnVjdCBjbGsgKiBzeXNfY2s7Cgl1MzIgdGlja19wZXJpb2QgPSAxMjAwMDA7Cgl1MzIgbDsKCgkvKiBSZXNldCBjbG9jayBhbmQgcHJlc2NhbGUgdmFsdWUgKi8KCXRpbWVyX3dyaXRlX3JlZyhPU19USU1FUl9OUiwgR1BfVElNRVJfVENMUiwgMCk7CgoJc3lzX2NrID0gY2xrX2dldChOVUxMLCAic3lzX2NrIik7CglpZiAoSVNfRVJSKHN5c19jaykpCgkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZ2V0IHN5c19ja1xuIik7CgllbHNlIHsKCQljbGtfZW5hYmxlKHN5c19jayk7CgkJdGlja19wZXJpb2QgPSBjbGtfZ2V0X3JhdGUoc3lzX2NrKSAvIDEwMDsKCQljbGtfcHV0KHN5c19jayk7Cgl9CgoJdGlja19wZXJpb2QgLz0gMjsJLyogTWluaW11bSBwcmVzY2FsZSBkaXZpZGVyIGlzIDIgKi8KCXRpY2tfcGVyaW9kIC09IDE7CgoJbCA9IHRpbWVyX3JlYWRfcmVnKE9TX1RJTUVSX05SLCBHUF9USU1FUl9USURSKTsKCXByaW50ayhLRVJOX0lORk8gIk9NQVAyIEdQIHRpbWVyIChIVyB2ZXJzaW9uICVkLiVkKVxuIiwKCSAgICAgICAobCA+PiA0KSAmIDB4MGYsIGwgJiAweDBmKTsKCglzZXR1cF9pcnEoMzgsICZvbWFwMl9ncF90aW1lcl9pcnEpOwoKCW9tYXAyX2dwX3RpbWVyX3N0YXJ0KE9TX1RJTUVSX05SLCB0aWNrX3BlcmlvZCk7Cn0KCnN0cnVjdCBzeXNfdGltZXIgb21hcF90aW1lciA9IHsKCS5pbml0CT0gb21hcDJfZ3BfdGltZXJfaW5pdCwKfTsKCg==