LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IKkgMTk5Ny0yMDA3IEFsYWNyaXRlY2gsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZAogKgogKiAkSWQ6IHN4Z2hpZi5oLHYgMS41IDIwMDgvMDcvMjQgMTk6MTg6MjIgY2hyaXMgRXhwICQKICoKICogc3hnaGlmLmg6CiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgdGhlCiAqIEFsYWNyaXRlY2ggU2FoYXJhIGhvc3QgaW50ZXJmYWNlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIERCRwkJCQkxCgovKiBVQ09ERSBSZWdpc3RlcnMgKi8Kc3RydWN0IHN4Z191Y29kZV9yZWdzIHsKCS8qIEFkZHJlc3MgMCAtIDB4M0YgPSBDb21tYW5kIGNvZGVzIDAtMTUgZm9yIFRDQiAwLiAgRXhjb2RlIDAgKi8KCXUzMglJY3I7CQkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAwIC0gSW50IGNvbnRyb2wgKi8KCXUzMglSc3ZkUmVnMTsJLyogQ29kZSA9IDEgLSBUT0UgLU5BICovCgl1MzIJUnN2ZFJlZzI7CS8qIENvZGUgPSAyIC0gVE9FIC1OQSAqLwoJdTMyCVJzdmRSZWczOwkvKiBDb2RlID0gMyAtIFRPRSAtTkEgKi8KCXUzMglSc3ZkUmVnNDsJLyogQ29kZSA9IDQgLSBUT0UgLU5BICovCgl1MzIJUnN2ZFJlZzU7CS8qIENvZGUgPSA1IC0gVE9FIC1OQSAqLwoJdTMyCUNhcmRVcDsJCS8qIENvZGUgPSA2IC0gTWljcm9jb2RlIGluaXRpYWxpemVkIHdoZW4gMSAqLwoJdTMyCVJzdmRSZWc3OwkvKiBDb2RlID0gNyAtIFRPRSAtTkEgKi8KCXUzMglDb25maWdTdGF0OyAgICAgLyogQ29kZSA9IDggLSBDb25maWd1cmF0aW9uIGRhdGEgbG9hZCBzdGF0dXMgKi8KCXUzMiAgCVJzdmRSZWc5OwkvKiBDb2RlID0gOSAtIFRPRSAtTkEgKi8KCXUzMglDb2RlTm90VXNlZFs2XTsJLyogQ29kZXMgMTAtMTUgbm90IHVzZWQuICBFeENvZGUgPSAwICovCgkvKiBUaGlzIGJyaW5ncyB1cyB0byBFeENvZGUgMSBhdCBhZGRyZXNzIDB4NDAgPSBJbnRlcnJ1cHQgc3RhdHVzIHBvaW50ZXIgKi8KCXUzMglJc3A7CQkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAxICovCgl1MzIJUGFkRXgxWzE1XTsJLyogQ29kZXMgMS0xNSBub3QgdXNlZCB3aXRoIGV4dGVuZGVkIGNvZGVzICovCgkvKiBFeENvZGUgMiA9IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KCXUzMglJc3I7CQkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAyICovCgl1MzIgUGFkRXgyWzE1XTsKCS8qIEV4Q29kZSAzID0gRXZlbnQgYmFzZSByZWdpc3Rlci4gIExvY2F0aW9uIG9mIGV2ZW50IHJpbmdzICovCgl1MzIJRXZlbnRCYXNlOwkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAzICovCgl1MzIgUGFkRXgzWzE1XTsKCS8qIEV4Q29kZSA0ID0gRXZlbnQgcmluZyBzaXplICovCgl1MzIJRXZlbnRTaXplOwkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSA0ICovCgl1MzIgUGFkRXg0WzE1XTsKCS8qIEV4Q29kZSA1ID0gVENCIEJ1ZmZlcnMgYmFzZSBhZGRyZXNzICovCgl1MzIJVGNiQmFzZTsJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gNSAqLwoJdTMyIFBhZEV4NVsxNV07CgkvKiBFeENvZGUgNiA9IFRDQiBDb21wb3NpdGUgQnVmZmVycyBiYXNlIGFkZHJlc3MgKi8KCXUzMglUY2JDb21wQmFzZTsJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gNiAqLwoJdTMyIFBhZEV4NlsxNV07CgkvKiBFeENvZGUgNyA9IFRyYW5zbWl0IHJpbmcgYmFzZSBhZGRyZXNzICovCgl1MzIJWG10QmFzZTsJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gNyAqLwoJdTMyIFBhZEV4N1sxNV07CgkvKiBFeENvZGUgOCA9IFRyYW5zbWl0IHJpbmcgc2l6ZSAqLwoJdTMyCVhtdFNpemU7CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDggKi8KCXUzMiBQYWRFeDhbMTVdOwoJLyogRXhDb2RlIDkgPSBSZWNlaXZlIHJpbmcgYmFzZSBhZGRyZXNzICovCgl1MzIJUmN2QmFzZTsJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gOSAqLwoJdTMyIFBhZEV4OVsxNV07CgkvKiBFeENvZGUgMTAgPSBSZWNlaXZlIHJpbmcgc2l6ZSAqLwoJdTMyCVJjdlNpemU7CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDEwICovCgl1MzIgUGFkRXgxMFsxNV07CgkvKiBFeENvZGUgMTEgPSBSZWFkIEVFUFJPTS9GbGFzaCBDb25maWcgKi8KCXUzMglDb25maWc7CQkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAxMSAqLwoJdTMyIFBhZEV4MTFbMTVdOwoJLyogRXhDb2RlIDEyID0gTXVsdGljYXN0IGJpdHMgMzE6MCAqLwoJdTMyCU1jYXN0TG93OwkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAxMiAqLwoJdTMyIFBhZEV4MTJbMTVdOwoJLyogRXhDb2RlIDEzID0gTXVsdGljYXN0IGJpdHMgNjM6MzIgKi8KCXUzMglNY2FzdEhpZ2g7CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDEzICovCgl1MzIgUGFkRXgxM1sxNV07CgkvKiBFeENvZGUgMTQgPSBQaW5nICovCgl1MzIJUGluZzsJCS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDE0ICovCgl1MzIgUGFkRXgxNFsxNV07CgkvKiBFeENvZGUgMTUgPSBMaW5rIE1UVSAqLwoJdTMyCUxpbmtNdHU7CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDE1ICovCgl1MzIgUGFkRXgxNVsxNV07CgkvKiBFeENvZGUgMTYgPSBEb3dubG9hZCBzeW5jaHJvbml6YXRpb24gKi8KCXUzMglMb2FkU3luYzsJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMTYgKi8KCXUzMiBQYWRFeDE2WzE1XTsKCS8qIEV4Q29kZSAxNyA9IFVwcGVyIERSQU0gYWRkcmVzcyBiaXRzIG9uIDMyLWJpdCBzeXN0ZW1zICovCgl1MzIJVXBwZXI7CQkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAxNyAqLwoJdTMyIFBhZEV4MTdbMTVdOwoJLyogRXhDb2RlIDE4ID0gU2xvd3BhdGggU2VuZCBJbmRleCBBZGRyZXNzICovCgl1MzIJU1BTZW5kSW5kZXg7CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDE4ICovCgl1MzIgUGFkRXgxOFsxNV07CgkvKiBFeENvZGUgMTkgPSBHZXQgdWNvZGUgc3RhdGlzdGljcyAqLwoJdTMyCUdldFVjb2RlU3RhdHM7CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDE5ICovCgl1MzIgUGFkRXgxOVsxNV07CgkvKiBFeENvZGUgMjAgPSBBZ2dyZWdhdGlvbiAtIFNlZSBzeGdtaXNjLmM6U3hnU2V0SW50ZXJydXB0QWdncmVnYXRpb24gKi8KCXUzMglBZ2dyZWdhdGlvbjsJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMjAgKi8KCXUzMiBQYWRFeDIwWzE1XTsKCS8qIEV4Q29kZSAyMSA9IFJlY2VpdmUgTURMIHB1c2ggdGltZXIgKi8KCXUzMglQdXNoVGlja3M7CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDIxICovCgl1MzIgUGFkRXgyMVsxNV07CgkvKiBFeENvZGUgMjIgPSBBQ0sgRnJlcXVlbmN5ICovCgl1MzIJQWNrRnJlcXVlbmN5OwkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAyMiAqLwoJdTMyIFBhZEV4MjJbMTVdOwoJLyogRXhDb2RlIDIzID0gVE9FIE5BICovCgl1MzIgUnN2ZFJlZzIzOwoJdTMyIFBhZEV4MjNbMTVdOwoJLyogRXhDb2RlIDI0ID0gVE9FIE5BICovCgl1MzIgUnN2ZFJlZzI0OwoJdTMyIFBhZEV4MjRbMTVdOwoJLyogRXhDb2RlIDI1ID0gVE9FIE5BICovCgl1MzIJUnN2ZFJlZzI1OwkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAyNSAqLwoJdTMyIFBhZEV4MjVbMTVdOwoJLyogRXhDb2RlIDI2ID0gUmVjZWl2ZSBjaGVja3N1bSByZXF1aXJlbWVudHMgKi8KCXUzMglSZWNlaXZlQ2hlY2tzdW07CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDI2ICovCgl1MzIgUGFkRXgyNlsxNV07CgkvKiBFeENvZGUgMjcgPSBSU1MgUmVxdWlyZW1lbnRzICovCgl1MzIJUnNzOwkJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMjcgKi8KCXUzMiBQYWRFeDI3WzE1XTsKCS8qIEV4Q29kZSAyOCA9IFJTUyBUYWJsZSAqLwoJdTMyCVJzc1RhYmxlOwkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAyOCAqLwoJdTMyIFBhZEV4MjhbMTVdOwoJLyogRXhDb2RlIDI5ID0gRXZlbnQgcmluZyByZWxlYXNlIGVudHJpZXMgKi8KCXUzMglFdmVudFJlbGVhc2U7CS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDI5ICovCgl1MzIgUGFkRXgyOVsxNV07CgkvKiBFeENvZGUgMzAgPSBOdW1iZXIgb2YgcmVjZWl2ZSBidWZmZXJsaXN0IGNvbW1hbmRzIG9uIHJpbmcgMCAqLwoJdTMyCVJjdkNtZDsJCS8qIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDMwICovCgl1MzIgUGFkRXgzMFsxNV07CgkvKiBFeENvZGUgMzEgPSBzbG93cGF0aCB0cmFuc21pdCBjb21tYW5kIC0gRGF0YVszMTowXSA9IDEgKi8KCXUzMglYbXRDbWQ7CQkvKiBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAzMSAqLwoJdTMyIFBhZEV4MzFbMTVdOwoJLyogRXhDb2RlIDMyID0gRHVtcCBjb21tYW5kICovCgl1MzIJRHVtcENtZDsJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMzIgKi8KCXUzMiBQYWRFeDMyWzE1XTsKCS8qIEV4Q29kZSAzMyA9IERlYnVnIGNvbW1hbmQgKi8KCXUzMglEZWJ1Z0NtZDsJLyogQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMzMgKi8KCXUzMiBQYWRFeDMzWzE1XTsKCS8qCgkgKiBUaGVyZSBhcmUgMTI4IHBvc3NpYmxlIGV4dGVuZGVkIGNvbW1hbmRzIC0gZWFjaCBvZiBhY2NvdW50IGZvciAxNgoJICogd29yZHMgKGluY2x1ZGluZyB0aGUgbm9uLXJlbGV2ZW50IGJhc2UgY29tbWFuZCBjb2RlcyAxLTE1KS4KCSAqIFBhZCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGVzZSBoZXJlIHRvIGJyaW5nIHVzIHRvIHRoZSBuZXh0IENQVQoJICogYmFzZS4gIEFzIGV4dGVuZGVkIGNvZGVzIGFyZSBhZGRlZCwgcmVkdWNlIHRoZSBmaXJzdCBhcnJheSB2YWx1ZSBpbgoJICogdGhlIGZvbGxvd2luZyBmaWVsZAoJICovCgl1MzIgUGFkVG9OZXh0Q3B1Wzk0XVsxNl07CS8qIDk0ID0gMTI4IC0gMzQgKDM0ID0gRXhjb2RlcyAwIC0gMzMpKi8KfTsKCi8qIEludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICgwKSB2YWx1ZXMgKi8KI2RlZmluZSBTWEdfSUNSX0RJU0FCTEUJCQkJCTB4MDAwMDAwMDAKI2RlZmluZSBTWEdfSUNSX0VOQUJMRQkJCQkJMHgwMDAwMDAwMQojZGVmaW5lIFNYR19JQ1JfTUFTSwkJCQkJMHgwMDAwMDAwMgojZGVmaW5lIFNYR19JQ1JfTVNHSURfTUFTSwkJCQkweEZGRkYwMDAwCiNkZWZpbmUgU1hHX0lDUl9NU0dJRF9TSElGVAkJCTE2CiNkZWZpbmUgU1hHX0lDUihfTWVzc2FnZUlkLCBfRGF0YSkJXAoJKCgoKF9NZXNzYWdlSWQpIDw8IFNYR19JQ1JfTVNHSURfU0hJRlQpICYJXAoJICBTWEdfSUNSX01TR0lEX01BU0spIHwgKF9EYXRhKSkKCiNkZWZpbmUgU1hHX01JTl9BR0dfREVGQVVMVAkweDAwMTAJLyogTWluaW11bSBhZ2dyZWdhdGlvbiBkZWZhdWx0ICovCiNkZWZpbmUgU1hHX01BWF9BR0dfREVGQVVMVAkweDAwNDAJLyogTWF4aW11bSBhZ2dyZWdhdGlvbiBkZWZhdWx0ICovCiNkZWZpbmUgU1hHX01BWF9BR0dfU0hJRlQJMTYJLyogTWF4aW11bSBpbiB0b3AgMTYgYml0cyBvZiByZWdpc3RlciAqLwovKiBEaXNhYmxlIGludGVycnVwdCBhZ2dyZWdhdGlvbiBvbiB4bXQgKi8KI2RlZmluZSBTWEdfQUdHX1hNVF9ESVNBQkxFCTB4ODAwMDAwMDAKCi8qIFRoZSBNaWNyb2NvZGUgc3VwcG9ydHMgdXAgdG8gMTYgUlNTIHF1ZXVlcyAoUmV2QikgKi8KI2RlZmluZSBTWEdfTUFYX1JTUwkJCTE2CiNkZWZpbmUgU1hHX01BWF9SU1NfUkVWQQkJOAoKI2RlZmluZSBTWEdfTUFYX1JTU19UQUJMRV9TSVpFCTI1NgkJLyogMjU2LWJ5dGUgbWF4ICovCgojZGVmaW5lIFNYR19SU1NfUkVWQV9UQ1A2CTB4MDAwMDAwMDEJLyogUlNTIFRDUCBvdmVyIElQdjYgKi8KI2RlZmluZSBTWEdfUlNTX1JFVkFfVENQNAkweDAwMDAwMDAyCS8qIFJTUyBUQ1Agb3ZlciBJUHY0ICovCiNkZWZpbmUgU1hHX1JTU19JUAkJMHgwMDAwMDAwMQkvKiBSU1MgVENQIG92ZXIgSVB2NiAqLwojZGVmaW5lIFNYR19SU1NfVENQCQkweDAwMDAwMDAyCS8qIFJTUyBUQ1Agb3ZlciBJUHY0ICovCiNkZWZpbmUgU1hHX1JTU19MRUdBQ1kJCTB4MDAwMDAwMDQJLyogTGluZS1iYXNlIGludGVycnVwdHMgKi8KI2RlZmluZSBTWEdfUlNTX1RBQkxFX1NJWkUJMHgwMDAwRkYwMAkvKiBUYWJsZSBzaXplIG1hc2sgKi8KCiNkZWZpbmUgU1hHX1JTU19UQUJMRV9TSElGVAkJCTgKI2RlZmluZQlTWEdfUlNTX0JBU0VfQ1BVCTB4MDBGRjAwMDAJLyogQmFzZSBDUFUgKG5vdCB1c2VkKSAqLwojZGVmaW5lIFNYR19SU1NfQkFTRV9TSElGVAkJCTE2CgojZGVmaW5lIFNYR19SQ1ZfSVBfQ1NVTV9FTkFCTEVECQkweDAwMDAwMDAxCS8qIEV4Q29kZSAyNiAoUmVjZWl2ZUNoZWNrc3VtKSAqLwojZGVmaW5lIFNYR19SQ1ZfVENQX0NTVU1fRU5BQkxFRAkweDAwMDAwMDAyCS8qIEV4Q29kZSAyNiAoUmVjZWl2ZUNoZWNrc3VtKSAqLwoKI2RlZmluZSBTWEdfWE1UX0NQVUlEX1NISUZUCQkJMTYKCi8qCiAqIFN0YXR1cyByZXR1cm5lZCBieSB1Y29kZSBpbiB0aGUgQ29uZmlnU3RhdCByZWcgKHNlZSBhYm92ZSkgd2hlbiBhdHRlbXB0ZWQKICogdG8gbG9hZCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSB0aGUgRUVQUk9NL0ZsYXNoLgogKi8KI2RlZmluZQlTWEdfQ0ZHX1RJTUVPVVQJCTEJLyogaW5pdCB2YWx1ZSAtIHRpbWVvdXQgaWYgdW5jaGFuZ2VkICovCiNkZWZpbmUJU1hHX0NGR19MT0FEX0VFUFJPTQkyCS8qIGNvbmZpZyBkYXRhIGxvYWRlZCBmcm9tIEVFUFJPTSAqLwojZGVmaW5lCVNYR19DRkdfTE9BRF9GTEFTSAkzCS8qIGNvbmZpZyBkYXRhIGxvYWRlZCBmcm9tIGZsYXNoICovCiNkZWZpbmUJU1hHX0NGR19MT0FEX0lOVkFMSUQJNAkvKiBubyB2YWxpZCBjb25maWcgZGF0YSBmb3VuZCAqLwojZGVmaW5lCVNYR19DRkdfTE9BRF9FUlJPUgk1CS8qIGhhcmR3YXJlIGVycm9yICovCgojZGVmaW5lIFNYR19DSEVDS19GT1JfSEFOR19USU1FCQk1CgovKgogKiBUQ0IgcmVnaXN0ZXJzIC0gVGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgcmVnaXN0ZXIgbWVtb3J5IGFyZWEgYXMgVUNPREVfUkVHUwogKiBhYm92ZSwgYnV0IGRlZmluZWQgZGlmZmVyZW50bHkuICBCaXRzIDE3OjA2IG9mIHRoZSBhZGRyZXNzIGRlZmluZSB0aGUgVENCLAogKiB3aGljaCBtZWFucyBlYWNoIFRDQiBhcmVhIG9jY3VwaWVzIDB4NDAgKDY0KSBieXRlcywgb3IgMTYgdTMyUy4gIFdoYXQgcmVhbGx5CiAqIGlzIGhhcHBlbmluZyBpcyB0aGF0IHRoZXNlIHJlZ2lzdGVycyBvY2N1cHkgdGhlICJQYWRFeFsxNV0iIGFyZWFzIGluIHRoZQogKiBzdHJ1Y3Qgc3hnX3Vjb2RlX3JlZ3MgZGVmaW5pdGlvbiBhYm92ZQogKi8Kc3RydWN0IHN4Z190Y2JfcmVncyB7Cgl1MzIgRXhDb2RlOwkvKiBFeHRlbmRlZCBjb2RlcyAtIHNlZSBTWEdfVUNPREVfUkVHUyAqLwoJdTMyIFhtdDsJLyogQ29kZSA9IDEgLSAjIG9mIFhtdCBkZXNjcmlwdG9ycyBhZGRlZCB0byByaW5nICovCgl1MzIgUmN2OwkvKiBDb2RlID0gMiAtICMgb2YgUmN2IGRlc2NyaXB0b3JzIGFkZGVkIHRvIHJpbmcgKi8KCXUzMiBSc3ZkMTsJLyogQ29kZSA9IDMgLSBUT0UgTkEgKi8KCXUzMiBSc3ZkMjsJLyogQ29kZSA9IDQgLSBUT0UgTkEgKi8KCXUzMiBSc3ZkMzsJLyogQ29kZSA9IDUgLSBUT0UgTkEgKi8KCXUzMiBJbnZhbGlkMTsJLyogQ29kZSA9IDYgLSBSZXNlcnZlZCBmb3IgIkNhcmRVcCIgc2VlIGFib3ZlICovCgl1MzIgUnN2ZDQ7CS8qIENvZGUgPSA3IC0gVE9FIE5BICovCgl1MzIgSW52YWxpZDI7CS8qIENvZGUgPSA4IC0gUmVzZXJ2ZWQgZm9yICJDb25maWdTdGF0IiBzZWUgYWJvdmUgKi8KCXUzMiBSc3ZkNTsJLyogQ29kZSA9IDkgLSBUT0UgTkEgKi8KCXUzMiBQYWRbNl07CS8qIENvZGVzIDEwLTE1IC0gTm90IHVzZWQuICovCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElTUiBGb3JtYXQKICogICAgICAgICAgICAgICAgMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICogICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogKiAgICAgICAgICAgICAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwgICAgfAogKiAgICAgICAgICAgICAgICB8X19fX3xfX19ffF9fX198X19fX3xfX19ffF9fX198X19fX3xfX19ffAogKiAgICAgICAgICAgICAgICAgXl5eXiBeXl5eIF5eXl4gXl5eXiBcICAgICAgICAgICAgICAgICAvCiAqICAgICAgICAgICBFUlIgLS18fHx8IHx8fHwgfHx8fCB8fHx8ICAtLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEVWRU5UIC0tLXx8fCB8fHx8IHx8fHwgfHx8fCAgICAgICAgICB8CiAqICAgICAgICAgICAgICAgLS0tLXx8IHx8fHwgfHx8fCB8fHx8ICAgICAgICAgIHwtLSBDcmFzaCBBZGRyZXNzCiAqICAgICAgICAgICBVUEMgLS0tLS18IHx8fHwgfHx8fCB8fHx8CiAqICAgICAgICBMRVZFTlQgLS0tLS0tLXx8fHwgfHx8fCB8fHx8CiAqICAgICAgICAgIFBEUUYgLS0tLS0tLS18fHwgfHx8fCB8fHx8CiAqICAgICAgICAgUk1JU1MgLS0tLS0tLS0tfHwgfHx8fCB8fHx8CiAqICAgICAgICAgQlJFQUsgLS0tLS0tLS0tLXwgfHx8fCB8fHx8CiAqICAgICAgIEhCRUFUT0sgLS0tLS0tLS0tLS0tfHx8fCB8fHx8CiAqICAgICAgIE5PSEJFQVQgLS0tLS0tLS0tLS0tLXx8fCB8fHx8CiAqICAgICAgICBFUkZVTEwgLS0tLS0tLS0tLS0tLS18fCB8fHx8CiAqICAgICAgICAgWERST1AgLS0tLS0tLS0tLS0tLS0tfCB8fHx8CiAqICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS18fHx8CiAqICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS18fHx8LS1cCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwtLS18LUNwdUlkIG9mIGNyYXNoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0vCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgU1hHX0lTUl9FUlIJCTB4ODAwMDAwMDAJLyogRXJyb3IgKi8KI2RlZmluZSBTWEdfSVNSX0VWRU5UCQkweDQwMDAwMDAwCS8qIEV2ZW50IHJpbmcgZXZlbnQgKi8KI2RlZmluZSBTWEdfSVNSX05PTkUxCQkweDIwMDAwMDAwCS8qIE5vdCB1c2VkICovCiNkZWZpbmUgU1hHX0lTUl9VUEMJCTB4MTAwMDAwMDAJLyogRHVtcC9kZWJ1ZyBjb21tYW5kIGNvbXBsZXRlKi8KI2RlZmluZSBTWEdfSVNSX0xJTksJCTB4MDgwMDAwMDAJLyogTGluayBldmVudCAqLwojZGVmaW5lIFNYR19JU1JfUERRRgkJMHgwNDAwMDAwMAkvKiBQcm9jZXNzZWQgZGF0YSBxdWV1ZSBmdWxsICovCiNkZWZpbmUgU1hHX0lTUl9STUlTUwkJMHgwMjAwMDAwMAkvKiBEcm9wIC0gbm8gaG9zdCBidWYgKi8KI2RlZmluZSBTWEdfSVNSX0JSRUFLCQkweDAxMDAwMDAwCS8qIEJyZWFrcG9pbnQgaGl0ICovCiNkZWZpbmUgU1hHX0lTUl9QSU5HCQkweDAwODAwMDAwCS8qIEhlYXJ0YmVhdCByZXNwb25zZSAqLwojZGVmaW5lIFNYR19JU1JfREVBRAkJMHgwMDQwMDAwMAkvKiBDYXJkIGNyYXNoICovCiNkZWZpbmUgU1hHX0lTUl9FUkZVTEwJCTB4MDAyMDAwMDAJLyogRXZlbnQgcmluZyBmdWxsICovCiNkZWZpbmUgU1hHX0lTUl9YRFJPUAkJMHgwMDEwMDAwMAkvKiBYTVQgRHJvcCAtIG5vIERSQU0gYnVmcyBvciBYTVQgZXJyICovCiNkZWZpbmUgU1hHX0lTUl9TUFNFTkQJCTB4MDAwODAwMDAJLyogU2xvdyBzZW5kIGNvbXBsZXRlICovCiNkZWZpbmUgU1hHX0lTUl9DUFUJCTB4MDAwNzAwMDAJLyogRGVhZCBDUFUgbWFzayAqLwojZGVmaW5lIFNYR19JU1JfQ1BVX1NISUZUCTE2CQkvKiBEZWFkIENQVSBzaGlmdCAqLwojZGVmaW5lIFNYR19JU1JfQ1JBU0gJCTB4MDAwMEZGRkYJLyogQ3Jhc2ggYWRkcmVzcyBtYXNrICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEV2ZW50IFJpbmcgZW50cnkKICoKICogIDMxICAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgICAgICAgIDAKICogIC5fX19fX19fX19fX19fX19fX19fLl9fX19fX19fX19fX19fX19fX18uCiAqICB8PC0tLS0tLS0tLS0tLSAgICBQYWQgMCAgICAtLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wwCQkweDAwCiAqICB8PC0tLS0tLS0tLS0tLSAgICBQYWQgMSAgICAtLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3w0CQkweDA0CiAqICB8PC0tLS0tLS0tLS0tLSAgICBQYWQgMiAgICAtLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3w4IAkJMHgwOAogKiAgfDwtLS0tLS0tLS0tLSBFdmVudCBXb3JkIDAgLS0tLS0tLS0tLS0tPnwKICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MTIJCTB4MGMKICogIHw8LS0tLS0tLS0tLS0gRXZlbnQgV29yZCAxIC0tLS0tLS0tLS0tLT58CiAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDE2CQkweDEwCiAqICB8PC0tLS0tLS0tLS0tLS0gVG9lcGxpdHogICAtLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wyMAkJMHgxNAogKiAgfDwtLS0tLSBMZW5ndGggLS0tLT58PC0tLS0tLSBUQ0IgSWQgLS0tPnwKICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MjQJCTB4MTgKICogIHw8LS0tLS0gU3RhdHVzIC0tLS0+fEV2bnQgQ29kZXxGbHNoIENvZGV8CiAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDI4CQkweDFjCiAqICAgXiAgICAgICAgICAgICAgICAgICBeXl5eIF5eXl4KICogICB8LSBWQUxJRCAgICAgICAgICAgIHx8fHwgfHx8fC0gUkJVRkMKICogICAgICAgICAgICAgICAgICAgICAgIHx8fHwgfHx8LS0gU0xPV1IKICogICAgICAgICAgICAgICAgICAgICAgIHx8fHwgfHwtLS0gVU5VU0VECiAqICAgICAgICAgICAgICAgICAgICAgICB8fHx8IHwtLS0tIEZBU1RDCiAqICAgICAgICAgICAgICAgICAgICAgICB8fHx8LS0tLS0tIEZBU1RSCiAqICAgICAgICAgICAgICAgICAgICAgICB8fHwtLS0tLS0tCiAqICAgICAgICAgICAgICAgICAgICAgICB8fC0tLS0tLS0tCiAqICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tCiAqCiAqIFNsb3dwYXRoIHN0YXR1czoKICogICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICogIHw8LS0tLS0gU3RhdHVzIC0tLS0+fEV2bnQgQ29kZXxGbHNoIENvZGV8CiAqICB8X19fX19fX19ffENtZCBJbmRleHxfX19fX19fX198X19fX19fX19ffDI4CQkweDFjCiAqICAgIF5eXiBeXl5eCiAqICAgIHx8fCB8fHx8LSBJU1RDUElQNgogKiAgICB8fHwgfHx8LS0gSVBPTkxZCiAqICAgIHx8fCB8fC0tLSBSQ1ZFUlIKICogICAgfHx8IHwtLS0tIElQQ0JBRAogKiAgICB8fHwtLS0tLS0gVENQQ0JBRAogKiAgICB8fC0tLS0tLS0gSVNUQ1BJUAogKiAgICB8LS0tLS0tLS0gU0NFUlIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI3ByYWdtYSBwYWNrKHB1c2gsIDEpCnN0cnVjdCBzeGdfZXZlbnQgewoJdTMyCQkJUGFkWzFdOwkJLyogbm90IHVzZWQgKi8KCXUzMgkJCVNuZFVuYTsJCS8qIFNuZFVuYSB2YWx1ZSAqLwoJdTMyCQkJUmVzaWQ7CQkvKiByZWNlaXZlIE1ETCByZXNpZCAqLwoJdW5pb24gewoJCXZvaWQgKgkJSG9zdEhhbmRsZTsJLyogUmVjZWl2ZSBob3N0IGhhbmRsZSAqLwoJCXUzMgkJUnN2ZDE7CQkvKiBUT0UgTkEgKi8KCQlzdHJ1Y3QgewoJCQl1MzIgTm90VXNlZDsKCQkJdTMyCVJzdmQyOwkJLyogVE9FIE5BICovCgkJfSBGbHVzaDsKCX07Cgl1MzIJCQlUb2VwbGl0ejsJLyogUlNTIFRvZXBsaXR6IGhhc2ggKi8KCXVuaW9uIHsKCQl1c2hvcnQJCVJzdmQzOwkJLyogVE9FIE5BICovCgkJdXNob3J0CQlIZHJPZmZzZXQ7CS8qIFNsb3dwYXRoICovCgl9OwoJdXNob3J0CQkJTGVuZ3RoOwoJdW5zaWduZWQgY2hhciAJUnN2ZDQ7CQkvKiBUT0UgTkEgKi8KCXVuc2lnbmVkIGNoYXIgCUNvZGU7CQkvKiBFdmVudCBjb2RlICovCgl1bnNpZ25lZCBjaGFyCUNvbW1hbmRJbmRleDsJLyogTmV3IHJpbmcgaW5kZXggKi8KCXVuc2lnbmVkIGNoYXIJU3RhdHVzOwkJLyogRXZlbnQgc3RhdHVzICovCn07CiNwcmFnbWEgcGFjayhwb3ApCgovKiBFdmVudCBjb2RlIGRlZmluaXRpb25zICovCiNkZWZpbmUgRVZFTlRfQ09ERV9CVUZGRVJTCTB4MDEJLyogUmVjZWl2ZSBidWZmZXIgbGlzdCBjb21tYW5kIChyaW5nIDApICovCiNkZWZpbmUgRVZFTlRfQ09ERV9TTE9XUkNWCTB4MDIJLyogU2xvd3BhdGggcmVjZWl2ZSAqLwojZGVmaW5lIEVWRU5UX0NPREVfVU5VU0VECTB4MDQJLyogV2FzIHNsb3dwYXRoIGNvbW1hbmRzIGNvbXBsZXRlICovCgovKiBTdGF0dXMgdmFsdWVzICovCiNkZWZpbmUgRVZFTlRfU1RBVFVTX1ZBTElECTB4ODAJLyogRW50cnkgdmFsaWQgKi8KCi8qIFNsb3dwYXRoIHN0YXR1cyAqLwojZGVmaW5lIEVWRU5UX1NUQVRVU19FUlJPUgkweDQwCS8qIENvbXBsZXRlZCB3aXRoIGVycm9yLiBJbmRleCBpbiBuZXh0IGJ5dGUgKi8KI2RlZmluZSBFVkVOVF9TVEFUVVNfVENQSVA0CTB4MjAJLyogVENQSVB2NCBmcmFtZSAqLwojZGVmaW5lIEVWRU5UX1NUQVRVU19UQ1BCQUQJMHgxMAkvKiBCYWQgVENQIGNoZWNrc3VtICovCiNkZWZpbmUgRVZFTlRfU1RBVFVTX0lQQkFECTB4MDgJLyogQmFkIElQIGNoZWNrc3VtICovCiNkZWZpbmUgRVZFTlRfU1RBVFVTX1JDVkVSUgkweDA0CS8qIFNsb3dwYXRoIHJlY2VpdmUgZXJyb3IgKi8KI2RlZmluZSBFVkVOVF9TVEFUVVNfSVBPTkxZCTB4MDIJLyogSVAgZnJhbWUgKi8KI2RlZmluZSBFVkVOVF9TVEFUVVNfVENQSVA2CTB4MDEJLyogVENQSVB2NiBmcmFtZSAqLwojZGVmaW5lIEVWRU5UX1NUQVRVU19UQ1BJUAkweDIxCS8qIENvbWJpbmF0aW9uIG9mIHY0IGFuZCB2NiAqLwoKLyoKICogRXZlbnQgcmluZwogKiBTaXplIG11c3QgYmUgcG93ZXIgb2YgMiwgYmV0d2VlbiAxMjggYW5kIDE2awogKi8KI2RlZmluZSBFVkVOVF9SSU5HX1NJWkUJCTQwOTYKI2RlZmluZSBFVkVOVF9SSU5HX0JBVENICTE2CS8qIEhhbmQgZW50cmllcyBiYWNrIDE2IGF0IGEgdGltZS4gKi8KLyogU3RvcCBwcm9jZXNzaW5nIGV2ZW50cyBhZnRlciA0MDk2ICgyNTYgKiAxNikgKi8KI2RlZmluZSBFVkVOVF9CQVRDSF9MSU1JVAkyNTYKCnN0cnVjdCBzeGdfZXZlbnRfcmluZyB7CglzdHJ1Y3Qgc3hnX2V2ZW50IFJpbmdbRVZFTlRfUklOR19TSVpFXTsKfTsKCi8qIFRDQiBCdWZmZXJzICovCi8qIE1heGltdW0gbnVtYmVyIG9mIFRDQlMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlL21pY3JvY29kZSAqLwojZGVmaW5lIFNYR19NQVhfVENCCQk0MDk2Ci8qIE1pbmltdW0gVENCcyBiZWZvcmUgd2UgZmFpbCBpbml0aWFsaXphdGlvbiAqLwojZGVmaW5lIFNYR19NSU5fVENCCQk1MTIKLyoKICogVENCIEhhc2gKICogVGhlIGJ1Y2tldCBpcyBkZXRlcm1pbmVkIGJ5IGJpdHMgMTE6NCBvZiB0aGUgdG9lcGxpdHogaWYgd2Ugc3VwcG9ydCA0awogKiBvZmZsb2FkZWQgY29ubmVjdGlvbnMsIDEwOjQgaWYgd2Ugc3VwcG9ydCAyayBhbmQgc28gb24uCiAqLwojZGVmaW5lIFNYR19UQ0JfQlVDS0VUX1NISUZUCTQKI2RlZmluZSBTWEdfVENCX1BFUl9CVUNLRVQJMTYKI2RlZmluZSBTWEdfVENCX0JVQ0tFVF9NQVNLCTB4RkYwCS8qIEJ1Y2tldCBwb3J0aW9uIG9mIFRDQiBJRCAqLwojZGVmaW5lIFNYR19UQ0JfRUxFTUVOVF9NQVNLCTB4MDBGCS8qIEVsZW1lbnQgd2l0aGluIGJ1Y2tldCAqLwojZGVmaW5lIFNYR19UQ0JfQlVDS0VUUwkJMjU2CQkvKiAyNTYgKiAxNiA9IDRrICovCgojZGVmaW5lIFNYR19UQ0JfQlVGRkVSX1NJWkUJNTEyCS8qIEFTU0VSVCBmb3JtYXQgaXMgY29ycmVjdCAqLwoKI2RlZmluZSBTWEdfVENCX1JDVlFfU0laRQk3MzYKCiNkZWZpbmUgU1hHX1RDQl9DT01QT1NJVEVfQlVGRkVSX1NJWkUJMTAyNAoKI2RlZmluZSBTWEdfTE9DQVRFX1RDUF9GUkFNRV9IRFIoX1RjcE9iamVjdCwgX0lQdjYpCQkJXAoJKCgoX1RjcE9iamVjdCktPlZsYW5JZCkgPwkJCQkJXAoJICgoX0lQdjYpID8JCS8qIFZsYW4gZnJhbWUgaGVhZGVyID0geWVzICovCQlcCgkgICYoX1RjcE9iamVjdCktPkNvbXBCdWZmZXItPkZyYW1lLkhhc1ZsYW4uVGNwSXA2LlN4Z1RjcDoJXAoJICAmKF9UY3BPYmplY3QpLT5Db21wQnVmZmVyLT5GcmFtZS5IYXNWbGFuLlRjcElwLlN4Z1RjcCk6IAlcCgkgKChfSVB2NikgPwkJLyogVmxhbiBmcmFtZSBoZWFkZXIgPSBObyAqLwkJXAoJICAmKF9UY3BPYmplY3QpLT5Db21wQnVmZmVyLT5GcmFtZS5Ob1ZsYW4uVGNwSXA2LlN4Z1RjcAk6IAlcCgkgICYoX1RjcE9iamVjdCktPkNvbXBCdWZmZXItPkZyYW1lLk5vVmxhbi5UY3BJcC5TeGdUY3ApKQoKI2RlZmluZSBTWEdfTE9DQVRFX0lQX0ZSQU1FX0hEUihfVGNwT2JqZWN0KQkJCQlcCgkoX1RjcE9iamVjdCktPlZsYW5JZCA/CQkJCQkJXAoJJihfVGNwT2JqZWN0KS0+Q29tcEJ1ZmZlci0+RnJhbWUuSGFzVmxhbi5UY3BJcC5JcDogCQlcCgkmKF9UY3BPYmplY3QpLT5Db21wQnVmZmVyLT5GcmFtZS5Ob1ZsYW4uVGNwSXAuSXAKCiNkZWZpbmUgU1hHX0xPQ0FURV9JUDZfRlJBTUVfSERSKFRjcE9iamVjdCkJCQkJXAoJKF9UY3BPYmplY3QpLT5WbGFuSWQgPwkJCQkJCVwKCSYoX1RjcE9iamVjdCktPkNvbXBCdWZmZXItPkZyYW1lLkhhc1ZsYW4uVGNwSXA2LklwOgkJXAoJJihfVGNwT2JqZWN0KS0+Q29tcEJ1ZmZlci0+RnJhbWUuTm9WbGFuLlRjcElwNi5JcAoKI2lmIERCRwovKgogKiBIb3JyaWJsZSBrbHVkZ2UgdG8gZGlzdGluZ3Vpc2ggZHVtYi1uaWMsIHNsb3dwYXRoLCBhbmQKICogZmFzdHBhdGggdHJhZmZpYy4gIERlY3JlbWVudCB0aGUgSG9wTGltaXQgYnkgb25lCiAqIGZvciBzbG93cGF0aCwgdHdvIGZvciBmYXN0cGF0aC4gIFRoaXMgYXNzdW1lcyB0aGUgbGltaXQgaXMgbWVhc3VyYWJseQogKiBncmVhdGVyIHRoYW4gdHdvLCB3aGljaCBJIHRoaW5rIGlzIHJlYXNvbmFibGUuCiAqIE9idmlvdXNseSB0aGlzIGlzIERCRyBvbmx5LiAgTWF5YmUgcmVtb3ZlIGxhdGVyLCBvciAjaWYgMCBzbyB3ZQogKiBjYW4gc2V0IGl0IHdoZW4gbmVlZGVkCiAqLwojZGVmaW5lIFNYR19EQkdfSE9QX0xJTUlUKF9UY3BPYmplY3QsIF9GYXN0UGF0aCkgewkJCVwKCVBJUFY2X0hEUgkJX0lwNkZyYW1lSGRyOwkJCQlcCglpZiAoKF9UY3BPYmplY3QpLT5JUHY2KSB7CQkJCQlcCgkJX0lwNkZyYW1lSGRyID0gU1hHX0xPQ0FURV9JUDZfRlJBTUVfSERSKChfVGNwT2JqZWN0KSk7CVwKCQlpZiAoX0Zhc3RQYXRoKSB7CQkJCQlcCgkJCV9JcDZGcmFtZUhkci0+SG9wTGltaXQgPSAJCQlcCgkJCQkoX1RjcE9iamVjdCktPkNhY2hlZC5UdGxPckhvcExpbWl0IC0gMjsJXAoJCX0gZWxzZSB7CQkJCQkJXAoJCQlfSXA2RnJhbWVIZHItPkhvcExpbWl0ID0gCQkJXAoJCQkJKF9UY3BPYmplY3QpLT5DYWNoZWQuVHRsT3JIb3BMaW1pdCAtIDE7CVwKCQl9CQkJCQkJCVwKCX0JCQkJCQkJCVwKfQojZWxzZQovKiBEbyBub3RoaW5nIHdpdGggZnJlZSBidWlsZCAqLwojZGVmaW5lIFNYR19EQkdfSE9QX0xJTUlUKF9UY3BPYmplY3QsIF9GYXN0UGF0aCkKI2VuZGlmCgovKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5ncyAqLwojZGVmaW5lIFNYR19NQVhfUklOR19TSVpFCTI1NgojZGVmaW5lIFNYR19YTVRfUklOR19TSVpFCTEyOAkJLyogU3RhcnQgd2l0aCAxMjggKi8KI2RlZmluZSBTWEdfUkNWX1JJTkdfU0laRQkxMjgJCS8qIFN0YXJ0IHdpdGggMTI4ICovCiNkZWZpbmUgU1hHX01BWF9FTlRSSUVTICAgICA0MDk2CiNkZWZpbmUgU1hHX0pVTUJPX1JDVl9SSU5HX1NJWkUgICAgICAgMzIKCi8qIFN0cnVjdHVyZSBhbmQgbWFjcm9zIHRvIG1hbmFnZSBhIHJpbmcgKi8Kc3RydWN0IHN4Z19yaW5nX2luZm8gewoJLyogV2hlcmUgd2UgYWRkIGVudHJpZXMgLSBOb3RlIHVuc2lnbmVkIGNoYXI6UklOR19TSVpFICovCgl1bnNpZ25lZCBjaGFyIEhlYWQ7Cgl1bnNpZ25lZCBjaGFyIFRhaWw7CS8qIFdoZXJlIHdlIHB1bGwgb2ZmIGNvbXBsZXRlZCBlbnRyaWVzICovCgl1c2hvcnQJU2l6ZTsJCS8qIFJpbmcgc2l6ZSAtIE11c3QgYmUgbXVsdGlwbGUgb2YgMiAqLwoJdm9pZCAqCUNvbnRleHRbU1hHX01BWF9SSU5HX1NJWkVdOwkvKiBTaGFkb3cgcmluZyAqLwp9OwoKI2RlZmluZSBTWEdfSU5JVElBTElaRV9SSU5HKF9yaW5nLCBfc2l6ZSkgewkJCQlcCgkoX3JpbmcpLkhlYWQgPSAwOwkJCQkJCVwKCShfcmluZykuVGFpbCA9IDA7CQkJCQkJXAoJKF9yaW5nKS5TaXplID0gKF9zaXplKTsJCQkJCQlcCn0KCiNkZWZpbmUgU1hHX0FEVkFOQ0VfSU5ERVgoX2luZGV4LCBfc2l6ZSkgCQkJCVwKCQkJKChfaW5kZXgpID0gKChfaW5kZXgpICsgMSkgJiAoKF9zaXplKSAtIDEpKQojZGVmaW5lIFNYR19QUkVWSU9VU19JTkRFWChfaW5kZXgsIF9zaXplKSAJCQkJXAoJCQkoKChfaW5kZXgpIC0gMSkgJigoX3NpemUpIC0gMSkpCiNkZWZpbmUgU1hHX1JJTkdfRU1QVFkoX3JpbmcpICgoX3JpbmcpLT5IZWFkID09IChfcmluZyktPlRhaWwpCiNkZWZpbmUgU1hHX1JJTkdfRlVMTChfcmluZykgCQkJCQkJXAoJCSgoKChfcmluZyktPkhlYWQgKyAxKSAmICgoX3JpbmcpLT5TaXplIC0gMSkpID09IChfcmluZyktPlRhaWwpCiNkZWZpbmUgU1hHX1JJTkdfQURWQU5DRV9IRUFEKF9yaW5nKSAJCQkJCVwKCQlTWEdfQURWQU5DRV9JTkRFWCgoX3JpbmcpLT5IZWFkLCAoKF9yaW5nKS0+U2l6ZSkpCiNkZWZpbmUgU1hHX1JJTkdfUkVUUkVBVF9IRUFEKF9yaW5nKSAoKF9yaW5nKS0+SGVhZCA9CQkJXAoJCVNYR19QUkVWSU9VU19JTkRFWCgoX3JpbmcpLT5IZWFkLCAoX3JpbmcpLT5TaXplKSkKI2RlZmluZSBTWEdfUklOR19BRFZBTkNFX1RBSUwoX3JpbmcpIHsJCQkJCVwKCUFTU0VSVCgoX3JpbmcpLT5UYWlsICE9IChfcmluZyktPkhlYWQpOwkJCQlcCglTWEdfQURWQU5DRV9JTkRFWCgoX3JpbmcpLT5UYWlsLCAoKF9yaW5nKS0+U2l6ZSkpOwkJXAp9Ci8qCiAqIFNldCBjbWQgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJpbmcgZW50cnksIHNldCB0aGUgc2hhZG93IGNvbnRleHQKICogZW50cnkgYW5kIGFkdmFuY2UgdGhlIHJpbmcuCiAqIFRoZSBhcHByb3ByaWF0ZSBsb2NrIG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyBtYWNybwogKi8KI2RlZmluZSBTWEdfR0VUX0NNRChfcmluZywgX3JpbmdpbmZvLCBfY21kLCBfY29udGV4dCkgewkJCVwKCWlmKFNYR19SSU5HX0ZVTEwoX3JpbmdpbmZvKSkgewkJCQkJXAoJCShfY21kKSA9IE5VTEw7CQkJCQkJXAoJfSBlbHNlIHsJCQkJCQkJXAoJCShfY21kKSA9ICYoX3JpbmcpLT5EZXNjcmlwdG9yc1soX3JpbmdpbmZvKS0+SGVhZF07CVwKCQkoX3JpbmdpbmZvKS0+Q29udGV4dFsoX3JpbmdpbmZvKS0+SGVhZF0gPSAodm9pZCAqKShfY29udGV4dCk7XAoJCVNYR19SSU5HX0FEVkFOQ0VfSEVBRChfcmluZ2luZm8pOwkJCVwKCX0JCQkJCQkJCVwKfQoKLyoKICogQWJvcnQgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGNvbW1hbmQgYnkgcmV0cmVhdGluZyB0aGUgaGVhZC4KICogTk9URSAtIFRoZSBhcHBvcHJpYXRlIGxvY2sgTVVTVCBOT1QgQkUgRFJPUFBFRCBiZXR3ZWVuIHRoZSBTWEdfR0VUX0NNRAogKiBhbmQgU1hHX0FCT1JUX0NNRCBjYWxscy4KICovCiNkZWZpbmUgU1hHX0FCT1JUX0NNRChfcmluZ2luZm8pIHsJCQkJCVwKCUFTU0VSVCghKFNYR19SSU5HX0VNUFRZKF9yaW5naW5mbykpKTsJCQkJXAoJU1hHX1JJTkdfUkVUUkVBVF9IRUFEKF9yaW5naW5mbyk7CQkJCVwKCShfcmluZ2luZm8pLT5Db250ZXh0WyhfcmluZ2luZm8pLT5IZWFkXSA9IE5VTEw7CQkJXAp9CgovKgogKiBGb3IgdGhlIGdpdmVuIHJpbmcsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHRhaWwgY21kIGFuZCBjb250ZXh0LAogKiBjbGVhciB0aGUgY29udGV4dCBhbmQgYWR2YW5jZSB0aGUgdGFpbAogKi8KI2RlZmluZSBTWEdfUkVUVVJOX0NNRChfcmluZywgX3JpbmdpbmZvLCBfY21kLCBfY29udGV4dCkgewkJXAoJKF9jbWQpID0gJihfcmluZyktPkRlc2NyaXB0b3JzWyhfcmluZ2luZm8pLT5UYWlsXTsJCVwKCShfY29udGV4dCkgPSAoX3JpbmdpbmZvKS0+Q29udGV4dFsoX3JpbmdpbmZvKS0+VGFpbF07ICAgICAgIAlcCgkoX3JpbmdpbmZvKS0+Q29udGV4dFsoX3JpbmdpbmZvKS0+VGFpbF0gPSBOVUxMOwkJCVwKCVNYR19SSU5HX0FEVkFOQ0VfVEFJTChfcmluZ2luZm8pOwkJCQlcCn0KCi8qCiAqIEZvciBhIGdpdmVuIHJpbmcgZmluZCBvdXQgaG93IG11Y2ggdGhlIGZpcnN0IHBvaW50ZXIgaXMgYWhlYWQgb2YKICogdGhlIHNlY29uZCBwb2ludGVyLiAiYWhlYWQiIHJlY29nbmlzZXMgdGhlIGZhY3QgdGhhdCB0aGUgcmluZyBjYW4gd3JhcAogKi8Kc3RhdGljIGlubGluZSBpbnQgc3hnX3JpbmdfZ2V0X2ZvcndhcmRfZGlmZiAoc3RydWN0IHN4Z19yaW5nX2luZm8gKnJpbmdpbmZvLAoJCQkJCQlpbnQgYSwgaW50IGIpIHsKCWlmICgoYSA8IDAgfHwgYSA+IHJpbmdpbmZvLT5TaXplICkgfHwgKGIgPCAwIHx8IGIgPiByaW5naW5mby0+U2l6ZSkpCgkJcmV0dXJuIC0xOwoJaWYgKGEgPiBiKQkvKiBfYSBpcyBsYWdnaW5nIF9iIGFuZCBfYiBoYXMgbm90IHdyYXBwZWQgYXJvdW5kICovCgkJcmV0dXJuIChhIC0gYik7CgllbHNlCgkJcmV0dXJuICgocmluZ2luZm8tPlNpemUgLSAoYiAtIGEpKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSG9zdCBDb21tYW5kIEJ1ZmZlciAtIGNvbW1hbmRzIHRvIElOSUMgdmlhIHRoZSBDbWQgUmluZ3MKICoKICogIDMxICAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgICAgICAgIDAKICogIC5fX19fX19fX19fX19fX19fX19fLl9fX19fX19fX19fX19fX19fX18uCiAqICB8PC0tLS0tLS0tLS0tLS0tIFNnbCBMb3cgLS0tLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wwCQkweDAwCiAqICB8PC0tLS0tLS0tLS0tLS0tIFNnbCBIaWdoIC0tLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3w0CQkweDA0CiAqICB8PC0tLS0tLS0tLS0tLS0gIFNnZSAwIExvdyAgLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3w4IAkJMHgwOAogKiAgfDwtLS0tLS0tLS0tLS0tICBTZ2UgMCBIaWdoIC0tLS0tLS0tLS0tPnwKICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MTIJCTB4MGMKICogIHw8LS0tLS0tLS0tLS0tICBTZ2UgMCBMZW5ndGggLS0tLS0tLS0tLT58CiAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDE2CQkweDEwCiAqICB8PC0tLS0tLS0tLS0tIFdpbmRvdyBVcGRhdGUgLS0tLS0tLS0tLS0+fAogKiAgfDwtLS0tLS0tLSBTUCAxc3QgU0dFIG9mZnNldCAtLS0tLS0tLS0tPnwKICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MjAJCTB4MTQKICogIHw8LS0tLS0tLS0tLS0gVG90YWwgTGVuZ3RoIC0tLS0tLS0tLS0tLT58CiAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDI0CQkweDE4CiAqICB8PC0tLS0tIExDbnQgLS0tLS0tPnw8LS0tLS0gRmxhZ3MgLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wyOAkJMHgxYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI3ByYWdtYSBwYWNrKHB1c2gsIDEpCnN0cnVjdCBzeGdfY21kIHsKCWRtYTY0X2FkZHJfdAlTZ2w7CQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIFNHTCAqLwoJdW5pb24gewoJCXN0cnVjdCB7CgkJCWRtYTY0X2FkZHJfdCBGaXJzdFNnZUFkZHJlc3M7IC8qIEFkZHJlc3Mgb2YgZmlyc3QgU0dFICovCgkJCXUzMiAJICAgICBGaXJzdFNnZUxlbmd0aDsgIC8qIExlbmd0aCBvZiBmaXJzdCBTR0UgKi8KCQkJdW5pb24gewoJCQkJdTMyICBSc3ZkMTsJICAgLyogVE9FIE5BICovCgkJCQl1MzIgIFNnZU9mZnNldDsgLyogU2xvd3BhdGggLSAybmQgU0dFIG9mZnNldCAqLwoJCQkJLyogTURMIGNvbXBsZXRpb24gLSBjbG9iYmVycyB1cGRhdGUgKi8KCQkJCXUzMiAgUmVzaWQ7CgkJCX07CgkJCXVuaW9uIHsKCQkJCXUzMiAgVG90YWxMZW5ndGg7IC8qIFRvdGFsIHRyYW5zZmVyIGxlbmd0aCAqLwoJCQkJdTMyICBNc3M7CSAgLyogTFNPIE1TUyAqLwoJCQl9OwoJCX0gQnVmZmVyOwoJfTsKCXVuaW9uIHsKCQlzdHJ1Y3QgewoJCQl1bnNpZ25lZCBjaGFyIEZsYWdzOjQ7CS8qIHNsb3dwYXRoIGZsYWdzICovCgkJCXVuc2lnbmVkIGNoYXIgSXBIbDo0OwkvKiBJcCBoZWFkZXIgbGVuZ3RoICg+PjIpICovCgkJCXVuc2lnbmVkIGNoYXIgTWFjTGVuOwkvKiBNYWMgaGVhZGVyIGxlbiAqLwoJCX0gQ3N1bUZsYWdzOwoJCXN0cnVjdCB7CgkJCXVzaG9ydAlGbGFnczo0OwkvKiBzbG93cGF0aCBmbGFncyAqLwoJCQl1c2hvcnQJVGNwSGRyT2ZmOjc7CS8qIFRDUCAqLwoJCQl1c2hvcnQJTWFjTGVuOjU7CS8qIE1hYyBoZWFkZXIgbGVuICovCgkJfSBMc29GbGFnczsKCQl1c2hvcnQJCUZsYWdzOwkJLyogZmxhZ3MgKi8KCX07Cgl1bmlvbiB7CgkJdXNob3J0CVNnRW50cmllczsJLyogU0cgZW50cnkgY291bnQgaW5jbHVkaW5nIGZpcnN0IHNnZSAqLwoJCXN0cnVjdCB7CgkJCXVuc2lnbmVkIGNoYXIgU3RhdHVzOwkvKiBDb3BpZWQgZnJvbSBldmVudCBzdGF0dXMgKi8KCQkJdW5zaWduZWQgY2hhciBOb3RVc2VkOwoJCX0gU3RhdHVzOwoJfTsKfTsKI3ByYWdtYSBwYWNrKHBvcCkKCiNwcmFnbWEgcGFjayhwdXNoLCAxKQpzdHJ1Y3Qgdmxhbl9oZHIgewoJdXNob3J0IFZsYW5UY2k7Cgl1c2hvcnQgVmxhblRwaWQ7Cn07CiNwcmFnbWEgcGFjayhwb3ApCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2xvd3BhdGggRmxhZ3M6CiAqCiAqCiAqIExTUyBGbGFnczoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0tLQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8uLS0tIFRDUCBMYXJnZSBzZWdtZW50IHNlbmQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLi0tLQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8uLS0tCiAqICAzICAgICAgICAgICAgICAgICAgIDEgICAgIDEgICAgICAgLy8vLwogKiAgMSAgICAgICAgICAgICAgICAgICA1ICAgICAwICAgICAgfHx8fAogKiAgLl9fX19fX19fX19fX19fX19fX18uX19fX19fX19fX19fdnZ2di4KICogIHwgICAgICAgICAgICAgICAgICAgfE1BQyB8ICBUQ1AgfCAgICB8CiAqICB8ICAgICAgTENudCAgICAgICAgIHxobGVufGhkcm9mZnxGbGdzfAogKiAgfF9fX19fX19fX19fX19fX19fX198fHx8fHx8fHx8fHx8X19fX3wKICoKICoKICogQ2hlY2tzdW0gRmxhZ3MKICoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0tLQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8uLS0tCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4tLS0gQ2hlY2tzdW0gVENQCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy4tLS0gQ2hlY2tzdW0gSVAKICogIDMgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAvLy8vIE5vIGJpdHMgLSBub3JtYWwgc2VuZAogKiAgMSAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgIDcgICAgfHx8fAogKiAgLl9fX19fX19fX19fX19fX19fX18uX19fX19fX19fX19fX19fdnZ2di4KICogIHwgICAgICAgICAgICAgICAgICAgfCBPZmZsb2FkIHwgSVAgfCAgICB8CiAqICB8ICAgICAgTENudCAgICAgICAgIHxNQUMgaGxlbiB8SGxlbnxGbGdzfAogKiAgfF9fX19fX19fX19fX19fX19fX198X19fX3xfX19ffF9fX198X19fX3wKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTbG93cGF0aCBDTUQgZmxhZ3MgKi8KI2RlZmluZSBTWEdfU0xPV0NNRF9DU1VNX0lQCQkweDAxCS8qIENoZWNrc3VtIElQICovCiNkZWZpbmUgU1hHX1NMT1dDTURfQ1NVTV9UQ1AJCTB4MDIJLyogQ2hlY2tzdW0gVENQICovCiNkZWZpbmUgU1hHX1NMT1dDTURfTFNPCQkJMHgwNAkvKiBMYXJnZSBzZWdtZW50IHNlbmQgKi8KCnN0cnVjdCBzeGdfeG10X3JpbmcgewoJc3RydWN0IHN4Z19jbWQgRGVzY3JpcHRvcnNbU1hHX1hNVF9SSU5HX1NJWkVdOwp9OwoKc3RydWN0IHN4Z19yY3ZfcmluZyB7CglzdHJ1Y3Qgc3hnX2NtZCBEZXNjcmlwdG9yc1tTWEdfUkNWX1JJTkdfU0laRV07Cn07CgovKgogKiBTaGFyZSBtZW1vcnkgYnVmZmVyIHR5cGVzIC0gVXNlZCB0byBpZGVudGlmeSBhc3luY2hyb25vdXMKICogc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uCiAqLwplbnVtIHN4Z19idWZmZXJfdHlwZSB7CglTWEdfQlVGRkVSX1RZUEVfUkNWLAkJLyogUmVjZWl2ZSBidWZmZXIgKi8KCVNYR19CVUZGRVJfVFlQRV9TR0wJCS8qIFNHTCBidWZmZXIgKi8KfTsKCi8qIFN0YXRlIGZvciBTWEcgYnVmZmVycyAqLwojZGVmaW5lIFNYR19CVUZGRVJfRlJFRQkJMHgwMQojZGVmaW5lIFNYR19CVUZGRVJfQlVTWQkJMHgwMgojZGVmaW5lIFNYR19CVUZGRVJfT05DQVJECTB4MDQKI2RlZmluZSBTWEdfQlVGRkVSX1VQU1RSRUFNCTB4MDgKCi8qCiAqIFJlY2VpdmUgZGF0YSBidWZmZXJzCiAqCiAqIFJlY2VpdmUgZGF0YSBidWZmZXJzIGFyZSBnaXZlbiB0byB0aGUgU2FoYXJhIGNhcmQgMTI4IGF0IGEgdGltZS4KICogVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgZmlsbGluZyBpbiBhICJyZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2siCiAqIHdpdGggMTI4ICJyZWNlaXZlIGRlc2NyaXB0b3JzIi4gIEVhY2ggZGVzY3JpcHRvciBjb25zaXN0cyBvZgogKiBhIHBoeXNpY2FsIGFkZHJlc3MsIHdoaWNoIHRoZSBjYXJkIHVzZXMgYXMgdGhlIGFkZHJlc3MgdG8KICogRE1BIGRhdGEgaW50bywgYW5kIGEgdmlydHVhbCBhZGRyZXNzLCB3aGljaCBpcyBnaXZlbiBiYWNrCiAqIHRvIHRoZSBob3N0IGluIHRoZSAiSG9zdEhhbmRsZSIgcG9ydGlvbiBvZiBhbiBldmVudC4KICogVGhlIHJlY2VpdmUgZGVzY3JpcHRvciBkYXRhIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGJlbG93CiAqIGFzIHN4Z19yY3ZfZGF0YV9kZXNjcmlwdG9yLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sKICogaXMgZGVmaW5lZCBhcyBzeGdfcmN2X2Rlc2NyaXB0b3JfYmxvY2suCiAqCiAqIFRoaXMgcmVjZWl2ZSBkZXNjcmlwdG9yIGJsb2NrIGlzIGdpdmVuIHRvIHRoZSBjYXJkIGJ5IGZpbGxpbmcKICogaW4gdGhlIFNnbCBmaWVsZCBvZiBhIHN4Z19jbWQgZW50cnkgZnJvbSBwQWRhcHQtPlJjdlJpbmdzWzBdCiAqIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciBibG9jay4KICoKICogQm90aCB0aGUgcmVjZWl2ZSBidWZmZXJzIGFuZCB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIGJsb2NrcwogKiByZXF1aXJlIGFkZGl0aW9uYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIG1haW50YWluIHRoZW0KICogb24gYSBmcmVlIHF1ZXVlIGFuZCBjb250YWluIG90aGVyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgogKiBUaG9zZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgYXMgdGhlIHN4Z19yY3ZfZGF0YV9idWZmZXJfaGRyCiAqIGFuZCBzeGdfcmN2X2Rlc2NyaXB0b3JfYmxvY2tfaGRyIHJlc3BlY3RpdmVseS4KICoKICogU2luY2UgYm90aCB0aGUgcmVjZWl2ZSBidWZmZXJzIGFuZCB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIGJsb2NrCiAqIG11c3QgYmUgYWNjZXNzaWJsZSBieSB0aGUgY2FyZCwgYm90aCBtdXN0IGJlIGFsbG9jYXRlZCBvdXQgb2YKICogc2hhcmVkIG1lbW9yeS4gIFRvIGVuc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGEgZGVzY3JpcHRvcgogKiBibG9jayBhdmFpbGFibGUgZm9yIGV2ZXJ5IDEyOCBidWZmZXJzLCB3ZSBhbGxvY2F0ZSBhbGwgb2YKICogdGhlc2UgcmVzb3VyY2VzIHRvZ2V0aGVyIGluIGEgc2luZ2xlIGJsb2NrLiAgVGhpcyBlbnRpcmUKICogYmxvY2sgaXMgbWFuYWdlZCBieSBhIHN0cnVjdCBzeGdfcmN2X2Jsb2NrX2hkciwgd2hvJ3Mgc29sZSBwdXJwb3NlCiAqIGlzIHRvIG1haW50YWluIGFkZHJlc3MgaW5mb3JtYXRpb24gc28gdGhhdCB0aGUgZW50aXJlIGJsb2NrCiAqIGNhbiBiZSBmcmVlIGxhdGVyLgogKgogKiBGdXJ0aGVyIGNvbXBsaWNhdGluZyBtYXR0ZXJzIGlzIHRoZSBmYWN0IHRoYXQgdGhlIHJlY2VpdmUKICogYnVmZmVycyBtdXN0IGJlIHZhcmlhYmxlIGluIGxlbmd0aCBpbiBvcmRlciB0byBhY2NvbW9kYXRlCiAqIGp1bWJvIGZyYW1lIGNvbmZpZ3VyYXRpb25zLiAgV2UgY29uZmlndXJlIHRoZSBidWZmZXIKICogbGVuZ3RoIHNvIHRoYXQgdGhlIGJ1ZmZlciBhbmQgaXQncyBjb3JyZXNwb25kaW5nIHN0cnVjdAogKiBzeGdfcmN2X2RhdGFfYnVmZmVyX2hkciBzdHJ1Y3R1cmUgYWRkIHVwIHRvIGFuIGV2ZW4KICogYm91bmRhcnkuICBUaGVuIHdlIHBsYWNlIHRoZSByZW1haW5pbmcgZGF0YSBzdHJ1Y3R1cmVzIGFmdGVyIDEyOAogKiAgb2YgdGhlbSBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGRpYWdyYW06CiAqCiAqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqIHwgICAgVmFyaWFibGUgbGVuZ3RoIHJlY2VpdmUgYnVmZmVyICMxICAgIHwKICogfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAogKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqIHwgICAgICAgc3hnX3Jjdl9kYXRhX2J1ZmZlcl9oZHIgIzEgICAgICAgIHwKICogfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCA8PT0gRXZlbiAyayBvciAxMGsgYm91bmRhcnkKICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiB8ICAgICAgICAgLi4uIHJlcGVhdCAyLTEyOCAuLiAgICAgICAgICAgICB8CiAqIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiB8ICAgICAgc3RydWN0IHN4Z19yY3ZfZGVzY3JpcHRvcl9ibG9jayAgICB8CiAqIHwgIENvbnRhaW5zIHN4Z19yY3ZfZGF0YV9kZXNjcmlwdG9yICogMTI4IHwKICogfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAogKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqIHwgICBzdHJ1Y3Qgc3hnX3Jjdl9kZXNjcmlwdG9yX2Jsb2NrX2hkciAgIHwKICogfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAogKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqIHwgICAgICBzdHJ1Y3Qgc3hnX3Jjdl9ibG9ja19oZHIgICAgICAgICAgIHwKICogfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAogKgogKiBNZW1vcnkgY29uc3VtcHRpb246CiAqCSAgTm9uLWp1bWJvOgogKiAgICAgIEJ1ZmZlcnMgYW5kIHN4Z19yY3ZfZGF0YV9idWZmZXJfaGRyID0gMmsgKiAxMjggPSAyNTZrCiAqICAgICsgc3RydWN0IHN4Z19yY3ZfZGVzY3JpcHRvcl9ibG9jayA9IDJrCiAqICAgICsgc3RydWN0IHN4Z19yY3ZfZGVzY3JpcHRvcl9ibG9ja19oZHIgPSB+MzIKICogICAgKyBzdHJ1Y3Qgc3hnX3Jjdl9ibG9ja19oZHIgPSB+MzIKICogICAgPT4gVG90YWwgPSB+MjU4ay9ibG9jawogKgogKgkgIEp1bWJvOgogKiAgICAgIEJ1ZmZlcnMgYW5kIHN4Z19yY3ZfZGF0YV9idWZmZXJfaGRyID0gMTBrICogMTI4ID0gMTI4MGsKICogICAgKyBzdHJ1Y3Qgc3hnX3Jjdl9kZXNjcmlwdG9yX2Jsb2NrID0gMmsKICogICAgKyBzdHJ1Y3Qgc3hnX3Jjdl9kZXNjcmlwdG9yX2Jsb2NrX2hkciA9IH4zMgogKiAgICArIHN0cnVjdCBzeGdfcmN2X2Jsb2NrX2hkciA9IH4zMgogKiAgICA9PiBUb3RhbCA9IH4xMjgyay9ibG9jawogKgogKi8KI2RlZmluZSBTWEdfUkNWX0RBVEFfQlVGRkVSUwkJODE5MgkvKiBBbW91bnQgdG8gZ2l2ZSB0byB0aGUgY2FyZCAqLwojZGVmaW5lIFNYR19JTklUSUFMX1JDVl9EQVRBX0JVRkZFUlMJMTYzODQJLyogSW5pdGlhbCBwb29sIG9mIGJ1ZmZlcnMgKi8KLyogTWluaW11bSBhbW91bnQgYW5kIHdoZW4gdG8gZ2V0IG1vcmUgKi8KI2RlZmluZSBTWEdfTUlOX1JDVl9EQVRBX0JVRkZFUlMJNDA5NgojZGVmaW5lIFNYR19NQVhfUkNWX0JMT0NLUwkJMjU2CS8qID0gMzJrIHJlY2VpdmUgYnVmZmVycyAqLwovKiBBbW91bnQgdG8gZ2l2ZSB0byB0aGUgY2FyZCBpbiBjYXNlIG9mIGp1bWJvIGZyYW1lcyAqLwojZGVmaW5lIFNYR19KVU1CT19SQ1ZfREFUQV9CVUZGRVJTCQkyMDQ4Ci8qIEluaXRpYWwgcG9vbCBvZiBidWZmZXJzIGluIGNhc2Ugb2YganVtYm8gYnVmZmVycyAqLwojZGVmaW5lIFNYR19JTklUSUFMX0pVTUJPX1JDVl9EQVRBX0JVRkZFUlMJNDA5NgojZGVmaW5lIFNYR19NSU5fSlVNQk9fUkNWX0RBVEFfQlVGRkVSUwkJMTAyNAoKLyogUmVjZWl2ZSBidWZmZXIgaGVhZGVyICovCnN0cnVjdCBzeGdfcmN2X2RhdGFfYnVmZmVyX2hkciB7CglkbWE2NF9hZGRyX3QJUGh5c2ljYWxBZGRyZXNzOwkvKiBCdWZmZXIgcGh5c2ljYWwgYWRkcmVzcyAqLwoJLyoKCSAqIE5vdGUgLSBETyBOT1QgVVNFIHRoZSBWaXJ0dWFsQWRkcmVzcyBmaWVsZCB0byBsb2NhdGUgZGF0YS4KCSAqIFVzZSB0aGUgc3hnLmg6U1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTiBtYWNybyBpbnN0ZWFkLgoJICovCglzdHJ1Y3QgbGlzdF9lbnRyeQlGcmVlTGlzdDsJLyogRnJlZSBxdWV1ZSBvZiBidWZmZXJzICovCgl1bnNpZ25lZCBjaGFyCQlTdGF0ZTsJCS8qIFNlZSBTWEdfQlVGRkVSIHN0YXRlIGFib3ZlICovCglzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqIHNrYjsJCS8qIERvdWJsZSBtYXBwZWQgKG5ibCBhbmQgcGt0KSovCn07CgovKgogKiBTeGdTbG93UmVjZWl2ZSB1c2VzIHRoZSBQQUNLRVQgKHNrYikgY29udGFpbmVkCiAqIGluIHRoZSBzdHJ1Y3Qgc3hnX3Jjdl9kYXRhX2J1ZmZlcl9oZHIgd2hlbiBpbmRpY2F0aW5nIGR1bWItbmljIGRhdGEKICovCiNkZWZpbmUgU3hnRHVtYlJjdlBhY2tldAkgICAgICAgIHNrYgoKLyogU3BhY2UgZm9yIHN0cnVjdCBzeGdfcmN2X2RhdGFfYnVmZmVyX2hkciAqLwojZGVmaW5lIFNYR19SQ1ZfREFUQV9IRFJfU0laRQkJc2l6ZW9mKHN0cnVjdCBzeGdfcmN2X2RhdGFfYnVmZmVyX2hkcikKLyogTm9uIGp1bWJvID0gMmsgaW5jbHVkaW5nIEhEUiAqLwojZGVmaW5lIFNYR19SQ1ZfREFUQV9CVUZGRVJfU0laRQkyMDQ4Ci8qIGp1bWJvID0gMTBrIGluY2x1ZGluZyBIRFIgKi8KI2RlZmluZSBTWEdfUkNWX0pVTUJPX0JVRkZFUl9TSVpFCTEwMjQwCgovKiBSZWNlaXZlIGRhdGEgZGVzY3JpcHRvciAqLwpzdHJ1Y3Qgc3hnX3Jjdl9kYXRhX2Rlc2NyaXB0b3IgewoJdW5pb24gewoJCXN0cnVjdCBza19idWZmICpWaXJ0dWFsQWRkcmVzczsJLyogSG9zdCBoYW5kbGUgKi8KCQl1NjQJCUZvcmNlVG84Qnl0ZXM7CS8qRm9yY2UgeDg2IHRvIDgtYnl0ZSBib3VuZGFyeSovCgl9OwoJZG1hNjRfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsKfTsKCi8qIFJlY2VpdmUgZGVzY3JpcHRvciBibG9jayAqLwojZGVmaW5lIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLCQkxMjgKI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfU0laRQkJMjA0OAkvKiBGb3Igc2FuaXR5IGNoZWNrICovCgpzdHJ1Y3Qgc3hnX3Jjdl9kZXNjcmlwdG9yX2Jsb2NrIHsKCXN0cnVjdCBzeGdfcmN2X2RhdGFfZGVzY3JpcHRvciBEZXNjcmlwdG9yc1tTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DS107Cn07CgovKiBSZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sgaGVhZGVyICovCnN0cnVjdCBzeGdfcmN2X2Rlc2NyaXB0b3JfYmxvY2tfaGRyIHsKCXZvaWQgCQkqVmlydHVhbEFkZHJlc3M7CS8qIHN0YXJ0IG9mIDJrIGJ1ZmZlciAqLwoJZG1hNjRfYWRkcl90CQlQaHlzaWNhbEFkZHJlc3M7LyogYW5kIGl0J3MgcGh5c2ljYWwgYWRkcmVzcyAqLwoJc3RydWN0IGxpc3RfZW50cnkJRnJlZUxpc3Q7LyogZnJlZSBxdWV1ZSBvZiBkZXNjcmlwdG9yIGJsb2NrcyAqLwoJdW5zaWduZWQgY2hhcglTdGF0ZTsJLyogc2VlIHN4Z19idWZmZXIgc3RhdGUgYWJvdmUgKi8KfTsKCi8qIFJlY2VpdmUgYmxvY2sgaGVhZGVyICovCnN0cnVjdCBzeGdfcmN2X2Jsb2NrX2hkciB7Cgl2b2lkCQkqVmlydHVhbEFkZHJlc3M7CS8qIFN0YXJ0IG9mIHZpcnR1YWwgbWVtb3J5ICovCglkbWE2NF9hZGRyX3QJCVBoeXNpY2FsQWRkcmVzczsvKiAuLmFuZCBpdCdzIHBoeXNpY2FsIGFkZHJlc3MqLwoJc3RydWN0IGxpc3RfZW50cnkJQWxsTGlzdDsJLyogUXVldWUgb2YgYWxsIFNYR19SQ1ZfQkxPQ0tTKi8KfTsKCi8qIE1hY3JvcyB0byBkZXRlcm1pbmUgZGF0YSBzdHJ1Y3R1cmUgb2Zmc2V0cyBpbnRvIHJlY2VpdmUgYmxvY2sgKi8KI2RlZmluZSBTWEdfUkNWX0JMT0NLX1NJWkUoX0J1ZmZlcnNpemUpIAkJCQlcCgkoKChfQnVmZmVyc2l6ZSkgKiBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSykgKwkJXAoJIChzaXplb2Yoc3RydWN0IHN4Z19yY3ZfZGVzY3JpcHRvcl9ibG9jaykpICAgICAgICAgICAgICArCVwKCSAoc2l6ZW9mKHN0cnVjdCBzeGdfcmN2X2Rlc2NyaXB0b3JfYmxvY2tfaGRyKSkgICAgICAgICAgKwlcCgkgKHNpemVvZihzdHJ1Y3Qgc3hnX3Jjdl9ibG9ja19oZHIpKSkKI2RlZmluZSBTWEdfUkNWX0JVRkZFUl9EQVRBX1NJWkUoX0J1ZmZlcnNpemUpCQkJCVwKCSgoX0J1ZmZlcnNpemUpIC0gU1hHX1JDVl9EQVRBX0hEUl9TSVpFKQojZGVmaW5lIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJCQlcCgkoKF9CdWZmZXJzaXplKSAtIFNYR19SQ1ZfREFUQV9IRFJfU0laRSkKI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfT0ZGU0VUKF9CdWZmZXJzaXplKQkJCVwKCSgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spCiNkZWZpbmUgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUl9PRkZTRVQoX0J1ZmZlcnNpemUpCQlcCgkoKChfQnVmZmVyc2l6ZSkgKiBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSykgKwkJXAoJIChzaXplb2Yoc3RydWN0IHN4Z19yY3ZfZGVzY3JpcHRvcl9ibG9jaykpKQojZGVmaW5lIFNYR19SQ1ZfQkxPQ0tfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJCQkJXAoJKCgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spICsJCVwKCSAoc2l6ZW9mKHN0cnVjdCBzeGdfcmN2X2Rlc2NyaXB0b3JfYmxvY2spKSAgICAgICAgICAgICAgKwlcCgkgKHNpemVvZihzdHJ1Y3Qgc3hnX3Jjdl9kZXNjcmlwdG9yX2Jsb2NrX2hkcikpKQoKLyogU2NhdHRlciBnYXRoZXIgbGlzdCBidWZmZXIgKi8KI2RlZmluZSBTWEdfSU5JVElBTF9TR0xfQlVGRkVSUwk4MTkyCS8qIEluaXRpYWwgcG9vbCBvZiBTR0wgYnVmZmVycyAqLwojZGVmaW5lIFNYR19NSU5fU0dMX0JVRkZFUlMJMjA0OAkvKiBNaW5pbXVtIGFtb3VudCBhbmQgd2hlbiB0byBnZXQgbW9yZSovCi8qIE1heGltdW0gdG8gYWxsb2NhdGUgKG5vdGUgQURBUFQ6dXNob3J0KSAqLwojZGVmaW5lIFNYR19NQVhfU0dMX0JVRkZFUlMJMTYzODQKCi8qCiAqIFNYR19TR0xfUE9PTF9QUk9QRVJUSUVTIC0gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYSBwb29sIG9mIFNHTAogKiBidWZmZXJzLiBUaGVzZSBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgb3V0IG9mIHNoYXJlZCBtZW1vcnkgYW5kIHVzZWQgdG8KICogY29udGFpbiBhIHBoeXNpY2FsIHNjYXR0ZXIgZ2F0aGVyIGxpc3Qgc3RydWN0dXJlIHRoYXQgaXMgc2hhcmVkCiAqIHdpdGggdGhlIGNhcmQuCiAqCiAqIFdlIHNwbGl0IG91ciBTR0wgYnVmZmVycyBpbnRvIG11bHRpcGxlIHBvb2xzIGJhc2VkIG9uIHNpemUuICBUaGUgbW90aXZhdGlvbgogKiBpcyB0aGF0IHNvbWUgYXBwbGljYXRpb25zIHBlcmZvcm0gdmVyeSBsYXJnZSBJL09zICgxTUIgZm9yIGV4YW1wbGUpLCBzbwogKiB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgYW4gU0dMIHRvIGFjY29tbW9kYXRlIHN1Y2ggYSByZXF1ZXN0LgogKiBCdXQgc3VjaCBhbiBTR0wgd291bGQgcmVxdWlyZSAyNTYgMjQtYnl0ZSBTRyBlbnRyaWVzIC0gfjZrLgogKiBHaXZlbiB0aGF0IHRoZSB2YXN0IG1ham9yaXR5IG9mIEkvT3MgYXJlIG11Y2ggc21hbGxlciB0aGFuIDFNLCBhbGxvY2F0aW5nCiAqIGEgc2luZ2xlIHBvb2wgb2YgU0dMIGJ1ZmZlcnMgd291bGQgYmUgYSBob3JyaWJseSBpbmVmZmljaWVudCB1c2Ugb2YKICogbWVtb3J5LgogKgogKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbmNsdWRlcyB0d28gZmllbGRzIHJlbGF0aW5nIHRvIGl0cyBzaXplLgogKiBUaGUgTkJTaXplIGZpZWxkIHNwZWNpZmllcyB0aGUgbGFyZ2VzdCBORVRfQlVGRkVSIHRoYXQgY2FuIGJlIGhhbmRsZWQKICogYnkgdGhlIHBhcnRpY3VsYXIgcG9vbC4gIFRoZSBTR0VudHJpZXMgZmllbGQgZGVmaW5lcyB0aGUgc2l6ZSwgaW4KICogZW50cmllcywgb2YgdGhlIFNHTCBmb3IgdGhhdCBwb29sLiAgVGhlIFNHRW50cmllcyBpcyBkZXRlcm1pbmVkIGJ5CiAqIGRpdmlkaW5nIHRoZSBOQlNpemUgYnkgdGhlIGV4cGVjdGVkIHBhZ2Ugc2l6ZSAoNGspLCBhbmQgdGhlbiBwYWRkaW5nCiAqIGl0IGJ5IHNvbWUgYXBwcm9wcmlhdGUgYW1vdW50IGFzIGluc3VyYW5jZSAoMjAlIG9yIHNvLi4/PykuCiAqLwpzdHJ1Y3Qgc3hnX3NnbF9wb29sX3Byb3BlcnRpZXMgewoJdTMyCU5CU2l6ZTsJCS8qIExhcmdlc3QgTkVUX0JVRkZFUiBzaXplIGZvciB0aGlzIHBvb2wgKi8KCXVzaG9ydAlTR0VudHJpZXM7CS8qIE51bWJlciBvZiBlbnRyaWVzIGluIFNHTCAqLwoJdXNob3J0CUluaXRpYWxCdWZmZXJzOwkvKiBOdW1iZXIgdG8gYWxsb2NhdGUgYXQgaW5pdGlhbGl6YXRpb250aW1lICovCgl1c2hvcnQJTWluQnVmZmVyczsJLyogV2hlbiB0byBnZXQgbW9yZSAqLwoJdXNob3J0CU1heEJ1ZmZlcnM7CS8qIFdoZW4gdG8gc3RvcCAqLwoJdXNob3J0CVBlckNwdVRocmVzaG9sZDsvKiBTZWUgc3hnaC5oOlNYR19SRVNPVVJDRVMgKi8KfTsKCi8qCiAqIEF0IHRoZSBtb21lbnQgSSdtIGdvaW5nIHRvIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZSA0IHBvb2xzOgogKgkxMDBrIGJ1ZmZlciBwb29sOiBUaGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgZXhwZWN0ZWQgYnVmZmVycyBhcmUgZXhwZWN0ZWQKICoJCQl0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTAway4gIEF0IDMwIGVudHJpZXMgcGVyIGFuZAogKiAJCQk4ayBpbml0aWFsIGJ1ZmZlcnMgYW1vdW50cyB0byB+NE1CIG9mIG1lbW9yeQogKiAgICAgICAgICAgICAgICAgTk9URSAtIFRoaXMgdXNlZCB0byBiZSA2NEsgd2l0aCAyMCBlbnRyaWVzLCBidXQgZHVyaW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgV0hRTCBORElTIDYuMCBUZXN0aW5nICgyY19taW5pNnN0cmVzcykgTVMgZG9lcyB0aGVpcgogKiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgdG8gc2VuZCBhYnN1cmQgTkJMJ3Mgd2l0aCByaWRpY3Vsb3VzIFNHTHMsIHdlCiAqICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSByZWNlaXZlZCA0MDBieXRlIHNlbmRzIGNvbnRhaW5lZCBpbiBTR0wncyB0aGF0CiAqICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSAyOCBlbnRyaWVzCiAqCSAgMU0gYnVmZmVyIHBvb2w6IEJ1ZmZlcnMgYmV0d2VlbiA2NGsgYW5kIDFNLiAgQWxsb2NhdGUgMjU2IGluaXRpYWwKICoJICAJCSAgYnVmZmVycyB3aXRoIDMwMCBlbnRyaWVzIGVhY2ggPT4gfjJNQiBvZiBtZW1vcnkKICoJICA1TSBidWZmZXIgcG9vbDogTm90IGV4cGVjdGVkIG9mdGVuLCBpZiBhdCBhbGwuICAzMiBpbml0aWFsIGJ1ZmZlcnMKICoJCQkgIGF0IDE1MDAgZW50cmllcyBlYWNoID0+IH4xTUIgb2YgbWVtb3J5CiAqIDEwTSBidWZmZXIgcG9vbDogTm90IGV4cGVjdGVkIGF0IGFsbCwgZXhjZXB0IHVuZGVyIHBhdGhlbG9naWNhbCBjb25kaXRpb25zLgogKiAJCSAgICBBbGxvY2F0ZSBvbmUgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4KICogCQkgIE5vdGUgLSAxME0gaXMgdGhlIGN1cnJlbnQgbGltaXQgb2Ygd2hhdCB3ZSBjYW4gcmVhbGlzdGljYWxseQogKiAJCSAgCSBzdXBwb3J0IGR1ZSB0byB0aGUgc2FoYXJhIFNHTCBidWcgZGVzY3JpYmVkIGluIHRoZQogKiAJCSAgCSBTQUhBUkEgU0dMIFdPUktBUk9VTkQgYmVsb3cuIFdlIHdpbGwgbGlrZWx5IGFkanVzdCB0aGUKICogCQkgIAkgbnVtYmVyIG9mIHBvb2xzIGFuZC9vciBwb29sIHByb3BlcnRpZXMgb3ZlciB0aW1lLgogKi8KI2RlZmluZSBTWEdfTlVNX1NHTF9QT09MUwk0CiNkZWZpbmUgSU5JVElBTElaRV9TR0xfUE9PTF9QUk9QRVJUSUVTCQkJCQlcCnN0cnVjdCBzeGdfc2dsX3Bvb2xfcHJvcGVydGllcyBTeGdTZ2xQb29sUHJvcGVydGllc1tTWEdfTlVNX1NHTF9QT09MU10gPVwKeyAJCQkJCQkJCQlcCgl7ICAxMDI0MDAsICAgMzAsIDgxOTIsIDIwNDgsIDE2Mzg0LCAyNTZ9LAkJCVwKCXsgMTA0ODU3NiwgIDMwMCwgIDI1NiwgIDEyOCwgIDEwMjQsIDE2fSwJCQlcCgl7IDUyNTI4ODAsIDE1MDAsICAgMzIsICAgMTYsICAgNTEyLCAwfSwJCQkJXAoJezEwNDg1NzYwLCAyNzAwLCAgICAyLCAgICA0LCAgICAzMiwgMH0sCQkJCVwKfTsKCmV4dGVybiBzdHJ1Y3Qgc3hnX3NnbF9wb29sX3Byb3BlcnRpZXMgU3hnU2dsUG9vbFByb3BlcnRpZXNbXTsKCiNkZWZpbmUgU1hHX01BWF9TR0xfQlVGRkVSX1NJWkUJCQkJCQlcCglTeGdTZ2xQb29sUHJvcGVydGllc1tTWEdfTlVNX1NHTF9QT09MUyAtIDFdLk5CU2l6ZQoKLyoKICogU0FIQVJBIFNHTCBXT1JLQVJPVU5EISEKICogVGhlIGN1cnJlbnQgU2FoYXJhIGNhcmQgdXNlcyBhIDE2LWJpdCBjb3VudGVyIHdoZW4gYWR2YW5jaW5nCiAqIFNHTCBhZGRyZXNzIGxvY2F0aW9ucy4gIFRoaXMgbWVhbnMgdGhhdCBpZiBhbiBTR0wgY3Jvc3NlcwogKiBhIDY0ayBib3VuZGFyeSwgdGhlIGhhcmR3YXJlIHdpbGwgYWN0dWFsbHkgc2tpcCBiYWNrIHRvCiAqIHRoZSBzdGFydCBvZiB0aGUgcHJldmlvdXMgNjRrIGJvdW5kYXJ5LCB3aXRoIG9idmlvdXNseQogKiB1bmRlc2lyYWJsZSByZXN1bHRzLgogKgogKiBXZSBjdXJyZW50bHkgd29ya2Fyb3VuZCB0aGlzIGlzc3VlIGJ5IGFsbG9jYXRpbmcgU0dMIGJ1ZmZlcnMKICogaW4gNjRrIGJsb2NrcyBhbmQgc2tpcHBpbmcgb3ZlciBidWZmZXJzIHRoYXQgc3RyYWRkbGUgdGhlIGJvdW5kYXJ5LgogKi8KI2RlZmluZSBTWEdfSU5WQUxJRF9TR0wocGh5c19hZGRyLGxlbikgXAoJKCgocGh5c19hZGRyID4+IDE2KSAhPSAoIChwaHlzX2FkZHIgKyBsZW4pID4+IDE2ICkpKQoKLyoKICogQWxsb2NhdGUgU0dMcyBpbiBibG9ja3Mgc28gd2UgY2FuIHNraXAgb3ZlciBpbnZhbGlkIGVudHJpZXMuCiAqIFdlIGFsbG9jYXRpb24gNjRrIHdvcnRoIG9mIFNHTCBidWZmZXJzLCBpbmNsdWRpbmcgdGhlCiAqIHN0cnVjdCBzeGdfc2dsX2Jsb2NrX2hkciwgcGx1cyBvbmUgZm9yIHBhZGRpbmcKICovCiNkZWZpbmUgU1hHX1NHTF9CTE9DS19TSVpFCQkJCTY1NTM2CiNkZWZpbmUgU1hHX1NHTF9BTExPQ0FUSU9OX1NJWkUoX1Bvb2wpCQkJCQlcCglTWEdfU0dMX0JMT0NLX1NJWkUgKyBTWEdfU0dMX1NJWkUoX1Bvb2wpCgpzdHJ1Y3Qgc3hnX3NnbF9ibG9ja19oZHIgewoJdXNob3J0CQkJUG9vbDsJCS8qIEFzc29jaWF0ZWQgU0dMIHBvb2wgKi8KCS8qIHN0cnVjdCBzeGdfc2NhdHRlcl9nYXRoZXIgYmxvY2tzICovCglzdHJ1Y3QgbGlzdF9lbnRyeQlMaXN0OwoJZG1hNjRfYWRkcl90ICAgICAgICAJUGh5c2ljYWxBZGRyZXNzOy8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KfTsKCi8qCiAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiBkZW5vdGVzIHRoZSBtYXhpbXVtIGJsb2NrIG9mIG1lbW9yeSB0aGF0IHRoZQogKiBjYXJkIGNhbiBETUEgdG8uSXQgaXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIE5kaXNNUmVnaXN0ZXJTY2F0dGVyR2F0aGVyRG1hLgogKiBGb3Igbm93LCB1c2UgdGhlIHNhbWUgdmFsdWUgYXMgdXNlZCBpbiB0aGUgU2xpYy9PYXNpcyBkcml2ZXIsIHdoaWNoCiAqIGlzIDEyOE0uICBUaGF0IHNob3VsZCBjb3ZlciBhbnkgZXhwZWN0ZWQgTURMIHRoYXQgSSBjYW4gdGhpbmsgb2YuCiAqLwojZGVmaW5lIFNYR19NQVhfUEhZU19NQVAJKDEwMjQgKiAxMDI0ICogMTI4KQoKLyogU2VsZiBpZGVudGlmeWluZyBzdHJ1Y3R1cmUgdHlwZSAqLwplbnVtIFNYR19TR0xfVFlQRSB7CglTWEdfU0dMX0RVTUIsCQkvKiBEdW1iIE5JQyBTR0wgKi8KCVNYR19TR0xfU0xPVywJCS8qIFNsb3dwYXRoIHByb3RvY29sIGhlYWRlciAtIHNlZSBiZWxvdyAqLwoJU1hHX1NHTF9DSElNTkVZCQkvKiBDaGltbmV5IG9mZmxvYWQgU0dMICovCn07CgovKgogKiBUaGUgdWNvZGUgZXhwZWN0cyBhbiBORElTIFNHTCBzdHJ1Y3R1cmUgdGhhdAogKiBpcyBmb3JtYXR0ZWQgZm9yIGFuIHg2NCBzeXN0ZW0uICBXaGVuIHJ1bm5pbmcKICogb24gYW4geDY0IHN5c3RlbSwgd2UgY2FuIHNpbXBseSBoYW5kIHRoZSBORElTIFNHTAogKiB0byB0aGUgY2FyZCBkaXJlY3RseS4gIEZvciB4ODYgc3lzdGVtcyB3ZSBtdXN0IHJlY29uc3RydWN0CiAqIHRoZSBTR0wuICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZWZpbmVzIGFuIHg2NAogKiBmb3JtYXR0ZWQgU0dMIGVudHJ5CiAqLwpzdHJ1Y3Qgc3hnX3g2NF9zZ2UgewoJZG1hNjRfYWRkcl90ICAgIEFkZHJlc3M7CS8qIHNhbWUgYXMgd2RtLmggKi8KCXUzMgkJTGVuZ3RoOwkJLyogc2FtZSBhcyB3ZG0uaCAqLwoJdTMyCQlDb21waWxlclBhZDsJLyogVGhlIGNvbXBpbGVyIHBhZHMgdG8gOC1ieXRlcyAqLwoJdTY0CQlSZXNlcnZlZDsJLyogdTMyICogaW4gd2RtLmguICBGb3JjZSB0byA4IGJ5dGVzICovCn07CgovKgogKiBPdXIgU0dMIHN0cnVjdHVyZSAtIEVzc2VudGlhbGx5IHRoZSBzYW1lIGFzCiAqIHdkbS5oOlNDQVRURVJfR0FUSEVSX0xJU1QuICBOb3RlIHRoZSB2YXJpYWJsZSBudW1iZXIgb2YKICogZWxlbWVudHMgYmFzZWQgb24gdGhlIHBvb2wgc3BlY2lmaWVkIGFib3ZlCiAqLwpzdHJ1Y3Qgc3hnX3g2NF9zZ2wgewoJdTMyIE51bWJlck9mRWxlbWVudHM7Cgl1MzIgKlJlc2VydmVkOwoJc3RydWN0IHN4Z194NjRfc2dlCQlFbGVtZW50c1sxXTsgICAvKiBWYXJpYWJsZSAqLwp9OwoKc3RydWN0IHN4Z19zY2F0dGVyX2dhdGhlciB7CgllbnVtIFNYR19TR0xfVFlQRQlUeXBlOwkJLyogRklSU1QhIER1bWItbmljIG9yIG9mZmxvYWQgKi8KCXVzaG9ydAkJCVBvb2w7CQkvKiBBc3NvY2lhdGVkIFNHTCBwb29sICovCgl1c2hvcnQJCQlFbnRyaWVzOwkvKiBTR0wgdG90YWwgZW50cmllcyAqLwoJdm9pZCAqICAgCQlhZGFwdGVyOwkvKiBCYWNrIHBvaW50ZXIgdG8gYWRhcHRlciAqLwoJLyogRnJlZSBzdHJ1Y3Qgc3hnX3NjYXR0ZXJfZ2F0aGVyIGJsb2NrcyAqLwoJc3RydWN0IGxpc3RfZW50cnkJRnJlZUxpc3Q7CgkvKiBBbGwgc3RydWN0IHN4Z19zY2F0dGVyX2dhdGhlciBibG9ja3MgKi8KCXN0cnVjdCBsaXN0X2VudHJ5CUFsbExpc3Q7CglkbWE2NF9hZGRyX3QJCVBoeXNpY2FsQWRkcmVzczsvKiBwaHlzaWNhbCBhZGRyZXNzICovCgl1bnNpZ25lZCBjaGFyCQlTdGF0ZTsJCS8qIFNlZSBTWEdfQlVGRkVSIHN0YXRlIGFib3ZlICovCgl1bnNpZ25lZCBjaGFyCQlDbWRJbmRleDsJLyogQ29tbWFuZCByaW5nIGluZGV4ICovCglzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgIAkqRHVtYlBhY2tldDsJLyogQXNzb2NpYXRlZCBQYWNrZXQgKi8KCS8qIEZvciBhc3luY2hyb25vdXMgY29tcGxldGlvbnMgKi8KCXUzMgkJCURpcmVjdGlvbjsKCXUzMgkJCUN1ck9mZnNldDsJLyogQ3VycmVudCBTR0wgb2Zmc2V0ICovCgl1MzIJCQlTZ2xSZWY7CQkvKiBTR0wgcmVmZXJlbmNlIGNvdW50ICovCglzdHJ1Y3Qgdmxhbl9oZHIJCVZsYW5UYWc7CS8qIFZMQU4gdGFnIHRvIGJlIGluc2VydGVkIGludG8gU0dMICovCglzdHJ1Y3Qgc3hnX3g2NF9zZ2wgICAgIAkqcFNnbDsJCS8qIFNHTCBBZGRyLiBQb3NzaWJseSAmU2dsICovCglzdHJ1Y3Qgc3hnX3g2NF9zZ2wJU2dsOwkJLyogU0dMIGhhbmRlZCB0byBjYXJkICovCn07CgovKgogKiBOb3RlIC0gdGhlICItIDEiIGlzIGJlY2F1c2Ugc3RydWN0IHN4Z19zY2F0dGVyX2dhdGhlcj0+c3RydWN0IHN4Z194NjRfc2dsCiAqIGluY2x1ZGVzIDEgU0dFLi4KICovCiNkZWZpbmUgU1hHX1NHTF9TSVpFKF9Qb29sKSAJCQkJCQlcCgkoc2l6ZW9mKHN0cnVjdCBzeGdfc2NhdHRlcl9nYXRoZXIpICsJCQkJXAoJICgoU3hnU2dsUG9vbFByb3BlcnRpZXNbX1Bvb2xdLlNHRW50cmllcyAtIDEpICogCQlcCgkJCQlzaXplb2Yoc3RydWN0IHN4Z194NjRfc2dlKSkpCgovKiBGb3JjZSBORElTIHRvIGdpdmUgdXMgaXQncyBvd24gYnVmZmVyIHNvIHdlIGNhbiByZWZvcm1hdCB0byBvdXIgb3duICovCiNkZWZpbmUgU1hHX1NHTF9CVUZGRVIoX1N4Z1NnbCkgICAgICAgICAgICAgICAgIE5VTEwKI2RlZmluZSBTWEdfU0dMX0JVRkZFUl9MRU5HVEgoX1N4Z1NnbCkgICAgICAgICAgMAojZGVmaW5lIFNYR19TR0xfQlVGX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAwCgovKgojaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQojZGVmaW5lIFNYR19TR0xfQlVGRkVSKF9TeGdTZ2wpCQkgICAgKCZfU3hnU2dsLT5TZ2wpCiNkZWZpbmUgU1hHX1NHTF9CVUZGRVJfTEVOR1RIKF9TeGdTZ2wpCSgoX1N4Z1NnbCktPkVudHJpZXMgKiAJCVwKCQkJCQlzaXplb2Yoc3RydWN0IHN4Z194NjRfc2dlKSkKI2RlZmluZSBTWEdfU0dMX0JVRl9TSVpFCQkJICAgIHNpemVvZihzdHJ1Y3Qgc3hnX3g2NF9zZ2wpCiNlbGlmIGRlZmluZWQoQ09ORklHX1g4NikKLy8gRm9yY2UgTkRJUyB0byBnaXZlIHVzIGl0J3Mgb3duIGJ1ZmZlciBzbyB3ZSBjYW4gcmVmb3JtYXQgdG8gb3VyIG93bgojZGVmaW5lIFNYR19TR0xfQlVGRkVSKF9TeGdTZ2wpCQkgICAgICAgIE5VTEwKI2RlZmluZSBTWEdfU0dMX0JVRkZFUl9MRU5HVEgoX1N4Z1NnbCkJCTAKI2RlZmluZSBTWEdfU0dMX0JVRl9TSVpFCQkJMAojZWxzZQojZXJyb3Igc3RhZ2luZzogc3hnOiBkcml2ZXIgaXMgZm9yIFg4NiBvbmx5IQojZW5kaWYKKi8KLyogTWljcm9jb2RlIHN0YXRpc3RpY3MgKi8Kc3RydWN0IHN4Z191Y29kZV9zdGF0cyB7Cgl1MzIgIFJQRFFPZmxvdzsJCS8qIFBEUSBvdmVyZmxvdyAodW5mcmFtZWQgaWUgZHEgJiBkcm9wIDFzdCkgKi8KCXUzMiAgWERyb3BzOwkJLyogWG10IGRyb3BzIGR1ZSB0byBubyB4bXQgYnVmZmVyICovCgl1MzIgIEVSRHJvcHM7CQkvKiBSY3YgZHJvcHMgZHVlIHRvIEVSIGZ1bGwgKi8KCXUzMiAgTkJEcm9wczsJCS8qIFJjdiBkcm9wcyBkdWUgdG8gb3V0IG9mIGhvc3QgYnVmZmVycyAqLwoJdTMyICBQUURyb3BzOwkJLyogUmN2IGRyb3BzIGR1ZSB0byBQRFEgZnVsbCAqLwoJLyogUmN2IGRyb3BzIGR1ZSB0byBiYWQgZnJhbWU6IG5vIGxpbmsgYWRkciBtYXRjaCwgZnJsZW4gPiBtYXggKi8KCXUzMiAgQkZEcm9wczsKCXUzMiAgVVBEcm9wczsJCS8qIFJjdiBkcm9wcyBkdWUgdG8gVVBGcSBmdWxsICovCgl1MzIgIFhOb0J1ZnM7CQkvKiBYbXQgZHJvcCBkdWUgdG8gbm8gRFJBTSBYbWl0IGJ1ZmZlciBvciBQeHlCdWYgKi8KfTsKCi8qCiAqIE1hY3JvcyBmb3IgaGFuZGxpbmcgdGhlIE9mZmxvYWQgZW5naW5lIHZhbHVlcwogKi8KLyogTnVtYmVyIG9mIHBvc2l0aW9ucyB0byBzaGlmdCBOZXR3b3JrIEhlYWRlciBMZW5ndGggYmVmb3JlIHBhc3NpbmcgdG8gY2FyZCAqLwojZGVmaW5lIFNYR19OV19IRFJfTEVOX1NISUZUCQkyCg==