LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KLyogVmlkZW8gc3VwcG9ydCBmb3IgRXBzb24gU0VEMTM4MDYgY2hpcHNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCiNpZm5kZWYgX1NFRDEzODA2X0hfCiNkZWZpbmUgX1NFRDEzODA2X0hfCgoKLyogR2VuZXJhbCBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIEZSQU1FX0JVRkZFUl9PRkZTRVQgICAgICAgIDB4MjAwMDAwICAgICAvKiBGcmFtZSBidWZmZXIgb2Zmc2V0ICovCiNkZWZpbmUgVE9UQUxfU1BBQ0VfU0laRSAgICAgICAgICAgMHg0MDAwMDAKCiNkZWZpbmUgREVGQVVMVF9WSURFT19NRU1PUllfU0laRSAgMHgxNDAwMDAgICAgIC8qIFZpZGVvIE1lbW9yeSBTaXplICovCgojZGVmaW5lIEhXQ1VSU09SU0laRSAJCSAgIDEwMjQgICAgIC8qIFNpemUgb2YgbWVtb3J5IHJlc2VydmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBIVyBjdXJzb3IqLyAKCi8qIE9mZnNldCBvZiBjaGlwc2V0IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZQlCTFRfQ1RSTDAJKDB4MDEwMCkKI2RlZmluZQlCTFRfQ1RSTDEJKDB4MDEwMSkKI2RlZmluZSBCTFRfUk9QCQkoMHgwMTAyKQojZGVmaW5lCUJMVF9PUAkJKDB4MDEwMykKI2RlZmluZSBCTFRfU1JDX0FERFIwCSgweDAxMDQpCiNkZWZpbmUJQkxUX1NSQ19BRERSMQkoMHgwMTA1KQojZGVmaW5lCUJMVF9TUkNfQUREUjIJKDB4MDEwNikKI2RlZmluZQlCTFRfRFNUX0FERFIwCSgweDAxMDgpCiNkZWZpbmUgQkxUX0RTVF9BRERSMQkoMHgwMTA5KQojZGVmaW5lCUJMVF9EU1RfQUREUjIJKDB4MDEwQSkKI2RlZmluZSBCTFRfTUVNX09GRjAJKDB4MDEwQykKI2RlZmluZSBCTFRfTUVNX09GRjEJKDB4MDEwRCkKI2RlZmluZSBCTFRfV0lEVEgwCSgweDAxMTApCiNkZWZpbmUgQkxUX1dJRFRIMQkoMHgwMTExKQojZGVmaW5lIEJMVF9IRUlHSFQwCSgweDAxMTIpCiNkZWZpbmUgQkxUX0hFSUdIVDEJKDB4MDExMykKI2RlZmluZQlCTFRfQkdDT0xPUjAJKDB4MDExNCkKI2RlZmluZQlCTFRfQkdDT0xPUjEJKDB4MDExNSkKI2RlZmluZQlCTFRfRkdDT0xPUjAJKDB4MDExOCkKI2RlZmluZSBCTFRfRkdDT0xPUjEJKDB4MDExOSkKCiNkZWZpbmUgQkxUX1JFRyAgICAgICAgICgweDEwMDAwMCkKCi8qIExvb2t1cCB0YWJsZSByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBSRUdfTFVUX0FERFIgMHgxZTIKI2RlZmluZSBSRUdfTFVUX0RBVEEgMHgxZTQKCi8qIEN1cnNvci9JbmsgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBMQ0RfQ1VSU09SX0NOVEwgICAgICAgICAoMHgwMDcwKQojZGVmaW5lIExDRF9DVVJTT1JfU1RBUlQgICAgICAgICgweDAwNzEpCiNkZWZpbmUgTENEX0NVUlNPUl9YTCAgICAgICAgICAgKDB4MDA3MikKI2RlZmluZSBMQ0RfQ1VSU09SX1hNICAgICAgICAgICAoMHgwMDczKQojZGVmaW5lIExDRF9DVVJTT1JfWUwgICAgICAgICAgICgweDAwNzQpCiNkZWZpbmUgTENEX0NVUlNPUl9ZTSAgICAgICAgICAgKDB4MDA3NSkKI2RlZmluZSBMQ0RfQ1VSU09SX0NPTDBfQiAgICAgICAoMHgwMDc2KQojZGVmaW5lIExDRF9DVVJTT1JfQ09MMF9HICAgICAgICgweDAwNzcpCiNkZWZpbmUgTENEX0NVUlNPUl9DT0wwX1IgICAgICAgKDB4MDA3OCkKI2RlZmluZSBMQ0RfQ1VSU09SX0NPTDFfQiAgICAgICAoMHgwMDdBKQojZGVmaW5lIExDRF9DVVJTT1JfQ09MMV9HICAgICAgICgweDAwN0IpCiNkZWZpbmUgTENEX0NVUlNPUl9DT0wxX1IgICAgICAgKDB4MDA3QykKI2RlZmluZSBMQ0RfQ1VSU09SX0ZJRk8gICAgICAgICAoMHgwMDdFKQoKdHlwZWRlZiBzdHJ1Y3QKewogICAgdW5zaWduZWQgc2hvcnQgICAgICBJbmRleDsKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgVmFsdWU7Cn0gUzFEX1JFR1M7CgoKCi8qIEJvYXJkIHNwZWNpZmljIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KdW5zaWduZWQgaW50IGJvYXJkX3ZpZGVvX2luaXQgKHZvaWQpOwp2b2lkIGJvYXJkX3ZhbGlkYXRlX3NjcmVlbiAodW5zaWduZWQgaW50IGJhc2UpOwpjb25zdCBTMURfUkVHUyAqYm9hcmRfZ2V0X3JlZ3MgKHZvaWQpOwppbnQgYm9hcmRfZ2V0X3dpZHRoICh2b2lkKTsKaW50IGJvYXJkX2dldF9oZWlnaHQgKHZvaWQpOwoKI2VuZGlmIC8qIF9TRUQxMzgwNl9IXyAqLwo=