LyoKICogR1N0cmVhbWVyCiAqIENvcHlyaWdodCAyMDA1IFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgogKiBDb3B5cmlnaHQgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CiAqIENvcHlyaWdodCAyMDA1IFPpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgogKiBDb3B5cmlnaHQgMjAwNiBKb25pIFZhbHRhbmVuIDxqb25pLnZhbHRhbmVuQG1vdmlhbC5maT4KICogCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCiAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQogKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgKHRoZSAiTEdQTCIpLCBpbgogKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCiAqIG1lbnRpb25lZCBhYm92ZToKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAogKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KICovCgojaWZuZGVmIF9fR1NUX0RJUkVDVFNPVU5EU1JDX0hfXwojZGVmaW5lIF9fR1NUX0RJUkVDVFNPVU5EU1JDX0hfXwoKI2luY2x1ZGUgPGdzdC9nc3QuaD4KI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgojaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc3JjLmg+CiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxkc291bmQuaD4KI2luY2x1ZGUgPG1tc3lzdGVtLmg+CgovKiBhZGQgaGVyZSBzb21lIGhlYWRlcnMgaWYgbmVlZGVkICovCgoKR19CRUdJTl9ERUNMUwoKLyogI2RlZmluZXMgZG9uJ3QgbGlrZSB3aGl0ZXNwYWNleSBiaXRzICovCiNkZWZpbmUgR1NUX1RZUEVfRElSRUNUU09VTkRfU1JDIChnc3RfZGlyZWN0c291bmRfc3JjX2dldF90eXBlKCkpCiNkZWZpbmUgR1NUX0RJUkVDVFNPVU5EX1NSQyhvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9ESVJFQ1RTT1VORF9TUkMsR3N0RGlyZWN0U291bmRTcmMpKQojZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9TUkNfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NSQyxHc3REaXJlY3RTb3VuZFNyY0NsYXNzKSkKI2RlZmluZSBHU1RfSVNfRElSRUNUU09VTkRfU1JDKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NSQykpCiNkZWZpbmUgR1NUX0lTX0RJUkVDVFNPVU5EX1NSQ19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRElSRUNUU09VTkRfU1JDKSkKCnR5cGVkZWYgc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNyYyAgICAgIEdzdERpcmVjdFNvdW5kU3JjOwp0eXBlZGVmIHN0cnVjdCBfR3N0RGlyZWN0U291bmRTcmNDbGFzcyBHc3REaXJlY3RTb3VuZFNyY0NsYXNzOwoKI2RlZmluZSBHU1RfRFNPVU5EX0xPQ0sob2JqKQkoZ19tdXRleF9sb2NrICgmb2JqLT5kc291bmRfbG9jaykpCiNkZWZpbmUgR1NUX0RTT1VORF9VTkxPQ0sob2JqKQkoZ19tdXRleF91bmxvY2sgKCZvYmotPmRzb3VuZF9sb2NrKSkKCnN0cnVjdCBfR3N0RGlyZWN0U291bmRTcmMKewoKICBHc3RBdWRpb1NyYyBzcmM7CgogIEhJTlNUQU5DRSBEU291bmRETEw7IC8qIERMTCBpbnN0YW5jZSAqLwogIExQRElSRUNUU09VTkRDQVBUVVJFIHBEU0M7IC8qIERpcmVjdFNvdW5kQ2FwdHVyZSovCiAgTFBESVJFQ1RTT1VORENBUFRVUkVCVUZGRVIgcERTQlNlY29uZGFyeTsgIC8qU2Vjb25kYXR5IGNhcHR1cmVidWZmZXIqLwogIERXT1JEIGN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0OwoKICBIQU5ETEUgcmdoRXZlbnQ7CiAgRFdPUkQgbm90aWZ5c2l6ZTsKCiAgZ3VpbnQgYnVmZmVyX3NpemU7CiAgZ3VpbnQgbGF0ZW5jeV9zaXplOwogIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7CgogIGd1aW50IGJ1ZmZlcl90aW1lOwogIGd1aW50IGxhdGVuY3lfdGltZTsKCiAgSE1JWEVSIG1peGVyOwogIERXT1JEIG1peGVybGluZV9jY2hhbm5lbHM7CiAgZ2ludCBjb250cm9sX2lkX3ZvbHVtZTsKICBnaW50IGNvbnRyb2xfaWRfbXV0ZTsKICBnbG9uZyBkd192b2xfbWF4OwogIGdsb25nIGR3X3ZvbF9taW47CgogIGdsb25nIHZvbHVtZTsKICBnYm9vbGVhbiBtdXRlOwoKICBHVUlEICpkZXZpY2VfZ3VpZDsKCiAgY2hhciAqZGV2aWNlX25hbWU7CiAgY2hhciAqZGV2aWNlX2lkOwoKICBHTXV0ZXggZHNvdW5kX2xvY2s7Cgp9OwoKc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNyY0NsYXNzIAp7CiAgR3N0QXVkaW9TcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cn07CgpHVHlwZSBnc3RfZGlyZWN0c291bmRfc3JjX2dldF90eXBlICh2b2lkKTsKCkdfRU5EX0RFQ0xTCgojZW5kaWYgLyogX19HU1RfRElSRUNUU09VTkRTUkNfSF9fICovCg==