LyoKICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCiAqCiAqIENvcHlyaWdodCAoQykgMjAwMyBOb2tpYSBDb3Jwb3JhdGlvbgogKiBBdXRob3I6IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqIERNQSBjaGFubmVsIGxpbmtpbmcgZm9yIDE2MTAgYnkgU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPgogKiBHcmFwaGljcyBETUEgYW5kIExDRCBETUEgZ3JhcGhpY3MgdHJhbmZvcm1hdGlvbnMKICogYnkgSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgogKiBPTUFQMiBzdXBwb3J0IENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAqIE1lcmdlZCB0byBzdXBwb3J0IGJvdGggT01BUDEgYW5kIE9NQVAyIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+CiAqIFNvbWUgZnVuY3Rpb25zIGJhc2VkIG9uIGVhcmxpZXIgZG1hLW9tYXAuYyBDb3B5cmlnaHQgKEMpIDIwMDEgUmlkZ2VSdW4sIEluYy4KICoKICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBPTUFQIGludGVybmFsIERNQSBjaGFubmVscy4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9pcnEuaD4KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KI2luY2x1ZGUgPGFzbS9kbWEuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CgojZGVmaW5lIERFQlVHX1BSSU5UUwojdW5kZWYgREVCVUdfUFJJTlRTCiNpZmRlZiBERUJVR19QUklOVFMKI2RlZmluZSBkZWJ1Z19wcmludGsoeCkgcHJpbnRrIHgKI2Vsc2UKI2RlZmluZQlkZWJ1Z19wcmludGsoeCkKI2VuZGlmCgojZGVmaW5lIE9NQVBfRE1BX0FDVElWRQkJMHgwMQojZGVmaW5lIE9NQVBfRE1BX0NDUl9FTgkJKDEgPDwgNykKI2RlZmluZSBPTUFQMl9ETUFfQ1NSX0NMRUFSX01BU0sJMHhmZmUKCiNkZWZpbmUgT01BUF9GVU5DX01VWF9BUk1fQkFTRQkoMHhmZmZlMTAwMCArIDB4ZWMpCgpzdGF0aWMgaW50IGVuYWJsZV8xNTEwX21vZGUgPSAwOwoKc3RydWN0IG9tYXBfZG1hX2xjaCB7CglpbnQgbmV4dF9sY2g7CglpbnQgZGV2X2lkOwoJdTE2IHNhdmVkX2NzcjsKCXUxNiBlbmFibGVkX2lycXM7Cgljb25zdCBjaGFyICpkZXZfbmFtZTsKCXZvaWQgKCogY2FsbGJhY2spKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpOwoJdm9pZCAqZGF0YTsKCWxvbmcgZmxhZ3M7Cn07CgpzdGF0aWMgaW50IGRtYV9jaGFuX2NvdW50OwoKc3RhdGljIHNwaW5sb2NrX3QgZG1hX2NoYW5fbG9jazsKc3RhdGljIHN0cnVjdCBvbWFwX2RtYV9sY2ggZG1hX2NoYW5bT01BUF9MT0dJQ0FMX0RNQV9DSF9DT1VOVF07CgpzdGF0aWMgY29uc3QgdTggb21hcDFfZG1hX2lycVtPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXSA9IHsKCUlOVF9ETUFfQ0gwXzYsIElOVF9ETUFfQ0gxXzcsIElOVF9ETUFfQ0gyXzgsIElOVF9ETUFfQ0gzLAoJSU5UX0RNQV9DSDQsIElOVF9ETUFfQ0g1LCBJTlRfMTYxMF9ETUFfQ0g2LCBJTlRfMTYxMF9ETUFfQ0g3LAoJSU5UXzE2MTBfRE1BX0NIOCwgSU5UXzE2MTBfRE1BX0NIOSwgSU5UXzE2MTBfRE1BX0NIMTAsCglJTlRfMTYxMF9ETUFfQ0gxMSwgSU5UXzE2MTBfRE1BX0NIMTIsIElOVF8xNjEwX0RNQV9DSDEzLAoJSU5UXzE2MTBfRE1BX0NIMTQsIElOVF8xNjEwX0RNQV9DSDE1LCBJTlRfRE1BX0xDRAp9OwoKI2RlZmluZSBSRVZJU0lUXzI0WFgoKQkJcHJpbnRrKEtFUk5fRVJSICJGSVhNRTogbm8gJXMgb24gMjR4eFxuIiwgXAoJCQkJCQlfX0ZVTkNUSU9OX18pOwoKI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCi8qIFJldHVybnMgMSBpZiB0aGUgRE1BIG1vZHVsZSBpcyBpbiBPTUFQMTUxMC1jb21wYXRpYmxlIG1vZGUsIDAgb3RoZXJ3aXNlICovCmludCBvbWFwX2RtYV9pbl8xNTEwX21vZGUodm9pZCkKewoJcmV0dXJuIGVuYWJsZV8xNTEwX21vZGU7Cn0KI2Vsc2UKI2RlZmluZSBvbWFwX2RtYV9pbl8xNTEwX21vZGUoKQkJMAojZW5kaWYKCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQpzdGF0aWMgaW5saW5lIGludCBnZXRfZ2RtYV9kZXYoaW50IHJlcSkKewoJdTMyIHJlZyA9IE9NQVBfRlVOQ19NVVhfQVJNX0JBU0UgKyAoKHJlcSAtIDEpIC8gNSkgKiA0OwoJaW50IHNoaWZ0ID0gKChyZXEgLSAxKSAlIDUpICogNjsKCglyZXR1cm4gKChvbWFwX3JlYWRsKHJlZykgPj4gc2hpZnQpICYgMHgzZikgKyAxOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2dkbWFfZGV2KGludCByZXEsIGludCBkZXYpCnsKCXUzMiByZWcgPSBPTUFQX0ZVTkNfTVVYX0FSTV9CQVNFICsgKChyZXEgLSAxKSAvIDUpICogNDsKCWludCBzaGlmdCA9ICgocmVxIC0gMSkgJSA1KSAqIDY7Cgl1MzIgbDsKCglsID0gb21hcF9yZWFkbChyZWcpOwoJbCAmPSB+KDB4M2YgPDwgc2hpZnQpOwoJbCB8PSAoZGV2IC0gMSkgPDwgc2hpZnQ7CglvbWFwX3dyaXRlbChsLCByZWcpOwp9CiNlbHNlCiNkZWZpbmUgc2V0X2dkbWFfZGV2KHJlcSwgZGV2KQlkbyB7fSB3aGlsZSAoMCkKI2VuZGlmCgpzdGF0aWMgdm9pZCBjbGVhcl9sY2hfcmVncyhpbnQgbGNoKQp7CglpbnQgaTsKCXUzMiBsY2hfYmFzZSA9IE9NQVBfRE1BX0JBU0UgKyBsY2ggKiAweDQwOwoKCWZvciAoaSA9IDA7IGkgPCAweDJjOyBpICs9IDIpCgkJb21hcF93cml0ZXcoMCwgbGNoX2Jhc2UgKyBpKTsKfQoKdm9pZCBvbWFwX3NldF9kbWFfcHJpb3JpdHkoaW50IGRzdF9wb3J0LCBpbnQgcHJpb3JpdHkpCnsKCXVuc2lnbmVkIGxvbmcgcmVnOwoJdTMyIGw7CgoJc3dpdGNoIChkc3RfcG9ydCkgewoJY2FzZSBPTUFQX0RNQV9QT1JUX09DUF9UMToJLyogRkZGRUNDMDAgKi8KCQlyZWcgPSBPTUFQX1RDX09DUFQxX1BSSU9SOwoJCWJyZWFrOwoJY2FzZSBPTUFQX0RNQV9QT1JUX09DUF9UMjoJLyogRkZGRUNDRDAgKi8KCQlyZWcgPSBPTUFQX1RDX09DUFQyX1BSSU9SOwoJCWJyZWFrOwoJY2FzZSBPTUFQX0RNQV9QT1JUX0VNSUZGOgkvKiBGRkZFQ0MwOCAqLwoJCXJlZyA9IE9NQVBfVENfRU1JRkZfUFJJT1I7CgkJYnJlYWs7CgljYXNlIE9NQVBfRE1BX1BPUlRfRU1JRlM6CS8qIEZGRkVDQzA0ICovCgkJcmVnID0gT01BUF9UQ19FTUlGU19QUklPUjsKCQlicmVhazsKCWRlZmF1bHQ6CgkJQlVHKCk7CgkJcmV0dXJuOwoJfQoJbCA9IG9tYXBfcmVhZGwocmVnKTsKCWwgJj0gfigweGYgPDwgOCk7CglsIHw9IChwcmlvcml0eSAmIDB4ZikgPDwgODsKCW9tYXBfd3JpdGVsKGwsIHJlZyk7Cn0KCnZvaWQgb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhpbnQgbGNoLCBpbnQgZGF0YV90eXBlLCBpbnQgZWxlbV9jb3VudCwKCQkJCSAgaW50IGZyYW1lX2NvdW50LCBpbnQgc3luY19tb2RlLAoJCQkJICBpbnQgZG1hX3RyaWdnZXIsIGludCBzcmNfb3JfZHN0X3N5bmNoKQp7CglPTUFQX0RNQV9DU0RQX1JFRyhsY2gpICY9IH4weDAzOwoJT01BUF9ETUFfQ1NEUF9SRUcobGNoKSB8PSBkYXRhX3R5cGU7CgoJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CgkJT01BUF9ETUFfQ0NSX1JFRyhsY2gpICY9IH4oMSA8PCA1KTsKCQlpZiAoc3luY19tb2RlID09IE9NQVBfRE1BX1NZTkNfRlJBTUUpCgkJCU9NQVBfRE1BX0NDUl9SRUcobGNoKSB8PSAxIDw8IDU7CgoJCU9NQVAxX0RNQV9DQ1IyX1JFRyhsY2gpICY9IH4oMSA8PCAyKTsKCQlpZiAoc3luY19tb2RlID09IE9NQVBfRE1BX1NZTkNfQkxPQ0spCgkJCU9NQVAxX0RNQV9DQ1IyX1JFRyhsY2gpIHw9IDEgPDwgMjsKCX0KCglpZiAoY3B1X2lzX29tYXAyNHh4KCkgJiYgZG1hX3RyaWdnZXIpIHsKCQl1MzIgdmFsID0gT01BUF9ETUFfQ0NSX1JFRyhsY2gpOwoKCQl2YWwgJj0gfigzIDw8IDE5KTsKCQlpZiAoZG1hX3RyaWdnZXIgPiA2MykKCQkJdmFsIHw9IDEgPDwgMjA7CgkJaWYgKGRtYV90cmlnZ2VyID4gMzEpCgkJCXZhbCB8PSAxIDw8IDE5OwoKCQl2YWwgJj0gfigweDFmKTsKCQl2YWwgfD0gKGRtYV90cmlnZ2VyICYgMHgxZik7CgoJCWlmIChzeW5jX21vZGUgJiBPTUFQX0RNQV9TWU5DX0ZSQU1FKQoJCQl2YWwgfD0gMSA8PCA1OwoJCWVsc2UKCQkJdmFsICY9IH4oMSA8PCA1KTsKCgkJaWYgKHN5bmNfbW9kZSAmIE9NQVBfRE1BX1NZTkNfQkxPQ0spCgkJCXZhbCB8PSAxIDw8IDE4OwoJCWVsc2UKCQkJdmFsICY9IH4oMSA8PCAxOCk7CgoJCWlmIChzcmNfb3JfZHN0X3N5bmNoKQoJCQl2YWwgfD0gMSA8PCAyNDsJCS8qIHNvdXJjZSBzeW5jaCAqLwoJCWVsc2UKCQkJdmFsICY9IH4oMSA8PCAyNCk7CS8qIGRlc3Qgc3luY2ggKi8KCgkJT01BUF9ETUFfQ0NSX1JFRyhsY2gpID0gdmFsOwoJfQoKCU9NQVBfRE1BX0NFTl9SRUcobGNoKSA9IGVsZW1fY291bnQ7CglPTUFQX0RNQV9DRk5fUkVHKGxjaCkgPSBmcmFtZV9jb3VudDsKfQoKdm9pZCBvbWFwX3NldF9kbWFfY29sb3JfbW9kZShpbnQgbGNoLCBlbnVtIG9tYXBfZG1hX2NvbG9yX21vZGUgbW9kZSwgdTMyIGNvbG9yKQp7Cgl1MTYgdzsKCglCVUdfT04ob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpOwoKCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewoJCVJFVklTSVRfMjRYWCgpOwoJCXJldHVybjsKCX0KCgl3ID0gT01BUDFfRE1BX0NDUjJfUkVHKGxjaCkgJiB+MHgwMzsKCXN3aXRjaCAobW9kZSkgewoJY2FzZSBPTUFQX0RNQV9DT05TVEFOVF9GSUxMOgoJCXcgfD0gMHgwMTsKCQlicmVhazsKCWNhc2UgT01BUF9ETUFfVFJBTlNQQVJFTlRfQ09QWToKCQl3IHw9IDB4MDI7CgkJYnJlYWs7CgljYXNlIE9NQVBfRE1BX0NPTE9SX0RJUzoKCQlicmVhazsKCWRlZmF1bHQ6CgkJQlVHKCk7Cgl9CglPTUFQMV9ETUFfQ0NSMl9SRUcobGNoKSA9IHc7CgoJdyA9IE9NQVAxX0RNQV9MQ0hfQ1RSTF9SRUcobGNoKSAmIH4weDBmOwoJLyogRGVmYXVsdCBpcyBjaGFubmVsIHR5cGUgMkQgKi8KCWlmIChtb2RlKSB7CgkJT01BUDFfRE1BX0NPTE9SX0xfUkVHKGxjaCkgPSAodTE2KWNvbG9yOwoJCU9NQVAxX0RNQV9DT0xPUl9VX1JFRyhsY2gpID0gKHUxNikoY29sb3IgPj4gMTYpOwoJCXcgfD0gMTsJCS8qIENoYW5uZWwgdHlwZSBHICovCgl9CglPTUFQMV9ETUFfTENIX0NUUkxfUkVHKGxjaCkgPSB3Owp9CgovKiBOb3RlIHRoYXQgc3JjX3BvcnQgaXMgb25seSBmb3Igb21hcDEgKi8Kdm9pZCBvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhpbnQgbGNoLCBpbnQgc3JjX3BvcnQsIGludCBzcmNfYW1vZGUsCgkJCSAgICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsCgkJCSAgICAgaW50IHNyY19laSwgaW50IHNyY19maSkKewoJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CgkJT01BUF9ETUFfQ1NEUF9SRUcobGNoKSAmPSB+KDB4MWYgPDwgMik7CgkJT01BUF9ETUFfQ1NEUF9SRUcobGNoKSB8PSBzcmNfcG9ydCA8PCAyOwoJfQoKCU9NQVBfRE1BX0NDUl9SRUcobGNoKSAmPSB+KDB4MDMgPDwgMTIpOwoJT01BUF9ETUFfQ0NSX1JFRyhsY2gpIHw9IHNyY19hbW9kZSA8PCAxMjsKCglpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpIHsKCQlPTUFQMV9ETUFfQ1NTQV9VX1JFRyhsY2gpID0gc3JjX3N0YXJ0ID4+IDE2OwoJCU9NQVAxX0RNQV9DU1NBX0xfUkVHKGxjaCkgPSBzcmNfc3RhcnQ7Cgl9CgoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCU9NQVAyX0RNQV9DU1NBX1JFRyhsY2gpID0gc3JjX3N0YXJ0OwoKCU9NQVBfRE1BX0NTRUlfUkVHKGxjaCkgPSBzcmNfZWk7CglPTUFQX0RNQV9DU0ZJX1JFRyhsY2gpID0gc3JjX2ZpOwp9Cgp2b2lkIG9tYXBfc2V0X2RtYV9wYXJhbXMoaW50IGxjaCwgc3RydWN0IG9tYXBfZG1hX2NoYW5uZWxfcGFyYW1zICogcGFyYW1zKQp7CglvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKGxjaCwgcGFyYW1zLT5kYXRhX3R5cGUsCgkJCQkgICAgIHBhcmFtcy0+ZWxlbV9jb3VudCwgcGFyYW1zLT5mcmFtZV9jb3VudCwKCQkJCSAgICAgcGFyYW1zLT5zeW5jX21vZGUsIHBhcmFtcy0+dHJpZ2dlciwKCQkJCSAgICAgcGFyYW1zLT5zcmNfb3JfZHN0X3N5bmNoKTsKCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKGxjaCwgcGFyYW1zLT5zcmNfcG9ydCwKCQkJCXBhcmFtcy0+c3JjX2Ftb2RlLCBwYXJhbXMtPnNyY19zdGFydCwKCQkJCXBhcmFtcy0+c3JjX2VpLCBwYXJhbXMtPnNyY19maSk7CgoJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKGxjaCwgcGFyYW1zLT5kc3RfcG9ydCwKCQkJCSBwYXJhbXMtPmRzdF9hbW9kZSwgcGFyYW1zLT5kc3Rfc3RhcnQsCgkJCQkgcGFyYW1zLT5kc3RfZWksIHBhcmFtcy0+ZHN0X2ZpKTsKfQoKdm9pZCBvbWFwX3NldF9kbWFfc3JjX2luZGV4KGludCBsY2gsIGludCBlaWR4LCBpbnQgZmlkeCkKewoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CgkJUkVWSVNJVF8yNFhYKCk7CgkJcmV0dXJuOwoJfQoJT01BUF9ETUFfQ1NFSV9SRUcobGNoKSA9IGVpZHg7CglPTUFQX0RNQV9DU0ZJX1JFRyhsY2gpID0gZmlkeDsKfQoKdm9pZCBvbWFwX3NldF9kbWFfc3JjX2RhdGFfcGFjayhpbnQgbGNoLCBpbnQgZW5hYmxlKQp7CglPTUFQX0RNQV9DU0RQX1JFRyhsY2gpICY9IH4oMSA8PCA2KTsKCWlmIChlbmFibGUpCgkJT01BUF9ETUFfQ1NEUF9SRUcobGNoKSB8PSAoMSA8PCA2KTsKfQoKdm9pZCBvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUoaW50IGxjaCwgZW51bSBvbWFwX2RtYV9idXJzdF9tb2RlIGJ1cnN0X21vZGUpCnsKCXVuc2lnbmVkIGludCBidXJzdCA9IDA7CglPTUFQX0RNQV9DU0RQX1JFRyhsY2gpICY9IH4oMHgwMyA8PCA3KTsKCglzd2l0Y2ggKGJ1cnN0X21vZGUpIHsKCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF9ESVM6CgkJYnJlYWs7CgljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfNDoKCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCgkJCWJ1cnN0ID0gMHgxOwoJCWVsc2UKCQkJYnVyc3QgPSAweDI7CgkJYnJlYWs7CgljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfODoKCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKCQkJYnVyc3QgPSAweDI7CgkJCWJyZWFrOwoJCX0KCQkvKiBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgaGFyZHdhcmUgb24gT01BUDEKCQkgKiB3IHw9ICgweDAzIDw8IDcpOwoJCSAqIGZhbGwgdGhyb3VnaAoJCSAqLwoJY2FzZSBPTUFQX0RNQV9EQVRBX0JVUlNUXzE2OgoJCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewoJCQlidXJzdCA9IDB4MzsKCQkJYnJlYWs7CgkJfQoJCS8qIE9NQVAxIGRvbid0IHN1cHBvcnQgYnVyc3QgMTYKCQkgKiBmYWxsIHRocm91Z2gKCQkgKi8KCWRlZmF1bHQ6CgkJQlVHKCk7Cgl9CglPTUFQX0RNQV9DU0RQX1JFRyhsY2gpIHw9IChidXJzdCA8PCA3KTsKfQoKLyogTm90ZSB0aGF0IGRlc3RfcG9ydCBpcyBvbmx5IGZvciBPTUFQMSAqLwp2b2lkIG9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhpbnQgbGNoLCBpbnQgZGVzdF9wb3J0LCBpbnQgZGVzdF9hbW9kZSwKCQkJICAgICAgdW5zaWduZWQgbG9uZyBkZXN0X3N0YXJ0LAoJCQkgICAgICBpbnQgZHN0X2VpLCBpbnQgZHN0X2ZpKQp7CglpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpIHsKCQlPTUFQX0RNQV9DU0RQX1JFRyhsY2gpICY9IH4oMHgxZiA8PCA5KTsKCQlPTUFQX0RNQV9DU0RQX1JFRyhsY2gpIHw9IGRlc3RfcG9ydCA8PCA5OwoJfQoKCU9NQVBfRE1BX0NDUl9SRUcobGNoKSAmPSB+KDB4MDMgPDwgMTQpOwoJT01BUF9ETUFfQ0NSX1JFRyhsY2gpIHw9IGRlc3RfYW1vZGUgPDwgMTQ7CgoJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CgkJT01BUDFfRE1BX0NEU0FfVV9SRUcobGNoKSA9IGRlc3Rfc3RhcnQgPj4gMTY7CgkJT01BUDFfRE1BX0NEU0FfTF9SRUcobGNoKSA9IGRlc3Rfc3RhcnQ7Cgl9CgoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCU9NQVAyX0RNQV9DRFNBX1JFRyhsY2gpID0gZGVzdF9zdGFydDsKCglPTUFQX0RNQV9DREVJX1JFRyhsY2gpID0gZHN0X2VpOwoJT01BUF9ETUFfQ0RGSV9SRUcobGNoKSA9IGRzdF9maTsKfQoKdm9pZCBvbWFwX3NldF9kbWFfZGVzdF9pbmRleChpbnQgbGNoLCBpbnQgZWlkeCwgaW50IGZpZHgpCnsKCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewoJCVJFVklTSVRfMjRYWCgpOwoJCXJldHVybjsKCX0KCU9NQVBfRE1BX0NERUlfUkVHKGxjaCkgPSBlaWR4OwoJT01BUF9ETUFfQ0RGSV9SRUcobGNoKSA9IGZpZHg7Cn0KCnZvaWQgb21hcF9zZXRfZG1hX2Rlc3RfZGF0YV9wYWNrKGludCBsY2gsIGludCBlbmFibGUpCnsKCU9NQVBfRE1BX0NTRFBfUkVHKGxjaCkgJj0gfigxIDw8IDEzKTsKCWlmIChlbmFibGUpCgkJT01BUF9ETUFfQ1NEUF9SRUcobGNoKSB8PSAxIDw8IDEzOwp9Cgp2b2lkIG9tYXBfc2V0X2RtYV9kZXN0X2J1cnN0X21vZGUoaW50IGxjaCwgZW51bSBvbWFwX2RtYV9idXJzdF9tb2RlIGJ1cnN0X21vZGUpCnsKCXVuc2lnbmVkIGludCBidXJzdCA9IDA7CglPTUFQX0RNQV9DU0RQX1JFRyhsY2gpICY9IH4oMHgwMyA8PCAxNCk7CgoJc3dpdGNoIChidXJzdF9tb2RlKSB7CgljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfRElTOgoJCWJyZWFrOwoJY2FzZSBPTUFQX0RNQV9EQVRBX0JVUlNUXzQ6CgkJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCQlidXJzdCA9IDB4MTsKCQllbHNlCgkJCWJ1cnN0ID0gMHgyOwoJCWJyZWFrOwoJY2FzZSBPTUFQX0RNQV9EQVRBX0JVUlNUXzg6CgkJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCQlidXJzdCA9IDB4MjsKCQllbHNlCgkJCWJ1cnN0ID0gMHgzOwoJCWJyZWFrOwoJY2FzZSBPTUFQX0RNQV9EQVRBX0JVUlNUXzE2OgoJCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewoJCQlidXJzdCA9IDB4MzsKCQkJYnJlYWs7CgkJfQoJCS8qIE9NQVAxIGRvbid0IHN1cHBvcnQgYnVyc3QgMTYKCQkgKiBmYWxsIHRocm91Z2gKCQkgKi8KCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIERNQSBidXJzdCBtb2RlXG4iKTsKCQlCVUcoKTsKCQlyZXR1cm47Cgl9CglPTUFQX0RNQV9DU0RQX1JFRyhsY2gpIHw9IChidXJzdCA8PCAxNCk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2VuYWJsZV9jaGFubmVsX2lycShpbnQgbGNoKQp7Cgl1MzIgc3RhdHVzOwoKCS8qIENsZWFyIENTUiAqLwoJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKQoJCXN0YXR1cyA9IE9NQVBfRE1BX0NTUl9SRUcobGNoKTsKCWVsc2UgaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCU9NQVBfRE1BX0NTUl9SRUcobGNoKSA9IE9NQVAyX0RNQV9DU1JfQ0xFQVJfTUFTSzsKCgkvKiBFbmFibGUgc29tZSBuaWNlIGludGVycnVwdHMuICovCglPTUFQX0RNQV9DSUNSX1JFRyhsY2gpID0gZG1hX2NoYW5bbGNoXS5lbmFibGVkX2lycXM7CgoJZG1hX2NoYW5bbGNoXS5mbGFncyB8PSBPTUFQX0RNQV9BQ1RJVkU7Cn0KCnN0YXRpYyB2b2lkIG9tYXBfZGlzYWJsZV9jaGFubmVsX2lycShpbnQgbGNoKQp7CglpZiAoY3B1X2lzX29tYXAyNHh4KCkpCgkJT01BUF9ETUFfQ0lDUl9SRUcobGNoKSA9IDA7Cn0KCnZvaWQgb21hcF9lbmFibGVfZG1hX2lycShpbnQgbGNoLCB1MTYgYml0cykKewoJZG1hX2NoYW5bbGNoXS5lbmFibGVkX2lycXMgfD0gYml0czsKfQoKdm9pZCBvbWFwX2Rpc2FibGVfZG1hX2lycShpbnQgbGNoLCB1MTYgYml0cykKewoJZG1hX2NoYW5bbGNoXS5lbmFibGVkX2lycXMgJj0gfmJpdHM7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfbG5rKGludCBsY2gpCnsKCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkKCQlPTUFQX0RNQV9DTE5LX0NUUkxfUkVHKGxjaCkgJj0gfigxIDw8IDE0KTsKCgkvKiBTZXQgdGhlIEVOQUJMRV9MTksgYml0cyAqLwoJaWYgKGRtYV9jaGFuW2xjaF0ubmV4dF9sY2ggIT0gLTEpCgkJT01BUF9ETUFfQ0xOS19DVFJMX1JFRyhsY2gpID0KCQkJZG1hX2NoYW5bbGNoXS5uZXh0X2xjaCB8ICgxIDw8IDE1KTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfbG5rKGludCBsY2gpCnsKCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwoJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CgkJT01BUF9ETUFfQ0lDUl9SRUcobGNoKSA9IDA7CgkJLyogU2V0IHRoZSBTVE9QX0xOSyBiaXQgKi8KCQlPTUFQX0RNQV9DTE5LX0NUUkxfUkVHKGxjaCkgfD0gMSA8PCAxNDsKCX0KCglpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKCQlvbWFwX2Rpc2FibGVfY2hhbm5lbF9pcnEobGNoKTsKCQkvKiBDbGVhciB0aGUgRU5BQkxFX0xOSyBiaXQgKi8KCQlPTUFQX0RNQV9DTE5LX0NUUkxfUkVHKGxjaCkgJj0gfigxIDw8IDE1KTsKCX0KCglkbWFfY2hhbltsY2hdLmZsYWdzICY9IH5PTUFQX0RNQV9BQ1RJVkU7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMl9lbmFibGVfaXJxX2xjaChpbnQgbGNoKQp7Cgl1MzIgdmFsOwoKCWlmICghY3B1X2lzX29tYXAyNHh4KCkpCgkJcmV0dXJuOwoKCXZhbCA9IG9tYXBfcmVhZGwoT01BUF9ETUE0X0lSUUVOQUJMRV9MMCk7Cgl2YWwgfD0gMSA8PCBsY2g7CglvbWFwX3dyaXRlbCh2YWwsIE9NQVBfRE1BNF9JUlFFTkFCTEVfTDApOwp9CgppbnQgb21hcF9yZXF1ZXN0X2RtYShpbnQgZGV2X2lkLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKCQkgICAgIHZvaWQgKCogY2FsbGJhY2spKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpLAoJCSAgICAgdm9pZCAqZGF0YSwgaW50ICpkbWFfY2hfb3V0KQp7CglpbnQgY2gsIGZyZWVfY2ggPSAtMTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglzdHJ1Y3Qgb21hcF9kbWFfbGNoICpjaGFuOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfY2hhbl9sb2NrLCBmbGFncyk7Cglmb3IgKGNoID0gMDsgY2ggPCBkbWFfY2hhbl9jb3VudDsgY2grKykgewoJCWlmIChmcmVlX2NoID09IC0xICYmIGRtYV9jaGFuW2NoXS5kZXZfaWQgPT0gLTEpIHsKCQkJZnJlZV9jaCA9IGNoOwoJCQlpZiAoZGV2X2lkID09IDApCgkJCQlicmVhazsKCQl9Cgl9CglpZiAoZnJlZV9jaCA9PSAtMSkgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLUVCVVNZOwoJfQoJY2hhbiA9IGRtYV9jaGFuICsgZnJlZV9jaDsKCWNoYW4tPmRldl9pZCA9IGRldl9pZDsKCglpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpCgkJY2xlYXJfbGNoX3JlZ3MoZnJlZV9jaCk7CgoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCW9tYXBfY2xlYXJfZG1hKGZyZWVfY2gpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKCgljaGFuLT5kZXZfbmFtZSA9IGRldl9uYW1lOwoJY2hhbi0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKCWNoYW4tPmRhdGEgPSBkYXRhOwoJY2hhbi0+ZW5hYmxlZF9pcnFzID0gT01BUF9ETUFfRFJPUF9JUlEgfCBPTUFQX0RNQV9CTE9DS19JUlE7CgoJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKQoJCWNoYW4tPmVuYWJsZWRfaXJxcyB8PSBPTUFQMV9ETUFfVE9VVF9JUlE7CgllbHNlIGlmIChjcHVfaXNfb21hcDI0eHgoKSkKCQljaGFuLT5lbmFibGVkX2lycXMgfD0gT01BUDJfRE1BX01JU0FMSUdORURfRVJSX0lSUSB8CgkJCU9NQVAyX0RNQV9UUkFOU19FUlJfSVJROwoKCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewoJCS8qIElmIHRoZSBzeW5jIGRldmljZSBpcyBzZXQsIGNvbmZpZ3VyZSBpdCBkeW5hbWljYWxseS4gKi8KCQlpZiAoZGV2X2lkICE9IDApIHsKCQkJc2V0X2dkbWFfZGV2KGZyZWVfY2ggKyAxLCBkZXZfaWQpOwoJCQlkZXZfaWQgPSBmcmVlX2NoICsgMTsKCQl9CgkJLyogRGlzYWJsZSB0aGUgMTUxMCBjb21wYXRpYmlsaXR5IG1vZGUgYW5kIHNldCB0aGUgc3luYyBkZXZpY2UKCQkgKiBpZC4gKi8KCQlPTUFQX0RNQV9DQ1JfUkVHKGZyZWVfY2gpID0gZGV2X2lkIHwgKDEgPDwgMTApOwoJfSBlbHNlIGlmIChjcHVfaXNfb21hcDczMCgpIHx8IGNwdV9pc19vbWFwMTV4eCgpKSB7CgkJT01BUF9ETUFfQ0NSX1JFRyhmcmVlX2NoKSA9IGRldl9pZDsKCX0KCglpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKCQlvbWFwMl9lbmFibGVfaXJxX2xjaChmcmVlX2NoKTsKCgkJb21hcF9lbmFibGVfY2hhbm5lbF9pcnEoZnJlZV9jaCk7CgkJLyogQ2xlYXIgdGhlIENTUiByZWdpc3RlciBhbmQgSVJRIHN0YXR1cyByZWdpc3RlciAqLwoJCU9NQVBfRE1BX0NTUl9SRUcoZnJlZV9jaCkgPSBPTUFQMl9ETUFfQ1NSX0NMRUFSX01BU0s7CgkJb21hcF93cml0ZWwofjB4MCwgT01BUF9ETUE0X0lSUVNUQVRVU19MMCk7Cgl9CgoJKmRtYV9jaF9vdXQgPSBmcmVlX2NoOwoKCXJldHVybiAwOwp9Cgp2b2lkIG9tYXBfZnJlZV9kbWEoaW50IGxjaCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmZG1hX2NoYW5fbG9jaywgZmxhZ3MpOwoJaWYgKGRtYV9jaGFuW2xjaF0uZGV2X2lkID09IC0xKSB7CgkJcHJpbnRrKCJvbWFwX2RtYTogdHJ5aW5nIHRvIGZyZWUgbm9uYWxsb2NhdGVkIERNQSBjaGFubmVsICVkXG4iLAoJCSAgICAgICBsY2gpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKCQlyZXR1cm47Cgl9CglkbWFfY2hhbltsY2hdLmRldl9pZCA9IC0xOwoJZG1hX2NoYW5bbGNoXS5uZXh0X2xjaCA9IC0xOwoJZG1hX2NoYW5bbGNoXS5jYWxsYmFjayA9IE5VTEw7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfY2hhbl9sb2NrLCBmbGFncyk7CgoJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CgkJLyogRGlzYWJsZSBhbGwgRE1BIGludGVycnVwdHMgZm9yIHRoZSBjaGFubmVsLiAqLwoJCU9NQVBfRE1BX0NJQ1JfUkVHKGxjaCkgPSAwOwoJCS8qIE1ha2Ugc3VyZSB0aGUgRE1BIHRyYW5zZmVyIGlzIHN0b3BwZWQuICovCgkJT01BUF9ETUFfQ0NSX1JFRyhsY2gpID0gMDsKCX0KCglpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKCQl1MzIgdmFsOwoJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwoJCXZhbCA9IG9tYXBfcmVhZGwoT01BUF9ETUE0X0lSUUVOQUJMRV9MMCk7CgkJdmFsICY9IH4oMSA8PCBsY2gpOwoJCW9tYXBfd3JpdGVsKHZhbCwgT01BUF9ETUE0X0lSUUVOQUJMRV9MMCk7CgoJCS8qIENsZWFyIHRoZSBDU1IgcmVnaXN0ZXIgYW5kIElSUSBzdGF0dXMgcmVnaXN0ZXIgKi8KCQlPTUFQX0RNQV9DU1JfUkVHKGxjaCkgPSBPTUFQMl9ETUFfQ1NSX0NMRUFSX01BU0s7CgoJCXZhbCA9IG9tYXBfcmVhZGwoT01BUF9ETUE0X0lSUVNUQVRVU19MMCk7CgkJdmFsIHw9IDEgPDwgbGNoOwoJCW9tYXBfd3JpdGVsKHZhbCwgT01BUF9ETUE0X0lSUVNUQVRVU19MMCk7CgoJCS8qIERpc2FibGUgYWxsIERNQSBpbnRlcnJ1cHRzIGZvciB0aGUgY2hhbm5lbC4gKi8KCQlPTUFQX0RNQV9DSUNSX1JFRyhsY2gpID0gMDsKCgkJLyogTWFrZSBzdXJlIHRoZSBETUEgdHJhbnNmZXIgaXMgc3RvcHBlZC4gKi8KCQlPTUFQX0RNQV9DQ1JfUkVHKGxjaCkgPSAwOwoJCW9tYXBfY2xlYXJfZG1hKGxjaCk7Cgl9Cn0KCi8qCiAqIENsZWFycyBhbnkgRE1BIHN0YXRlIHNvIHRoZSBETUEgZW5naW5lIGlzIHJlYWR5IHRvIHJlc3RhcnQgd2l0aCBuZXcgYnVmZmVycwogKiB0aHJvdWdoIG9tYXBfc3RhcnRfZG1hKCkuIEFueSBidWZmZXJzIGluIGZsaWdodCBhcmUgZGlzY2FyZGVkLgogKi8Kdm9pZCBvbWFwX2NsZWFyX2RtYShpbnQgbGNoKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKCglpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpIHsKCQlpbnQgc3RhdHVzOwoJCU9NQVBfRE1BX0NDUl9SRUcobGNoKSAmPSB+T01BUF9ETUFfQ0NSX0VOOwoKCQkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KCQlzdGF0dXMgPSBPTUFQX0RNQV9DU1JfUkVHKGxjaCk7Cgl9CgoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CgkJaW50IGk7CgkJdTMyIGxjaF9iYXNlID0gT01BUDI0WFhfRE1BX0JBU0UgKyBsY2ggKiAweDYwICsgMHg4MDsKCQlmb3IgKGkgPSAwOyBpIDwgMHg0NDsgaSArPSA0KQoJCQlvbWFwX3dyaXRlbCgwLCBsY2hfYmFzZSArIGkpOwoJfQoKCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKfQoKdm9pZCBvbWFwX3N0YXJ0X2RtYShpbnQgbGNoKQp7CglpZiAoIW9tYXBfZG1hX2luXzE1MTBfbW9kZSgpICYmIGRtYV9jaGFuW2xjaF0ubmV4dF9sY2ggIT0gLTEpIHsKCQlpbnQgbmV4dF9sY2gsIGN1cl9sY2g7CgkJY2hhciBkbWFfY2hhbl9saW5rX21hcFtPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKCgkJZG1hX2NoYW5fbGlua19tYXBbbGNoXSA9IDE7CgkJLyogU2V0IHRoZSBsaW5rIHJlZ2lzdGVyIG9mIHRoZSBmaXJzdCBjaGFubmVsICovCgkJZW5hYmxlX2xuayhsY2gpOwoKCQltZW1zZXQoZG1hX2NoYW5fbGlua19tYXAsIDAsIHNpemVvZihkbWFfY2hhbl9saW5rX21hcCkpOwoJCWN1cl9sY2ggPSBkbWFfY2hhbltsY2hdLm5leHRfbGNoOwoJCWRvIHsKCQkJbmV4dF9sY2ggPSBkbWFfY2hhbltjdXJfbGNoXS5uZXh0X2xjaDsKCgkJCS8qIFRoZSBsb29wIGNhc2U6IHdlJ3ZlIGJlZW4gaGVyZSBhbHJlYWR5ICovCgkJCWlmIChkbWFfY2hhbl9saW5rX21hcFtjdXJfbGNoXSkKCQkJCWJyZWFrOwoJCQkvKiBNYXJrIHRoZSBjdXJyZW50IGNoYW5uZWwgKi8KCQkJZG1hX2NoYW5fbGlua19tYXBbY3VyX2xjaF0gPSAxOwoKCQkJZW5hYmxlX2xuayhjdXJfbGNoKTsKCQkJb21hcF9lbmFibGVfY2hhbm5lbF9pcnEoY3VyX2xjaCk7CgoJCQljdXJfbGNoID0gbmV4dF9sY2g7CgkJfSB3aGlsZSAobmV4dF9sY2ggIT0gLTEpOwoJfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0eHgoKSkgewoJCS8qIEVycmF0YTogTmVlZCB0byB3cml0ZSBsY2ggZXZlbiBpZiBub3QgdXNpbmcgY2hhaW5pbmcgKi8KCQlPTUFQX0RNQV9DTE5LX0NUUkxfUkVHKGxjaCkgPSBsY2g7Cgl9CgoJb21hcF9lbmFibGVfY2hhbm5lbF9pcnEobGNoKTsKCgkvKiBFcnJhdGE6IE9uIEVTMi4wIEJVRkZFUklORyBkaXNhYmxlIG11c3QgYmUgc2V0LgoJICogVGhpcyB3aWxsIGFsd2F5cyBmYWlsIG9uIEVTMS4wICovCglpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKCQlPTUFQX0RNQV9DQ1JfUkVHKGxjaCkgfD0gT01BUF9ETUFfQ0NSX0VOOwoJfQoKCU9NQVBfRE1BX0NDUl9SRUcobGNoKSB8PSBPTUFQX0RNQV9DQ1JfRU47CgoJZG1hX2NoYW5bbGNoXS5mbGFncyB8PSBPTUFQX0RNQV9BQ1RJVkU7Cn0KCnZvaWQgb21hcF9zdG9wX2RtYShpbnQgbGNoKQp7CglpZiAoIW9tYXBfZG1hX2luXzE1MTBfbW9kZSgpICYmIGRtYV9jaGFuW2xjaF0ubmV4dF9sY2ggIT0gLTEpIHsKCQlpbnQgbmV4dF9sY2gsIGN1cl9sY2ggPSBsY2g7CgkJY2hhciBkbWFfY2hhbl9saW5rX21hcFtPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKCgkJbWVtc2V0KGRtYV9jaGFuX2xpbmtfbWFwLCAwLCBzaXplb2YoZG1hX2NoYW5fbGlua19tYXApKTsKCQlkbyB7CgkJCS8qIFRoZSBsb29wIGNhc2U6IHdlJ3ZlIGJlZW4gaGVyZSBhbHJlYWR5ICovCgkJCWlmIChkbWFfY2hhbl9saW5rX21hcFtjdXJfbGNoXSkKCQkJCWJyZWFrOwoJCQkvKiBNYXJrIHRoZSBjdXJyZW50IGNoYW5uZWwgKi8KCQkJZG1hX2NoYW5fbGlua19tYXBbY3VyX2xjaF0gPSAxOwoKCQkJZGlzYWJsZV9sbmsoY3VyX2xjaCk7CgoJCQluZXh0X2xjaCA9IGRtYV9jaGFuW2N1cl9sY2hdLm5leHRfbGNoOwoJCQljdXJfbGNoID0gbmV4dF9sY2g7CgkJfSB3aGlsZSAobmV4dF9sY2ggIT0gLTEpOwoKCQlyZXR1cm47Cgl9CgoJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBvbiB0aGUgY2hhbm5lbCAqLwoJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKQoJCU9NQVBfRE1BX0NJQ1JfUkVHKGxjaCkgPSAwOwoKCU9NQVBfRE1BX0NDUl9SRUcobGNoKSAmPSB+T01BUF9ETUFfQ0NSX0VOOwoJZG1hX2NoYW5bbGNoXS5mbGFncyAmPSB+T01BUF9ETUFfQUNUSVZFOwp9CgovKgogKiBSZXR1cm5zIGN1cnJlbnQgcGh5c2ljYWwgc291cmNlIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBETUEgY2hhbm5lbC4KICogSWYgdGhlIGNoYW5uZWwgaXMgcnVubmluZyB0aGUgY2FsbGVyIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIHByaW9yIGNhbGxpbmcKICogdGhpcyBmdW5jdGlvbiBhbmQgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgYmVmb3JlIHJlLWVuYWJsaW5nIGludGVycnVwdCB0bwogKiBwcmV2ZW50IHJhY2VzIHdpdGggdGhlIGludGVycnVwdCBoYW5kbGVyLiBOb3RlIHRoYXQgaW4gY29udGludW91cyBtb2RlIHRoZXJlCiAqIGlzIGEgY2hhbmNlIGZvciBDU1NBX0wgcmVnaXN0ZXIgb3ZlcmZsb3cgaW5iZXR3ZWVuIHRoZSB0d28gcmVhZHMgcmVzdWx0aW5nCiAqIGluIGluY29ycmVjdCByZXR1cm4gdmFsdWUuCiAqLwpkbWFfYWRkcl90IG9tYXBfZ2V0X2RtYV9zcmNfcG9zKGludCBsY2gpCnsKCWRtYV9hZGRyX3Qgb2Zmc2V0OwoKCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkKCQlvZmZzZXQgPSAoZG1hX2FkZHJfdCkgKE9NQVAxX0RNQV9DU1NBX0xfUkVHKGxjaCkgfAoJCQkJICAgICAgIChPTUFQMV9ETUFfQ1NTQV9VX1JFRyhsY2gpIDw8IDE2KSk7CgoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCW9mZnNldCA9IE9NQVBfRE1BX0NTQUNfUkVHKGxjaCk7CgoJcmV0dXJuIG9mZnNldDsKfQoKLyoKICogUmV0dXJucyBjdXJyZW50IHBoeXNpY2FsIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBETUEgY2hhbm5lbC4KICogSWYgdGhlIGNoYW5uZWwgaXMgcnVubmluZyB0aGUgY2FsbGVyIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIHByaW9yIGNhbGxpbmcKICogdGhpcyBmdW5jdGlvbiBhbmQgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgYmVmb3JlIHJlLWVuYWJsaW5nIGludGVycnVwdCB0bwogKiBwcmV2ZW50IHJhY2VzIHdpdGggdGhlIGludGVycnVwdCBoYW5kbGVyLiBOb3RlIHRoYXQgaW4gY29udGludW91cyBtb2RlIHRoZXJlCiAqIGlzIGEgY2hhbmNlIGZvciBDRFNBX0wgcmVnaXN0ZXIgb3ZlcmZsb3cgaW5iZXR3ZWVuIHRoZSB0d28gcmVhZHMgcmVzdWx0aW5nCiAqIGluIGluY29ycmVjdCByZXR1cm4gdmFsdWUuCiAqLwpkbWFfYWRkcl90IG9tYXBfZ2V0X2RtYV9kc3RfcG9zKGludCBsY2gpCnsKCWRtYV9hZGRyX3Qgb2Zmc2V0OwoKCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkKCQlvZmZzZXQgPSAoZG1hX2FkZHJfdCkgKE9NQVAxX0RNQV9DRFNBX0xfUkVHKGxjaCkgfAoJCQkJICAgICAgIChPTUFQMV9ETUFfQ0RTQV9VX1JFRyhsY2gpIDw8IDE2KSk7CgoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCW9mZnNldCA9IE9NQVAyX0RNQV9DRFNBX1JFRyhsY2gpOwoKCXJldHVybiBvZmZzZXQ7Cn0KCi8qCiAqIFJldHVybnMgY3VycmVudCBzb3VyY2UgdHJhbnNmZXIgY291bnRpbmcgZm9yIHRoZSBnaXZlbiBETUEgY2hhbm5lbC4KICogQ2FuIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgYSB0cmFuc2ZlciBpbnNpZGUgYSBibG9jay4KICogSXQgbXVzdCBiZSBjYWxsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLgogKi8KaW50IG9tYXBfZ2V0X2RtYV9zcmNfYWRkcl9jb3VudGVyKGludCBsY2gpCnsKCXJldHVybiAoZG1hX2FkZHJfdCkgT01BUF9ETUFfQ1NBQ19SRUcobGNoKTsKfQoKaW50IG9tYXBfZG1hX3J1bm5pbmcodm9pZCkKewoJaW50IGxjaDsKCgkvKiBDaGVjayBpZiBMQ0QgRE1BIGlzIHJ1bm5pbmcgKi8KCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKCQlpZiAob21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUikgJiBPTUFQX0RNQV9DQ1JfRU4pCgkJCXJldHVybiAxOwoKCWZvciAobGNoID0gMDsgbGNoIDwgZG1hX2NoYW5fY291bnQ7IGxjaCsrKQoJCWlmIChPTUFQX0RNQV9DQ1JfUkVHKGxjaCkgJiBPTUFQX0RNQV9DQ1JfRU4pCgkJCXJldHVybiAxOwoKCXJldHVybiAwOwp9CgovKgogKiBsY2hfcXVldWUgRE1BIHdpbGwgc3RhcnQgcmlnaHQgYWZ0ZXIgbGNoX2hlYWQgb25lIGlzIGZpbmlzaGVkLgogKiBGb3IgdGhpcyBETUEgbGluayB0byBzdGFydCwgeW91IHN0aWxsIG5lZWQgdG8gc3RhcnQgKHNlZSBvbWFwX3N0YXJ0X2RtYSkKICogdGhlIGZpcnN0IG9uZS4gVGhhdCB3aWxsIGZpcmUgdXAgdGhlIGVudGlyZSBxdWV1ZS4KICovCnZvaWQgb21hcF9kbWFfbGlua19sY2ggKGludCBsY2hfaGVhZCwgaW50IGxjaF9xdWV1ZSkKewoJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJETUEgbGlua2luZyBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7CgkJQlVHKCk7CgkJcmV0dXJuOwoJfQoKCWlmICgoZG1hX2NoYW5bbGNoX2hlYWRdLmRldl9pZCA9PSAtMSkgfHwKCSAgICAoZG1hX2NoYW5bbGNoX3F1ZXVlXS5kZXZfaWQgPT0gLTEpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJvbWFwX2RtYTogdHJ5aW5nIHRvIGxpbmsgIgoJCSAgICAgICAibm9uIHJlcXVlc3RlZCBjaGFubmVsc1xuIik7CgkJZHVtcF9zdGFjaygpOwoJfQoKCWRtYV9jaGFuW2xjaF9oZWFkXS5uZXh0X2xjaCA9IGxjaF9xdWV1ZTsKfQoKLyoKICogT25jZSB0aGUgRE1BIHF1ZXVlIGlzIHN0b3BwZWQsIHdlIGNhbiBkZXN0cm95IGl0LgogKi8Kdm9pZCBvbWFwX2RtYV91bmxpbmtfbGNoIChpbnQgbGNoX2hlYWQsIGludCBsY2hfcXVldWUpCnsKCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSkgewoJCXByaW50ayhLRVJOX0VSUiAiRE1BIGxpbmtpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiAxNTEwIG1vZGVcbiIpOwoJCUJVRygpOwoJCXJldHVybjsKCX0KCglpZiAoZG1hX2NoYW5bbGNoX2hlYWRdLm5leHRfbGNoICE9IGxjaF9xdWV1ZSB8fAoJICAgIGRtYV9jaGFuW2xjaF9oZWFkXS5uZXh0X2xjaCA9PSAtMSkgewoJCXByaW50ayhLRVJOX0VSUiAib21hcF9kbWE6IHRyeWluZyB0byB1bmxpbmsgIgoJCSAgICAgICAibm9uIGxpbmtlZCBjaGFubmVsc1xuIik7CgkJZHVtcF9zdGFjaygpOwoJfQoKCglpZiAoKGRtYV9jaGFuW2xjaF9oZWFkXS5mbGFncyAmIE9NQVBfRE1BX0FDVElWRSkgfHwKCSAgICAoZG1hX2NoYW5bbGNoX2hlYWRdLmZsYWdzICYgT01BUF9ETUFfQUNUSVZFKSkgewoJCXByaW50ayhLRVJOX0VSUiAib21hcF9kbWE6IFlvdSBuZWVkIHRvIHN0b3AgdGhlIERNQSBjaGFubmVscyAiCgkJICAgICAgICJiZWZvcmUgdW5saW5raW5nXG4iKTsKCQlkdW1wX3N0YWNrKCk7Cgl9CgoJZG1hX2NoYW5bbGNoX2hlYWRdLm5leHRfbGNoID0gLTE7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKCnN0YXRpYyBpbnQgb21hcDFfZG1hX2hhbmRsZV9jaChpbnQgY2gpCnsKCXUxNiBjc3I7CgoJaWYgKGVuYWJsZV8xNTEwX21vZGUgJiYgY2ggPj0gNikgewoJCWNzciA9IGRtYV9jaGFuW2NoXS5zYXZlZF9jc3I7CgkJZG1hX2NoYW5bY2hdLnNhdmVkX2NzciA9IDA7Cgl9IGVsc2UKCQljc3IgPSBPTUFQX0RNQV9DU1JfUkVHKGNoKTsKCWlmIChlbmFibGVfMTUxMF9tb2RlICYmIGNoIDw9IDIgJiYgKGNzciA+PiA3KSAhPSAwKSB7CgkJZG1hX2NoYW5bY2ggKyA2XS5zYXZlZF9jc3IgPSBjc3IgPj4gNzsKCQljc3IgJj0gMHg3ZjsKCX0KCWlmICgoY3NyICYgMHgzZikgPT0gMCkKCQlyZXR1cm4gMDsKCWlmICh1bmxpa2VseShkbWFfY2hhbltjaF0uZGV2X2lkID09IC0xKSkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNwdXJpb3VzIGludGVycnVwdCBmcm9tIERNQSBjaGFubmVsICIKCQkgICAgICAgIiVkIChDU1IgJTA0eClcbiIsIGNoLCBjc3IpOwoJCXJldHVybiAwOwoJfQoJaWYgKHVubGlrZWx5KGNzciAmIE9NQVAxX0RNQV9UT1VUX0lSUSkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiRE1BIHRpbWVvdXQgd2l0aCBkZXZpY2UgJWRcbiIsCgkJICAgICAgIGRtYV9jaGFuW2NoXS5kZXZfaWQpOwoJaWYgKHVubGlrZWx5KGNzciAmIE9NQVBfRE1BX0RST1BfSVJRKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJETUEgc3luY2hyb25pemF0aW9uIGV2ZW50IGRyb3Agb2NjdXJyZWQgIgoJCSAgICAgICAid2l0aCBkZXZpY2UgJWRcbiIsIGRtYV9jaGFuW2NoXS5kZXZfaWQpOwoJaWYgKGxpa2VseShjc3IgJiBPTUFQX0RNQV9CTE9DS19JUlEpKQoJCWRtYV9jaGFuW2NoXS5mbGFncyAmPSB+T01BUF9ETUFfQUNUSVZFOwoJaWYgKGxpa2VseShkbWFfY2hhbltjaF0uY2FsbGJhY2sgIT0gTlVMTCkpCgkJZG1hX2NoYW5bY2hdLmNhbGxiYWNrKGNoLCBjc3IsIGRtYV9jaGFuW2NoXS5kYXRhKTsKCXJldHVybiAxOwp9CgpzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcDFfZG1hX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKCQkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCnsKCWludCBjaCA9ICgoaW50KSBkZXZfaWQpIC0gMTsKCWludCBoYW5kbGVkID0gMDsKCglmb3IgKDs7KSB7CgkJaW50IGhhbmRsZWRfbm93ID0gMDsKCgkJaGFuZGxlZF9ub3cgKz0gb21hcDFfZG1hX2hhbmRsZV9jaChjaCk7CgkJaWYgKGVuYWJsZV8xNTEwX21vZGUgJiYgZG1hX2NoYW5bY2ggKyA2XS5zYXZlZF9jc3IpCgkJCWhhbmRsZWRfbm93ICs9IG9tYXAxX2RtYV9oYW5kbGVfY2goY2ggKyA2KTsKCQlpZiAoIWhhbmRsZWRfbm93KQoJCQlicmVhazsKCQloYW5kbGVkICs9IGhhbmRsZWRfbm93OwoJfQoKCXJldHVybiBoYW5kbGVkID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKfQoKI2Vsc2UKI2RlZmluZSBvbWFwMV9kbWFfaXJxX2hhbmRsZXIJTlVMTAojZW5kaWYKCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMgoKc3RhdGljIGludCBvbWFwMl9kbWFfaGFuZGxlX2NoKGludCBjaCkKewoJdTMyIHN0YXR1cyA9IE9NQVBfRE1BX0NTUl9SRUcoY2gpOwoJdTMyIHZhbDsKCglpZiAoIXN0YXR1cykKCQlyZXR1cm4gMDsKCWlmICh1bmxpa2VseShkbWFfY2hhbltjaF0uZGV2X2lkID09IC0xKSkKCQlyZXR1cm4gMDsKCWlmICh1bmxpa2VseShzdGF0dXMgJiBPTUFQX0RNQV9EUk9QX0lSUSkpCgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiRE1BIHN5bmNocm9uaXphdGlvbiBldmVudCBkcm9wIG9jY3VycmVkIHdpdGggZGV2aWNlICIKCQkgICAgICAgIiVkXG4iLCBkbWFfY2hhbltjaF0uZGV2X2lkKTsKCWlmICh1bmxpa2VseShzdGF0dXMgJiBPTUFQMl9ETUFfVFJBTlNfRVJSX0lSUSkpCgkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BIHRyYW5zYWN0aW9uIGVycm9yIHdpdGggZGV2aWNlICVkXG4iLAoJCSAgICAgICBkbWFfY2hhbltjaF0uZGV2X2lkKTsKCWlmICh1bmxpa2VseShzdGF0dXMgJiBPTUFQMl9ETUFfU0VDVVJFX0VSUl9JUlEpKQoJCXByaW50ayhLRVJOX0lORk8gIkRNQSBzZWN1cmUgZXJyb3Igd2l0aCBkZXZpY2UgJWRcbiIsCgkJICAgICAgIGRtYV9jaGFuW2NoXS5kZXZfaWQpOwoJaWYgKHVubGlrZWx5KHN0YXR1cyAmIE9NQVAyX0RNQV9NSVNBTElHTkVEX0VSUl9JUlEpKQoJCXByaW50ayhLRVJOX0lORk8gIkRNQSBtaXNhbGlnbmVkIGVycm9yIHdpdGggZGV2aWNlICVkXG4iLAoJCSAgICAgICBkbWFfY2hhbltjaF0uZGV2X2lkKTsKCglPTUFQX0RNQV9DU1JfUkVHKGNoKSA9IE9NQVAyX0RNQV9DU1JfQ0xFQVJfTUFTSzsKCgl2YWwgPSBvbWFwX3JlYWRsKE9NQVBfRE1BNF9JUlFTVEFUVVNfTDApOwoJLyogY2ggaW4gdGhpcyBmdW5jdGlvbiBpcyBmcm9tIDAtMzEgd2hpbGUgaW4gcmVnaXN0ZXIgaXQgaXMgMS0zMiAqLwoJdmFsID0gMSA8PCAoY2gpOwoJb21hcF93cml0ZWwodmFsLCBPTUFQX0RNQTRfSVJRU1RBVFVTX0wwKTsKCglpZiAobGlrZWx5KGRtYV9jaGFuW2NoXS5jYWxsYmFjayAhPSBOVUxMKSkKCQlkbWFfY2hhbltjaF0uY2FsbGJhY2soY2gsIHN0YXR1cywgZG1hX2NoYW5bY2hdLmRhdGEpOwoKCXJldHVybiAwOwp9CgovKiBTVEFUVVMgcmVnaXN0ZXIgY291bnQgaXMgZnJvbSAxLTMyIHdoaWxlIG91ciBpcyAwLTMxICovCnN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwMl9kbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLAoJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJdTMyIHZhbDsKCWludCBpOwoKCXZhbCA9IG9tYXBfcmVhZGwoT01BUF9ETUE0X0lSUVNUQVRVU19MMCk7CgoJZm9yIChpID0gMTsgaSA8PSBPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UOyBpKyspIHsKCQlpbnQgYWN0aXZlID0gdmFsICYgKDEgPDwgKGkgLSAxKSk7CgkJaWYgKGFjdGl2ZSkKCQkJb21hcDJfZG1hX2hhbmRsZV9jaChpIC0gMSk7Cgl9CgoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgpzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBvbWFwMjR4eF9kbWFfaXJxID0gewoJLm5hbWUgPSAiRE1BIiwKCS5oYW5kbGVyID0gb21hcDJfZG1hX2lycV9oYW5kbGVyLAoJLmZsYWdzID0gSVJRRl9ESVNBQkxFRAp9OwoKI2Vsc2UKc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcDI0eHhfZG1hX2lycTsKI2VuZGlmCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKc3RhdGljIHN0cnVjdCBsY2RfZG1hX2luZm8gewoJc3BpbmxvY2tfdCBsb2NrOwoJaW50IHJlc2VydmVkOwoJdm9pZCAoKiBjYWxsYmFjaykodTE2IHN0YXR1cywgdm9pZCAqZGF0YSk7Cgl2b2lkICpjYl9kYXRhOwoKCWludCBhY3RpdmU7Cgl1bnNpZ25lZCBsb25nIGFkZHIsIHNpemU7CglpbnQgcm90YXRlLCBkYXRhX3R5cGUsIHhyZXMsIHlyZXM7CglpbnQgdnhyZXM7CglpbnQgbWlycm9yOwoJaW50IHhzY2FsZSwgeXNjYWxlOwoJaW50IGV4dF9jdHJsOwoJaW50IHNyY19wb3J0OwoJaW50IHNpbmdsZV90cmFuc2ZlcjsKfSBsY2RfZG1hOwoKdm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxKHVuc2lnbmVkIGxvbmcgYWRkciwgdTE2IGZiX3hyZXMsIHUxNiBmYl95cmVzLAoJCQkgaW50IGRhdGFfdHlwZSkKewoJbGNkX2RtYS5hZGRyID0gYWRkcjsKCWxjZF9kbWEuZGF0YV90eXBlID0gZGF0YV90eXBlOwoJbGNkX2RtYS54cmVzID0gZmJfeHJlczsKCWxjZF9kbWEueXJlcyA9IGZiX3lyZXM7Cn0KCnZvaWQgb21hcF9zZXRfbGNkX2RtYV9zcmNfcG9ydChpbnQgcG9ydCkKewoJbGNkX2RtYS5zcmNfcG9ydCA9IHBvcnQ7Cn0KCnZvaWQgb21hcF9zZXRfbGNkX2RtYV9leHRfY29udHJvbGxlcihpbnQgZXh0ZXJuYWwpCnsKCWxjZF9kbWEuZXh0X2N0cmwgPSBleHRlcm5hbDsKfQoKdm9pZCBvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcihpbnQgc2luZ2xlKQp7CglsY2RfZG1hLnNpbmdsZV90cmFuc2ZlciA9IHNpbmdsZTsKfQoKCnZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV9yb3RhdGlvbihpbnQgcm90YXRlKQp7CglpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpIHsKCQlwcmludGsoS0VSTl9FUlIgIkRNQSByb3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7CgkJQlVHKCk7CgkJcmV0dXJuOwoJfQoJbGNkX2RtYS5yb3RhdGUgPSByb3RhdGU7Cn0KCnZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV9taXJyb3IoaW50IG1pcnJvcikKewoJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJETUEgbWlycm9yIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKCQlCVUcoKTsKCX0KCWxjZF9kbWEubWlycm9yID0gbWlycm9yOwp9Cgp2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfdnhyZXModW5zaWduZWQgbG9uZyB2eHJlcykKewoJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJETUEgdmlydHVhbCByZXN1bG90aW9uIGlzIG5vdCBzdXBwb3J0ZWQgIgoJCQkJImluIDE1MTAgbW9kZVxuIik7CgkJQlVHKCk7Cgl9CglsY2RfZG1hLnZ4cmVzID0gdnhyZXM7Cn0KCnZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV9zY2FsZSh1bnNpZ25lZCBpbnQgeHNjYWxlLCB1bnNpZ25lZCBpbnQgeXNjYWxlKQp7CglpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpIHsKCQlwcmludGsoS0VSTl9FUlIgIkRNQSBzY2FsZSBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7CgkJQlVHKCk7Cgl9CglsY2RfZG1hLnhzY2FsZSA9IHhzY2FsZTsKCWxjZF9kbWEueXNjYWxlID0geXNjYWxlOwp9CgpzdGF0aWMgdm9pZCBzZXRfYjFfcmVncyh2b2lkKQp7Cgl1bnNpZ25lZCBsb25nIHRvcCwgYm90dG9tOwoJaW50IGVzOwoJdTE2IHc7Cgl1bnNpZ25lZCBsb25nIGVuLCBmbjsKCWxvbmcgZWksIGZpOwoJdW5zaWduZWQgbG9uZyB2eHJlczsKCXVuc2lnbmVkIGludCB4c2NhbGUsIHlzY2FsZTsKCglzd2l0Y2ggKGxjZF9kbWEuZGF0YV90eXBlKSB7CgljYXNlIE9NQVBfRE1BX0RBVEFfVFlQRV9TODoKCQllcyA9IDE7CgkJYnJlYWs7CgljYXNlIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTY6CgkJZXMgPSAyOwoJCWJyZWFrOwoJY2FzZSBPTUFQX0RNQV9EQVRBX1RZUEVfUzMyOgoJCWVzID0gNDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJQlVHKCk7CgkJcmV0dXJuOwoJfQoKCXZ4cmVzID0gbGNkX2RtYS52eHJlcyA/IGxjZF9kbWEudnhyZXMgOiBsY2RfZG1hLnhyZXM7Cgl4c2NhbGUgPSBsY2RfZG1hLnhzY2FsZSA/IGxjZF9kbWEueHNjYWxlIDogMTsKCXlzY2FsZSA9IGxjZF9kbWEueXNjYWxlID8gbGNkX2RtYS55c2NhbGUgOiAxOwoJQlVHX09OKHZ4cmVzIDwgbGNkX2RtYS54cmVzKTsKI2RlZmluZSBQSVhBRERSKHgseSkgKGxjZF9kbWEuYWRkciArICgoeSkgKiB2eHJlcyAqIHlzY2FsZSArICh4KSAqIHhzY2FsZSkgKiBlcykKI2RlZmluZSBQSVhTVEVQKHN4LCBzeSwgZHgsIGR5KSAoUElYQUREUihkeCwgZHkpIC0gUElYQUREUihzeCwgc3kpIC0gZXMgKyAxKQoJc3dpdGNoIChsY2RfZG1hLnJvdGF0ZSkgewoJY2FzZSAwOgoJCWlmICghbGNkX2RtYS5taXJyb3IpIHsKCQkJdG9wID0gUElYQUREUigwLCAwKTsKCQkJYm90dG9tID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKCQkJLyogMTUxMCBETUEgcmVxdWlyZXMgdGhlIGJvdHRvbSBhZGRyZXNzIHRvIGJlIDIgbW9yZQoJCQkgKiB0aGFuIHRoZSBhY3R1YWwgbGFzdCBtZW1vcnkgYWNjZXNzIGxvY2F0aW9uLiAqLwoJCQlpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkgJiYKCQkJICAgIGxjZF9kbWEuZGF0YV90eXBlID09IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIpCgkJCQlib3R0b20gKz0gMjsKCQkJZWkgPSBQSVhTVEVQKDAsIDAsIDEsIDApOwoJCQlmaSA9IFBJWFNURVAobGNkX2RtYS54cmVzIC0gMSwgMCwgMCwgMSk7CgkJfSBlbHNlIHsKCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKCQkJYm90dG9tID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKCQkJZWkgPSBQSVhTVEVQKDEsIDAsIDAsIDApOwoJCQlmaSA9IFBJWFNURVAoMCwgMCwgbGNkX2RtYS54cmVzIC0gMSwgMSk7CgkJfQoJCWVuID0gbGNkX2RtYS54cmVzOwoJCWZuID0gbGNkX2RtYS55cmVzOwoJCWJyZWFrOwoJY2FzZSA5MDoKCQlpZiAoIWxjZF9kbWEubWlycm9yKSB7CgkJCXRvcCA9IFBJWEFERFIoMCwgbGNkX2RtYS55cmVzIC0gMSk7CgkJCWJvdHRvbSA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgMCk7CgkJCWVpID0gUElYU1RFUCgwLCAxLCAwLCAwKTsKCQkJZmkgPSBQSVhTVEVQKDAsIDAsIDEsIGxjZF9kbWEueXJlcyAtIDEpOwoJCX0gZWxzZSB7CgkJCXRvcCA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgbGNkX2RtYS55cmVzIC0gMSk7CgkJCWJvdHRvbSA9IFBJWEFERFIoMCwgMCk7CgkJCWVpID0gUElYU1RFUCgwLCAxLCAwLCAwKTsKCQkJZmkgPSBQSVhTVEVQKDEsIDAsIDAsIGxjZF9kbWEueXJlcyAtIDEpOwoJCX0KCQllbiA9IGxjZF9kbWEueXJlczsKCQlmbiA9IGxjZF9kbWEueHJlczsKCQlicmVhazsKCWNhc2UgMTgwOgoJCWlmICghbGNkX2RtYS5taXJyb3IpIHsKCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKCQkJYm90dG9tID0gUElYQUREUigwLCAwKTsKCQkJZWkgPSBQSVhTVEVQKDEsIDAsIDAsIDApOwoJCQlmaSA9IFBJWFNURVAoMCwgMSwgbGNkX2RtYS54cmVzIC0gMSwgMCk7CgkJfSBlbHNlIHsKCQkJdG9wID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKCQkJYm90dG9tID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKCQkJZWkgPSBQSVhTVEVQKDAsIDAsIDEsIDApOwoJCQlmaSA9IFBJWFNURVAobGNkX2RtYS54cmVzIC0gMSwgMSwgMCwgMCk7CgkJfQoJCWVuID0gbGNkX2RtYS54cmVzOwoJCWZuID0gbGNkX2RtYS55cmVzOwoJCWJyZWFrOwoJY2FzZSAyNzA6CgkJaWYgKCFsY2RfZG1hLm1pcnJvcikgewoJCQl0b3AgPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIDApOwoJCQlib3R0b20gPSBQSVhBRERSKDAsIGxjZF9kbWEueXJlcyAtIDEpOwoJCQllaSA9IFBJWFNURVAoMCwgMCwgMCwgMSk7CgkJCWZpID0gUElYU1RFUCgxLCBsY2RfZG1hLnlyZXMgLSAxLCAwLCAwKTsKCQl9IGVsc2UgewoJCQl0b3AgPSBQSVhBRERSKDAsIDApOwoJCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOwoJCQllaSA9IFBJWFNURVAoMCwgMCwgMCwgMSk7CgkJCWZpID0gUElYU1RFUCgwLCBsY2RfZG1hLnlyZXMgLSAxLCAxLCAwKTsKCQl9CgkJZW4gPSBsY2RfZG1hLnlyZXM7CgkJZm4gPSBsY2RfZG1hLnhyZXM7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJCXJldHVybjsJLyogU3VwcmVzcyB3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFycyAqLwoJfQoKCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSkgewoJCW9tYXBfd3JpdGV3KHRvcCA+PiAxNiwgT01BUDE1MTBfRE1BX0xDRF9UT1BfRjFfVSk7CgkJb21hcF93cml0ZXcodG9wLCBPTUFQMTUxMF9ETUFfTENEX1RPUF9GMV9MKTsKCQlvbWFwX3dyaXRldyhib3R0b20gPj4gMTYsIE9NQVAxNTEwX0RNQV9MQ0RfQk9UX0YxX1UpOwoJCW9tYXBfd3JpdGV3KGJvdHRvbSwgT01BUDE1MTBfRE1BX0xDRF9CT1RfRjFfTCk7CgoJCXJldHVybjsKCX0KCgkvKiAxNjEwIHJlZ3MgKi8KCW9tYXBfd3JpdGV3KHRvcCA+PiAxNiwgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfVSk7CglvbWFwX3dyaXRldyh0b3AsIE9NQVAxNjEwX0RNQV9MQ0RfVE9QX0IxX0wpOwoJb21hcF93cml0ZXcoYm90dG9tID4+IDE2LCBPTUFQMTYxMF9ETUFfTENEX0JPVF9CMV9VKTsKCW9tYXBfd3JpdGV3KGJvdHRvbSwgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjFfTCk7CgoJb21hcF93cml0ZXcoZW4sIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0VOX0IxKTsKCW9tYXBfd3JpdGV3KGZuLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19GTl9CMSk7CgoJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DU0RQKTsKCXcgJj0gfjB4MDM7Cgl3IHw9IGxjZF9kbWEuZGF0YV90eXBlOwoJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DU0RQKTsKCgl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwoJLyogQWx3YXlzIHNldCB0aGUgc291cmNlIHBvcnQgYXMgU0RSQU0gZm9yIG5vdyovCgl3ICY9IH4oMHgwMyA8PCA2KTsKCWlmIChsY2RfZG1hLmNhbGxiYWNrICE9IE5VTEwpCgkJdyB8PSAxIDw8IDE7CQkvKiBCbG9jayBpbnRlcnJ1cHQgZW5hYmxlICovCgllbHNlCgkJdyAmPSB+KDEgPDwgMSk7CglvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwoKCWlmICghKGxjZF9kbWEucm90YXRlIHx8IGxjZF9kbWEubWlycm9yIHx8CgkgICAgICBsY2RfZG1hLnZ4cmVzIHx8IGxjZF9kbWEueHNjYWxlIHx8IGxjZF9kbWEueXNjYWxlKSkKCQlyZXR1cm47CgoJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwoJLyogU2V0IHRoZSBkb3VibGUtaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUgKi8KCXcgfD0gKDB4MDMgPDwgMTIpOwoJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwoKCW9tYXBfd3JpdGV3KGVpLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19FSV9CMSk7CglvbWFwX3dyaXRldyhmaSA+PiAxNiwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRklfQjFfVSk7CglvbWFwX3dyaXRldyhmaSwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRklfQjFfTCk7Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdCBsY2RfZG1hX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKCQkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJdTE2IHc7CgoJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKCWlmICh1bmxpa2VseSghKHcgJiAoMSA8PCAzKSkpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgTENEIERNQSBJUlFcbiIpOwoJCXJldHVybiBJUlFfTk9ORTsKCX0KCS8qIEFjayB0aGUgSVJRICovCgl3IHw9ICgxIDw8IDMpOwoJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKCWxjZF9kbWEuYWN0aXZlID0gMDsKCWlmIChsY2RfZG1hLmNhbGxiYWNrICE9IE5VTEwpCgkJbGNkX2RtYS5jYWxsYmFjayh3LCBsY2RfZG1hLmNiX2RhdGEpOwoKCXJldHVybiBJUlFfSEFORExFRDsKfQoKaW50IG9tYXBfcmVxdWVzdF9sY2RfZG1hKHZvaWQgKCogY2FsbGJhY2spKHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpLAoJCQkgdm9pZCAqZGF0YSkKewoJc3Bpbl9sb2NrX2lycSgmbGNkX2RtYS5sb2NrKTsKCWlmIChsY2RfZG1hLnJlc2VydmVkKSB7CgkJc3Bpbl91bmxvY2tfaXJxKCZsY2RfZG1hLmxvY2spOwoJCXByaW50ayhLRVJOX0VSUiAiTENEIERNQSBjaGFubmVsIGFscmVhZHkgcmVzZXJ2ZWRcbiIpOwoJCUJVRygpOwoJCXJldHVybiAtRUJVU1k7Cgl9CglsY2RfZG1hLnJlc2VydmVkID0gMTsKCXNwaW5fdW5sb2NrX2lycSgmbGNkX2RtYS5sb2NrKTsKCWxjZF9kbWEuY2FsbGJhY2sgPSBjYWxsYmFjazsKCWxjZF9kbWEuY2JfZGF0YSA9IGRhdGE7CglsY2RfZG1hLmFjdGl2ZSA9IDA7CglsY2RfZG1hLnNpbmdsZV90cmFuc2ZlciA9IDA7CglsY2RfZG1hLnJvdGF0ZSA9IDA7CglsY2RfZG1hLnZ4cmVzID0gMDsKCWxjZF9kbWEubWlycm9yID0gMDsKCWxjZF9kbWEueHNjYWxlID0gMDsKCWxjZF9kbWEueXNjYWxlID0gMDsKCWxjZF9kbWEuZXh0X2N0cmwgPSAwOwoJbGNkX2RtYS5zcmNfcG9ydCA9IDA7CgoJcmV0dXJuIDA7Cn0KCnZvaWQgb21hcF9mcmVlX2xjZF9kbWEodm9pZCkKewoJc3Bpbl9sb2NrKCZsY2RfZG1hLmxvY2spOwoJaWYgKCFsY2RfZG1hLnJlc2VydmVkKSB7CgkJc3Bpbl91bmxvY2soJmxjZF9kbWEubG9jayk7CgkJcHJpbnRrKEtFUk5fRVJSICJMQ0QgRE1BIGlzIG5vdCByZXNlcnZlZFxuIik7CgkJQlVHKCk7CgkJcmV0dXJuOwoJfQoJaWYgKCFlbmFibGVfMTUxMF9tb2RlKQoJCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpICYgfjEsCgkJCSAgICBPTUFQMTYxMF9ETUFfTENEX0NDUik7CglsY2RfZG1hLnJlc2VydmVkID0gMDsKCXNwaW5fdW5sb2NrKCZsY2RfZG1hLmxvY2spOwp9Cgp2b2lkIG9tYXBfZW5hYmxlX2xjZF9kbWEodm9pZCkKewoJdTE2IHc7CgoJLyogU2V0IHRoZSBFbmFibGUgYml0IG9ubHkgaWYgYW4gZXh0ZXJuYWwgY29udHJvbGxlciBpcwoJICogY29ubmVjdGVkLiBPdGhlcndpc2UgdGhlIE9NQVAgaW50ZXJuYWwgY29udHJvbGxlciB3aWxsCgkgKiBzdGFydCB0aGUgdHJhbnNmZXIgd2hlbiBpdCBnZXRzIGVuYWJsZWQuCgkgKi8KCWlmIChlbmFibGVfMTUxMF9tb2RlIHx8ICFsY2RfZG1hLmV4dF9jdHJsKQoJCXJldHVybjsKCgl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwoJdyB8PSAxIDw8IDg7CglvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwoKCWxjZF9kbWEuYWN0aXZlID0gMTsKCgl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7Cgl3IHw9IDEgPDwgNzsKCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKfQoKdm9pZCBvbWFwX3NldHVwX2xjZF9kbWEodm9pZCkKewoJQlVHX09OKGxjZF9kbWEuYWN0aXZlKTsKCWlmICghZW5hYmxlXzE1MTBfbW9kZSkgewoJCS8qIFNldCBzb21lIHJlYXNvbmFibGUgZGVmYXVsdHMgKi8KCQlvbWFwX3dyaXRldygweDU0NDAsIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKCQlvbWFwX3dyaXRldygweDkxMDIsIE9NQVAxNjEwX0RNQV9MQ0RfQ1NEUCk7CgkJb21hcF93cml0ZXcoMHgwMDA0LCBPTUFQMTYxMF9ETUFfTENEX0xDSF9DVFJMKTsKCX0KCXNldF9iMV9yZWdzKCk7CglpZiAoIWVuYWJsZV8xNTEwX21vZGUpIHsKCQl1MTYgdzsKCgkJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwoJCS8qIElmIERNQSB3YXMgYWxyZWFkeSBhY3RpdmUgc2V0IHRoZSBlbmRfcHJvZyBiaXQgdG8gaGF2ZQoJCSAqIHRoZSBwcm9ncmFtbWVkIHJlZ2lzdGVyIHNldCBsb2FkZWQgaW50byB0aGUgYWN0aXZlCgkJICogcmVnaXN0ZXIgc2V0LgoJCSAqLwoJCXcgfD0gMSA8PCAxMTsJCS8qIEVuZF9wcm9nICovCgkJaWYgKCFsY2RfZG1hLnNpbmdsZV90cmFuc2ZlcikKCSAgICAgICAgCXcgfD0gKDMgPDwgOCk7CS8qIEF1dG9faW5pdCwgcmVwZWF0ICovCgkJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwoJfQp9Cgp2b2lkIG9tYXBfc3RvcF9sY2RfZG1hKHZvaWQpCnsKCXUxNiB3OwoKCWxjZF9kbWEuYWN0aXZlID0gMDsKCWlmIChlbmFibGVfMTUxMF9tb2RlIHx8ICFsY2RfZG1hLmV4dF9jdHJsKQoJCXJldHVybjsKCgl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7Cgl3ICY9IH4oMSA8PCA3KTsKCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKCgl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwoJdyAmPSB+KDEgPDwgOCk7CglvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwp9CgppbnQgb21hcF9sY2RfZG1hX2V4dF9ydW5uaW5nKHZvaWQpCnsKCXJldHVybiBsY2RfZG1hLmV4dF9jdHJsICYmIGxjZF9kbWEuYWN0aXZlOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKc3RhdGljIGludCBfX2luaXQgb21hcF9pbml0X2RtYSh2b2lkKQp7CglpbnQgY2gsIHI7CgoJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BIHN1cHBvcnQgZm9yIE9NQVAxNXh4IGluaXRpYWxpemVkXG4iKTsKCQlkbWFfY2hhbl9jb3VudCA9IDk7CgkJZW5hYmxlXzE1MTBfbW9kZSA9IDE7Cgl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpIHx8IGNwdV9pc19vbWFwNzMwKCkpIHsKCQlwcmludGsoS0VSTl9JTkZPICJPTUFQIERNQSBoYXJkd2FyZSB2ZXJzaW9uICVkXG4iLAoJCSAgICAgICBvbWFwX3JlYWR3KE9NQVBfRE1BX0hXX0lEKSk7CgkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BIGNhcGFiaWxpdGllczogJTA4eDolMDh4OiUwNHg6JTA0eDolMDR4XG4iLAoJCSAgICAgICAob21hcF9yZWFkdyhPTUFQX0RNQV9DQVBTXzBfVSkgPDwgMTYpIHwKCQkgICAgICAgb21hcF9yZWFkdyhPTUFQX0RNQV9DQVBTXzBfTCksCgkJICAgICAgIChvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMV9VKSA8PCAxNikgfAoJCSAgICAgICBvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMV9MKSwKCQkgICAgICAgb21hcF9yZWFkdyhPTUFQX0RNQV9DQVBTXzIpLCBvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMyksCgkJICAgICAgIG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU180KSk7CgkJaWYgKCFlbmFibGVfMTUxMF9tb2RlKSB7CgkJCXUxNiB3OwoKCQkJLyogRGlzYWJsZSBPTUFQIDMuMC8zLjEgY29tcGF0aWJpbGl0eSBtb2RlLiAqLwoJCQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9HU0NSKTsKCQkJdyB8PSAxIDw8IDM7CgkJCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0dTQ1IpOwoJCQlkbWFfY2hhbl9jb3VudCA9IDE2OwoJCX0gZWxzZQoJCQlkbWFfY2hhbl9jb3VudCA9IDk7Cgl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CgkJdTggcmV2aXNpb24gPSBvbWFwX3JlYWRiKE9NQVBfRE1BNF9SRVZJU0lPTik7CgkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBETUEgaGFyZHdhcmUgcmV2aXNpb24gJWQuJWRcbiIsCgkJICAgICAgIHJldmlzaW9uID4+IDQsIHJldmlzaW9uICYgMHhmKTsKCQlkbWFfY2hhbl9jb3VudCA9IE9NQVBfTE9HSUNBTF9ETUFfQ0hfQ09VTlQ7Cgl9IGVsc2UgewoJCWRtYV9jaGFuX2NvdW50ID0gMDsKCQlyZXR1cm4gMDsKCX0KCgltZW1zZXQoJmxjZF9kbWEsIDAsIHNpemVvZihsY2RfZG1hKSk7CglzcGluX2xvY2tfaW5pdCgmbGNkX2RtYS5sb2NrKTsKCXNwaW5fbG9ja19pbml0KCZkbWFfY2hhbl9sb2NrKTsKCW1lbXNldCgmZG1hX2NoYW4sIDAsIHNpemVvZihkbWFfY2hhbikpOwoKCWZvciAoY2ggPSAwOyBjaCA8IGRtYV9jaGFuX2NvdW50OyBjaCsrKSB7CgkJb21hcF9jbGVhcl9kbWEoY2gpOwoJCWRtYV9jaGFuW2NoXS5kZXZfaWQgPSAtMTsKCQlkbWFfY2hhbltjaF0ubmV4dF9sY2ggPSAtMTsKCgkJaWYgKGNoID49IDYgJiYgZW5hYmxlXzE1MTBfbW9kZSkKCQkJY29udGludWU7CgoJCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewoJCQkvKiByZXF1ZXN0X2lycSgpIGRvZXNuJ3QgbGlrZSBkZXZfaWQgKGllLiBjaCkgYmVpbmcKCQkJICogemVybywgc28gd2UgaGF2ZSB0byBrbHVkZ2UgYXJvdW5kIHRoaXMuICovCgkJCXIgPSByZXF1ZXN0X2lycShvbWFwMV9kbWFfaXJxW2NoXSwKCQkJCQlvbWFwMV9kbWFfaXJxX2hhbmRsZXIsIDAsICJETUEiLAoJCQkJCSh2b2lkICopIChjaCArIDEpKTsKCQkJaWYgKHIgIT0gMCkgewoJCQkJaW50IGk7CgoJCQkJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWQgIgoJCQkJICAgICAgICJmb3IgRE1BIChlcnJvciAlZClcbiIsCgkJCQkgICAgICAgb21hcDFfZG1hX2lycVtjaF0sIHIpOwoJCQkJZm9yIChpID0gMDsgaSA8IGNoOyBpKyspCgkJCQkJZnJlZV9pcnEob21hcDFfZG1hX2lycVtpXSwKCQkJCQkJICh2b2lkICopIChpICsgMSkpOwoJCQkJcmV0dXJuIHI7CgkJCX0KCQl9Cgl9CgoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCXNldHVwX2lycShJTlRfMjRYWF9TRE1BX0lSUTAsICZvbWFwMjR4eF9kbWFfaXJxKTsKCgkvKiBGSVhNRTogVXBkYXRlIExDRCBETUEgdG8gd29yayBvbiAyNHh4ICovCglpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpIHsKCQlyID0gcmVxdWVzdF9pcnEoSU5UX0RNQV9MQ0QsIGxjZF9kbWFfaXJxX2hhbmRsZXIsIDAsCgkJCQkiTENEIERNQSIsIE5VTEwpOwoJCWlmIChyICE9IDApIHsKCQkJaW50IGk7CgoJCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IElSUSBmb3IgTENEIERNQSAiCgkJCSAgICAgICAiKGVycm9yICVkKVxuIiwgcik7CgkJCWZvciAoaSA9IDA7IGkgPCBkbWFfY2hhbl9jb3VudDsgaSsrKQoJCQkJZnJlZV9pcnEob21hcDFfZG1hX2lycVtpXSwgKHZvaWQgKikgKGkgKyAxKSk7CgkJCXJldHVybiByOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKYXJjaF9pbml0Y2FsbChvbWFwX2luaXRfZG1hKTsKCkVYUE9SVF9TWU1CT0wob21hcF9nZXRfZG1hX3NyY19wb3MpOwpFWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X2RtYV9kc3RfcG9zKTsKRVhQT1JUX1NZTUJPTChvbWFwX2dldF9kbWFfc3JjX2FkZHJfY291bnRlcik7CkVYUE9SVF9TWU1CT0wob21hcF9jbGVhcl9kbWEpOwpFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9wcmlvcml0eSk7CkVYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2RtYSk7CkVYUE9SVF9TWU1CT0wob21hcF9mcmVlX2RtYSk7CkVYUE9SVF9TWU1CT0wob21hcF9zdGFydF9kbWEpOwpFWFBPUlRfU1lNQk9MKG9tYXBfc3RvcF9kbWEpOwpFWFBPUlRfU1lNQk9MKG9tYXBfZW5hYmxlX2RtYV9pcnEpOwpFWFBPUlRfU1lNQk9MKG9tYXBfZGlzYWJsZV9kbWFfaXJxKTsKCkVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyk7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX2NvbG9yX21vZGUpOwoKRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyk7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3NyY19pbmRleCk7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3NyY19kYXRhX3BhY2spOwpFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9zcmNfYnVyc3RfbW9kZSk7CgpFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyk7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX2Rlc3RfaW5kZXgpOwpFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9kZXN0X2RhdGFfcGFjayk7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX2Rlc3RfYnVyc3RfbW9kZSk7CgpFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9wYXJhbXMpOwoKRVhQT1JUX1NZTUJPTChvbWFwX2RtYV9saW5rX2xjaCk7CkVYUE9SVF9TWU1CT0wob21hcF9kbWFfdW5saW5rX2xjaCk7CgpFWFBPUlRfU1lNQk9MKG9tYXBfcmVxdWVzdF9sY2RfZG1hKTsKRVhQT1JUX1NZTUJPTChvbWFwX2ZyZWVfbGNkX2RtYSk7CkVYUE9SVF9TWU1CT0wob21hcF9lbmFibGVfbGNkX2RtYSk7CkVYUE9SVF9TWU1CT0wob21hcF9zZXR1cF9sY2RfZG1hKTsKRVhQT1JUX1NZTUJPTChvbWFwX3N0b3BfbGNkX2RtYSk7CkVYUE9SVF9TWU1CT0wob21hcF9sY2RfZG1hX2V4dF9ydW5uaW5nKTsKRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxKTsKRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2Zlcik7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9leHRfY29udHJvbGxlcik7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV9yb3RhdGlvbik7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV92eHJlcyk7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV9zY2FsZSk7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV9taXJyb3IpOwoK