LyoKICogUlBDIGRlZmluaXRpb25zCiAqCiAqIENvcHlyaWdodCAyMDAxLTIwMDIgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICogQ29weXJpZ2h0IDIwMDQgRmlsaXAgTmF2YXJhCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1JQQ19ERUZTX0gKI2RlZmluZSBfX1dJTkVfUlBDX0RFRlNfSAoKLyogaW5mbyBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9tc2ovMDM5OC9kY29tdGV4dGZpZ3MuaHRtICovCgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgY2hhciBycGNfdmVyOyAgICAgICAgICAvKiBSUEMgbWFqb3IgdmVyc2lvbiAoNSkgKi8KICB1bnNpZ25lZCBjaGFyIHJwY192ZXJfbWlub3I7ICAgIC8qIFJQQyBtaW5vciB2ZXJzaW9uICgwKSAqLwogIHVuc2lnbmVkIGNoYXIgcHR5cGU7ICAgICAgICAgICAgLyogUGFja2V0IHR5cGUgKFBLVF8qKSAqLwogIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CiAgdW5zaWduZWQgY2hhciBkcmVwWzRdOyAgICAgICAgICAvKiBEYXRhIHJlcHJlc2VudGF0aW9uICovCiAgdW5zaWduZWQgc2hvcnQgZnJhZ19sZW47ICAgICAgICAvKiBEYXRhIHNpemUgaW4gYnl0ZXMgaW5jbHVkaW5nIGhlYWRlciBhbmQgdGFpbC4gKi8KICB1bnNpZ25lZCBzaG9ydCBhdXRoX2xlbjsgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIGxlbmd0aCAgKi8KICB1bnNpZ25lZCBsb25nIGNhbGxfaWQ7ICAgICAgICAgIC8qIENhbGwgaWRlbnRpZmllci4gKi8KfSBScGNQa3RDb21tb25IZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIHNob3J0IG9wbnVtOwp9IFJwY1BrdFJlcXVlc3RIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIGNoYXIgY2FuY2VsX2NvdW50OwogIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7Cn0gUnBjUGt0UmVzcG9uc2VIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIGNoYXIgY2FuY2VsX2NvdW50OyAgICAgLyogUmVjZWl2ZWQgY2FuY2VsIGNvdW50ICovCiAgdW5zaWduZWQgY2hhciByZXNlcnZlZDsgICAgICAgICAvKiBGb3JjZSBhbGlnbm1lbnQhICovCiAgdW5zaWduZWQgbG9uZyBzdGF0dXM7ICAgICAgICAgICAvKiBSdW50aW1lIGZhdWx0IGNvZGUgKFJQQ19TVEFUVVMpICovCiAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDI7Cn0gUnBjUGt0RmF1bHRIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCBtYXhfdHNpemU7ICAgICAgIC8qIE1heGltdW0gdHJhbnNtaXNzaW9uIGZyYWdtZW50IHNpemUgKi8KICB1bnNpZ25lZCBzaG9ydCBtYXhfcnNpemU7ICAgICAgIC8qIE1heGltdW0gcmVjZWl2ZSBmcmFnbWVudCBzaXplICovCiAgdW5zaWduZWQgbG9uZyBhc3NvY19naWQ7ICAgICAgICAvKiBBc3NvY2lhdGVkIGdyb3VwIGlkICovCiAgdW5zaWduZWQgY2hhciBudW1fZWxlbWVudHM7ICAgICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgKi8KICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbM107ICAgICAgIC8qIEZvcmNlIGFsaWdubWVudCEgKi8KICB1bnNpZ25lZCBzaG9ydCBjb250ZXh0X2lkOyAgICAgIC8qIFByZXNlbnRhdGlvbiBjb250ZXh0IGlkZW50aWZpZXIgKi8KICB1bnNpZ25lZCBjaGFyIG51bV9zeW50YXhlczsgICAgIC8qIE51bWJlciBvZiBzeW50YXhlcyAqLwogIFJQQ19TWU5UQVhfSURFTlRJRklFUiBhYnN0cmFjdDsKICBSUENfU1lOVEFYX0lERU5USUZJRVIgdHJhbnNmZXI7Cn0gUnBjUGt0QmluZEhkcjsKCiNpbmNsdWRlICJwc2hwYWNrMS5oIgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOyAgLyogTGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW5jbHVkaW5nIG51bGwgdGVybWluYXRvciAqLwogIGNoYXIgc3RyaW5nWzFdOyAgICAgICAgIC8qIFN0cmluZyBkYXRhIGluIHNpbmdsZSBieXRlLCBudWxsIHRlcm1pbmF0ZWQgZm9ybSAqLwp9IFJwY0FkZHJlc3NTdHJpbmc7CiNpbmNsdWRlICJwb3BwYWNrLmgiCgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgY2hhciBwYWRkaW5nMVsyXTsgICAgICAgLyogRm9yY2UgYWxpZ25tZW50ISAqLwogIHVuc2lnbmVkIGNoYXIgbnVtX3Jlc3VsdHM7ICAgICAgIC8qIE51bWJlciBvZiByZXN1bHRzICovCiAgdW5zaWduZWQgY2hhciBwYWRkaW5nMlszXTsgICAgICAgLyogRm9yY2UgYWxpZ25tZW50ISAqLwogIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBzaG9ydCByZXN1bHQ7CiAgICB1bnNpZ25lZCBzaG9ydCByZWFzb247CiAgfSByZXN1bHRzWzFdOwp9IFJwY1Jlc3VsdHM7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCBtYXhfdHNpemU7ICAgICAgIC8qIE1heGltdW0gdHJhbnNtaXNzaW9uIGZyYWdtZW50IHNpemUgKi8KICB1bnNpZ25lZCBzaG9ydCBtYXhfcnNpemU7ICAgICAgIC8qIE1heGltdW0gcmVjZWl2ZSBmcmFnbWVudCBzaXplICovCiAgdW5zaWduZWQgbG9uZyBhc3NvY19naWQ7ICAgICAgICAvKiBBc3NvY2lhdGVkIGdyb3VwIGlkICovCiAgLyogCiAgICogRm9sbG93aW5nIHRoaXMgaGVhZGVyIGFyZSB0aGVzZSBmaWVsZHM6CiAgICogICBScGNBZGRyZXNzU3RyaW5nIHNlcnZlcl9hZGRyZXNzOwogICAqICAgUnBjUmVzdWx0cyByZXN1bHRzOwogICAqICAgUlBDX1NZTlRBWF9JREVOVElGSUVSIHRyYW5zZmVyOwogICAqLwp9IFJwY1BrdEJpbmRBY2tIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCByZWplY3RfcmVhc29uOwogIHVuc2lnbmVkIGNoYXIgcHJvdG9jb2xzX2NvdW50OwogIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBjaGFyIHJwY192ZXI7CiAgICB1bnNpZ25lZCBjaGFyIHJwY192ZXJfbWlub3I7CiAgfSBwcm90b2NvbHNbMV07Cn0gUnBjUGt0QmluZE5BY2tIZHI7CgovKiBVbmlvbiByZXByZXNlbnRpbmcgYWxsIHBvc3NpYmxlIHBhY2tldCBoZWFkZXJzICovCnR5cGVkZWYgdW5pb24KewogIFJwY1BrdENvbW1vbkhkciBjb21tb247CiAgUnBjUGt0UmVxdWVzdEhkciByZXF1ZXN0OwogIFJwY1BrdFJlc3BvbnNlSGRyIHJlc3BvbnNlOwogIFJwY1BrdEZhdWx0SGRyIGZhdWx0OwogIFJwY1BrdEJpbmRIZHIgYmluZDsKICBScGNQa3RCaW5kQWNrSGRyIGJpbmRfYWNrOwogIFJwY1BrdEJpbmROQWNrSGRyIGJpbmRfbmFjazsKfSBScGNQa3RIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgY2hhciBhdXRoX3R5cGU7ICAgICAgIC8qIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSBpbiB1c2UgKi8KICB1bnNpZ25lZCBjaGFyIGF1dGhfbGV2ZWw7ICAgICAgLyogUlBDX0NfQVVUSE5fTEVWRUwqICovCiAgdW5zaWduZWQgY2hhciBhdXRoX3BhZF9sZW5ndGg7IC8qIGxlbmd0aCBvZiBwYWRkaW5nIHRvIHJlc3RvcmUgbiAlIDQgYWxpZ25tZW50ICovCiAgdW5zaWduZWQgY2hhciBhdXRoX3Jlc2VydmVkOyAgIC8qIHJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KICB1bnNpZ25lZCBsb25nIGF1dGhfY29udGV4dF9pZDsgLyogdW5pcXVlIHZhbHVlIGZvciB0aGUgYXV0aGVudGljYXRlZCBjb25uZWN0aW9uICovCn0gUnBjQXV0aFZlcmlmaWVyOwoKI2RlZmluZSBSUENfVkVSX01BSk9SICAgICAgICAgICAgIDUKI2RlZmluZSBSUENfVkVSX01JTk9SICAgICAgICAgICAgIDAKCiNkZWZpbmUgUlBDX0ZMR19GSVJTVCAgICAgICAgICAgICAxCiNkZWZpbmUgUlBDX0ZMR19MQVNUICAgICAgICAgICAgICAyCiNkZWZpbmUgUlBDX0ZMR19PQkpFQ1RfVVVJRCAgICAweDgwCgojZGVmaW5lIFJQQ19NSU5fUEFDS0VUX1NJWkUgIDB4MTAwMAojZGVmaW5lIFJQQ19NQVhfUEFDS0VUX1NJWkUgIDB4MTZEMAoKI2RlZmluZSBQS1RfUkVRVUVTVCAgICAgICAgICAgICAwCiNkZWZpbmUgUEtUX1BJTkcgICAgICAgICAgICAgICAgMQojZGVmaW5lIFBLVF9SRVNQT05TRSAgICAgICAgICAgIDIKI2RlZmluZSBQS1RfRkFVTFQgICAgICAgICAgICAgICAzCiNkZWZpbmUgUEtUX1dPUktJTkcgICAgICAgICAgICAgNAojZGVmaW5lIFBLVF9OT0NBTEwgICAgICAgICAgICAgIDUKI2RlZmluZSBQS1RfUkVKRUNUICAgICAgICAgICAgICA2CiNkZWZpbmUgUEtUX0FDSyAgICAgICAgICAgICAgICAgNwojZGVmaW5lIFBLVF9DTF9DQU5DRUwgICAgICAgICAgIDgKI2RlZmluZSBQS1RfRkFDSyAgICAgICAgICAgICAgICA5CiNkZWZpbmUgUEtUX0NBTkNFTF9BQ0sgICAgICAgICAxMAojZGVmaW5lIFBLVF9CSU5EICAgICAgICAgICAgICAgMTEKI2RlZmluZSBQS1RfQklORF9BQ0sgICAgICAgICAgIDEyCiNkZWZpbmUgUEtUX0JJTkRfTkFDSyAgICAgICAgICAxMwojZGVmaW5lIFBLVF9BTFRFUl9DT05URVhUICAgICAgMTQKI2RlZmluZSBQS1RfQUxURVJfQ09OVEVYVF9SRVNQIDE1CiNkZWZpbmUgUEtUX0FVVEgzICAgICAgICAgICAgICAxNgojZGVmaW5lIFBLVF9TSFVURE9XTiAgICAgICAgICAgMTcKI2RlZmluZSBQS1RfQ09fQ0FOQ0VMICAgICAgICAgIDE4CiNkZWZpbmUgUEtUX09SUEhBTkVEICAgICAgICAgICAxOQoKI2RlZmluZSBSRVNVTFRfQUNDRVBUICAgICAgICAgICAwCgojZGVmaW5lIE5PX1JFQVNPTiAgICAgICAgICAgICAgIDAKCiNkZWZpbmUgTkNBREdfSVBfVURQICAgMHgwOAojZGVmaW5lIE5DQUNOX0lQX1RDUCAgIDB4MDcKI2RlZmluZSBOQ0FER19JUFggICAgICAweDBFCiNkZWZpbmUgTkNBQ05fU1BYICAgICAgMHgwQwojZGVmaW5lIE5DQUNOX05CX05CICAgIDB4MTIKI2RlZmluZSBOQ0FDTl9OQl9JUFggICAweDBECiNkZWZpbmUgTkNBQ05fRE5FVF9OU1AgMHgwNAojZGVmaW5lIE5DQUNOX0hUVFAgICAgIDB4MUYKCi8qIEZyZWVEQ0U6IFRXUl9DX0ZMUl9QUk9UX0lEX0lQICovCiNkZWZpbmUgVFdSX0lQIDB4MDkKCiNlbmRpZiAgLyogX19XSU5FX1JQQ19ERUZTX0ggKi8K