LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBRdWFsY29tbSBBdGhlcm9zIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCiAqLwojaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX1RJTUVSX0ggKQojZGVmaW5lIF9fV0xBTl9RQ1RfUEFMX1RJTUVSX0gKCi8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAKICBcZmlsZSAgd2xhbl9xY3RfcGFsX3RpbWVyLmgKICAKICBcYnJpZWYgZGVmaW5lIHN5bmNocm9uaXphdGlvbiBvYmplY3RzIFBBTCBleHBvcnRzLiB3cHQgPSAoV2xhbiBQYWwgVHlwZSkgd3BhbCA9IChXbGFuIFBBTCkKICAgICAgICAgICAgICAgCiAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGVudC4KICAKICAgQ29weXJpZ2h0IDIwMTAtMjAxMSAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgIAogICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgogIAogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKI2luY2x1ZGUgIndsYW5fcWN0X29zX3RpbWVyLmgiCgoKdHlwZWRlZiBWT1NfVElNRVJfU1RBVEUgV1BBTF9USU1FUl9TVEFURTsKCnR5cGVkZWYgdm9pZCAoKndwYWxfdGltZXJfY2FsbGJhY2spKHZvaWQgKnBVc2VyRGF0YSk7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgIHdwdF9vc190aW1lciB0aW1lcjsKICAgd3BhbF90aW1lcl9jYWxsYmFjayBjYWxsYmFjazsKICAgdm9pZCAqcFVzZXJEYXRhOwp9IHdwdF90aW1lcjsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFRpbWVySW5pdCAtIGluaXRpYWxpemUgYSB3cHRfdGltZXIgb2JqZWN0CiAgICBQYXJhbToKICAgICAgICBwVGltZXIgLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCB3cHRfdGltZXIgb2JqZWN0CiAgICAgICAgY2FsbGJhY2sgLSBBIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgcFVzZXJEYXRhIC0gQSBwb2ludGVyIHRvIGRhdGEgcGFzcyBhcyBwYXJhbWV0ZXIgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxUaW1lckluaXQod3B0X3RpbWVyICogcFRpbWVyLCB3cGFsX3RpbWVyX2NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwVXNlckRhdGEpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxUaW1lckRlbGV0ZSAtIGludmFsaWRhdGUgYSB3cHRfdGltZXIgb2JqZWN0CiAgICBQYXJhbToKICAgICAgICBwVGltZXIgLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCB3cHRfdGltZXIgb2JqZWN0CiAgICBSZXR1cm46CiAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFRpbWVyRGVsZXRlKHdwdF90aW1lciAqIHBUaW1lcik7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFRpbWVyU3RhcnQgLSBzdGFydCBhIHdwdF90aW1lciBvYmplY3Qgd2l0aCBhIHRpbWVvdXQgdmFsdWUKICAgIFBhcmFtOgogICAgICAgIHBUaW1lciAtIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIHdwdF90aW1lciBvYmplY3QKICAgICAgICB0aW1lb3V0IC0gdGltZW91dCB2YWx1ZSBvZiB0aGUgdGltZXIuIEluIHVuaXQgb2YgbWlsbGktc2Vjb25kcy4KICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsVGltZXJTdGFydCh3cHRfdGltZXIgKiBwVGltZXIsIHdwdF91aW50MzIgdGltZW91dCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFRpbWVyU3RvcCAtIHN0b3AgYSB3cHRfdGltZXIgb2JqZWN0LiBTdG9wIGRvZXNuknQgZ3VhcmFudGVlIHRoZSB0aW1lciBoYW5kbGVyIGlzIG5vdCBjYWxsZWQgaWYgaXQgaXMgYWxyZWFkeSB0aW1lb3V0LgogICAgUGFyYW06CiAgICAgICAgcFRpbWVyIC0gYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgd3B0X3RpbWVyIG9iamVjdAogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxUaW1lclN0b3Aod3B0X3RpbWVyICogcFRpbWVyKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsVGltZXJHZXRDdXJTdGF0dXMgLSBHZXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRpbWVyCgogICAgcFRpbWVyIC0gYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgd3B0X3RpbWVyIG9iamVjdAoKICAgIHJldHVybgogICAgICAgIFdQQUxfVElNRVJfU1RBVEUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KV1BBTF9USU1FUl9TVEFURSB3cGFsVGltZXJHZXRDdXJTdGF0dXMod3B0X3RpbWVyICogcFRpbWVyKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsR2V0U3lzdGVtVGltZSAtIEdldCB0aGUgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzCgogICAgcmV0dXJuCiAgICAgICAgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfdWludDMyIHdwYWxHZXRTeXN0ZW1UaW1lKHZvaWQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxHZXRBcmNoQ291bnRlclRpbWUgLSBHZXQgdGltZSBmcm9tIHBoeXNpY2FsIGNvdW50ZXIKCiAgICByZXR1cm4KICAgICAgICBNUE0gY291bnRlciB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfdWludDY0IHdwYWxHZXRBcmNoQ291bnRlclRpbWUodm9pZCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFNsZWVwIC0gc2xlZXAgZm9yIGEgc3BlY2lmaWVkIGludGVydmFsCiAgICBQYXJhbToKICAgICAgICB0aW1lb3V0IC0gYW1vdW50IG9mIHRpbWUgdG8gc2xlZXAuIEluIHVuaXQgb2YgbWlsbGktc2Vjb25kcy4KICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsU2xlZXAod3B0X3VpbnQzMiB0aW1lb3V0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsQnVzeVdhaXQgLSBUaHJlYWQgYnVzeSB3YWl0IHdpdGggc3BlY2lmaWVkIHVzZWMKICAgIFBhcmFtOgogICAgICAgIHVzZWNEZWxheSAtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQuIEluIHVuaXQgb2YgbWljcm8tc2Vjb25kcy4KICAgIFJldHVybjoKICAgICAgICBOT05FCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgd3BhbEJ1c3lXYWl0KHdwdF91aW50MzIgdXNlY0RlbGF5KTsKCiNlbmRpZiAvLyBfX1dMQU5fUUNUX1BBTF9USU1FUl9ICg==