LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyoKICogQmFzZWQgb24gc2M1MjBjZHAuYyBmcm9tIHJvbG8gMS42OgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSAogKiBLbGVpbi1XaW50ZXJuaGVpbSwgR2VybWFueQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgojaW5jbHVkZSA8Y29uZmlnLmg+CgojaWZkZWYgQ09ORklHX0FMSTE1MlgKCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2ljL2FsaTUxMnguaD4KCgovKiBBTEkgTTUxMjMgTG9naWNhbCBkZXZpY2UgbnVtYmVyczoKICogMCBGREMKICogMSB1bnVzZWQ/CiAqIDIgdW51c2VkPwogKiAzIGxwdAogKiA0IFVBUlQxCiAqIDUgVUFSVDIKICogNiBSVEMKICogNyBtb3VzZS9rYmQKICogOCBDSU8KICovCgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTb21lIGFjY2VzcyBwcmltaXRpdmVzIGZvciB0aGUgQUxpIGNoaXA6ICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnN0YXRpYyB2b2lkIGFsaV93cml0ZSh1OCBpbmRleCwgdTggdmFsdWUpCnsJCgkvKiB3cml0ZSBhbiBhcmJpcmFyeSByZWdpc3RlciAqLwoJb3V0YihpbmRleCwgQUxJX0lOREVYKTsKCW91dGIodmFsdWUsIEFMSV9EQVRBKTsKfQoKI2lmIDAKc3RhdGljIGludCBhbGlfcmVhZCh1OCBpbmRleCkKewoJb3V0YihpbmRleCwgQUxJX0lOREVYKTsKCXJldHVybiBpbmIoQUxJX0RBVEEpOwp9CiNlbmRpZgoKI2RlZmluZSBBTElfT1BFTigpIFwKCW91dGIoMHg1MSwgQUxJX0lOREVYKTsgXAoJb3V0YigweDIzLCBBTElfSU5ERVgpCQoKCiNkZWZpbmUgQUxJX0NMT1NFKCkgXAoJb3V0YigweGJiLCBBTElfSU5ERVgpCgovKiBTZWxlY3QgYSBsb2dpY2FsIGRldmljZSAqLwojZGVmaW5lIEFMSV9TRUxERVYoZGV2KQlcCglhbGlfd3JpdGUoMHgwNywgZGV2KQkKCgp2b2lkIGFsaTUxMnhfaW5pdCh2b2lkKQp7CglBTElfT1BFTigpOwoKCWFsaV93cml0ZSgweDAyLCAweDAxKTsJLyogc29mdCByZXNldCAqLwoJYWxpX3dyaXRlKDB4MDMsIDB4MDMpOwkvKiBkaXNhYmxlIGFjY2VzcyB0byBDSU9zICovCglhbGlfd3JpdGUoMHgyMiwgMHgwMCk7CS8qIGRpc2FibGUgZGlyZWN0IHBvd2VyZG93biAqLwoJYWxpX3dyaXRlKDB4MjMsIDB4MDApOwkvKiBkaXNhYmxlIGF1dG8gcG93ZXJkb3duICovCglhbGlfd3JpdGUoMHgyNCwgMHgwMCk7CS8qIElSIDggaXMgYWN0aXZlIGhpLCBwaW4yNiBpcyBQRElSICovCgoJQUxJX0NMT1NFKCk7Cn0KCnZvaWQgYWxpNTEyeF9zZXRfZmRjKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSwgdTggZG1hX2NoYW5uZWwpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDApOwoJCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CgkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CgkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CgkJYWxpX3dyaXRlKDB4NzQsIGRtYV9jaGFubmVsKTsKCQkKCQkvKiBBVCBtb2RlLCBubyBkcml2ZSBzd2FwICovCgkJYWxpX3dyaXRlKDB4ZjAsIDB4MDgpOwoJCWFsaV93cml0ZSgweGYxLCAweDAwKTsKCQlhbGlfd3JpdGUoMHhmMiwgMHhmZik7CgkJYWxpX3dyaXRlKDB4ZjQsIDB4MDApOwoJfQoJQUxJX0NMT1NFKCk7Cn0KCgp2b2lkIGFsaTUxMnhfc2V0X3BwKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSwgdTggZG1hX2NoYW5uZWwpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDMpOwoJCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CgkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CgkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CgkJYWxpX3dyaXRlKDB4NzQsIGRtYV9jaGFubmVsKTsKCQkKCQkvKiBtb2RlOiBFUFAgMS45LCBFQ1AgRklGTyB0aHJlc2hvbGQgPSA3LCBJUlEgYWN0aXZlIGxvdyAqLwoJCWFsaV93cml0ZSgweGYwLCAweGJjKTsKCQkvKiAxMiBNSHosIEJ1cnN0IERNQSBpbiBFQ1AgKi8KCQlhbGlfd3JpdGUoMHhmMSwgMHgwNSk7Cgl9CglBTElfQ0xPU0UoKTsKCn0KCnZvaWQgYWxpNTEyeF9zZXRfdWFydChpbnQgZW5hYmxlZCwgaW50IGluZGV4LCB1MTYgaW8sIHU4IGlycSkKewoJQUxJX09QRU4oKTsKCUFMSV9TRUxERVYoaW5kZXg/NTo0KTsKCQoJYWxpX3dyaXRlKDB4MzAsIGVuYWJsZWQ/MTowKTsKCWlmIChlbmFibGVkKSB7CgkJYWxpX3dyaXRlKDB4NjAsIGlvID4+IDgpOwoJCWFsaV93cml0ZSgweDYxLCBpbyAmIDB4ZmYpOwoJCWFsaV93cml0ZSgweDcwLCBpcnEpOwoJCQoJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKCQlhbGlfd3JpdGUoMHhmMSwgMHgwMCk7CgkJCgkJLyogaHVoPyB3cml0ZSAweGYyIHR3aWNlIC0gYSB0eXBvIGluIHJvbG8KCQkgKiBvciBzb21lIHNlY3JldCBhbGkgZXJyYXRhPyBXaG8ga25vd3M/IAoJCSAqLwoJCWlmIChpbmRleCkgewoJCQlhbGlfd3JpdGUoMHhmMiwgMHgwMCk7CgkJfQoJCWFsaV93cml0ZSgweGYyLCAweDBjKTsKCX0KCUFMSV9DTE9TRSgpOwoKfQoKdm9pZCBhbGk1MTJ4X3NldF91YXJ0Ml9pcmRhKGludCBlbmFibGVkKQp7CglBTElfT1BFTigpOwoJQUxJX1NFTERFVig1KTsKCQoJYWxpX3dyaXRlKDB4ZjEsIGVuYWJsZWQ/MHg0ODoweDAwKTsgLyogZnVsbGR1cGxleCBJckRhICovCglBTElfQ0xPU0UoKTsKCn0KCnZvaWQgYWxpNTEyeF9zZXRfcnRjKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSkKewoJQUxJX09QRU4oKTsKCUFMSV9TRUxERVYoNik7CgkKCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CglpZiAoZW5hYmxlZCkgewoJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKCQlhbGlfd3JpdGUoMHg2MSwgaW8gJiAweGZmKTsKCQlhbGlfd3JpdGUoMHg3MCwgaXJxKTsKCgkJYWxpX3dyaXRlKDB4ZjAsIDB4MDApOwoJfQoJQUxJX0NMT1NFKCk7Cn0KCnZvaWQgYWxpNTEyeF9zZXRfa2JjKGludCBlbmFibGVkLCB1OCBrYmNfaXJxLCB1OCBtb3VzZV9pcnEpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDcpOwoJCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg3MCwga2JjX2lycSk7CgkJYWxpX3dyaXRlKDB4NzIsIG1vdXNlX2lycSk7CQkKCQkKCQlhbGlfd3JpdGUoMHhmMCwgMHgwMCk7Cgl9CglBTElfQ0xPU0UoKTsKfQoKCi8qIENvbW1vbiBJL08KICogCiAqIChUaGlzIGRlc2NyaXBvdHNpb24gaXMgYmFzZSBvbiBzZXZlcmFsIGluY29tcGV0ZSBzb3VyY2VzCiAqICBzaW5jZSBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byBvYnRhaW4gYW55IGRhdGFzaGVldCBmb3IgdGhlIGRldmljZQogKiAgdGhlcmUgbWF5IGJlIHNvbWUgbWlzLXVuZGVyc3RhbmRpbmdzIGJ1cnJpZWQgaW4gaGVyZS4gCiAqICAtLSBEYW5pZWwgZGFuaWVsQG9taWNyb24uc2UpCiAqIAogKiBUaGVyZSBhcmUgMjIgQ0lPIHBpbnMgbnVtYmVyZWQKICogMTAtMTcKICogMjAtMjUKICogMzAtMzcKICogCiAqIDIwLTI0IGFyZSBkZWRpY2F0ZWQgQ0lPIHBpbnMsIHRoZSBvdGhlciAxNyBhcmUgbXVsaXBsZXhlZCB3aXRoCiAqIG90aGVyIGZ1bmN0aW9ucy4KICogCiAqICAgICAgICAgICBTZWNvbmRhcnkgCiAqIENJTyBQaW4gICBGdW5jdGlvbiAgICBEZWNyaXB0aW9uCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ0lPMTAgICAgIElSUUlOMSAgICAgIEludGVycnVwdCBpbnB1dCAxPwogKiBDSU8xMSAgICAgSVJRSU4yICAgICAgSW50ZXJydXB0IGlucHV0IDI/CiAqIENJTzEyICAgICBJUlJYICAgICAgICBJckRhIFJlY2VpdmUKICogQ0lPMTMgICAgIElSVFggICAgICAgIElyRGEgVHJhbnNtaXQKICogQ0lPMTQgICAgIFAyMSAgICAgICAgIEtCQyBQMjEgZnVjbnRpb24KICogQ0lPMTUgICAgIFAyMCAgICAgICAgIEtCQyBQMjEgZnVjbnRpb24KICogQ0lPMTYgICAgIEkyQ19DTEsgICAgIEkyQyBDbG9jawogKiBDSU8xNyAgICAgSTJDX0RBVCAgICAgSTJDIERhdGEKICogCiAqIENJTzIwICAgICAtCiAqIENJTzIxICAgICAtCiAqIENJTzIyICAgICAtCiAqIENJTzIzICAgICAtCiAqIENJTzI0ICAgICAtCiAqIENJTzI1ICAgICBMT0NLICAgICAgICBLZXlsb2NrCiAqIAogKiBDSU8zMCAgICAgS0JDX0NMSyAgICAgS2V5YmFvcmQgQ2xvY2sKICogQ0lPMzEgICAgIENTMEogICAgICAgIEdlbmVyYWwgQ2hpcCBTZWxlY3QgZGVjb2RlciBDUzBKCiAqIENJTzMyICAgICBDUzFKICAgICAgICBHZW5lcmFsIENoaXAgU2VsZWN0IGRlY29kZXIgQ1MxSgogKiBDSU8zMyAgICAgQUxUX0tDTEsgICAgQWx0ZXJuYXRpdmUgS2V5Ym9hcmQgQ2xvY2sKICogQ0lPMzQgICAgIEFMVF9LREFUICAgIEFsdGVybmF0aXZlIEtleWJvYXJkIERhdGEKICogQ0lPMzUgICAgIEFMVF9NQ0xLICAgIEFsdGVybmF0aXZlIE1vdXNlIENsb2NrCiAqIENJTzM2ICAgICBBTFRfTURBVCAgICBBbHRlcm5hdGl2ZSBNb3VzZSBEYXRhCiAqIENJTzM3ICAgICBBTFRfS0JDICAgICBBbHRlcm5hdGl2ZSBLQkMgc2VsZWN0CiAqCiAqIFRoZSBDSU8gdXNlIGFuIGluZGlyZWN0IGFkZHJlc3Mgc2NoZW1lLiAKICogCiAqIFJlaWdzdGVyIDMgaW4gdGhlIFNJTyBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgaW5kZXggYW5kIGRhdGEKICogcG9ydCBhZGRyZXNzZXMgd2hlcmUgdGhlIENJTyBJL08gcmVnaXN0ZXJzIHNob3cgdXAuCiAqIFRoZSBmdW5jdGlvbiBzZWxlY3Rpb24gcmVnaXN0ZXJzIGFyZSBhY2Nlc3NpYmxlIHVuZGVyIAogKiBmdW5jdGlvbiBTSU8gOC4gCiAqIAogKiBTSU8gcmVpZ3N0ZXIgMyAoQ0lPIEFkZHJlc3MgU2VsZWN0aW9uKSBiaXQgZGVmaW5pdGlvbnM6CiAqIGJpdCA3ICAgQ0lPIGluZGV4IGFuZCBkYXRhIHJlZ2lzdGVycyBlbmFibGVkCiAqIGJpdCAxLTAgQ0lPIGluZGlyZWN0IHJlZ2lzdGVycyBwb3J0IGFkZHJlc3Mgc2VsZWN0CiAqICAgICAJIDAgIGluZGV4ID0gMHhFMCBkYXRhID0gMHhFMQogKiAgICAgICAxICBpbmRleCA9IDB4RTIgZGF0YSA9IDB4RTMKICogICAgICAgMiAgaW5kZXggPSAweEU0IGRhdGEgPSAweEU1CiAqICAgICAgIDMgIGluZGV4ID0gMHhFQSBkYXRhID0gMHhFQgogKiAKICogVGhlcmUgYXJlIHRocmVlIENJTyBJL08gcmVnaXN0ZXIgYWNjZXNzZWQgdmlhIENJTyBpbmRleCBwb3J0IGFuZCBDSU8gZGF0YSBwb3J0CiAqIDB4MDEgICAgIENJTyAxMC0xNyBkYXRhCiAqIDB4MDIgICAgIENJTyAyMC0yNSBkYXRhIChiaXRzIDctNiB1bnVzZWQpCiAqIDB4MDMgICAgIENJTyAzMC0zNyBkYXRhCiAqIAogKiAKICogVGhlIHBpbiBmdW5jdGlvbiBpcyBhY2Nlc3NlZCB0aHJvdWdoIG5vcm1hbCAKICogU0lPIHJlZ2lzdGVycywgZWFjaCByZWdpc3RlciBoYXZlIHRoZSBzYW1lIGZvcm1hdDoKICogCiAqIEJpdCAgIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgVmFsdWUKICogMCAgICAgSW5wdXQvb3V0cHV0ICAgICAgICAgICAgICAgICAxPWlucHV0IAogKiAxICAgICBQb2xhcml0eSBvZiBzaWduYWwgICAgICAgICAgIDE9aW52ZXJ0ZWQKICogMiAgICAgVW51c2VkICAgICAgICAgICAgICAgICAgICAgICA/PwogKiAzICAgICBGdW5jdGlvbiAobm9ybWFsIG9yIHNwZWNpYWwpIDE9c3BlY2lhbAogKiA3LTQgICBVbnVzZWQKICogCiAqIFNJTyBSRUcKICogMHhlMCAgICAgQ0lPIDEwIENvbmZpZwogKiAweGUxICAgICBDSU8gMTEgQ29uZmlnCiAqIDB4ZTIgICAgIENJTyAxMiBDb25maWcKICogMHhlMyAgICAgQ0lPIDEzIENvbmZpZwogKiAweGU0ICAgICBDSU8gMTQgQ29uZmlnCiAqIDB4ZTUgICAgIENJTyAxNSBDb25maWcKICogMHhlNiAgICAgQ0lPIDE2IENvbmZpZwogKiAweGU3ICAgICBDSU8gMTYgQ29uZmlnCiAqCiAqIDB4ZTggICAgIENJTyAyMCBDb25maWcKICogMHhlOSAgICAgQ0lPIDIxIENvbmZpZwogKiAweGVhICAgICBDSU8gMjIgQ29uZmlnCiAqIDB4ZWIgICAgIENJTyAyMyBDb25maWcKICogMHhlYyAgICAgQ0lPIDI0IENvbmZpZwogKiAweGVkICAgICBDSU8gMjUgQ29uZmlnCiAqCiAqIDB4ZjUgICAgIENJTyAzMCBDb25maWcKICogMHhmNiAgICAgQ0lPIDMxIENvbmZpZwogKiAweGY3ICAgICBDSU8gMzIgQ29uZmlnCiAqIDB4ZjggICAgIENJTyAzMyBDb25maWcKICogMHhmOSAgICAgQ0lPIDM0IENvbmZpZwogKiAweGZhICAgICBDSU8gMzUgQ29uZmlnCiAqIDB4ZmIgICAgIENJTyAzNiBDb25maWcKICogMHhmYyAgICAgQ0lPIDM3IENvbmZpZwogKiAKICovCgojZGVmaW5lIEFMSV9DSU9fUE9SVF9TRUwgMHg4MwojZGVmaW5lIEFMSV9DSU9fSU5ERVggICAgMHhlYQojZGVmaW5lIEFMSV9DSU9fREFUQSAgICAgMHhlYgoKdm9pZCBhbGk1MTJ4X3NldF9jaW8oaW50IGVuYWJsZWQpCnsKCWludCBpOwoJCglBTElfT1BFTigpOwoJCglpZiAoZW5hYmxlZCkgewoJCWFsaV93cml0ZSgweDMsIEFMSV9DSU9fUE9SVF9TRUwpOyAgICAvKiBFbmFibGUgQ0lPIGRhdGEgcmVnaXN0ZXIgKi8KCX0gZWxzZSB7CgkJYWxpX3dyaXRlKDB4MywgQUxJX0NJT19QT1JUX1NFTCAmIH4weDgwKTsKCX0KCQoJQUxJX1NFTERFVig4KTsKCQoJYWxpX3dyaXRlKDB4MzAsIGVuYWJsZWQ/MTowKTsKCQoJLyogc2V0IGFsbCBwaW5zIHRvIGlucHV0IHRvIHN0YXJ0IHdpdGggKi8KCWZvciAoaT0weGUwO2k8MHhlZTtpKyspIHsKCQlhbGlfd3JpdGUoaSwgMSk7Cgl9CgkKCWZvciAoaT0weGY1O2k8MHhmZTtpKyspIHsKCQlhbGlfd3JpdGUoaSwgMSk7Cgl9CgkKCUFMSV9DTE9TRSgpOwp9CgoKdm9pZCBhbGk1MTJ4X2Npb19mdW5jdGlvbihpbnQgcGluLCBpbnQgc3BlY2lhbCwgaW50IGludiwgaW50IGlucHV0KQp7Cgl1OCBkYXRhOwoJdTggYWRkcjsKCQoJLyogdmFsaWQgcGlucyBhcmUgMTAtMTcsIDIwLTI1IGFuZCAzMC0zNyAqLwoJaWYgKHBpbiA+PSAxMCAmJiBwaW4gPD0gMTcpIHsgCgkJYWRkciA9IDB4ZTArKHBpbiY3KTsKCX0gZWxzZSBpZiAocGluID49IDIwICYmIHBpbiA8PSAyNSkgewoJCWFkZHIgPSAweGU4KyhwaW4mNyk7Cgl9IGVsc2UgaWYgKHBpbiA+PSAzMCAmJiBwaW4gPD0gMzcpIHsgCgkJYWRkciA9IDB4ZjUrKHBpbiY3KTsKCX0gZWxzZSB7CgkJcmV0dXJuOwoJfQoJCglBTElfT1BFTigpOwoKCUFMSV9TRUxERVYoOCk7CgkKCQoJZGF0YT0weGY0OwoJaWYgKHNwZWNpYWwpIHsKCQlkYXRhIHw9IDB4MDg7Cgl9IGVsc2UgewoJCWlmIChpbnYpIHsKCQkJZGF0YSB8PSAweDAyOwoJCX0KCQlpZiAoaW5wdXQpIHsKCQkJZGF0YSB8PSAweDAxOwoJCX0KCX0KCQoJYWxpX3dyaXRlKGFkZHIsIGRhdGEpOwoJCglBTElfQ0xPU0UoKTsKfQoKdm9pZCBhbGk1MTJ4X2Npb19vdXQoaW50IHBpbiwgaW50IHZhbHVlKSAKewoJdTggcmVnOwoJdTggZGF0YTsKCXU4IGJpdDsKCQoJcmVnID0gcGluLzEwOwoJYml0ID0gMSA8PCAocGluJTEwKTsKCQoJCQoJb3V0YihyZWcsIEFMSV9DSU9fSU5ERVgpOyAgICAgLyogc2VsZWN0IEkvTyByZWdpc3RlciAqLwoJZGF0YSA9IGluYihBTElfQ0lPX0RBVEEpOwoJaWYgKHZhbHVlKSB7CgkJZGF0YSB8PSBiaXQ7Cgl9IGVsc2UgewoJCWRhdGEgJj0gfmJpdDsKCX0KCW91dGIoZGF0YSwgQUxJX0NJT19EQVRBKTsKfQoKaW50IGFsaTUxMnhfY2lvX2luKGludCBwaW4pCnsKCXU4IHJlZzsKCXU4IGRhdGE7Cgl1OCBiaXQ7CgkJCQoJLyogdmFsaWQgcGlucyBhcmUgMTAtMTcsIDIwLTI1IGFuZCAzMC0zNyAqLwoJcmVnID0gcGluLzEwOwoJYml0ID0gMSA8PCAocGluJTEwKTsKCQoJCglvdXRiKHJlZywgQUxJX0NJT19JTkRFWCk7ICAgICAvKiBzZWxlY3QgSS9PIHJlZ2lzdGVyICovCglkYXRhID0gaW5iKEFMSV9DSU9fREFUQSk7CgkKCXJldHVybiBkYXRhICYgYml0OyAKfQoKIAojZW5kaWYK