LyogJElkJCAqLwovKiAKICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCiAqLwoKI2lmbmRlZiBfX1BKU1VBX0FQUF9IX18KI2RlZmluZSBfX1BKU1VBX0FQUF9IX18KCi8qKgogKiBJbnRlcmZhY2UgZm9yIHVzZXIgYXBwbGljYXRpb24gdG8gdXNlIHBqc3VhIHdpdGggQ0xJL21lbnUgYmFzZWQgVUkuIAogKi8KCiNpbmNsdWRlICJwanN1YV9hcHBfY29tbW9uLmgiCgpQSl9CRUdJTl9ERUNMCgovKioKICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYXBwbGljYXRpb24uCiAqLwp0eXBlZGVmIHN0cnVjdCBwanN1YV9hcHBfY2ZnX3QKewogICAgLyoqCiAgICAgKiBUaGUgbnVtYmVyIG9mIHJ1bnRpbWUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgYXBwbGljYXRpb24uCiAgICAgKi8KICAgIGludCAgICAgICBhcmdjOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGFyZ3VtZW50cyBzdHJpbmcgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4gCiAgICAgKi8KICAgIGNoYXIgICAgKiphcmd2OwoKICAgIC8qKiAKICAgICAqIFRlbGwgYXBwIHRoYXQgQ0xJIChhbmQgcGpzdWEpIGlzIChyZSlzdGFydGVkLgogICAgICogbXNnIHdpbGwgY29udGFpbiBzdGFydCBlcnJvciBtZXNzYWdlIHN1Y2ggYXMgk1RlbG5ldCB0byBYOlmULAogICAgICogk2ZhaWxlZCB0byBzdGFydCBwanN1YSBsaWKULCCTcG9ydCBidXN5lC4uCiAgICAgKi8KICAgIHZvaWQgKCpvbl9zdGFydGVkKShwal9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIqIHRpdGxlKTsKCiAgICAvKioKICAgICAqIFRlbGwgYXBwIHRoYXQgbGlicmFyeSByZXF1ZXN0IHRvIHN0b3BwZWQvcmVzdGFydC4KICAgICAqIEdVSSBhcHAgbmVlZHMgdG8gdXNlIGEgdGltZXIgbWVjaGFuaXNtIHRvIHdhaXQgYmVmb3JlIGludm9raW5nIHRoZSAKICAgICAqIGNsZWFudXAgcHJvY2VkdXJlLgogICAgICovCiAgICB2b2lkICgqb25fc3RvcHBlZCkocGpfYm9vbF90IHJlc3RhcnQsIGludCBhcmdjLCBjaGFyKiogYXJndik7CgogICAgLyoqCiAgICAgKiBUaGlzIHdpbGwgZW5hYmxlIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBjdXN0b21pemUgY29uZmlndXJhdGlvbiBvdGhlciB0aGFuCiAgICAgKiB0aGUgYmFzaWMgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSBwanN1YS4gCiAgICAgKi8KICAgIHZvaWQgKCpvbl9jb25maWdfaW5pdCkocGpzdWFfYXBwX2NvbmZpZyAqY2ZnKTsKfSBwanN1YV9hcHBfY2ZnX3Q7CgovKioKICogVGhpcyB3aWxsIGluaXRpYXRlIHRoZSBwanN1YSBhbmQgdGhlIHVzZXIgaW50ZXJmYWNlIChDTEkvbWVudSBVSSkgYmFzZWQgb24gCiAqIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLgogKi8KcGpfc3RhdHVzX3QgcGpzdWFfYXBwX2luaXQoY29uc3QgcGpzdWFfYXBwX2NmZ190ICphcHBfY2ZnKTsKCi8qKgogKiBUaGlzIHdpbGwgcnVuIHRoZSBDTEkvbWVudSBiYXNlZCBVSS4KICogd2FpdF90ZWxuZXRfY2xpIGlzIHVzZWQgZm9yIENMSSBiYXNlZCBVSS4gSXQgd2lsbCB0ZWxsIHRoZSBsaWJyYXJ5IHRvIGJsb2NrCiAqIG9yIHdhaXQgdW50aWwgdXNlciBpbnZva2UgdGhlICJzaHV0ZG93biIvInJlc3RhcnQiIGNvbW1hbmQuIEdVSSBiYXNlZCBhcHAKICogc2hvdWxkIGRlZmluZSB0aGlzIHBhcmFtIGFzIFBKX0ZBTFNFLgogKi8KcGpfc3RhdHVzX3QgcGpzdWFfYXBwX3J1bihwal9ib29sX3Qgd2FpdF90ZWxuZXRfY2xpKTsKCi8qKgogKiBUaGlzIHdpbGwgZGVzdHJveS9jbGVhbnVwIHRoZSBhcHBsaWNhdGlvbiBsaWJyYXJ5LgogKi8KcGpfc3RhdHVzX3QgcGpzdWFfYXBwX2Rlc3Ryb3koKTsKClBKX0VORF9ERUNMCiAgICAKI2VuZGlmCS8qIF9fUEpTVUFfQVBQX0hfXyAqLwo=