LyoKICogRGVmaW5pdGlvbnMgZm9yIFNOTVAgKFJGQyAxMDY3KSBhZ2VudCB2YXJpYWJsZSBmaW5kZXIuCiAqCiAqLwoKI2lmbmRlZiBfU05NUF9WQVJTX0hfCiNkZWZpbmUgX1NOTVBfVkFSU19IXwoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAgICAgICAgICAiQyIgewojZW5kaWYKCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJQ29weXJpZ2h0IDE5ODgsIDE5ODkgYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKCUNvcHlyaWdodCAxOTg5CVRHViwgSW5jb3Jwb3JhdGVkCgoJCSAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCnByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ01VIGFuZCBUR1Ygbm90IGJlIHVzZWQKaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQp3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgQU5EIFRHViBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwpFVkVOVCBTSEFMTCBDTVUgT1IgVEdWIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiAgICBzdHJ1Y3QgdmFyaWFibGU7CgogICAgLyoqCiAgICAgKiBEdXBsaWNhdGVzIGEgdmFyaWFibGUuCiAgICAgKgogICAgICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBkdXBsaWNhdGUgdmFyaWFibGUgdXBvbiBzdWNjZXNzOyBOVUxMIHVwb24KICAgICAqICAgZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIHN0cnVjdCB2YXJpYWJsZQogICAgICogQHNlZSBzdHJ1Y3QgdmFyaWFibGUxCiAgICAgKiBAc2VlIHN0cnVjdCB2YXJpYWJsZTIKICAgICAqIEBzZWUgc3RydWN0IHZhcmlhYmxlMwogICAgICogQHNlZSBzdHJ1Y3QgdmFyaWFibGU0CiAgICAgKiBAc2VlIHN0cnVjdCB2YXJpYWJsZTcKICAgICAqIEBzZWUgc3RydWN0IHZhcmlhYmxlOAogICAgICogQHNlZSBzdHJ1Y3QgdmFyaWFibGUxMwogICAgICovCiAgICBzdHJ1Y3QgdmFyaWFibGUgKm5ldHNubXBfZHVwbGljYXRlX3ZhcmlhYmxlKGNvbnN0IHN0cnVjdCB2YXJpYWJsZSAqdmFyKTsKCiAgICAvKgogICAgICogRnVuY3Rpb24gcG9pbnRlciBjYWxsZWQgYnkgdGhlIG1hc3RlciBhZ2VudCBmb3Igd3JpdGVzLiAKICAgICAqLwogICAgdHlwZWRlZiBpbnQgICAgIChXcml0ZU1ldGhvZCkgKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLCBzaXplX3QgbGVuZ3RoKTsKCiAgICAvKgogICAgICogRnVuY3Rpb24gcG9pbnRlciBjYWxsZWQgYnkgdGhlIG1hc3RlciBhZ2VudCBmb3IgbWliIGluZm9ybWF0aW9uIHJldHJpZXZhbCAKICAgICAqLwogICAgdHlwZWRlZiB1X2NoYXIgKihGaW5kVmFyTWV0aG9kKSAoc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogdmFyX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCk7CgogICAgLyoKICAgICAqIEZ1bmN0aW9uIHBvaW50ZXIgY2FsbGVkIGJ5IHRoZSBtYXN0ZXIgYWdlbnQgZm9yIHNldHRpbmcgdXAgc3ViYWdlbnQgcmVxdWVzdHMgCiAgICAgKi8KICAgIHR5cGVkZWYgaW50ICAgICAoQWRkVmFyTWV0aG9kKSAobmV0c25tcF9hZ2VudF9zZXNzaW9uICphc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZicCk7CgogICAgc3RydWN0IG5saXN0OwoKICAgIGV4dGVybiBsb25nICAgICBsb25nX3JldHVybjsKICAgIGV4dGVybiB1X2NoYXIgICByZXR1cm5fYnVmW107CgogICAgZXh0ZXJuIG9pZCAgICAgIG51bGxPaWRbXTsKICAgIGV4dGVybiBpbnQgICAgICBudWxsT2lkTGVuOwoKI2RlZmluZSBJTlNUCTB4RkZGRkZGRkYgICAgICAvKiB1c2VkIHRvIGZpbGwgb3V0IHRoZSBpbnN0YW5jZSBmaWVsZCBvZiB0aGUgdmFyaWFibGVzIHRhYmxlICovCgogICAgc3RydWN0IHZhcmlhYmxlIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgbWFnaWM7ICAvKiBwYXNzZWQgdG8gZnVuY3Rpb24gYXMgYSBoaW50ICovCiAgICAgICAgY2hhciAgICAgICAgICAgIHR5cGU7ICAgLyogdHlwZSBvZiB2YXJpYWJsZSAqLwogICAgICAgIC8qCiAgICAgICAgICogU2VlIGltcG9ydGFudCBjb21tZW50IGluIHNubXBfdmFycy5jIHJlbGF0aW5nIHRvIGFjbCAKICAgICAgICAgKi8KICAgICAgICB1X3Nob3J0ICAgICAgICAgYWNsOyAgICAvKiBhY2Nlc3MgY29udHJvbCBsaXN0IGZvciB2YXJpYWJsZSAqLwogICAgICAgIEZpbmRWYXJNZXRob2QgICpmaW5kVmFyOyAgICAgICAgLyogZnVuY3Rpb24gdGhhdCBmaW5kcyB2YXJpYWJsZSAqLwogICAgICAgIHVfY2hhciAgICAgICAgICBuYW1lbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIGFib3ZlICovCiAgICAgICAgb2lkICAgICAgICAgICAgIG5hbWVbTUFYX09JRF9MRU5dOyAgICAgIC8qIG9iamVjdCBpZGVudGlmaWVyIG9mIHZhcmlhYmxlICovCiAgICB9OwoKICAgIGludCAgICAgICAgICAgICBpbml0X2FnZW50KGNvbnN0IGNoYXIgKik7CiAgICB2b2lkICAgICAgICAgICAgc2h1dGRvd25fYWdlbnQodm9pZCk7CgogICAgaW50ICAgICAgICAgICAgIHNob3VsZF9pbml0KGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lKTsKICAgIHZvaWQgICAgICAgICAgICBhZGRfdG9faW5pdF9saXN0KGNoYXIgKm1vZHVsZV9saXN0KTsKCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9lbmFibGVfc3ViYWdlbnQodm9pZCk7CiNlbmRpZgoKI2lmbmRlZiBfQUdFTlRfUkVHSVNUUllfSAojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfaGFuZGxlci5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvdmFyX3N0cnVjdC5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfcmVnaXN0cnkuaD4KI2VuZGlmCgogICAgLyoKICAgICAqIGZhaWwgb3ZlcmxvYWRzIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlLiBpdCBtdXN0IGJlIC0xICEgCiAgICAgKi8KI2RlZmluZSBNQVRDSF9GQUlMRUQJKC0xKQojZGVmaW5lIE1BVENIX1NVQ0NFRURFRAkwCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfU05NUF9WQVJTX0hfICovCg==